2018年2月23日(金)にFukuoka.NET #9を開催しました。参加して頂きました皆様、誠にありがとうございました。
fukuten.connpass.com
今回のふくてんでは、GitLabで.NET Coreアプリケーションの継続的インテグレーションを行う方法についてのセッションを行いました。
この記事では登壇内容について、解説と補足をしたいなと思います。
セッションスライド
セッションの内容だけ確認したい人はこちらをどうぞ。
www.slideshare.net
概要
GitホスティングサービスであるGitLabには、IssueやWikiの他、CI/CDやContainer Registryも備わっているため、GitLab単体でだいたい必要な機能が揃います。
GitLabのCI/CDの仕組み
- パイプライン定義はYAMLで記述する。
- パイプライン内の各ジョブはDockerコンテナで実行される。
- リポジトリ内に
.gitlab-ci.yml
があれば、プッシュした際に自動実行される。
.NET Coreアプリケーションをビルドしてみる
コンソールアプリケーション
単純に「Hello World!」と出力するアプリケーションです。
簡単なクラスとxUnitの単体テストコードを用意します。
Dockerfile
gist9f660b4f6fd093133376042a5ba408f6
.gitlab-ci.yml
正しくビルド、テスト、コンテナイメージの登録ができているYAMLファイルはこちらになります。
GitLabで.NET Coreアプリケーションの継続的インテグレーションを行う
苦戦したこと
ビルドやテストはdotnetコマンドを使って処理させるだけなので、さほど難しいことはありませんでした。
ただ今回は.NET Coreのアプリケーションをコンテナイメージ化して、GitLabのContainer Registryに登録することをゴールにしていました。
GitLabのContainer Registryへの登録にはこちらのドキュメントを参考にしました。
gitlab.com
しかし何度試しても下記のエラーが起き、パイプラインに失敗しました。(ユーザー名とパスワードは加工しています)
理由としてはdocker
コマンドが見つからないという原因です。
$ docker login registry.example.com -u {user} -p {password}
/bin/bash: line 62: docker: command not found
ERROR: Job failed: exit code 1
解決策
同僚でありGitLabに詳しい@morita92hiroに大事なポイントを教えてもらいました。
Container Registryに登録するジョブのブロックにてimage: docker:latest
を記述し、Dockerを使うと定義しなければならないようでした。
その部分のジョブの定義だけ抜粋するとこちらになります。
job3:
stage: push
image: docker:latest
before_script:
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
script:
- cd src
- docker build --pull -t "$CI_REGISTRY_IMAGE" .
- docker push "$CI_REGISTRY_IMAGE"
only:
- master
感想
ある程度、シェルスクリプトやYAMLファイルが扱えるような人は、GitLabのCI/CDは使いやすいんじゃないでしょうか。
アプリケーションエンジニアな私としてはちょっと難しいので、Visual Studio Team Servicesを使ってGUIでパイプラインを構築するほうがやりやすいなと感じました。