gitlab-release-note-generatorを使ってみた。

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を書く。

```docker-compose.yml
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` を直接編集した。

``` 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に登録する。

``` .gitlab-ci.yml
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