GitHubには自動リリースノート作成機能があるんだけど、GitLabにはそういった機能デフォルトではなさそうなんだよねえ。
https://github.com/jk1z/gitlab-release-note-generator
というわけでこれを使ってみた。
まずはコマンドラインから
docker container run -e GITLAB_PERSONAL_TOKEN=gitlabSampleToken \
-e GITLAB_PROJECT_ID=12345678 \
-e TARGET_BRANCH=master \
-e GITLAB_API_ENDPOINT=http://hogehoge/gitlab \
00freezy00/gitlab-release-note-generator
これをdockerが既にインストールされているEC2上で動作させて、sample通りに動作することを確認。まあまあいいんじゃない?
GITLAB_PERSONAL_TOKENは↓を見ながら発行。
https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html
http?https?
色々あって、当Gitlabについては、自己署名証明書(=所謂オレオレ証明書)を用いて、httpsを実現しているのだが、dockerからのSSL解決との相性が恐ろしく悪いため、VPC内部のみhttpを許可するように変更した。これにより、GITLAB_API_ENDPOINTはhttpスキームになっている。
というか、やっぱりこんな迂回策を作っちゃだめで、ちゃんとドメインとか取るべきだ。
そのせいで、後述する作業が恐ろしくめんどくさくなった。
自動化
gitlab-runnerのインストール
まずはgitlab-runnerからである。
こんな感じのyamlを書く。
version: "2.1"
services:
runner:
image: gitlab/gitlab-runner:alpine-v13.4.0
volumes:
- /data/docker-gitlab-runner/runner:/etc/gitlab-runner
- /var/run/docker.sock:/var/run/docker.sock
# 後述するが、ここはうまくいってない。
- /data/docker-gitlab-runner/ssl/certs:/etc/ssl/certs
restart: always
で、docker上でgitlabが動作しているEC2上でdocker-compose up -dでrunnerを起動
(Versionは単純にgitlabのVersionと合わせてあるだけ。)
https://docs.gitlab.com/runner/install/docker.html
gitlab-runnerの登録
起動したgitlab-runnerをgitlabから見えるように登録する。対話式の設定だったが、まあこれくらいはコード化しなくてもいいだろ的な。
[ec2-user@foo ]$ docker exec -it docker-gitlab-runner_runner_1 bash
bash-5.0# gitlab-runner register
Runtime platform arch=amd64 os=linux pid=23 revision=4e1f20da version=13.4.0
Running in system-mode.
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
http://hogehoge/gitlab
Please enter the gitlab-ci token for this runner:
XXXXXXXXXXXXXXXXXXXXXXX
Please enter the gitlab-ci description for this runner:
[3ad5a140c27f]:gitlab-ci
Please enter the gitlab-ci tags for this runner (comma separated):
shell
Registering runner... succeeded runner=z-5xs9LA
Please enter the executor: docker, parallels, docker+machine, docker-ssh+machine, kubernetes, custom, docker-ssh, shell, ssh, virtualbox:
docker
Please enter the default Docker image (e.g. ruby:2.6):
docker:stable
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
gitlab-ci tokenはSettings→CICD→Runnersから取得したものを設定する。
Trouble Shooting
結果的には、この時の設定はあまり意味なくって、/etc/gitlab-runner/config.toml
を直接編集した。
[session_server]
session_timeout = 1800
[[runners]]
name = "gitlab-ci"
url = "http://hogehoge/gitlab"
token = "XXXXXXXXXXXXXXXXXXXXXX"
executor = "docker"
clone_url = "http://hogehoge/gitlab"
[runners.custom_build_dir]
[runners.cache]
[runners.cache.s3]
[runners.cache.gcs]
[runners.cache.azure]
[runners.docker]
tls_verify = false
image = "docker:stable"
privileged = true
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = ["/cache"]
shm_size = 0
ポイントは、clone_urlとprivilegedの設定の箇所。
clone_url
元々はhttpsになってたと前述したが、そのせいで、gitlab-runnerを動作させると、最初にgit cloneするところで、SSL certificate problem: self signed certificate
というエラーになる。これを対応するためにclone_urlを別途設定する。
https://docs.gitlab.com/runner/configuration/advanced-configuration.html
privileged
後述するが、docker in dockerを利用するため、dockerの特権モードをtrueにしておく。
https://gitlab-docs.creationline.com/ee/ci/docker/using_docker_build.html
gitlab側の設定
こんな感じで、ymlを書いて、gitlabに登録する。
variables:
DOCKER_HOST: tcp://docker:2375/
DOCKER_DRIVER: overlay2
stages:
- post_deploy
generate-release-note:
tags:
- shell
only:
refs:
- tags
stage: post_deploy
image: docker:18-git
services:
- docker:18-dind
script:
- docker container run -e GITLAB_PERSONAL_TOKEN=XXXXXXXXXXXXXXXX \
-e GITLAB_PROJECT_ID=${CI_PROJECT_ID} \
-e GITLAB_API_ENDPOINT=http://hogehoge/gitlab/api/v4 \
-e TARGET_BRANCH=master \
-e TZ=Asia/Tokyo \
00freezy00/gitlab-release-note-generator
Trouble shooting
dind
何も考えず、sample通りに動作させていたら、
Cannot connect to the Docker daemon at tcp://docker:2375. Is the docker daemon running?
みたいなエラーが出る。
↓を参考にdocker imageの設定を変更することで、エラーを解消した。
https://forum.gitlab.com/t/gitlab-shared-runner-can-not-connect-to-docker-daemon-and-leaks-secrets/28298
tags
gitlab runnerのregister時に登録したtagを設定することで動作する。なので、以下のような記載の追加がgitlab-ci.yml側に必要。(勿論、tagを変更した場合はそれに対応して設定する。)
tags:
- shell
TZ
TZのDefaultがまさかの"Australia/Melbourne"
だった(笑)、なので変更。
補足
dockerhubの以下を利用して動作させているが、ローカルで動作させたいときは、docker pullで取ってきて、buildする必要がある。
https://hub.docker.com/r/00freezy00/gitlab-release-note-generator