Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

【Gitlab/CI/CD】Cloud Run の 自動デプロイ ~gitlab~

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オプション)。

image.png
Dockerコンテナ内からDockerを使うことについて | じゃあ、したためておきます より引用

gitlab での dind

Building Docker images with GitLab CI/CD | GitLab

DOCKER_HOST

dindを使用する場合は、dockerとやりとりできるように指示する必要があります。
その際に指定するのがDOCKER_HOSTになります。

DOCKER_HOST: tcp://docker:2375

OSX - Gitlab-runner "error during connect: Get http://docker:2375/v1.40/containers/json: dial tcp: lookup docker on 192.168.65.1:53: no such host"" (#25344) · Issues · GitLab.org / gitlab-runner · GitLab

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

環境変数

gitlab だと Setting > CI/CDVariables で設定することができます。
image.png

sanoyo
自衛隊からソフトウェアエンジニア
https://note.com/yokosano
engineerlife
技術力をベースに人生を謳歌する人たちのコミュニティです。
https://community.camp-fire.jp/projects/view/280040
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away