GitLab CIを動作させる

これまでGitLabを自PCで運用してきたのですが、CI/CD機能は未使用でした。
CI/CD機能を使用するためにはいくつかの手順が必要とのことで、調べながら作業して、なんとかCI/CD機能を動かすことができました。
ここでは、CI/CD機能を動かすまでに行ったことを、忘れないようにするために記録しておきます。
今回使用した試行環境は以下のとおりです。

- OS：Ubuntu 16.04 LTS
- GitLab：Dockerにて、sameersbn/gitlab:11.10.1イメージで運用

----------------------------------------------------------------

# 1. GitLab Runnerのインストール  
公式サイトの「[Install GitLab Runner manually on GNU/LinuxのUsing binary file](https://docs.gitlab.com/runner/install/linux-manually.html#using-binary-file)」に記載されている内容にしたがって、GitLabが稼働している実マシンに、GitLab Runnerをインストールします。

1. バイナリをダウンロード
   Proxy環境下では、必要に応じて`curl`コマンドの`-x`オプション等を使用してProxy情報を指定します。
   Proxy設定については、こちらを参照ください。→ [curlコマンドにてproxy設定](https://qiita.com/tkj/items/c6dad4efc0dff4fecd93)

    ```
    sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64
    ```

2. バイナリに実行権限を付与

    ```
    sudo chmod +x /usr/local/bin/gitlab-runner
    ```

3. GitLab CIユーザーを作成

    ```
    sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
    ```

4. サービスとしてインストール

    ```
    sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
    ```

5. サービスの実行

    ```
    sudo gitlab-runner start
    ```

6. （おまけ）サービスが実行されているか確認

    ```
    sudo gitlab-runner status
    ```

# 2. GitLabへGitLab Runnerを登録
1. GitLabでプロジェクトを開き、左側のメニューから `設定` > `CI/CD` を選択
2. `Runner`を展開して、`Set up a specific Runner manually` に記載されている`URL`と`トークン`を記録
3. Runnerの登録
   以下のコマンドで登録します。

    ```
    sudo gitlab-runner register
    ```
    - `Please enter the gitlab-ci coordinator URL` ... 上で記録した `URL` を入力
    - `Please enter the gitlab-ci token for this runner` ... 上で記録した `トークン` を入力
    - `Please enter the gitlab-ci description for this runner` ... Runnerの説明を適宜入力
    - `Please enter the gitlab-ci tags for this runner` ... タグを適宜入力
    - `Please enter the executor` ... `docker` を入力
    - `Please enter the default Docker image` ... CI実行環境として使用するDockerイメージ名を入力

# 3. ローカルのDockerイメージを使用するための設定  
CI実行環境としてDockerを選択した場合、ローカルに用意したDockerイメージを使用させるためには、`config.toml`への設定が必要となります。
以下の情報をもとに設定します。なお、ローカルのDockerイメージではなく、Docker Hubのイメージを使用する場合は、この設定は関係ありません。

- [GitLab-CIのRunnerでDockerのローカルイメージを使う#Runnerに"ローカルの"Dockerイメージを使わせる](https://qiita.com/sudachi808/items/4dcd6ad1c43010184459#runner%E3%81%AB%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%81%AEdocker%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%82%92%E4%BD%BF%E3%82%8F%E3%81%9B%E3%82%8B)
- 上のサイトの概要
  詳細は上のサイトを一読ください。概要としては以下のとおりです。
    - `config.toml`の`[[runners]]`セクションの`[runners.docker]`セクションに以下を追加

        ```
        pull_policy = "if-not-present"
        ```

- 公式サイトの「[https://docs.gitlab.com/runner/configuration/advanced-configuration.html#using-a-private-container-registry](https://docs.gitlab.com/runner/configuration/advanced-configuration.html#using-a-private-container-registry)」によると、編集する`config.toml`は以下の場所にあるとなっています。
  今回試行した環境では、1. の`config.toml`を編集しました。
    1. `/etc/gitlab-runner/config.toml` on *nix systems when GitLab Runner is executed as root (this is also path for service configuration)
    2. `‾/.gitlab-runner/config.toml` on *nix systems when GitLab Runner is executed as non-root
    3. `./config.toml` on other systems

# 4. clone元を変更するための設定  
今回試行した環境では、CI対象をcloneする際、`http://localhost` からcloneしてしまいました。
これを、localhostではなく、GitLabサーバーのアドレスを指定してcloneするように変更するためには、`config.toml`への設定が必要となります。
以下の情報をもとに設定します。

- [Self-Managed な社内 Gitlab をhttps化 したら Gitlab Runnerがうまく動かなかった件#対策2](https://qiita.com/nishioka-sctv/items/3284d38121d07d900f35#%E5%AF%BE%E7%AD%962)
- 上のサイトの概要
  詳細は上のサイトを一読ください。概要としては以下のとおりです。
    - `config.toml`の`[[runners]]`セクションに`clone_url`キーを追加し、値としてGitLabのURL（`[[runners]]`セクションの`url`キーと同値）を記載

        ```
        clone_url = "http://<GitLabアクセスアドレス>:<GitLabアクセスポート>/"
        ```

# 5. Dockerイメージを用意  
CI実行環境として、独自のDockerイメージを使用する場合は、イメージを作成しておきます。
例えば、「Docker Hubで公開されているAlpine LinuxのDockerイメージをベースにして、OpenJDKとMavenが格納されたイメージを用意する」といったことが考えれます。

# 6. .gitlab-ci.ymlを用意  
`.gitlab-ci.yml`を用意して、プロジェクト配下に配置します。

----------------------------------------------------------------

ここまでで、一応、CI機能を動作させることができました。  

-- 以上 --