茶太郎の日記

クラウドやコンテナ辺り中心に技術をやっていきます

GitLabのCI環境を構築してみる

やってみたきっかけ

インフラCI実践ガイド を買って読み始めたことと、
Ansible Night in Tokyo 2018.09 のイベントでGitLabを使ったCIの話があったようで、
書いている時点ではまだ資料が上がっていませんが自分なりに試してみようと思いました。

Install GitLab-CE Core

動作要件

まずはGitLabを動かすのに必要なリソースを確認です。
docs.gitlab.com リンクを調べてみるとサーバはメジャーなLinuxなら大抵動くようなので
今回はVagrant(VirtualBox)でデプロイしたCentOS7にしました。
またMemoryは最低4GB/推奨8GBということでしたが念のために8GB、
CPUは2Coreが推奨でしたが100usersまでなら1Coreでも良さそうなので1Coreにしました。

インストール方法

次はGitLab(CE)のインストール方法です。 about.gitlab.com 手順がまとまっているのでほぼコピペで進められました。

1. Install and configure the necessary dependencies

sudo yum install -y curl policycoreutils-python openssh-server openssh-clients
sudo systemctl enable sshd
sudo systemctl start sshd

sudo firewall-cmd --permanent --add-service=http
sudo systemctl reload firewalld

この次にpostfixのインストールがありますが、Slack等の別の通知方法でよければskipしても良いとのことだったのでスキップしました。

2. Add the GitLab package repository and install the package

GitLabのパッケージなどが含まれているyumリポジトリを追加します

curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash

次にGitLabのパッケージインストールするのですが、
本文をよく見るとhttp://gitlab.example.comのところを環境に合わせて書き換えるように書いてあるのですが、
英語だったのでスルーしてそのまま入力してしまい後ほど少々困りましたが、
後から書き換えてreconfigureでちゃんと動きました。

sudo EXTERNAL_URL="http://gitlab.example.com" yum install -y gitlab-ce

↑のせいかもしれませんが、
「インストールとともにconfigureとstartが走ってURLにアクセスすれば繋がる」的なことが書いてあるのですが、
psなどを見て動いていなさそうだったのでインストールメッセージにあったコマンドを実行して起動させました。

sudo gitlab-ctl reconfigure

その後vagrantで割り当てたIPアドレスをブラウザに打ち込むとGitLabの画面が表示され、
rootのパスワード設定をしてメイン画面に入れました。

この段階でGitのリポジトリとしては十分動作します!

個人的に驚いたのはWeb IDE機能です。
Gitなのでしばらくはローカルからcommit & pushしていましたが、
ある程度のシンタックスが効いたりオートインデントしてくれるので、
ちょっとした変更ならWeb IDEでも良さそうです。
この辺はGitHubAWSのCode Commitは弱いのでGitLabの意外な強みですね。

また色々説明が英語で書かれてて読み飛ばすとリスキーであることはわかったので、
ユーザ設定から言語を日本語に変更しました。言語を変えられるのは地味に助かりますね。
ただし新しい機能解説なのか英語のままというところもチラホラあるのでやっぱり英語は避けて通れませんね。

Install GitLab Runner

GitLabの自分的目玉であるCIをするには、当然何らかの実行基盤が必要です。
それを提供するのがGitLab Runnerです。

docs.gitlab.com

Admin Area -> 概要 -> Runner
Setup a shared Runner manuallyとしてインストール方法のリンクが記載されています。

インストール方法

1. Simply download one of the binaries for your system:

# Linux x86-64
sudo wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64

2. Give it permissions to execute:

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

3. Optionally, if you want to use Docker, install Docker with:

Optionallyと書いてありますが、DockerでCIを動かしたかったのでインストールしました

curl -sSL https://get.docker.com/ | sh

4. Create a GitLab CI user:

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

5. Install and run as service:

(*) sudoだと/usr/local/bin/にPATHが通っておらず、ここはgitlab-runnerが叩けなかったのでrootで実行しました。

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

Register the Runner

docs.gitlab.com

1. Run the following command:

GitLab Runnerのインストールが済んだら、GitLab Runner側でGitLabの情報を登録します。

sudo gitlab-runner register

こちらのコマンドを実行することで対話的に設定することができます。
(コマンドにオプションを追加することでワンライナーで設定することも可能なようです)

2. Enter your GitLab instance URL

Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com )
http://<hostname>

3. Enter the token you obtained to register the Runner:

TOKENについては上記の
Admin Area -> 概要 -> Runner -> Setup a shared Runner manually -> 3.
に記載されています。

Please enter the gitlab-ci token for this runner
xxx

4. Enter a description for the Runner, you can change this later in GitLab's UI:

Please enter the gitlab-ci description for this runner
[hostame] gitlab01

5. Enter the tags associated with the Runner, you can change this later in GitLab's UI:

タグは適当に割り当てておきましたが、私の使い方だとあまり活用できてません。

Please enter the gitlab-ci tags for this runner (comma separated):
myself

6. Enter the Runner executor:

GitLab CIの実行環境を選びます。今回は先述の通りdockerを選択しました。いずれkubernetesなども使ってみたいですね。

Please enter the executor: ssh, docker+machine, docker-ssh+machine, kubernetes, docker, parallels, virtualbox, docker-ssh, shell:
docker

7. If you chose Docker as your executor, you'll be asked for the default image to be used for projects that do not define one in .gitlab-ci.yml:

Docker Imageを指定しなかった場合のデフォルトのイメージを指定します。大抵指定すると思うのであまり考えずにコピペでalpine:latestにしました。

Please enter the Docker image (eg. ruby:2.1):
alpine:latest

これでgitlab-runner registerの設定は完了です。

Runnerの確認

次にGitLab側でRunnerが登録されたか確認します。
うまく登録されていれば以下のようにRunnerが表示されているはずです(ローカルなのでトークンも未加工でサボり) f:id:chataro00:20180925013307p:plain

この画面では表示されていませんが、同じようにインストールしていると最初はlockedというタグがついているかと思います。
この状態だとCIには使えないため解除する必要があります。

Runner tokenの列に記載されているIDをクリックしてRunnerの設定画面に入ります。 f:id:chataro00:20180925014129p:plain 現在のプロジェクトをロックするのチェックを外してロックを解除しました。((gitlab-runner registerのオプションで最初からロックしないようにできるようです))
また、先述したようにタグの設定が有効とCIの記述が増えて面倒なのでRun untagged jobsにチェックを入れます。
これでタグの付いていないジョブ(後述)が実行されるようになります。

GitLab CIの動作確認

最後にCIが意図通りに動いてくれるか確認します。
CIの設定はリポジトリ直下に.gitlab-ci.ymlというファイルを作って記載していきます。(ファイル名/パスはリポジトリごとの設定で変更できるようです)

image: alpine:latest
stages:
    - test
    - deploy

test1:
    stage: test
    script:
    - pwd
    - ls -lR

deploy:
    stage: deploy
    script:
    - apk add git
    - git status

記述していくパラメータは以下のようになります。((.gitlab-ci.ymlの書き方はまだ勉強中なので最小限です))

  • image 使用するコンテナイメージを指定
  • stages パイプライン上段に書かれる工程
  • <job>ジョブ名
    • stage stagesで指定したステージに紐付けます
    • script実行するコマンド

このように指定すると以下のようなパイプラインで実行されます。
各ジョブをクリックするとその実行経過&結果が表示されます。

f:id:chataro00:20180925020101p:plain

注意すべき点は、ジョブ毎に実行するコンテナが別々になる、ということ。
そのため、pre-buildのようなジョブで何かを準備していても、別のジョブではその準備が引き継がれません。
この辺りはもしかしたらうまい方法があるかもしれないので調査するとともに情報提供お待ちしています。

次にやったこと(次回予告)

次にやったことは、
PackerのAnsible Provisonerを使ってAMIをCI/CDする です。

ですが、今回はここまでにして次回に解説を回したいと思います。

一応順次更新中ですがGitLabにおいているのと同じリポジトリGitHubに置いておきましたので、先に見たい方はご覧ください。

github.com