Gitlab CI とgitlab-ci-multi-runnerのwindows版を使ってwindows側にビルドを走らせるCIを作る

2016-01-25(Mon) Server

趣味、仕事のgitリポジトリやイシュー管理はGitlabを利用しています。最近のバージョンにはGitlab CIというCI(継続的インテグレーション)が搭載されていまして、適切な設定が用意できればGitlabのプロジェクト内でビルドをさせることができるようになります。

仕事ではWindowsが対象で、Windows上でビルド作業が出来ないと困るため、unix向けのCIツールは使えず、以前からjenkinsを使ってみたいなーと言いながらすっかり対応をせずに放ったらかしにしていました。 が、最近はzc.buildoutでワン・コマンドでビルドできるようになったし、Gitlab CIのRunnerという概念を知り(jenkinsだとスレーブですね)、WindowsでもRun nerを動かすことができるらしいので試してみました。若干ハマりどころがありますが、動かすことは可能です。

TL;DR

  • Gitlab CIのビルドはWindowsを使うこともできる
  • RunnerはGo製らしい
  • Windowsサービスとして実行できるがハマりどころがある
  • とりあえず試して動いた

Gitlab CIのビルドはWindowsを使うこともできる

Gitlab CIのビルドはRunnerというアプリ、サービス(デーモン)で実行されるようです。CIと予め接続したうえで、gitのclone(fetch)を行い、.gitlab-ci.yml というYAML文法の設定ファイルをリポジトリのルートに置くことで、commitした段階でビルドしてくれます。

GitLab.org / gitlab-ci-multi-runner · GitLab

GitLab Documentation

なお、Runnerは以前までruby?だったらしいですが、multi-runner と銘打った物はGo製らしいです。

Windows版をインストールする

インストール方法は基本的に以下のドキュメント通りです。

docs/install/windows.md · master · GitLab.org / gitlab-ci-multi-runner · GitLab

Windowsのバイナリファイルをダウンロードすると、ファイル名 gitlab-co-multi-runnerwindows-368 (x86の意味)や windows-amd64 とかついたりしますが、ついていてもそのまま実行しても問題なく動きます。(ドキュメント通りに動かしたいときはリネームするのが良いですね)

gitlab-co-multi-runner register を動かして設定する時、 runnerをインストールしたWindowsでビルドをさせたい時、コマンドプロンプトを使いたいときはshellを指定する必要があります。 powershellで動かしたい場合の方法はよくわかりません。

Please enter the executor: shell, docker, docker-ssh, ssh?
shell

その後にある gitlab-co-multi-runner startがうまく動かなかったです。

gitlab-ci-multi-runner-windows-amd64.exe install --password [ユーザーのパスワード]
$ gitlab-ci-multi-runner-windows-amd64.exe start
$ FATA[0000] Failed to start GitLab Runner: The service did not start due to a logon failure.

この部分はWindowsのサービスとして登録する時の設定で、installでサービスとして登録し、startでサービスを開始します。

その時に、ユーザーアカウントを指定する必要があり、デフォルトでは--userを省くと現在ログインしているユーザー、パスワードは必ず指定が必要で、上のコマンドだと、現在ログインしているユーザーのパスワードを指定する必要があります。

がその後、startでサービスを起動させようとすると失敗します。理由はよくわからず、issueに登録されていたので見てみると、installで指定したユーザー情報がちゃんと入ってないっぽいです。

The service did not start due to a logon failure (#48) · Issues · GitLab.org / gitlab-ci-multi-runner · GitLab

自分がとりあえず解決した方法を上げておくと

  • Windowsのサービス(Windowsの検索メニューからサービスで検索、または、 コントロールパネル > 管理ツール > サービス より)の一覧を開いて、gitlab-runnerを探す
  • gitlab-runnerの設定を開いて ログオン タブ より、ユーザー情報を入れなおす。
  • パスワードのみ打てばよいはずです

これで、試しに.gitlab-ci.yml を書いてコミットすると自動的に動いてくれました。

とりあえず動いた

試しに書いた .gitlab-ci.ymlはこちらで、

exam:
    script:
        - echo "hello github ci"

動いた結果はこちら。CIツールとしては当たり前でしょうが結果がちゃんと見れるのはありがたいですね。

ビルドが通らなかった時に確認することは以下のことかと思います。

  • 対象のWindowsにgitを入れて、PATHに指定してる(システム環境変数でも、サービスを動かすユーザーがわかるならユーザー環境変数にでも入れる)
  • .gitlab-ci.ymlの文法ミス
  • これは、ciのlintに通して確認すると良いらしいです。lintは http(s)://[gitlabのホスト]/ci/lint からバリデーションするページへアクセスできます。
    • (Quick_Docsを見ていて気がついたけど) Settings > CI settings からもlintのリンク先が確認できるらしいです
  • ファイヤーウォールに注意。Windowsファイヤーウォールでは特に設定は必要ないと思います。http/httpsアクセスっぽい?

まとめ

というわけで、Windowsでも割りと簡単に動かすことが出来ました。今度は実際にちゃんとビルドと運用ができるか確認できたら、それについても言及したいと思います。