Circle CIでGKEにデプロイ

Feb 7, 2019 22:52 · 849 words · 2 minute read

先日このブログをGKEに移行したが、修正のたびにイメージ作成やデプロイを手でやっているのでこのままだとブログを書く気が起きない。このため、イメージのビルドからDocker HubへのPush、そしてPodを新しいイメージで更新、までをCircle CIで自動化することにした。こうすることで、記事を書いてgit pushするだけで新しいイメージに置き換えられるようになる。

Circle CIでのCIだが、このブログではmasterブランチへ直接git pushするのでシンプルなワークフローとなった。イメージのビルド -> Docker HubへPush -> Podの更新、というのが大まかな処理の流れである。
具体的に示すと、.circleci/config.ymlは以下の通りである。

version: 2
jobs:
  deploy:
    docker:
      - image: google/cloud-sdk
    steps:
      - checkout
      - setup_remote_docker
      - run:
          name: Docker build and push
          command: |
            docker login -u $DOCKER_USER -p $DOCKER_PASS
            docker build -t my_docker_id_user/my_image:$CIRCLE_SHA1 .
            docker push my_docker_id_user/my_image:$CIRCLE_SHA1
      - run:
          name: Deploy to GKE
          command: |
            apt-get install -qq -y gettext
            echo $GCLOUD_SERVICE_KEY | gcloud auth activate-service-account --key-file=-
            gcloud --quiet config set project $GOOGLE_PROJECT_ID
            gcloud --quiet config set compute/zone $GOOGLE_COMPUTE_ZONE
            gcloud --quiet container clusters get-credentials $GOOGLE_CLUSTER_NAME
            envsubst < deployment.yml > patched_deployment.yml
            kubectl apply -f patched_deployment.yml
            
workflows:
  version: 2
  build_and_deploy:
    jobs:
      - deploy

コンテナのタグには$CIRCLE_SHA1を使用した。$CIRCLE_SHA1はビルド時の最終コミットのハッシュ値が自動で設定されるので、これとenvsubstと併用することでデプロイに至る一連の作業を自動化できた。

感想

git pushするだけでPodが更新されるので、これでようやくGitHub Pagesと同じくらい使いやすくなったのではないだろうか。ブログを書く気も出てくる。

しかし、一通り作成してから気づいたのだが、envsubstでPodの更新まで自動化してしまったがために、rollbackのように手でコンテナのタグを指定してデプロイする場合の手間が増えてしまった(k8sのymlに環境変数表記(${FOO})を含むことになるため、kubectl apply -fするのに余計なファイル修正が発生する)。このため、自動化の対象をコンテナの作成・プッシュまでにしてローカルからkubectl apply -fする、というフローでもよかったかなと思った。

参考