まず最初はdocker
最近やっぱりdocker
にハマっているのもありますが簡単そうなのと環境的にはホストOSと環境が別れているような物なので環境を作り直すのに何かあった時は楽に復旧できそうです。(毎回作り直すので)
インストール
$ docker pull gitlab/gitlab-runner:latest
latest: Pulling from gitlab/gitlab-runner
064f9af02539: Already exists
390957b2f4f0: Already exists
cee0974db2b8: Already exists
c8144262002c: Already exists
7a0374749bc1: Pull complete
d73a93a666cb: Pull complete
2fb68deec158: Pull complete
a46cfb7c401d: Pull complete
5566b54e1ba1: Pull complete
Digest: sha256:01cb604ebb8ff1e5d7a788ce86172c86d20041aa88a7587dad812292d7daae79
Status: Downloaded newer image for gitlab/gitlab-runner:latest
$
docker
は別途インストールする必要はありますが、そこは省略(笑) 入っていればこの1行で入ります。
起動
$ docker run -itd \
--name gitlab-runnder \
-h gitlab-runnder \
-v `pwd`/gitlab-runner/config:/etc/gitlab-runner
gitlab-runnder:latest
起動確認
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6050fe0176e8 gitlab-runnder:latest "/usr/bin/dumb-init /" 2 minutes ago Up 2 minutes gitlab-runnder
528b306382ba gitlab8:sameersbn8.11.2 "/sbin/entrypoint.sh " 11 minutes ago Up 11 minutes 80/tcp, 0.0.0.0:22->22/tcp, 443/tcp gitlab8
ba742054a60c nginx:1.2.1 "/sbin/init 3" 30 minutes ago Up 30 minutes 0.0.0.0:80->80/tcp nginx
gitlab-runner
動いていますね。 gitlab
自体もdocker
で動かしているので隣で動いているような感じになっています(笑)
登録
次に、runner
をGitlab
に登録します。
事前に登録する前に、Gitlab
側のtoken
を知らないと登録できません。1
token
には2種類あって以下の物があります。
サーバーに登録
- 管理者エリアで
token
を確認します。
右上「」→「overview」→「runner」で表示されます。
こんな感じでtoken
が赤く表示されます。
登録コマンド
token
が分かったら次に登録処理のコマンドを実行します。
$ docker exec -it gitlab-runnder gitlab-runner register
Running in system-mode.
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/ci):
http://gitlab/ci
Please enter the gitlab-ci token for this runner:
xxLECy8zkytCyu8sSzdS
Please enter the gitlab-ci description for this runner:
[gitlab-runnder]: docker-runner
Please enter the gitlab-ci tags for this runner (comma separated):
Registering runner... succeeded runner=xxLECy8z
Please enter the executor: virtualbox, docker+machine, docker-ssh+machine, docker, docker-ssh, parallels, shell, ssh:
docker
Please enter the default Docker image (eg. ruby:2.1):
debian:7.9
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
するといくつか登録内容を聞かれるので入力します。
-
http://gitlab/ci
これは登録したいgitlab
サーバーのURLにci
付けて、登録先を指定します。 -
xxLECy8zkytCyu8sSzdS
これはサーバーのtoken
です。4 -
docker-runner
runner
の名前ですね。Gitlab
側で表示されても分かるように付けましょう。 -
次にタグですけど、カンマで複数登録できますしここでは空にしています。
CI
処理にこのタグで処理するという時の判断に使われます。 -
docker
今回はdokcer編なのでdockerですね(笑) -
debian:7.9
docker
の時に聞かれるのですが使用するイメージ(default)を指定します。docker hub
に登録されていイメージを指定します。5
無事登録されると以下のようにtoken
が表示されていた画面の下へ先ほど登録した名前(説明?)で表示されます。
サーバーに登録されたrunner
はプロジェクトの設定画面から登録されているrunner
を選ぶことができます。
プロジェクトに登録
サーバーに間接的に登録して選ぶのではなくプロジェクト側のtoken
で直接プロジェクトに登録します。
プロジェクトのtoken
はプロジェクトを開いて右上に表示される「歯車アイコン」→「runner」をクリックすると管理エリアと同じように次のように表示されます。
管理エリアからすでにサーバーに登録されている物から選ぶことができますし、先ほどの登録コマンド時token
入力でここでいう「-74uY9UmQun7dPuyaZTy」を登録すれば直接プロジェクトに登録することにします。一旦削除して、再度登録します。
登録コマンド
$ make regist
docker exec -it gitlab-runnder gitlab-runner register
Running in system-mode.
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/ci):
http://gitlab/ci
Please enter the gitlab-ci token for this runner:
-74uY9UmQun7dPuyaZTy
Please enter the gitlab-ci description for this runner:
[gitlab-runnder]: docker-runner
Please enter the gitlab-ci tags for this runner (comma separated):
Registering runner... succeeded runner=-74uY9Um
Please enter the executor: virtualbox, docker+machine, docker-ssh+machine, docker, docker-ssh, parallels, shell, ssh:
docker
Please enter the default Docker image (eg. ruby:2.1):
debian:7.9
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
token
以外変わらないです。
するとプロジェクトの設定画面で次のようになります。
CI実行!!
これで準備は整いました!
早速実行してみましょう。ほかのネット上のサービスCIは特定のファイルに書いてpush
する事がトリガーなのが主流です。gitlab
の場合はリポジトリの中に.gitlab-ci.yaml
に実行手順を書くことによって実行されます。
まずはCIの設定ファイル
image: debian:7.11
stages:
- check
- test
- deploy
code_check:
stage: check
script:
- echo "check1"
- echo "check2"
test1:
stage: test
script:
- echo "test"
deploy_production1:
stage: deploy
script:
- echo "deploy(production)"
only:
- release/production
deploy_staging1:
stage: deploy
script:
- echo "deploy(staging)"
only:
- release/staging
デフォルトではdebian:7.9でしたが設定ファイルの方で7.11を指定します。
最初のブロックのstages
ですがここで大枠の実行順序を指定します。
その下にはジョブと呼ばれるブロックがあり、最初には「code_check」があり、「stage: code_ceck」でstagesのどのステージにあたるかを書いています。
実行されるスクリプトは「scripts」の中で指定していきます。
ここでは実行スクリプトは単純に「echo」しているだけです。
次のステージ「test」ではジョブ「test1」があり。「deploy」のステージでは「production1」と「staging1」が用意されていますがそれぞれ、「only」で対象になるブランチが指定されています。
.gitlab-ci.yaml
と適当に一つソースを書いてmaster
にプッシュします。続けて「release/staging」にもプッシュします。
プッシュされるとサーバー上では.gitlab-ci.yaml
に従ってが実行され、以下のような実行結果になります。
master
ブランチは「check」「test」が実行されていますがrelease/staging
は「deploy」まで実行されているのが分かります。
それぞれのジョブ(ビルド)の結果はこんな感じになります。
前述の通りここではecho
だけですが、ログを見るとソースもクローンしてることが分かると思います。ソース中のシェルを指定するとコミットした物を実行できることが分かります。
チェック用の実行結果ですね。
デプロイが実行された結果です。
このようにリリース先毎のシェルとブランチを用意しておけばそのブランチにマージしただけでデプロイが自動で走るような事ができます。
もちろんチェックやテストでエラーになるとそれ以降のステージはスキップされるので、変なソースがデプロイされるのも防ぎます。