はじめに
タイトルどおり、docker-composeを使ってGitLabおよびGitLab Runnerをローカル環境に作ります。
このへん詳しく解説した記事は点在していますが、必要最低限の情報だけ網羅したような記事がなかったので書いてみます。とりあえず難しいことを考えずに作ってみたい人向け。
前提
今回のGitLabおよびRunnerバージョン情報はこちら
GitLab information Version: 12.8.7 Revision: b679f55a199 Directory: /opt/gitlab/embedded/service/gitlab-rails DB Adapter: PostgreSQL DB Version: 10.12 URL: http://web:8929 HTTP Clone URL: http://web:8929/some-group/some-project.git SSH Clone URL: ssh://git@web:2224/some-group/some-project.git Using LDAP: no Using Omniauth: yes Omniauth Providers: GitLab Shell Version: 11.0.0 Repository storage paths: - default: /var/opt/gitlab/git-data/repositories GitLab Shell path: /opt/gitlab/embedded/service/gitlab-shell Git: /opt/gitlab/embedded/bin/git
root@gitlab-runner:/# gitlab-runner Runtime platform arch=amd64 os=linux pid=139 revision=4c96e5ad version=12.9.0 NAME: gitlab-runner - a GitLab Runner USAGE: gitlab-runner [global options] command [command options] [arguments...] VERSION: 12.9.0 (4c96e5ad)
docker-compose.ymlを作る
まずはdocker-compose.ymlを作ります。
version: '3'
services:
web:
image: "gitlab/gitlab-ce:latest"
restart: "always"
hostname: "gitlab.local-docker.com"
volumes:
- gitlab_etc:/etc/gitlab
- gitlab_log:/var/log/gitlab
- gitlab_opt:/var/opt/gitlab
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://web:8929'
gitlab_rails['gitlab_shell_ssh_port'] = 2224
ports:
- '8929:8929'
- '2224:22'
runner:
image: "gitlab/gitlab-runner"
restart: "always"
hostname: "gitlab-runner.local-docker.com"
links:
- web
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./config:/etc/gitlab-runner
volumes:
gitlab_etc:
gitlab_log:
gitlab_opt:
gitlab コンテナと gitlab-runner コンテナを一台ずつ立てます。
注意すべきところはHTTP接続に8929番ポートを、SSH接続に2224番ポートを使っている点。あとはrunnerの/etc/gitlab-runnerをvolumeしているので、./config/config.tomlを作って置かなければいけない(中身は多分空でもよい)。
ちなみにhostnameは環境に合わせてそれぞれ設定しましょう。
細かい注意点は他にもありますが、そのあたりは後述します。
コンテナ起動
docker-compose up -dでコンテナを起動します。
そこそこメモリを使うし、起動までに時間がかかるので注意しましょう。
参考までに僕はWindowsのDocker in Vagrant環境を使ってVagrantにメモリを4GBくらい割り当てて、gitlabコンテナの起動にだいたい4, 5分くらいかかっています。
docker-compose logsしながら見守りましょう。
ちなみに初期化処理中にGitLabにHTTPでアクセスしようとすると502エラーが出ます。
GitLabにアクセス
初期化処理が完了したらGitLabにアクセスします。ポート番号はさっきあったように8929番です。今回の場合はhttp://gitlab.local-docker.com:8929ですね。
はじめてアクセスする際は「rootアカウントのパスワード設定してね」の画面になるので、適切なパスワードを設定してください。設定後はアカウント名"root"でログインできます。
プロジェクトを作成
ログイン後は通常通りGitLabを使えるのでテスト用のプロジェクトをひとつ作成し、ホスト側でクローンしてみましょう。

ちなみにここからクローン時のURLをコピーできますが、webはrunnerコンテナでのみ使えるドメインなのでこのURLをそのまま使うことはできません。
今回の場合はwebをgitlab.local-docker.comに読み替えて登録しましょう。(これが面倒な場合はdocker-compose.ymlのservice名やlinksの設定を良しなにしてください)
Runnerの登録
あわせてRunnerの設定もしておきます。
まずは事前にRunner登録用トークンを取得しましょう。どのプロジェクトでも使用できる共有Runnerなら管理者設定 > Runnerから、特定プロジェクトで使用するSpecific Runnerならプロジェクトの設定 > CI/CD > Runnerから取得できます。

Runnerの登録はgitlab-runnerコンテナから行います。docker-compose exec runner bashからコンテナの中に入りましょう。
コンテナにはgitlab-runnerコマンドがインストールされているので、
gitlab-runner register
で登録を行います。対話形式で設定できるので適宜設定しましょう。
root@gitlab-runner:/# gitlab-runner register
Runtime platform arch=amd64 os=linux pid=116 revision=4c96e5ad version=12.9.0
Running in system-mode.
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
http://web:8929/
Please enter the gitlab-ci token for this runner:
VUzzjtqsZYyxjmB1McBn
Please enter the gitlab-ci description for this runner:
[gitlab-runner.local-docker.com]: my-runner
Please enter the gitlab-ci tags for this runner (comma separated):
default
Registering runner... succeeded runner=VUzzjtqs
Please enter the executor: custom, shell, docker+machine, kubernetes, docker, docker-ssh, parallels, ssh, virtualbox, docker-ssh+machine:
shell
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
途中で聞かれるタグ名はあとでCIの設定をする際に使用します。好きに設定してよいですが、よくわからなければdefaultなどとしましょう。
設定が完了したらconfig.tomlの設定が書き換わります。
check_interval = 0
[session_server]
session_timeout = 1800
[[runners]]
name = "my-runner"
url = "http://web:8929/"
token = "Mq4Po9ssGs4GAyPLqxvu"
executor = "shell"
[runners.custom_build_dir]
[runners.cache]
[runners.cache.s3]
[runners.cache.gcs]
また、GitLab側にもRunnerが登録されているので確認してみてください。
パイプラインを実行してみる
Runnerが登録できたのでPipelineを実行することができます。
試しにやってみましょう。
下記のような.gitlab-ci.ymlをテスト用リポジトリにコミットします。
job1:
stage: deploy
tags:
- default
script:
- echo "test"
ここでは.gitlab-ci.ymlの書き方について詳しく説明しませんが、これで"test"とechoするだけのジョブ job1ができます。tagsにdefaultを設定しているので、同じくdefaultタグに対応する先程のRunnerで実行されます。
ジョブの実行タイミングを特に指定していないため、リポジトリにpushしたタイミングでパイプラインが走り、無事にjob1が実行されているはずです。お疲れさまでした。
