CI/CDのためにGitLab RunnerをDockerで動かす準備～EHW2018「環境整備⑧」 

# 概要

このエントリは、「Enterprise "hello, world" 2018 Advent Calendar 2018」の12/21向けのものです。このAdvent Calendarでは、複数個のエントリにまたがる話の流れも鑑みつつ、なるべく1エントリで1つのトピックをカバーできるようにする予定です。

このエントリで記載するトピックは、CI/CDのためにGitLab RunnerをDockerで動かす準備です。

今までのトピックをつなげると、1台のPCの中の「コンテナ盆栽」環境は、下図のようになります。

![EHW2018DevEnv(1)(1)(1).png](https://qiita-image-store.s3.amazonaws.com/0/65002/e85a8205-5e0f-27d1-b26b-9780d3434c40.png)


# 前提

## おことわり

- このEnterpfise "hello, world"シリーズは、ネタのためのエントリです。実環境でそのまま利用ことを目的とはしていません。
- 動かしやすさを優先してセキュリティを意図的に低くする設定など入れてありますのでご注意ください。

## 想定読者

「Enterprise "hello, world" 2018」的なネタとしては、下記のような状況を想定しています。

> CI/CDの考え方から言って、GitLabにリポジトリを作ったあとには、デプロイの前にテストを実行しなくてはいけない。

# GitLab Runnerの準備

## GitLab Runnerとは

[Gitlab Runner](https://docs.gitlab.com/runner/)は、GitLabでCI/CDを実現する際に用いる、GitLabからジョブの指示を受け取って結果を返すワーカです。

ワーカの動作のさせ方は、指定したホスト内でプログラムとして動かしたり、Dockerコンテナ内で動かしたりなどいくつかの方法があります。何ができて何ができるかは、[サイト内に表](https://docs.gitlab.com/runner/executors/README.html#compatibility-chart)があります。
表をちらっとみると、Kubernetesで動かす方法が、もっともできることの数が多いのですが、このエントリでは、次に出来ることの数が多いDockerコンテナとして動かします。

## GitLab

GitLab Runnerのインストールにあたり、GitLabからのトークンが必要となります。
管理者権限(今までのAdvent Calendarの手順では"root")でログインし、GitLabの"/admin/runners"にアクセスします。

![Screenshot_2018-12-28_09-01-01.png](https://qiita-image-store.s3.amazonaws.com/0/65002/976128df-b2ed-d5c5-5c77-9f957566b662.png)


![Screenshot_2018-12-28_08-36-08.png](https://qiita-image-store.s3.amazonaws.com/0/65002/65de34ff-d785-b96b-f0f1-7e5e9c4a232c.png)


```yaml
  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! 
```

![Screenshot_2018-12-28_09-07-05.png](https://qiita-image-store.s3.amazonaws.com/0/65002/5e1c43e8-a606-4ca9-1ac2-c82b9acd0658.png)



```shell-session
$ sudo docker-compose up gitlab-runner
```

<details><summary>起動の様子</summary><div>

```shell-session

$ 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
```
</div></details>

管理画面をリロードすると、「Runners currently online」が1になっています。


![Screenshot_2018-12-28_09-09-10.png](https://qiita-image-store.s3.amazonaws.com/0/65002/c25d0ffa-87de-a30e-c0af-ee4b5b0f0200.png)

# CIの実行

.gitlab-ci.ymlファイルを用意して、commit, pushします。

```yaml
image: alpine:3.8.2

stages:
    - hello

print_hello:
    stage: hello
    tags:
        - test
    script:
        - echo hello, world!
```

で、これでコミットするとジョブコケますので、いくつか足回りの設定を加えます。
これまでのエントリの設定通りだと、下記のように、gitlab.ehw2018.localが名前解決できないでエラーとなるでしょう。

![Screenshot_2018-12-29_23-26-06.png](https://qiita-image-store.s3.amazonaws.com/0/65002/d26ed175-649d-bcab-c341-3a49b57d7c21.png)

## gitlab-runnerの設定

gitlab-runnerの設定ファイル(/etc/gitlab-runner/config.toml)に、network_modeとして、docker-composeのカスタムネットワークを指定します。

```
(一部抜粋。全体は下記の折りたたみにあります)
[[runners]]
  [runners.docker]
    network_mode = "ehw2018.local"
```

<details><summary>/etc/gitlab-runner/config.toml</summary><div>

```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]
```
</div></details>

docker-composeの、ネットワーク設定も、ドメイン名が「dhw2018.local」変えておきます。

```yaml
(一部抜粋)
networks:
  extnet:
    name: ehw2018.local
  intnet:
    name: ehw2018-internal.local
```

設定を直し、「$ sudo docker-compose down」して「$ sudo docker-compose up -d」したあとで、しばらくしてGitLabが再起動したあたりで、CIをもう一度「Retry」で走らせてみます。

![Screenshot_2018-12-29_23-44-24.png](https://qiita-image-store.s3.amazonaws.com/0/65002/3d586a74-2200-0b3a-9e0e-3406b76c166d.png)

文字列をechoするだけのジョブは成功しました。ここまでで、GitLabからGitLab-runnerを動作させ、内部でCI用のジョブが動作するところまでが確認できました。

## パイプラインを変更

.gitlab-ci.ymlを下記のように書き換え、coommit+pushします。前述のものと異なり、

- イメージは、nodeの公式のもので、alpineベースのものを使用しています(npmがすぐ動くように)
- testのステージを追加し、npmでのパッケージのダウンロードと、テスト(mithrilのospec)を実行しています



```yml
image: node:8-alpine

stages:
    - test

exec_test:
    stage: test
    tags:
        - test
    script:
        - npm install
        - npm run test

```

commit+pushすると

![Screenshot_2018-12-29_23-54-54.png](https://qiita-image-store.s3.amazonaws.com/0/65002/64f1e18e-a007-67d8-1c03-23354d65db93.png)

テストが成功しました。これで、GitLabにソースがpushされるたびに、テストが実行できる環境ができました。

# 補足: api-serverの方

[第18日目の、Ginで書いたAPI Server](https://qiita.com/hrkt/items/d7ccc2ea3f571f3b1040)について、.gitlab-ci.ymlは以下のような感じになります。

```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のネタとしては、このあと、ついにデプロイができるのではないかとを考えています。