Windows10下のVisualStuioプロジェクトをgitlab-ciでビルドする


はじめに

本記事では、Windows10環境下にてVisualStudioのプロジェクトをgitlab-ciでビルドする手順をまとめる。
gitlab-ciに関しては、Docker環境下での情報が大半であり、かつ、これまでのWindows環境下の情報にないつまづきポイントがあったため、本記事を書くに至る。

筆者の環境

  • Windows10 professional
  • VisualStudio2017

gitlab-ci導入手順

では、順を追ってgitlab-ciの導入手順を見ていこう

インストール

gitlabの公式リファレンスより、バイナリファイル(.exe)をダウンロードする。
ダウンロードしたバイナリをPATHの通っているファイルにコピーする。
名前が長いので、gitlab-runner.exeとリネームする。これ以降は、この名前にバイナリファイルをリネームしたとして進める。
コマンドプロンプトを管理者で実行し、以下のコマンドをたたく。

$ gitlab-runner install

リポジトリ登録

gitlabのリポジトリとgitlab-runnerを紐づける。
CIを導入したいgitlabプロジェクトのSettingsCD/CI → Runnersexpandする。
上記の操作をすれば、Set up a specific Runner manuallyと出る。そこに記されているURLとトークンを以降の手順で使用する。
コマンドプロンプトに戻り、以下のコマンドをたたく。

$ gitlab-runner register

すると対話モードになるので、以下のように順に入力していく。

Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
# URLを記述し、Enter

Please enter the gitlab-ci token for this runner:
# Tokenを記述し、Enter

Please enter the gitlab-ci description for this runner:
# runnerに任意の名前をつける。

Please enter the gitlab-ci tags for this runner (comma separated):
# runnerに任意のtagをつける。

Please enter the executor: shell, docker+machine, virtualbox, docker-ssh+machine, kubernetes, docker, docker-ssh, parallels, ssh: 
# 実行する環境を指定する。今回はwindows上でビルドするので、shellと入力する。

Config.tomlの編集(つまづきポイント)

gitlab-runnerの設定は、C:\Windows\System32\config.tomlに記述される。
現在の状態ではおそらくこのような中身であろう。

C\Windows\System32\config.toml
concurrent = 1
check_interval = 0

[session_server]
  session_timeout = 1800

[[runners]]
  name = "windows10"
  url = "gitlabのURL"
  token = "トークン"
  executor = "shell"
  shell = "powershell"
  [runners.custom_build_dir]
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]

このままでは、CIのジョブはpowershell上で動くため、コマンドプロンプトに変更するには、shell = "cmd"に書き換える。
また、デフォルトの設定では、git cloneするディレクトリはC:/Windows/System32/builds下となる。このままではmsbuildコマンドは失敗してしまう。
そのため、git cloneするディレクトリを変更してやる必要がある。
config.tomlbuilds_dir = "任意のgitlab-ciがgit cloneするディレクトリ"と追記する。なお、ディレクトリパスはバックスラッシュではなく、フォワードスラッシュで記述する。
上記の変更を加えるとconfig.tomlは以下のようになる。

C\Windows\System32\config.toml
concurrent = 1
check_interval = 0

[session_server]
  session_timeout = 1800

[[runners]]
  name = "windows10"
  url = "gitlabのURL"
  token = "トークン"
  executor = "shell"
  shell = "cmd"
  builds_dir = "任意のgitlab-ciがgit cloneするディレクトリ"
  [runners.custom_build_dir]
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]

gitlab-runner起動

コマンドプロンプトで以下のコマンドをたたく。

$ gitlab-runner start

gitlab側で以下の画面のように、緑色の丸になっていれば、起動完了だ。

鉛筆マークから、gitlab-runnerの設定画面に入れる。
git tagがついていないコミットでもジョブを走らせたい場合はRun untagged jobsにチェックを入れておこう。(下図)

ジョブの記述(.gitlab-ci.yml)

さて、いよいよCIが実行するジョブを記述し、VisualStudioのプロジェクトをgit push時にビルドするようにする。
gitlab-ciにジョブを与えるには、リポジトリのルート下に.gitlab-ci.ymlを加え、そこにスクリプトを記述する。
より詳しい説明は公式リファレンスを参照していただきたい。
今回は、.gitlab-ci.ymlに以下のように記述する。

.gitlab-ci.yml
before_script:
  - chcp 65001
  - 'call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\Tools\VsDevCmd.bat"'
stages:
  - build
debug_duild:
  stage: build
  script:
    - msbuild
  artifacts:
    paths:
      - プロジェクトの名前\bin\Debug

順に説明していこう。
コマンドプロンプトの文字コードはSHIFT-JISであるため、文字化けしてしまう。そのため、chcp 65001でutf-8な環境にする。
VsDevCmd.batはVisualStudioに付属する、コマンドラインでビルドするためのファイル群のPATHをよろしく設定してくれるバッチファイルだ。
後は、msbuildコマンドを実行し、ビルド成果物をartifactsに指定すればよい。
artifactsに指定したビルド成果物は、gitlab上からダウンロードすることができる。

参考

(公式)config.tomlについて

おわりに

本記事では、ビルドについて触れたが、同様にMStestによるユニットテストを動かすこともできる。