それなりに適当にやってます

なんとなくそれっぽいメモとか備忘録とか適当に。 2018年5月にブログ移転しました。 古い記事は未整理です。

CircleCI から Google App Engine へデプロイしてみた

昨日の続き・・・をサクッと。 Node.jsのコードはドキュメントのサンプルを拝借
特に意味ないけど AppEngine のファイアウォールルール設定 > デプロイ > 後処理で削除とか、AppEngine Standard / Node.js 試したり・・・みたいな。

環境構築

CircleCI と BitBucket の連携、CircleCI/プロジェクトへの環境変数を設定〜の流れ、手順としては昨日と同じ、まとめると以下の通り。

  • BitBucket で非公開リポジトリを作成
  • CircleCI でリポジトリを選択して、プロジェクトを作成
    • Linux, Other で表示されたコードをリポジトリに push して、CircleCI 側で初回ビルド
  • CircleCI プロジェクト設定で環境変数を設定
    • GCLOUD_PROJECT : GCPのプロジェクトID
    • GCLOUD_SERVICE_KEY : GCPのサービスアカウントJSON
  • GCPコンソール > API とサービス で Google App Engine Admin API を有効にする

Node.js の準備

GAE Standard / Node.js のドキュメントを参考にして進める。

$ cd ~
$ git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples
$ cd nodejs-docs-samples/appengine/hello-world/standard
$ npm install
$ npm start             #<-ローカルでの確認(ドキュメントの通り)
  #->ローカルのブラウザで 8080 ポートを表示し、"Hello World" を確認

config.yml

$ cd REPOSITORY             #<-事前に git clone してたパスに移動
$ cp ~/nodejs-docs-samples/appengine/hello-world/standard/* .
$ vi .circleci/config.yml
version: 2
jobs:
  build:
    docker:
      - image: centos:latest
    environment:
      TZ: /usr/share/zoneinfo/Asia/Tokyo
    steps:
      - checkout
      - run:
          name: google auth
          command: |
            if [ -n "${GCLOUD_SERVICE_KEY}" -a -n "${GCLOUD_PROJECT}" ]; then
              echo ${GCLOUD_SERVICE_KEY} > ${HOME}/gcloud-service-key.json
              echo "export GOOGLE_APPLICATION_CREDENTIALS=\"${HOME}/gcloud-service-key.json\"" >> $BASH_ENV
            else
              echo "Not set environment"
              exit 1
            fi
      - run:
          name: install and initialize gcloud command
          command: |
            cp google-cloud-sdk.repo /etc/yum.repos.d/
            yum -y install google-cloud-sdk which
            gcloud auth activate-service-account --key-file=${HOME}/gcloud-service-key.json
            gcloud config set project ${GCLOUD_PROJECT}
      - run:
          name: create app engine firewall-rule
          command: |
            IP=`curl -f -s ifconfig.io`
            gcloud app firewall-rules create 100 --action=ALLOW --description circleci \
            --source-range=${IP}/32
      - run:
          name: app deploy
          command:
            gcloud app deploy || echo "export DEPLOY_RESULT=${?}" >> $BASH_ENV
      - run:
          name: delete app engine firewall-rule
          command: gcloud app firewall-rules delete 100
      - run:
          name: closing
          command: |
            echo "DEPLOY_RESULT [${DEPLOY_RESULT:-0}]"
            exit ${DEPLOY_RESULT:-0}
$ circleci config validate -c .circleci/config.yml
$ git commit -a -m "circleci config.yml update" && git push

で、AppEngine のURLを確認して Hello World. が表示されたこと。 文言を変えて再度 git push で反映されたとこまで確認した。

参考URL

真面目にやるのならフローに応じたブランチ別の動作まで考えないとダメなんだろうけど・・・とりあえずメモ(;^ω^)

追記

CircleCIのドキュメントで Orchestrating WorkflowsUsing Environment Variables を見てたら CIRCLE_BRANCH という環境変数にブランチ名が入ることを知った。 これ利用すればブランチに応じてプロジェクトとサービスアカウント変えられるのでは?と思って試した。

  • CircleCI プロジェクトの環境変数名を master_GCLOUD_SERVICE_KEYmaster_GCLOUD_PROJECT に変更して再登録
  • config.yml の該当箇所を下記のように修正
            if [ -n "eval '$'\"${CIRCLE_BRANCH}_GCLOUD_SERVICE_KEY\"" -a -n "eval '$'\"${CIRCLE_BRANCH}_GCLOUD_PROJECT\"" ]; then
              eval echo '$'"${CIRCLE_BRANCH}_GCLOUD_SERVICE_KEY" > ${HOME}/gcloud-service-key.json
              echo "export GOOGLE_APPLICATION_CREDENTIALS=\"${HOME}/gcloud-service-key.json\"" >> $BASH_ENV
            else
              echo "Not set environment"
              exit 1
            fi
            ...
            eval gcloud config set project '$'"${CIRCLE_BRANCH}_GCLOUD_PROJECT"

んで push してみたらこれで通った。 別のブランチ名で push したら CIRCLE_BRANCH の値が変わってコケたのでこれでいけるのかもしれない。 あとは branches で対象のブランチを選択したり、workflow で頑張れば良いのかも。

今のところこれで満足した(´・ω・`)

以上