みなさんはアプリケーション開発でCI/CDを行っていますか?
私は個人だけで開発することが多く規模も小さい案件だったので、CI/CDに興味はあったのですが、実際にやったことや関わったこともなく、知識もほとんどありませんでした。
そこで今回は私の学習を兼ねて、CI/CDの環境をDockerで構築して試してみたいと思います。
CI/CDツールとしてはgitlabと親和性の高いgitlab-runnerをDockerコンテナで構築して試してみました。
もし、私のようにCI/CDがどのように動くかを理解したい方は是非参考にしてみてください。
今回の目的
GitlabへGitlab-Runnerを登録して、CI/CDが実際にどのように動くかどうかを確認します。
今回はCI/CDについての初心者向けの入門という位置づけで、まずは動くとこまで確認したいと思います。
今回の構成
今回の構成としては以下のような感じになります。
CentOS7の上にDockerをインストールして、Dockerを使ってGitlabとGitlab-Runnerの環境を構築します。
docker-compose.yamlではまとめて2つを定義してコンテナを起動することができますが、gitlabとgitlab-runnerは1対多の関係になることが多いと思いますので今回は別々で構築します。

CentOS上のディレクトリ構成としては以下の様に構成しました。

コンテナの構築
Gitlabコンテナの構築
はじめにGitlabから構築していきます。以下の記事に従ってGitlabを構築してください。
1点だけ注意となりますが、以下の記事の中ではhttps://gitlab.xxxxxというSSLでかつホスト名で構成していますが、後々Runnerで登録する際にエラーになってしまうのでhttp://192.168.xx.xxというSSLを使わずにIPアドレスとしてGitlabを構築してください。
Gitlab-Runnerコンテナの構築
次にRunnerコンテナを構築します。
docker-compose.yamlの準備
まずは上の構成に従って「/root/docker/runner」のディレクトリを作成し、その中にdocker-compose.ymlファイルを作成します。
version: '3'
services:
runner:
image: 'gitlab/gitlab-runner:latest'
restart: always
volumes:
- ./srv/gitlab-runner/config:/etc/gitlab-runner
- /var/run/docker.sock:/var/run/docker.sock
Dockerの起動・確認
コンテナを起動します。こんな感じでコンテナが起動していることを確認します。
[root@gitlab runner]# docker-compose up -d
[root@gitlab runner]# docker-compose ps
Name Command State Ports
----------------------------------------------------------------
runner_runner_1 /usr/bin/dumb-init /entryp ... Up
Gitlabサーバへログオン/Project作成/トークンの取得
Gitlabへログオン
コンテナが起動したあとにgitlabへアクセスしてみます。今回はlocalhostの80番ポートで作っているので http://192.168.10.31 へアクセスします。
注意となりますがGitlabサービスが起動するのには結構時間がかかりますのでしばらくまってください。私の環境では5分くらいかかりました。

プロジェクト作成
適当なプロジェクトを作成します。私は以前に以下の記事で作った「aws-gitlab-bk」を使います。
トークンを取得
[Setting]->[CI/CD]->[Runner]を開いてGitlabのURLとトークンを取得します。

gitlab-runnerを登録(Regist)
ではいよいよ、Gitlab-runnerをGitlabへ登録します。
この作業はGitlab-Runnerへ接続して、gitlabへrunnerを登録するためにコマンドを打ち込みます。
// コンテナに接続
[root@gitlab runner]# docker exec -it runner_runner_1 /bin/bash
// gitlab-runner register コマンド実行
root@d2800979f1db:/# gitlab-runner register
・
・
Enter the GitLab instance URL (for example, https://gitlab.com/):
http:// 192.168.10.31/ <- 先ほどのURL
Enter the registration token:
XXXXXX <- 先ほどのトークン
Enter a description for the runner:
[d2800979f1db]: docker-runner <- Runnerの名前
Enter tags for the runner (comma-separated):
docker-runner
・
・
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
Gitlab上に戻って正しく登録されていることを確認します。

とりあえずテストのためにtagを指定しなくても動作するように以下の設定を変更します。これを変更しておかないとPendingのまま動作しません。

.gitlab-ci.ymlの作成
テストのために以下の様な.gitlab-ci.ymlを作成します。
あくまでテストのためで特に実践では使えませんがCentOSのイメージを取得して、yum updateしているだけです。
image: centos
test:
script:
- yum update -y
- echo test
何かファイルを修正してpushするとCI/CDが開始されれば成功です。

事項された中身をみるとCentOSのイメージを取得→GitlabからClone→yum update -y の実施という流れで実行されていることが分かります。

まとめ
これでCI/CDの環境としては構築できました。やはり自動チェックされるというのは重要ですね。
次は実践的に使えるLintやValidateなどを実行するCI/CD環境を作ってみたいと思います。
今回は以上となります。
ハマったポイント
この方法にたどり着くまでに結構苦労したので参考のためにメモしておきます。
主に、構成として1つのdocker-compose内にgitlabとrunnerのコンテナを混在させようとした場合にハマった内容です。
Cannot connect to the Docker daemon
ERROR: Removing network for build
ERROR: Preparation failed: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? (docker.go:1027:0s)

このエラーの原因はGitlab Runner内でDockerでテストしようとしたら、ホストPCのdocker.sockがなくて実行できなかったというエラー内容です。
docker-compose.ymlファイルの以下の部分が怪しいです。まずは/var/run/docker.sockが存在するかも含めてチェックしてしてください。
- /var/run/docker.sock:/var/run/docker.sock
fatal: unable to access ‘http://gitlab/root/testproject.git/’: Could not resolve host: gitlab
Fetching changes with git depth set to 50...
Reinitialized existing Git repository in /builds/root/testproject/.git/
fatal: unable to access 'http://gitlab/root/testproject.git/': Could not resolve host: gitlab

これはGitlab Runnerでテスト用のDockerコンテナを作成するところまではうまくいってます。エラーになっているのはテスト用のDockerコンテナからGitlabにあるリポジトリを取得しようとしたけど、名前解決ができない。という内容です。
対応としてはGitlabRunnerの設定に[extra_host]を追加して、テスト用のDockerからも名前解決できるように紐付けを行ってあげる必要があります。
※最終的には今回の記事で紹介したように別々のコンテナとして管理しました。
Failed to connect to gitlab port 80: Operation timed out
fatal: unable to access 'http://gitlab/root/testproject.git/':
Failed to connect to gitlab port 80: Operation timed out

Dockerのオススメ勉強方法
私がオススメするDocker初心者向けの最初に購入すべき書籍は「さわって学ぶクラウドインフラ docker基礎からのコンテナ構築」です。
さわって学ぶクラウドインフラ docker基礎からのコンテナ構築

本書ではDockerの基本的な概念などの座学ももちろんありますが、実際に、Dockerのインストール方法やWebサーバーをコンテナで構築するハンズオンを通じて学習することができるため、特に初心者の方はは分かりやすい内容となっています。
今回は以上となります。
コメント