2019年7月24日水曜日

Gitlab CI で docker build したイメージを Gitlab Container Registry に push してみた

概要

前回は Gitlab + Container Registry を試してみました
今回は CI と組み合わせて Container Registry を使ってみたいと思います

環境

  • macOS 10.14.5
  • docker 18.09.2
  • Gitlab-ce 12.0.3
  • gitlab-runner 12.0.1 (Ubuntu 16.04)

gitlab-runner のインストール

今回は Ubuntu を Runner にします
Shared Runner でも可能ですが Specified Runner のほうが確実です

  • curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash
  • apt -y install gitlab-runner

gitlab-runner の登録

  • sudo gitlab-runner register -n --url http://gitlab.example.com/ --registration-token e47zbJPKPwroKWF-nu1V --executor shell

token は Gitlab 上で確認できます
Settings -> CI/CD -> Runners -> Expand

「Runner registered successfully」と表示されれば OK です
Gitlab 上のプロジェクトで確認しても Runner が登録されているのがわかると思います

gitlab-runner ユーザに権限を付与

  • sudo usermod -aG docker gitlab-runner

Insecure Registry の登録

  • sudo vim /etc/docker/daemon.json
{
  "insecure-registries" : ["gitlab.example.com:4567"]
}
  • sudo service docker restart

/etc/hosts の編集

  • sudo vim /etc/hosts
172.28.128.1 gitlab.example.com

IP は適宜変更してください
この IP は Vagrant が mac に DHCP で付与している IP になります

Tips: mac 版 gitlab-runner だとうまく動作しなかった

Homebrew で簡単に導入できたので始めは macOS を gitlab-runner にしようとしていたのですがどうもうまく登録できなかったのでやめました
おそらく gitlab-runner として登録する mac の IP がうまく取得/アクセスできないのが原因かなと思います

macOS の場合 moby がいて Gitlab コンテナから見ると送信元の IP が必ず 172.17.0.1 になります
この辺りが怪しそうですが Ubuntu でも同じ IP になったのでよくわかりませんでした

.gitlab-ci.yml 作成

では CI のルールを作成してみます
今回は shell executor なので素直に docker コマンドを並べれば OK です
今回の目的は build してできたイメージを Gitlab Container Registry に push するのが目的なのでそれができるところまでやります

  • vim .gitlab-ci.yml
before_script:
  - env
  - echo $CI_BUILD_TOKEN
  - docker login -u $CI_REGISTRY_USER -p $CI_BUILD_TOKEN gitlab.example.com:4567
  - docker info

build_image:
   stage: build
   script:
     - docker build -t gitlab.example.com:4567/root/test:latest .
     - docker push gitlab.example.com:4567/root/test:latest

env はデバッグ用なので不要であれば削除してください
ポイントは before_scriptdocker login している部分です
ログインするユーザはこれまでのように root ではなく $CI_REGISTRY_USER/$CI_BUILD_TOKEN を使います
CI 用に Container Registry にログインできる専用のユーザとパスワードが環境変数で渡ってくるのでそれを使いましょう
単純にそれらを使ったほうがセキュアで root のパスワードを平文で .gitlab-ci.yml に書くのはよろしくないためです

今回は docker build もするので適当に Dockerfile を作成しましょう

  • vim Dockerfile
FROM alpine

CMD ["date"]

あとはプロジェクトに push すれば OK です
push 後は自動で CI の内容が Runner で実行されます

  • git add .
  • git commit -m "add .gitlab-ci.yml"
  • git push -u origin master

動作確認

まずは CI が成功したか確認しましょう
CI/CI -> Pipelines を確認すると CI の結果が一覧で見れます

また Pipeline の番号を選択すると詳細が確認できます

最後に Registry を確認するとちゃんとイメージが Gitlab Container Registry に push されているのが確認できると思います

最後に

Gitlab CI と Container Registry を組み合わせて自動で docker イメージをリポジトリに push するところまでやってみました
今回は shell executor の Runner を用意しましたが docker in docker を使った Runner を立ち上げることもできるのでその辺りは環境に応じて変えてもらえればと思います
Runner を準備するのが面倒な場合は管理者であれば Shared Runner を作ってしまえば OK です

参考サイト

0 件のコメント:

コメントを投稿