前回 の続きから GitLab Runner を追加しようと思ったのだが、 想像以上に苦労してしまったので、もっとミニマムなところから構築していくことにした。
今回は、 Docker Compose で GitLab + GitLab Runner を組み合わせる手順を記録する。
環境
- OS: Windows 10 Pro
- Docker version 18.03.1-ce, build 9ee9f40
- docker-compose version 1.21.1, build 7641a569
- 使用イメージ
- gitlab & gitlab-runner
- gitlab: gitlab/gitlab-ce:11.0.1-ce.0
- gitlab-runner: gitlab/gitlab-runner:v11.0.0
- 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
- gitlab:
- 今回は下記の通り設定した
networks/NETWORK_NAME/ipam/config
- 今回は下記の通り設定した
- subnet:
172.16.238.0/24
- subnet:
- 今回は下記の通り設定した
gitlab-runner
はgitlab
に依存しているのでその設定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
が良い感じになる。 環境変数に設定しましょう。
ここまでの動作確認
hosts
に 127.0.0.1 gitlab.example.com
を追加してブラウザで gitlab.example.com
にアクセスする。
root
パスワード設定- 一般ユーザー作成
test
プロジェクト作成
ここまでやっておく。
gitlab に gitlab-runner の登録
「ここまでの動作確認」で作成した test
プロジェクトから、必要な情報を取得する。
プロジェクト -> Settings -> CI / CD
と選択していくRunners settings
に記載されているURL
とregistration 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 の
hotsname
やcontainer_name
の仕組みの外で名前解決が行われているらしい(参考資料の「ワークアラウンド」参照)ので、これらワークアラウンドの設定を行う
- gitlab-runner の CI 内は、 docker-compose の
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 のページに行けばジョブが見えるはず。
プロジェクト -> CI / CD -> Jobs
と選択していく- Job 1 の
passed
ボタンを押下 - 下記みたいなログが出力されていれば 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 化していきたい。
参考資料
- Run GitLab Runner in a container | GitLab
- Configuring GitLab Runners | GitLab
- Registering Runners | GitLab
- ワークアラウンド
更新履歴
日付 | 更新内容 |
---|---|
2018/7/16 | 新規作成 |
2019/7/12 | GITLAB_IP に何を設定すればよいのかわかりにくかったので、実際使った IP に修正 |
技術記事を作成して下さりありがとうございます。
返信削除同様の手順で作成したところエラーが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
コメントありがとうございます。
削除うーん、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 アドレス)へアクセスするようになります。
最新の環境での手順をまとめ直したくなりますねぇ。
(...いつになるかわかりませんが)
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` でネットワーク名を確認して設定する。
お忙しい中お時間を割いて下さりありがとうございます。
返信削除早速試してみます!
CI動作まで動作したことを確認しました。
返信削除ご指導いただきありがとうございました。
うまくいったようでよかったです!
削除