gitlab の全体感
gitlab CI/CDについては下記記事が参考になります。
GitLab CI/CDパイプライン設定リファレンス(日本語訳:GitLab CI/CD Pipeline Configuration Reference) - Qiita
実装
stages:
- deploy
deploy:
stage: deploy
image: google/cloud-sdk
variables:
DOCKER_HOST: tcp://docker:2375
DOCKER_TLS_CERTDIR: ''
services:
- name: docker:19.03.8-dind
script:
- echo ENV1=$ENV1 > .env
- echo ENV2=$ENV2 >> .env
- echo $SERVICE_ACCOUNT > service-account.json
- gcloud auth activate-service-account --key-file service-account.json
- gcloud config set project $STG_GCP_PROJECT_ID
- gcloud auth configure-docker
- docker build -t {GCRのレポジトリ名}:$CI_COMMIT_SHA .
- docker push {GCRのレポジトリ名}:$CI_COMMIT_SHA
- gcloud run deploy {サービス名} --image {GCRのレポジトリ名}:$CI_COMMIT_SHA --region asia-northeast1 --platform managed --port 8080 --allow-unauthenticated --revision-suffix $CI_COMMIT_SHA
services
images
で指定されたコンテナとは別で動作し、実装したジョブが終了するまで実行され続けます。
GitLab RunnerでCI/CDしてみる(後編) | Developers.IO
Docker の GCR での認証
gcloud auth configure-docker
認証方法 | Container Registry のドキュメント | Google Cloud
Docker in Docker
下記の実装が該当します。
docker:19.03.8-dind
dind(docker in docker)
とは?
下記の図が非常にわかりやすいです。
この場合、コンテナからホストのリソースを実行できる権限を持たせる必要があります(privilegedオプション)。
gitlab
での dind
Building Docker images with GitLab CI/CD | GitLab
DOCKER_HOST
dind
を使用する場合は、dockerとやりとりできるように指示する必要があります。
その際に指定するのがDOCKER_HOST
になります。
DOCKER_HOST: tcp://docker:2375
DOCKER_TLS_CERTDIR
DOCKER_TLS_CERTDIR: ''
Since the service docker:dind will create the certificates, we need to have the certificate shared between the service and the job container.
(サービスのdocker:dindが証明書を作成するので、サービスとジョブコンテナの間で証明書を共有する必要があります。)
Update: Changes to GitLab CI/CD and Docker in Docker with Docker 19.03 | GitLab
この実装方法は、
上記のようにTLS
を無効にするか、
下記のようにTLS
を設定するかのいづれかになります。
[[runners]]
name = "My Docker Runner"
url = "http://gitlab.com"
token = ""
executor = "docker"
[runners.custom_build_dir]
[runners.docker]
privileged = true
volumes = ["/certs/client", "/cache"]
shm_size = 0
CircleCIとの違い
CircleCI
で実装する機会が多い方は下記の記事が非常に参考になります。
特に個人的に調べたことを下記に書いておきます。
CircleCIからの移行 | GitLab
ワークフロー
CircleCI
workflows:
version: 2
jobs:
- job1
- job2
- job3:
requires:
- job1
- job2
gitlab
stages
に それぞれ job が所属しているイメージです。
stages:
- build
- test
- deploy
job 1:
stage: build
script: make build dependencies
job 2:
stage: build
script: make build artifacts
job3:
stage: test
script: make test
approval
CircleCI
- deploy:
type: approval
requires:
- testing
gitlab
deploy_prod:
stage: deploy
script:
- echo "Deploy to production server"
when: manual # approve に該当する
Filter job by branch
CircleCI
jobs:
deploy:
branches:
only:
- master
gitlab
deploy_prod:
stage: deploy
script:
- echo "Deploy to production"
rules:
- if: '$CI_COMMIT_BRANCH == "master"'
ローカルでの実行
インストール
$ sudo curl --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-darwin-amd64
$ sudo chmod +x /usr/local/bin/gitlab-runner
.gitlab-ci.yml をローカルのMacで動かしたい - Qiita
GitLabのgitlab-runnerを使えるようにするまでの備忘録 - Qiita
実行コマンド
gitlab-runner exec docker [jobの名前]
jobの名前に関しては、上記実装だと、deploy
に該当します。
GitLab.comからDockerイメージをGoogleContainerRegistryにPushする - Qiita