tech.guitarrapc.cóm

Technical updates

CI を 用いない 自動Pullをしたくて PowerShell でCIする

なにか作ったので公開しておきましょう。

目次

なにがしたいの

開発、本番環境いかんに関わらず、 GitHub -> CI -> デプロイ という流れがあります。*1

ただし、プロジェクトを跨いでいてもCIにgitクローン結果を残したくないというのがあります。で、CIを使わず自動で Clone -> Pull -> Pull後のアクションをしたいなと。

今回公開するモジュールは、PowerShellモジュールによるCIの簡易モジュールです。

どう使うの

前提
  1. 認証処理をクリアするため valentia を用いているため、valentiaのインストールが必要です

  2. あとは、git が入っていますよね?ということで

実行

初めて使うところから、自動化するとこんな感じで。例としてRespClientをClone -> Pull してみましょう。

実行している様子

実行するとこんな感じで、 valentia と GitContinuousPull モジュールを自動ダウンロード、git認証情報を Windows Credential Manager に入れようとします。

  • コードでは、前提の valentia インストールを含んでいます
  • コードでは、前提の GitContinousPull インストールを含んでいます

ここからがGitContinuousPullの機能

認証情報を求められたら、GitHub のユーザー名、パスワードを入れてください。

f:id:guitarrapc_tech:20141214055105p:plain

これで、次回以降は自動的に GitHub の認証が配置、自動復旧されます。

f:id:guitarrapc_tech:20141214055509p:plain

あとは、Clone と Pull が走って、PostAction に設定したコマンドが実行できます。

f:id:guitarrapc_tech:20141214055633p:plain

他の利用例

単純に git環境の構築にも便利なわけで。イケメンさんとか使ったみたいです。

あとは、CIの認証が吹き飛んだ時の自動復旧に使えたりとか。ね。

何ができるの

単純です。

  • Git認証情報の自動修復
  • GitリポジトリのClone/Pull
  • Pull後のカスタムスクリプト実行

つまり、簡易CIですね。

ヘルプ

使えるコマンドは1つだけです。

Start-GitContinuousPull

ヘルプです。

NAME
    Start-GitContinuousPull
    
SYNOPSIS
    Git Automation simple module for both private/public respository.
    
SYNTAX
    Start-GitContinuousPull [-RepositoryUrl] <Uri> [-GitPath] <String> [[-LogFolderPath] <String>] [[-LogName] <String>
    ] [[-PostAction] <ScriptBlock[]>] [<CommonParameters>]
    
    
DESCRIPTION
    You can automate git clone -> pull -> PostAction with simple definition.
    This would be usefull to temporary continuous execution without CI.
    
    Make sure you have don Prerequisites.
        1. You need to install git.
        2. Set git-credential-wincred as a Credential helper.
        3. Set your git password to Windows Credential Manager as TargetName : git
    
    See NOTES for the details.
    

PARAMETERS
    -RepositoryUrl <Uri>
        
        Required?                    true
        Position?                    1
        Default value                
        Accept pipeline input?       true (ByValue, ByPropertyName)
        Accept wildcard characters?  false
        
    -GitPath <String>
        
        Required?                    true
        Position?                    2
        Default value                
        Accept pipeline input?       true (ByValue, ByPropertyName)
        Accept wildcard characters?  false
        
    -LogFolderPath <String>
        
        Required?                    false
        Position?                    3
        Default value                
        Accept pipeline input?       true (ByValue, ByPropertyName)
        Accept wildcard characters?  false
        
    -LogName <String>
        
        Required?                    false
        Position?                    4
        Default value                
        Accept pipeline input?       true (ByValue, ByPropertyName)
        Accept wildcard characters?  false
        
    -PostAction <ScriptBlock[]>
        
        Required?                    false
        Position?                    5
        Default value                
        Accept pipeline input?       true (ByValue, ByPropertyName)
        Accept wildcard characters?  false
        
    <CommonParameters>
        This cmdlet supports the common parameters: Verbose, Debug,
        ErrorAction, ErrorVariable, WarningAction, WarningVariable,
        OutBuffer, PipelineVariable, and OutVariable. For more information, see 
        about_CommonParameters (https://go.microsoft.com/fwlink/?LinkID=113216). 
    
INPUTS
    
OUTPUTS
    System.String[]
        
    
    
    
NOTES
    
    
        # 1. Install git. You may find it by Chocolatey, Git for Windows, SourceTree or other git tools. Below is sampl
        e to install git through chocolatey.
        cinst git
        
        # 2. Run this to add git-credential-wincred into .gitconfig.
        # set git-credential-wincred into .girhub. Now git.exe read github credential from Windows Credential Manager.
        git config --global credential.helper wincred
        
        # 3. You need to set git credential into Credential Manager as name : git
        # set your github authenticated user/password
        Set-ValentiaCredential -TargetName git
    
    -------------------------- EXAMPLE 1 --------------------------
    
    PS C:\>Import-Module GitContinuousPull
    
    
    $param = @(
        @{
            RepositoryUrl = "https://github.com/guitarrapc/valentia.git"
            GitPath = "C:\Repository"
            LogFolderPath = "C:\logs\GitContinuousPull"
            LogName = "valentia-{0}.log" -f (Get-Date).ToString("yyyyMMdd-HHmmss")
            PostAction = {PowerShell -File "C:\Repository\valentia\valentia\Tools\install.ps1"}
        }
    )
    $param | %{Start-GitContinuousPull @_ -Verbose}
    # this will clone valentia into C:\Repository\valentia and pull it to the latest commit.
    
    
    
    
    
    
RELATED LINKS

流れだけさくっと。

Git認証情報の自動修復

HTTPS の場合だけなんですが、Windows でsshが相性わるいんですよにぇ。しょーがないHTTPS決め打ちにゃ。

どういうことかというと、git-credential-winstore.exegit-credential-wincred.exe が主に利用されるでしょうが、どっちを使っても GitHub認証情報が吹き飛びます。主に、gitプロセスが壊れたりすると認証情報も吹っ飛ぶます。

Windows で GitHub を使ってるとおそらく誰もが経験したことあるのではないでしょうか?

本モジュールでは、 git-credential-wincred を.gitconfig 上で helper として規定しています。

git config --global credential.helper wincred

これにより、git:https://GitHubUserName@github.com でWindows認証マネージャーに設定されている認証情報が、git-credential-wincredなどで自動的に利用されます。

本モジュールでは、git という名称で別に Windows認証マネージャーに認証情報を設定しています。これにより、git:https://GitHubUserName@github.comがもし吹き飛んでいた場合は自動補完してくれます。

gitリポジトリのClone/Pull

リポジトリに対して、HTTPSで接続するので、RepositoryUrlhttps://github.com/neuecc/RespClient.gitのように .gitが末尾につきます。

このリポジトリをGitPathにCloneします。

もし同名フォルダなどがあって、Clone済みとみなされる場合はスキップされます。

で、続いてPullが試みられます。

Pull後のカスタムスクリプト実行

Clone/Pullが正常に終わってら、PostActionに指定した内容が実行されます。

実行条件は2つ

  1. 初Clone
  2. Pull で更新が検知された場合

この条件の場合に自動実行されます。

自動化

タスクスケジューラでいいですかね。

スケジュールをスクリプトで組む

valentia と連携することで容易に可能です。valentia の wiki に詳細書いてあるのでどうぞ。*2

DSC でスケジュールを組む

DSC でも可能ですよ?この辺のサンプルをどうぞ。

まとめ

ActiveDirectory とかの構築、運用とか全部コードに落として自動化されてるんですが、そういうコードってCIほしいけど、Jenkinsだとやりすぎ感がちょっと。

でも、GitHubに Push したら、即反映させたい。GitContinousPull モジュールを使うとPushするだけですから楽です。

*1:これは、コンテナを固めてコンテナごとデプロイという仕組みでもまぁはい。

*2:今時 ScheduledTask Cmdlet 使うとかめんどくさすぎてありえない。