Dockerコンテナ上にGitLab Runnerを構築してGitLabに登録する

CICDのアイキャッチ画像プログラミング
プログラミング

今回は、Dockerホスト上にGitLab Runnerのコンテナを構築し、構築済みのGitLabと連携する手順を説明します。

前提

  • GitLabサーバーが構築済み

構成

簡単ですが、以下のような構成です。

各OS・アプリケーションのバージョン情報

  • Ubuntu Server: 18.04
  • Docker: 19.03.5, build 633a0ea838
  • GitLabサーバー: 11.0.4
  • GitLab Runner: 12.5.0

GitLab Runner用ホストの構築

AWS上にUbuntu Server18.04を起動して、sshログイン後、以下の手順を進めます。

パッケージアップデート

$ sudo apt -y update && sudo apt -y upgrade

Dockerを公式リポジトリからインストール

$ sudo apt -y install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common \
    git
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
$ sudo apt update
$ sudo apt -y install docker-ce

Dockerのインストール確認

$ docker -v
Docker version 19.03.5, build 633a0ea838

Docker Composeのインストール

$ sudo curl -L https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose

Docker Composeのインストール確認

$ docker-compose --version
docker-compose version 1.25.0, build 0a186604

sudoなしでdockerコマンドを使えるようにする

$ sudo gpasswd -a $USER docker
$ sudo systemctl restart docker
$ sudo chmod 666  /var/run/docker.sock

Dockerコマンドがsudoなしで使えるか確認

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

以上で、GitLab RunnerのコンテナをホストするDocker、Docker Composeのセットアップが完了。

参考: https://qiita.com/taroshin/items/1d95a96d7ee55220875f

GitLab Runnerの構築

次に、Gitlab Runnerを構築します。

事前準備

事前準備として、Runnerを登録するGitLabサーバーのURLとレジストリトークンを確認しておきます。

Admin Area > Runners
GitLabサーバーのURLとレジストリトークンを確認

GitLab Runnerのインストール

GitLab RunnerでDockerコンテナをビルドする方法は3つあります。

Use Docker to build Docker images | GitLab
Documentation for GitLab Community Edition, GitLab Enterprise Edition, Omnibus GitLab, and GitLab Runner.

今回は、「Use Docker socket binding」の方法を使います。

以下のような構成でディレクトリとファイルを作成し、docker composeを使ってGitLab Runnerを起動します。

└── runner
    └── docker-compose.yml

GitLab Runnerのdocker-compose.ymlを以下の通り作成します。

version: '3'
services:
  runner:
    image: gitlab/gitlab-runner:ubuntu
    tty: true
    container_name: docker-executor
    restart: always
    environment:
      - REGISTER_NON_INTERACTIVE=true
      - CI_SERVER_URL=[GitlabのURL] ★
      - REGISTRATION_TOKEN=[レジストリトークン] ★
      - RUNNER_EXECUTOR=docker
      - RUNNER_TAG_LIST=docker
      - RUNNER_NAME=Docker Executor (Docker socket binding)
      - RUNNER_LIMIT=1
      - DOCKER_IMAGE=docker:latest
      - DOCKER_VOLUMES=/var/run/docker.sock:/var/run/docker.sock
    volumes:
      - /srv/gitlab-runner/config:/etc/gitlab-runner
      - /var/run/docker.sock:/var/run/docker.sock
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

★の二箇所は、事前準備で確認した値を記載してください。

変数の簡単な説明を書いておきます。

環境変数説明
REGISTER_NON_INTERACTIVEビルド時のインタラクティブな問い合わせの有効/無効
CI_SERVER_URL事前準備で確認したGitLabサーバーのURLを指定
REGISTRATION_TOKEN事前準備で確認したGitLabサーバーのRegistration Tokenを指定
RUNNER_EXECUTORExecutor(shell、dockerなど)を指定
RUNNER_TAG_LISTRunnerのタグ名を定義。後述のgitlab-ci.yamlでタグを指定してデプロイできる。
RUNNER_NAMERunnerの名前を定義
RUNNER_LIMITジョブの最大同時実行数を指定
DOCKER_IMAGEジョブを実行するコンテナがベースとするデフォルトのDockerイメージを指定
DOCKER_VOLUMESジョブ用のコンテナ実行時にマウントするボリュームを指定

参考: 公式GitHub README

GitLab Runnerを起動

$ docker-compose up -d

GitLabサーバーにGitLab Runnerを登録

$ docker exec -it docker-executor gitlab-runner register

以下のようなメッセージが表示されれば、正しく登録できています。

Registering runner... succeeded                     runner=xxxxxx
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!

GitLab上からも、GitLab Runnerが登録されたことを確認できます。

GitLab > Admin Area > Runners

ここまでで、GitLab Runnerの構築は完了です。

参考: GitLabとGitLab Runnerの連携

まとめ

今回は、Dockerホスト上にGitLab Runnerのコンテナを構築し、構築済みのGitLabに登録する手順を説明しました。

次回は、Webアプリケーションのソースを使って、GitLabにソースをpushしたら、GitLab RunnerがWebアプリケーションを起動するCICDの流れを実践してみたいと思います。

コメント

タイトルとURLをコピーしました