概要
このエントリは、「Enterprise "hello, world" 2018 Advent Calendar 2018」の12/21向けのものです。このAdvent Calendarでは、複数個のエントリにまたがる話の流れも鑑みつつ、なるべく1エントリで1つのトピックをカバーできるようにする予定です。
このエントリで記載するトピックは、CI/CDのためにGitLab RunnerをDockerで動かす準備です。
今までのトピックをつなげると、1台のPCの中の「コンテナ盆栽」環境は、下図のようになります。
前提
おことわり
- このEnterpfise "hello, world"シリーズは、ネタのためのエントリです。実環境でそのまま利用ことを目的とはしていません。
- 動かしやすさを優先してセキュリティを意図的に低くする設定など入れてありますのでご注意ください。
想定読者
「Enterprise "hello, world" 2018」的なネタとしては、下記のような状況を想定しています。
CI/CDの考え方から言って、GitLabにリポジトリを作ったあとには、デプロイの前にテストを実行しなくてはいけない。
GitLab Runnerの準備
GitLab Runnerとは
Gitlab Runnerは、GitLabでCI/CDを実現する際に用いる、GitLabからジョブの指示を受け取って結果を返すワーカです。
ワーカの動作のさせ方は、指定したホスト内でプログラムとして動かしたり、Dockerコンテナ内で動かしたりなどいくつかの方法があります。何ができて何ができるかは、サイト内に表があります。
表をちらっとみると、Kubernetesで動かす方法が、もっともできることの数が多いのですが、このエントリでは、次に出来ることの数が多いDockerコンテナとして動かします。
GitLab
GitLab Runnerのインストールにあたり、GitLabからのトークンが必要となります。
管理者権限(今までのAdvent Calendarの手順では"root")でログインし、GitLabの"/admin/runners"にアクセスします。
gitlab-runner:
image: gitlab/gitlab-runner:latest
restart: always
hostname: gitlab-runner.ehw2018.local
networks:
- extnet
container_name: gitlab-runner.ehw2810
volumes:
- '${CONF_DIR}/gitlab-runner:/etc/gitlab-runner'
- '/var/run/docker.sock:/var/run/docker.sock'
depends_on:
- gitlab
networks:
- int_net
$ sudo docker run --rm -t -i -v ~/ehw2018/second-dev-env/conf_dir/gitlab-runner:/etc/gitl-runner --name gitlab-runner gitlab/gitlab-runner register
Runtime platform arch=amd64 os=linux pid=6 revision=f100a208 version=11.6.0
Running in system-mode.
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
http://192.168.3.220/
Please enter the gitlab-ci token for this runner:
5nkCdHE4b7uHsjx6fJch
Please enter the gitlab-ci description for this runner:
[4cbc2529a46b]: Shared Runner
Please enter the gitlab-ci tags for this runner (comma separated):
test
Registering runner... succeeded runner=5nkCdHE4
Please enter the executor: docker-ssh, shell, virtualbox, docker, parallels, ssh, docker+machine, docker-ssh+machine, kubernetes:
docker
Please enter the default Docker image (e.g. ruby:2.1):
alpine:3.8.2
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
$ sudo docker-compose up gitlab-runner
起動の様子
$ sudo docker-compose up gitlab-runner
WARNING: Some networks were defined but are not used by any service: intnet
samba is up-to-date
second-dev-env_gitlab_1_3d4e620e72db is up-to-date
Starting gitlab-runner.ehw2810 ... done
Attaching to gitlab-runner.ehw2810
gitlab-runner.ehw2810 | Runtime platform arch=amd64 os=linux pid=7 revision=f100a208 version=11.6.0
gitlab-runner.ehw2810 | Starting multi-runner from /etc/gitlab-runner/config.toml ... builds=0
gitlab-runner.ehw2810 | Running in system-mode.
gitlab-runner.ehw2810 |
gitlab-runner.ehw2810 | Configuration loaded builds=0
gitlab-runner.ehw2810 | Listen address not defined, metrics server disabled builds=0
gitlab-runner.ehw2810 | Listen address not defined, session server disabled builds=0
管理画面をリロードすると、「Runners currently online」が1になっています。
CIの実行
.gitlab-ci.ymlファイルを用意して、commit, pushします。
image: alpine:3.8.2
stages:
- hello
print_hello:
stage: hello
tags:
- test
script:
- echo hello, world!
で、これでコミットするとジョブコケますので、いくつか足回りの設定を加えます。
これまでのエントリの設定通りだと、下記のように、gitlab.ehw2018.localが名前解決できないでエラーとなるでしょう。
gitlab-runnerの設定
gitlab-runnerの設定ファイル(/etc/gitlab-runner/config.toml)に、network_modeとして、docker-composeのカスタムネットワークを指定します。
(一部抜粋。全体は下記の折りたたみにあります)
[[runners]]
[runners.docker]
network_mode = "ehw2018.local"
/etc/gitlab-runner/config.toml
concurrent = 1
check_interval = 0
[session_server]
session_timeout = 1800
[[runners]]
name = "Shared Runner"
url = "http://192.168.3.220/"
token = "adf4e4b7cf8de25e9bcd7e44d5d71a"
executor = "docker"
[runners.docker]
tls_verify = false
image = "alpine:3.8.2"
privileged = false
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = ["/cache"]
shm_size = 0
network_mode = "ehw2018.local"
[runners.cache]
[runners.cache.s3]
[runners.cache.gcs]
docker-composeの、ネットワーク設定も、ドメイン名が「dhw2018.local」変えておきます。
(一部抜粋)
networks:
extnet:
name: ehw2018.local
intnet:
name: ehw2018-internal.local
設定を直し、「$ sudo docker-compose down」して「$ sudo docker-compose up -d」したあとで、しばらくしてGitLabが再起動したあたりで、CIをもう一度「Retry」で走らせてみます。
文字列をechoするだけのジョブは成功しました。ここまでで、GitLabからGitLab-runnerを動作させ、内部でCI用のジョブが動作するところまでが確認できました。
パイプラインを変更
.gitlab-ci.ymlを下記のように書き換え、coommit+pushします。前述のものと異なり、
- イメージは、nodeの公式のもので、alpineベースのものを使用しています(npmがすぐ動くように)
- testのステージを追加し、npmでのパッケージのダウンロードと、テスト(mithrilのospec)を実行しています
image: node:8-alpine
stages:
- test
exec_test:
stage: test
tags:
- test
script:
- npm install
- npm run test
commit+pushすると
テストが成功しました。これで、GitLabにソースがpushされるたびに、テストが実行できる環境ができました。
補足: api-serverの方
第18日目の、Ginで書いたAPI Serverについて、.gitlab-ci.ymlは以下のような感じになります。
image: golang:1.11-alpine
stages:
- test
before_script:
- mkdir -p /go/src/ehw2018.io/greetings-server/
- cp -fr ../greetings-server /go/src/ehw2018.io
- cd /go/src/ehw2018.io/greetings-server
exec_test:
stage: test
tags:
- test
script:
- apk add make
- apk add git
- apk add build-base
- go get -u github.com/golang/dep/cmd/dep
- make depensure
- make bin/greetings-server
- make test
まとめ
このエントリでは、「Enterprise "hello, world" 2018 Advent Calendar 2018」(EHW2018)の21日目として、CI/CDのためにGitLab RunnerをDockerで動かす準備をトピックとして取り上げました。
EHW2018のネタとしては、このあと、ついにデプロイができるのではないかとを考えています。