tsyama記

プログラミングとそのほか

docker-composeを使ってGitLab / Runner のローカル環境

はじめに

タイトルどおり、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を使えるのでテスト用のプロジェクトをひとつ作成し、ホスト側でクローンしてみましょう。

f:id:tsyama-desu:20200329000322p:plain

ちなみにここからクローン時のURLをコピーできますが、webrunnerコンテナでのみ使えるドメインなのでこのURLをそのまま使うことはできません。
今回の場合はwebgitlab.local-docker.comに読み替えて登録しましょう。(これが面倒な場合はdocker-compose.ymlのservice名やlinksの設定を良しなにしてください)

Runnerの登録

あわせてRunnerの設定もしておきます。
まずは事前にRunner登録用トークンを取得しましょう。どのプロジェクトでも使用できる共有Runnerなら管理者設定 > Runnerから、特定プロジェクトで使用するSpecific Runnerならプロジェクトの設定 > CI/CD > Runnerから取得できます。

f:id:tsyama-desu:20200329004912p:plain

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ができます。tagsdefaultを設定しているので、同じくdefaultタグに対応する先程のRunnerで実行されます。

ジョブの実行タイミングを特に指定していないため、リポジトリにpushしたタイミングでパイプラインが走り、無事にjob1が実行されているはずです。お疲れさまでした。

f:id:tsyama-desu:20200329012644p:plain

参考にした記事とか

docs.gitlab.com

qiita.com

docs.gitlab.com