オンプレの GitLab サーバーに GitLab Runner を同居させて GitLab CI/CD を動かす（Docker編）

# オンプレ環境
- CentOS : 7.2.1511
- Docker : 1.13.1
- Docker Compose : 1.11.1
- GitLab : 10.1.1
- GitLab Runner : 11.1.0
    - 極力 GitLab とバージョンは合わせたほうが良いと思います。

# 前提条件
- オンプレ上で GitLab が動いていること
    - 自分の場合、Docker Composeで環境構築してます
        - https://github.com/sameersbn/docker-gitlab
- GitLab のバージョンは 8.0 以上であること
    - 8.0のメジャーアップデートで GitLab CI が GitLab CE/EE に統合されたため
- GitLab Runner は Docker で構築します（Shellでも可）

# .gitlab_ci.yml
プロジェクト直下に `.gitlab_ci.yml` を作成する

ex. Node App を Heroku にデプロイするケース

```yaml:.gitlab_ci.yml
image: node:latest

stages:
  - production

production:
  type: deploy
  stage: production
  image: ruby:latest
  script:
    - apt-get update -qy
    - apt-get install -y ruby-dev
    - gem install dpl
    - dpl --provider=heroku --app=zyyx-slack-bots --api-key=$HEROKU_API_KEY
  only:
    - master
```

`$HEROKU_API_KEY` は GitLab に隠蔽します。
Project > Settings > CI/CD > Secret variables

![CI___CD_Settings_·_CI___CD_·_00000_zyyxall___zyyx-slack-bots_·_GitLab.png](https://qiita-image-store.s3.amazonaws.com/0/121942/1128279d-d179-7090-5925-3fd001363e1b.png)




# GitLab Runner
## Shared Runners と Specific Runners の違い
**Shared Runners**

> - プロジェクト毎にいちいちRunnerの環境を構築しなくても良くなる
- Runnerがアイドリング状態で遊び続け、リソースが無駄になることを抑止できる

**Specific Runners**

> - 自分のプロジェクトのビルドを実行する際に、他のプロジェクトのビルドが完了するまで待たされることが無い
- Runnerにプロジェクト固有の設定を追加できる
- 別ユーザーと隔離された環境で自分のプロジェクトのジョブを実行できるのでセキュリティレベルを担保しやすい

https://dev.classmethod.jp/ci/gitlab-runner-ci-cd-1/ より引用

## Shared Runners

1. Admin アカウントで GitLab にログイン
2. Admin Area (ex. https://my-gitlab.com/admin) にアクセス
3. 左ナビ Overview > Runners から URLとトークンを取得（以下キャプチャ）

![Admin_Area_·_GitLab.png](https://qiita-image-store.s3.amazonaws.com/0/121942/f5d81475-0a5f-c533-8863-51194467078d.png)

## Specific Runners

1. 任意プロジェクトの Master 権限以上のアカウントで GitLab にログイン
2. 任意プロジェクトの 左ナビ Settings > CI/CD > Runners settings から URLとトークンを取得（以下キャプチャ）

![CI___CD_Settings_·_CI___CD_·_00000_zyyxall___aws_controller_·_GitLab.png](https://qiita-image-store.s3.amazonaws.com/0/121942/744d215f-2b37-0dfb-3ea3-5a82dc45ab99.png)


## Runner 登録手順
Docker のみでも動かすこと可能ですが GitLab を Docker Compose で動かしているため、GitLab Runner も Docker Compose を使用しました。

YAMLファイルの中身は以下の通りです。

```yaml:docker-compose.yml
version: '2'

services:
  runner:
    restart: always
    image: gitlab/gitlab-runner:v11.1.0
      # v11.1.0 は、任意のバージョンを指定
      # [Released Tags] https://hub.docker.com/r/gitlab/gitlab-runner/tags/
    volumes:
      - /home/docker/gitlab_ci/runner:/etc/gitlab-runner
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/ssl/certs:/etc/ssl/certs
        # 最終行は、自己証明書の場合のみ必要
        # ホストの公開鍵を GitLab Runner が動くコンテナにマウント
```


1. GitLab Runner 用のディレクトリを作成＆移動  
`$ mkdir -p /usr/local/docker/gitlab_ci/ && cd /usr/local/docker/gitlab_ci/`
2. YAMLファイルを作成（中身は上記参照）   
`$ vi docker-compose.yml`
3. Dockerコンテナの起動＆プロセスの確認   
`$ docker-compose up -d && docker-compose ps`
4. コンテナに接続   
`$ docker exec -it gitlabci_runner_1 bash`
5. GitLab Runner 登録コマンドを実行し、情報を入力して完了   

```terminal
$ gitlab-runner register
Running in system-mode.                            
                                                   
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
[Shared/Specific Runners の URL]
Please enter the gitlab-ci token for this runner:
[Shared/Specific Runners の トークン]
Please enter the gitlab-ci description for this runner:
[8c8a66fc1750]: [任意]
Please enter the gitlab-ci tags for this runner (comma separated):
[任意]
Registering runner... succeeded                     runner=-w4gGJzV
Please enter the executor: parallels, shell, ssh, virtualbox, docker, docker-ssh, docker+machine, docker-ssh+machine, kubernetes:
[docker]
Please enter the default Docker image (e.g. ruby:2.1):
[任意]
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded! 
```

**Docker Compose を使わず、Docker 単体で動かしたい場合**
手順1〜3の代わりに、以下のコマンドを実行する

```terminal
$ docker run -d --name gitlab-runner --restart always \
    -v /srv/gitlab-runner/config:/etc/gitlab-runner \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v /etc/ssl/certs:/etc/ssl/certs \
    gitlab/gitlab-runner:v11.1.0
```

## 登録済みの Runner
Admin アカウントで Admin Area > Overview > Runners (ex. https://my-gitlab.com/admin/runners) から確認可能です。

![Admin_Area_·_GitLab.png](https://qiita-image-store.s3.amazonaws.com/0/121942/b6041af5-4eed-5bd2-a799-5e360621be85.png)

# GitLab CI/CD
各プロジェクトの CI/CD > Pipeline から実行可能です。

![Pipelines_·_00000_zyyxall___zyyx-slack-bots_·_GitLab.png](https://qiita-image-store.s3.amazonaws.com/0/121942/41029812-0b97-4b14-1264-e4cc74f35273.png)

# 参考URL
- GitLab Offical
    - Install      
https://docs.gitlab.com/runner/install/docker.html   
    - Register   
https://docs.gitlab.com/runner/register/index.html#docker
- Deploy Node.js App with GitLab CI/CD   
https://medium.com/@seulkiro/deploy-node-js-app-with-gitlab-ci-cd-214d12bfeeb5
- GitLab RunnerでCI/CDしてみる(前編)   
https://dev.classmethod.jp/ci/gitlab-runner-ci-cd-1/

# さいごに
個人ブログにオリジナル（日本語＆英語）をUPしています。
この記事が良いと感じた方は、そちらにもリアクション頂けると嬉しいです:relaxed:
https://blog.n11sh1.com