【SRE/CircleCI】Orbsを使ってGKEへ自動デプロイ


Circle CI Orbs

Orbsとは

docker hub みたいにcircle ci用のimageを取ってくる感覚で使用する事ができます。
先にさらっとCircleCI2.1の復習です。

version 2.1以降の新しい機能

結論、何回も使用するコマンドや環境を共通化できるようになりました。

  • Orbs
  • commands
  • executors

Orbs

Orbsは下記の要素で構成されます。

  • コマンド
  • ジョブ
  • Executors

commands

stepsを再利用するために使用され、複数間のジョブ間でコマンドの再定義が可能になります。
CircleCI を設定する - CircleCI
CircleCI 2.1 の新機能を使って冗長な config.yml をすっきりさせよう! – PSYENCE:MEDIA

executors

共通で使用する実行環境を定義することができます。

CircleCI を設定する - CircleCI

executors:
  my-executor:
    docker:
      - image: circleci/ruby:2.5.1-node-browsers

GKEへのデプロイ

使用するOrbs

下記2つを使用していきます。


- circleci/[email protected]
- circleci/[email protected]

実装


version: 2.1
orbs:
  gcp-gke: circleci/[email protected]
  gcr: circleci/[email protected]
executors:
  # 共通で使用するimageはここで定義します。
  node-executor:
    docker:
      - image: circleci/node:7.10
jobs:
  build:
    executor: 
      name: node-executor
    steps:
      - checkout
      - # 何かしらのテスト
  build-push-image-docker:
    description: Build and push image to GCR
    machine: true
    steps:
      - checkout
      - gcr/gcr-auth
      - gcr/build-image:
          image: $STG_GKE_IMAGE
          tag: $CIRCLE_SHA1
      - gcr/push-image:
          image: $STG_GKE_IMAGE
          tag: $CIRCLE_SHA1
  deploy:
    description: Deploy application to GKE
    machine: true
    steps:
      - gcp-gke/install
      - gcp-gke/init
      - run:
          name: Deploy to staging
          command: | 
            gcloud container clusters get-credentials $STG_GKE_CLUSTER
            kubectl set image deployment/$STG_GKE_DEPLOYMENT $STG_GKE_CONTAINER=gcr.io/$GOOGLE_PROJECT_ID/$STG_GKE_IMAGE:$CIRCLE_SHA1
workflows:
  version: 2.1
  deploy_staging:
    jobs:
      - build
      - build-push-image-docker:
          requires:
            - build
      - deploy:
          requires:
            - build-push-image-docker

Deploy to Google Kubernetes Engine - Deploy to GKE | CircleCI
circleci-docs/configuration-cookbook.md at master · circleci/circleci-docs · GitHub
Orbs を使う - CircleCI

TODO

環境変数を動的に渡す

上記のCircleCIの実装では、認証を行うために下記のような実装をしています。

- gcr/gcr-auth

下記3つの値を CircleCI の環境変数に設定することで認証することができています。
次回はこの環境変数を動的にして、ステージング環境、プロダクション環境とデプロイできるようにしたいです。
おそらく、parameters を使いそうな気がしますが、自分で定義した環境変数をそのまま渡してもダメだったので、次回のTODOにしておきます。

CircleCI 2.1のすゝめ - Qiita

PARAMETER(ここをCircleCIで設定) DESCRIPTION REQUIRED DEFAULT TYPE
gcloud-service-key サービスアカウントの値 必須でない GCLOUD_SERVICE_KEY env_var_name
google-compute-zone GCPのZone 必須でない GOOGLE_COMPUTE_ZONE env_var_name
google-project-id GCPのプロジェクトID 必須でない GOOGLE_PROJECT_ID env_var_name

gcr-auth

Orbsを使ったデプロイ

Orbsを使ってのGKEへのでデプロイは下記を使用するようなので、これをステージング環境、プロダクション環境で動的に切り替えれるようにしたいです。

- gcp-gke/rollout-image

rollout-image

デバッグ

version2.1では、デバッグ方法が変わるので、注意です。

$ circleci config process .circleci/config.yml > process.yml
$ circleci local execute -c process.yml

まさかPushデバッグしてないよね? よく使うCircleCIのデバッグ方法 - VTRyo Blog