2018年7月16日月曜日

Docker Compose で GitLab + GitLab Runner の環境を整える

前回 の続きから GitLab Runner を追加しようと思ったのだが、 想像以上に苦労してしまったので、もっとミニマムなところから構築していくことにした。

今回は、 Docker Compose で GitLab + GitLab Runner を組み合わせる手順を記録する。

環境

ボリュームリセット

docker container prune
docker volume rm gitlab_etc gitlab_opt gitlab_log gitlab-runner_config
docker volume create gitlab_etc; docker volume create gitlab_log; docker volume create gitlab_opt; docker volume create gitlab-runner_config

gitlab & gitlab-runner の設定

docker-compose.yml の準備

version: '3'
services:
    gitlab:
        image: gitlab/gitlab-ce:11.0.1-ce.0
        restart: always
        hostname: gitlab.example.com
        container_name: gitlab.example.com
        volumes:
            - gitlab_etc:/etc/gitlab
            - gitlab_log:/var/log/gitlab
            - gitlab_opt:/var/opt/gitlab
        environment:
            GITLAB_OMNIBUS_CONFIG: |
                external_url 'http://gitlab.example.com/'
                gitlab_rails['gitlab_shell_ssh_port'] = 8022
        ports:
            - "80:80"
            - "8022:22"
        networks:
            gitlab_net:
                ipv4_address: 172.16.238.2
    gitlab-runner:
        image: gitlab/gitlab-runner:v11.0.0
        restart: always
        hostname: gitlab-runner.example.com
        container_name: gitlab-runner.example.com
        volumes:
            - gitlab-runner_config:/etc/gitlab-runner
            - /var/run/docker.sock:/var/run/docker.sock
        depends_on:
            - gitlab
        networks:
            gitlab_net:
                ipv4_address: 172.16.238.3

networks:
    gitlab_net:
        ipam:
            config:
            - subnet: 172.16.238.0/24

volumes:
    gitlab_etc:
        external: true
    gitlab_log:
        external: true
    gitlab_opt:
        external: true
    gitlab-runner_config:
        external: true

今回は、 172.16.238.0/24 のネットワークに gitlab, gitlab-runner のコンテナをぶら下げる形で docker-compose.yml を作成。

下記設定(+ Runnar への設定)をしないと Failed to connect to gitlab.example.com port 80: Connection refused といわれて CI が成功しない。(参考資料の「ワークアラウンド」参照)

  • この後、 extra_hosts(手動設定) で名前解決の指定をする必要があるため、コンテナ固定 IP の設定を行う
    • services/SERVICE_NAME/networks/NETWORK_NAME/ipv4_address
      • 今回は下記の通り設定した
        • gitlab: 172.16.238.2
        • gitlab-runner: 172.16.238.3
    • networks/NETWORK_NAME/ipam/config
      • 今回は下記の通り設定した
        • subnet: 172.16.238.0/24
  • gitlab-runnergitlab に依存しているのでその設定
    • services/gitlab-runner/depends_on

コンテナ起動

$Env:COMPOSE_CONVERT_WINDOWS_PATHS=1
docker-compose up -d

$Env:COMPOSE_CONVERT_WINDOWS_PATHS=1 をすることで、 /var/run/docker.sock:/var/run/docker.sock が良い感じになる。 環境変数に設定しましょう。

ここまでの動作確認

hosts127.0.0.1 gitlab.example.com を追加してブラウザで gitlab.example.com にアクセスする。

  1. root パスワード設定
  2. 一般ユーザー作成
  3. test プロジェクト作成

ここまでやっておく。

gitlab に gitlab-runner の登録

「ここまでの動作確認」で作成した test プロジェクトから、必要な情報を取得する。

  1. プロジェクト -> Settings -> CI / CD と選択していく
  2. Runners settings に記載されている URLregistration token をメモ

GitLab Runner を起動して登録

「gitlab に gitlab-runner の登録」 の情報をもとに Runner を登録する。

  • GITLAB_HOST_NAME: メモした URL のホスト部分
  • GITLAB_IP: 作った subnet の IP アドレス 1
  • REGISTRATION_TOKEN: メモした registration token
$REGISTRATION_TOKEN="REGISTRATION_TOKEN"
$GITLAB_HOST_NAME="GITLAB_HOST_NAME"
$GITLAB_IP="172.16.238.1"
docker-compose exec gitlab-runner gitlab-runner register `
    --non-interactive `
    --name gitlab-runner `
    --url http://${GITLAB_HOST_NAME}/ `
    --registration-token ${REGISTRATION_TOKEN} `
    --executor docker `
    --env "GODEBUG=netdns=cgo" `
    --docker-image debian:stretch-slim `
    --tag-list test `
    --docker-extra-hosts "${GITLAB_HOST_NAME}:${GITLAB_IP}"
  • --env "GODEBUG=netdns=cgo", --docker-extra-hosts "${GITLAB_HOST_NAME}:${GITLAB_IP}"
    • gitlab-runner の CI 内は、 docker-compose の hotsnamecontainer_name の仕組みの外で名前解決が行われているらしい(参考資料の「ワークアラウンド」参照)ので、これらワークアラウンドの設定を行う

CI 動作確認

リポジトリ初期化

mkdir test
cd test
git init

.gitlab-ci.yml の準備

vim .gitlab-ci.yml

.gitlab-ci.yml

image: debian:stretch-slim

stages:
    - hello

print_hello:
    stage: hello
    tags:
        - test
    script:
        - echo Hello, World!

変更の push

git add .gitlab-ci.yml
git commit -m 'First commit.'
git remote add origin http://gitlab.example.com/mikoto/test.git
git push -u origin master

Runner を登録済みなので、 CI / CD のページに行けばジョブが見えるはず。

  1. プロジェクト -> CI / CD -> Jobs と選択していく
  2. Job 1 の passed ボタンを押下
  3. 下記みたいなログが出力されていれば OK
Running with gitlab-runner 11.0.0 (5396d320)
  on gitlab-runner c22e7436
Using Docker executor with image debian:stretch-slim ...
Pulling docker image debian:stretch-slim ...
Using docker image sha256:3e235dbb0ba6811e57b8d805536b3a9678aa6b11046c7019d93eef4cf4a0f7cc for debian:stretch-slim ...
Running on runner-c22e7436-project-1-concurrent-0 via gitlab-runner.example.com...
Cloning repository...
Cloning into '/builds/mikoto/test'...
Checking out 5c956c15 as master...
Skipping Git submodules setup
$ echo Hello, World!
Hello, World!
Job succeeded

ok, 引き続き HTTPS 化していきたい。

参考資料

更新履歴

日付 更新内容
2018/7/16 新規作成
2019/7/12 GITLAB_IP に何を設定すればよいのかわかりにくかったので、実際使った IP に修正

6 件のコメント:

  1. 技術記事を作成して下さりありがとうございます。
    同様の手順で作成したところエラーがCI動作確認のところで起きました。

    なにかご存じでしたら教えてくださると幸いです。

    Running with gitlab-runner 11.0.0 (5396d320)
    on gitlab-runner ed243414
    Using Docker executor with image debian:stretch-slim ...
    Pulling docker image debian:stretch-slim ...
    Using docker image sha256:4b673a9c386b64fe0dc35a293d5db90e0e5911d399b1cc5bd70cba01c0be2b26 for debian:stretch-slim ...
    Running on runner-ed243414-project-1-concurrent-0 via gitlab-runner.example.com...
    Cloning repository...
    Cloning into '/builds/root/test'...
    fatal: unable to access 'http://gitlab-ci-token:xxxxxxxxxxxxxxxxxxxx@gitlab.example.com/root/test.git/': Failed to connect to gitlab.example.com port 80: Connection refused
    ERROR: Job failed: exit code 1

    返信削除
    返信
    1. コメントありがとうございます。

      うーん、Docker のバックエンドが WSL2 になったタイミングあたりでだめになってしまったのかもしれません。

      とりあえずのワークアラウンドとしては、 `gitlab-runner register` のオプションに、`--clone-url` オプションを付けると解決します。
      (HTTPS 化するときにまた別の問題が出てくる気がしますが...)

      ```
      docker-compose exec gitlab-runner gitlab-runner register `
      --non-interactive `
      --name gitlab-runner `
      --url http://${GITLAB_HOST_NAME}/ `
      --clone-url http://host.docker.internal/ `
      --registration-token ${REGISTRATION_TOKEN} `
      --executor docker `
      --env "GODEBUG=netdns=cgo" `
      --docker-image debian:stretch-slim `
      --tag-list test `
      --docker-extra-hosts "${GITLAB_HOST_NAME}:${GITLAB_IP}"
      ```

      これで、gitlab-runner が Git リポジトリにアクセスする際に、 `host.docker.internal`(Docker ホストの IP アドレス)へアクセスするようになります。

      最新の環境での手順をまとめ直したくなりますねぇ。
      (...いつになるかわかりませんが)

      削除
    2. gitlab-runner が作成するコンテナを、 docker-compose が GitLab 用に作成したネットワークに所属させるのが根本解決か。

      ```
      docker compose exec gitlab-runner gitlab-runner register `
      --non-interactive `
      --name gitlab-runner `
      --url http://${GITLAB_HOST_NAME}/ `
      --registration-token ${REGISTRATION_TOKEN} `
      --docker-image docker:latest `
      --executor docker `
      --env "GODEBUG=netdns=cgo" `
      --tag-list test `
      --docker-network-mode gitlab_gitlab_net
      ```

      ※ gitlab_gitlab_net は、 `docker-compose.yml` が存在するディレクトリによって異なるため、 `docker network ls` でネットワーク名を確認して設定する。

      削除
  2. お忙しい中お時間を割いて下さりありがとうございます。
    早速試してみます!

    返信削除
  3. CI動作まで動作したことを確認しました。
    ご指導いただきありがとうございました。

    返信削除
    返信
    1. うまくいったようでよかったです!

      削除