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
は以下。
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
は以下。
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検証環境できた。