GIG

赴くままに技術を。

GitLab CI環境を自己証明書を使って構築する

※自己証明書を使うのは検証目的に留めておいて、本番運用では証明書の購入が必要。

2018/5/12追記

  • gitlab omnibusインストールのパラメータ修正(gitlab_shell_ssh_port)
  • ジョブとしてDockerイメージをビルドするため、gitlab-runner registerでdocker.sockのマウントを指定

検証環境

検証した環境は以下。

パッケージ バージョン 備考
Docker for Mac(Edge) 18.05.0-ce-rc1-mac63 Macでk8sを触るためEdgeにしている
GitLab Community Edition 10.7.0-ce.0
GitLab Runner v10.7.0

GitLabをDocker Composeで立てる

フォルダ構成は以下。

.
├── docker-compose.yml
└── volume
    ├── certs
    ├── conf
    ├── data
    └── logs

volume/certs配下に自己証明書を作成して、配備する。 ここで作成した証明書はGitLab Runnerを登録する際に利用する。しかしその時にSAN(Subject Altanative Name)を指定して作成しないと以下のようなエラーが出てしまう。

ERROR: Registering runner... failed                 runner=cTGFEKNu status=couldn't execute POST against https://192.168.1.9/api/v4/runners: Post https://192.168.1.9/api/v4/runners: x509: cannot validate certificate for 192.168.1.9 because it doesn't contain any IP SANs

そのため、GitLab用途で証明書を作成する際には、SANを設定する。Macでは/System/Library/OpenSSL/openssl.cnfにあるので、以下のように秘密鍵と証明書を生成する(ただし、192.168.1.9はホストサーバ(Mac)側に割り当たったIPアドレスで、固定である方が望ましい...)。

$ cd volume/certs/
$ openssl req -newkey rsa:4096 -days 365 -nodes -x509 -subj "/C=JP/ST=CHIBA/L=CHIBA/O=NAN/OU=NAN/CN=192.168.1.9" -extensions v3_ca -config <( cat /System/Library/OpenSSL/openssl.cnf <(printf "[v3_ca]\nsubjectAltName='IP:192.168.1.9'")) -keyout server.pem -out server.crt
Generating a 4096 bit RSA private key
.............................................................++
...............................................................................................++
  • docker-compose.ymlは以下。
    • GITLAB_OMUNIbUS_CONFIG以下には、gitlab.rbで指定可能なパラメータを並べることができる
    • TLSの設定はnginx[]の箇所。
    • rootユーザの初期パスワードはgitlab_rails['initial_root_password']で指定したpasswordである
    • GitLab RunnerからGitLabへの登録を行うトークンもあらかじめgitlab_rails['initial_shared_runners_registration_token']でtokenと指定している
version: "3"
services:
  gitlab:
    image: gitlab/gitlab-ce:10.7.0-ce.0
    container_name: gitlab
    restart: always
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url "https://192.168.1.8"
        gitlab_rails['time_zone'] = "Asia/Tokyo"
        gitlab_rails['initial_root_password'] = "password"
        gitlab_rails['initial_shared_runners_registration_token'] = "token"
        gitlab_rails['gitlab_shell_ssh_port'] = 2222
        unicorn['worker_timeout'] = 60
        unicorn['worker_processes'] = 3
        logging['logrotate_frequency'] = "weekly"
        logging['logrotate_rotate'] = 52
        logging['logrotate_compress'] = "compress"
        logging['logrotate_method'] = "copytruncate"
        nginx['listen_port'] = 443
        nginx['redirect_http_to_https'] = true
        nginx['ssl_certificate'] = "/etc/ssl/certs/gitlab/server.crt"
        nginx['ssl_certificate_key'] = "/etc/ssl/certs/gitlab/server.pem"
        nginx['ssl_protocols'] = "TLSv1.1 TLSv1.2"
        # Add any other gitlab.rb configuration options if desired
    ports:
      - "443:443"
      - "2222:22"
    volumes:
      - ./volume/conf:/etc/gitlab
      - ./volume/certs:/etc/ssl/certs/gitlab
      - ./volume/logs:/var/log/gitlab
      - ./volume/data:/var/opt/gitlab
    logging:
      options:
        max-size: "4M"
        max-file: "14"

起動する。

$ docker-compose up -d
Starting gitlab ... done

しばらくするとWebブラウザからhttps://192.168.1.9で接続可能になる(起動未完了時は502エラーページが表示される)。 起動完了後は、docker-compose.ymlで指定したように、ユーザIDroot、パスワードpasswordでログインできる。

GitLab Runnerを登録する

フォルダ構成は下記。

.
├── docker-compose.yml
└── volume
    ├── certs
    │   └── 192.168.1.9.crt
    └── config

ここで192.168.1.9.crtとは、GitLab構築時に作成した証明書を(GitLabのアドレス).crtとして格納する(参考情報)。

  • docker-compose.ymlは以下。
    • ジョブを実行するExecuterとしてホストマシン上のDockerコンテナ上で行いたいため、ホストマシン側のDockerエンドポイント(/var/run/docker.sock)を指定している。ただし、MacではこのUNIXソケットの利用をサポートしていない(?)とのこと。
version: '3'
services:
  runner:
    image: gitlab/gitlab-runner:v10.7.0
    container_name: gitlab-runner
    restart: always
    volumes:
      - ./volume/config:/etc/gitlab-runner
      - ./volume/certs:/etc/gitlab-runner/certs
      - /var/run/docker.sock:/var/run/docker.sock
    logging:
      options:
        max-size: "4M"
        max-file: "14"

起動する。

$ docker-compose up -d
Recreating gitlab-runner ... done

ついで、Runnerを登録する。registerで指定可能なオプションはgitlab-runner register --helpで確認できる(分量が非常に多い)。 また、登録されると./volume/config/config.tomlという設定ファイルが出力されるので、これをあらかじめ設定しておき、registerの引数で渡すこともできる。

$ docker exec gitlab-runner gitlab-runner register -n -r token --executor docker --docker-image alpine:latest --url https://192.168.1.8/ --docker-volumes /var/run/docker.sock:/var/run/docker.sock
Running in system-mode.

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

以上でめでたくGitLab検証環境できた。