GitLab-CI on docker を触ってみた


前回の投稿（[GitLab on docker のバージョンアップをしてみた](http://qiita.com/DG0426/items/28b205901fca9eaff80a)）でGitLabのversionが8.3.0になったので、CI機能を触ってみました。
※GitLabは以前CIサーバーを別途用意する必要がありましたが、8.0以降CI機能が本体にマージされました。

# 環境
ホストのCentOSにVirtualBoxでUbuntuを作成し、その中にdockerを入れています。

* HostOS: CentOS release 6.5
* GuestOS: Ubuntu 14.04 LTS
* docker version: 1.9.1
* docker container
  * gitlab
  * postgresql
  * redis

# 作業
今回も[sameersbn@Github](https://github.com/sameersbn)さんにお世話になりたいと思います。
GitLabについては前述した「[GitLab on docker のバージョンアップをしてみた](http://qiita.com/DG0426/items/28b205901fca9eaff80a)」を使用しております。

## docker pull 
先に必要なdockerイメージをpullしておきます。

```shell-session
$ sudo docker pull [REPOSITORY]:[TAG]
$ sudo docker images | grep gitlab-ci-runner
REPOSITORY             TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
sameersbn/gitlab-ci-runner   5.2.1               e51ef07f6f1f        12 months ago       350.4 MB
```

## CI時に使用するディレクトリを作成

```shell-session
$ mkdir -p /opt/gitlab-ci-runner
```

## GitLab上にCIを行うためのプロジェクトを作成

今回はシンプルに構成します。
sample.pyはpy.test用に汚いコードとしております。

 - python-ci-sample
   - test
     - sample.py
   - .gitlab-ci.yml

```py:test/sample.py


import os
import sys


class A(object): pass


def func(x, y = 2):
    return x, y

def main():
    l = [1,2, 3, 4, 5]
    d = {'a': 1, 'b': 2}

if __name__ == "__main__":
    main()
```

```yaml:.gitlab-ci.yml
job1:
  script: echo "Hello CI!"

job2:
  script: pwd; cat /etc/lsb-release

job3:
  script: pep8 test/sample.py

job4:
  script: py.test --pep8 test/sample.py
```

## CI-Runnerとの連携準備

プロジェクトのSettings => Runnersを押下すると、「Specific runners」という項目が表示されます。
ここのURLとtokenをコピーしておきましょう。

続いて、dockerが起動しているServerにinして、次のようなコマンドを打ちます。
※URL, token, マウント先は適宜書き換えて下さい。

```shell-session:setup.sh
#!/bin/bash

CI_SERVER_URL="上記のURL"
REGISTRATION_TOKEN="上記のtoken"

## SETUP
docker run --name gitlab-ci-runner -it --rm \
 -v /opt/gitlab-ci-runner:/home/gitlab_ci_runner/data \
 --env CI_SERVER_URL=${CI_SERVER_URL} \
 --env REGISTRATION_TOKEN=${REGISTRATION_TOKEN} \
 sameersbn/gitlab-ci-runner:5.2.1 app:setup
```

これを実行すると、プロジェクトのSettings => Runnersに「Runners activated for this project」が表示されます。これで連携の準備ができました。

## CI実行

まずは先ほど設定したrunnnerを起動します。
※runnerには予めpep8やpytestをインストールしています。

```shell-session:run.sh
#!/bin/bash

CI_SERVER_URL="上記のURL"
REGISTRATION_TOKEN="上記のtoken"

## RUN
docker run --name gitlab-ci-runner -it --rm \
 -v /opt/gitlab-ci-runner:/home/gitlab_ci_runner/data \
 --env CI_SERVER_URL=${CI_SERVER_URL} \
 --env REGISTRATION_TOKEN=${REGISTRATION_TOKEN} \
 sameersbn/gitlab-ci-runner:5.2.1
```

これで.gitlab-ci.yml に記載された内容でCIが走ります。

## 結果確認

GitLabプロジェクト => Buildsを押下して下さい。

Runningタブに4種類のjobが実行されているはずです。（今回は簡単なものなので、すぐにFinishedタブに移動してしまうと思います。）

下記は参考画像です（jobが異なりますが、上記job4の結果と同じものになります）

![gitlab-ci-sample.png](https://qiita-image-store.s3.amazonaws.com/0/58725/1bafac3e-3c07-3be9-7407-8fe9ad393d5a.png)

## おわりに

GitLab-CIが手軽に使用できるようになりました。まだまだ機能全般を把握できていないので、いろいろ試してみようと思います。できれば既存プロジェクトに使ってみたいな～（遠い目）

# 参考リンク

[GitLab Documentation / docker](http://doc.gitlab.com/ce/ci/docker/using_docker_images.html)
[GitLab Documentation / quick_start](http://doc.gitlab.com/ce/ci/quick_start/README.html)
[GitLab Documentation / yaml](http://doc.gitlab.com/ce/ci/yaml/README.html)
[GitLab.org / GitLab CI Runner](https://gitlab.com/gitlab-org/gitlab-ci-runner)
[GitLab.org / omnibus-gitlab-runner](https://gitlab.com/gitlab-org/omnibus-gitlab-runner/blob/master/doc/build/README.md)
[sameersbn/docker-gitlab-ci-runner](https://github.com/sameersbn/docker-gitlab-ci-runner)
[pytest で pep8 テストを実行する](http://dev.ariel-networks.com/wp/archives/2491)