GeekFactory

int128.hatenablog.com

Circle CIでCloud Functionをデプロイする

Circle CIからGoogle Cloud Functionsに関数をデプロイする方法を調べたのでメモします。

具体的には、GitHub → Circle CI → Cloud Source Repository → Cloud Functionの流れで継続的インテグレーションと継続的デプロイを行います。

  1. 開発者がGitHubリポジトリソースコードをpushする。
  2. Circle CIでビルドとテストを行う。
  3. Circle CIでCloud Source Repositoryに成果物をpushする。
  4. Cloud Source RepositoryからCloud Functionにデプロイが行われる。

開発者がCloud Source Repositoryに直接pushしてもよいのですが、CIをパスした場合のみデプロイしたい、あるいはビルドした成果物をデプロイしたい場合はCircle CIを経由させると実現できます。

設定方法

まず、Cloud Source Repositoriesで新しいリポジトリを作成します。リポジトリを作成したら、 “Generate and store your Git credentials” でSSHでアクセスするためのクレデンシャルを取得します。下記のような文字列が表示されるのでメモしておきます。

machine source.developers.google.com login **** password ****

Circle CIの管理コンソールで環境変数を設定します。

キー 設定値
GCLOUD_PROJECT GCPのプロジェクト名
GCLOUD_REPO Cloud Source Repositoriesのリポジトリ
NETRC リポジトリSSHでアクセスするためのクレデンシャル(前述)

circle.yml を作成します。

machine:
  node:
    version: 6

deployment:
  cloud-repository:
    branch: master
    commands:
      - echo "$NETRC" > "$HOME/.netrc"
      - git remote add google "https://source.developers.google.com/p/${GCLOUD_PROJECT}/r/${GCLOUD_REPO}"
      - git push google master -f

GitHubリポジトリにmasterブランチをpushしてみましょう。Circle CIでビルドが実行されて、Cloud Source Repositoriesのリポジトリが新しくなれば成功です。

最後に、Cloud Source RepositoryからデプロイするようにCloud Functionを設定すれば完了です。

APIキー等の秘密情報を追加してデプロイする

Circle CIで秘密情報を管理してデプロイ時に追加することで、公開リポジトリから秘密情報を切り出すことができます。(Cloud Functionsが環境変数に対応するまでのワークアラウンドですが)

deployment:
  cloud-repository:
    branch: master
    commands:
      - git config user.name circle
      - git config user.email circle@example.com
      - echo "$TWITTER_API_CREDENTIALS_JSON" > twitter-api-credentials.json
      - git add twitter-api-credentials.json
      - git commit -m 'Add Twitter API Credentials'
      - echo "$NETRC" > "$HOME/.netrc"
      - git remote add google "https://source.developers.google.com/p/${GCLOUD_PROJECT}/r/${GCLOUD_REPO}"
      - git push google master -f

ビルドした成果物をデプロイする

Babel等でビルドした成果物をデプロイしたい場合は、下記のように成果物をコミットしてからpushします。もしくは、新しいローカルリポジトリに成果物を追加してpushします。

deployment:
  cloud-repository:
    branch: master
    commands:
      - git config user.name circle
      - git config user.email circle@example.com
      - git add build
      - git commit -m 'Add build'
      - echo "$NETRC" > "$HOME/.netrc"
      - git remote add google "https://source.developers.google.com/p/${GCLOUD_PROJECT}/r/${GCLOUD_REPO}"
      - git push google master -f