CI / CD

継続的インテグレーションと継続的デプロイ(CI / CD)パイプラインにより、ローカルと Google Cloud 上のテスト環境で関数を動かすことができます。

ローカルでの開発を完了したら、Cloud Build などの CI / CD プラットフォームを構成し、既存の Cloud Functions のテストを継続的に行うことができます。継続的にテストを行うことで、コードが引き続き正常に機能することと、依存関係が最新の状態に保たれていることを確認できます。Cloud Functions は自動的に更新されません。GitHubBitbucketCloud Source Repositories などのソース リポジトリから関数を自動的にテストし、再デプロイするように、CI / CD パイプラインと Cloud Build で作成したビルドを構成することもできます。

始める前に

このガイドを始める前に環境を設定してください。

テスト フレームワーク

テスト フレームワークは自動テストの実行環境を提供します。デプロイあたりのテスト量を最小限に抑え、十分にテストされたビルドを本番環境にデプロイできます。Mocking フレームワークを使用すると、外部依存関係を再現できます。 外部依存関係とは、関数がその関数に含まれていないコード部分に依存している関係を意味します。

Node.js

このガイドの例では、テスト用のフレームワークとして Mocha を使用します。また、外部依存関係を疑似的に再現するため、モックアップ フレームワークとして Sinon を使用します。

外部依存関係とは、関数がその関数に含まれていないコード部分に依存している関係を意味します。外部依存の一般的な例としては、npmPyPIMaven などのパッケージ マネージャーを使用してインストールされた Google Cloud サービスやライブラリなどがあります。

Python

このガイドの例では、テスト用のフレームワークとして Pytest を使用します。また、外部依存関係を疑似的に再現するため、モックアップ フレームワークとして unittest を使用します。

外部依存関係とは、関数がその関数に含まれていないコード部分に依存している関係を意味します。外部依存の一般的な例としては、pip などのパッケージ マネージャーを使用してインストールされた Google Cloud サービスやライブラリなどがあります。

Go

このガイドの例では、標準ライブラリの testing パッケージを使用してテストを実行します。ただし、システムテストには外部依存関係があります。

外部依存関係とは、関数がその関数に含まれていないコード部分に依存している関係を意味します。外部依存関係の一般的な例としては、他の Google Cloud サービスやダウンロードした他のパッケージなどがあります。

Java

このガイドの例では、テストの実行に JUnit ライブラリを使用します。また、外部依存関係を疑似的に再現するため、モック フレームワークとして Mockito を使用します。

外部依存関係とは、関数がその関数に含まれていないコード部分に依存している関係を意味します。

Cloud Build の設定

以下の cloudbuild.yaml ビルド構成ファイルを使用して、ビルドトリガーを使用したビルドの自動化の説明に従うことで、関数を自動的にテストしてデプロイするように Cloud Build を構成できます。

Node.js

steps:
- name: 'gcr.io/cloud-builders/npm'
  args: ['install']
  dir: 'function/dir/from/repo/root'
- name: 'gcr.io/cloud-builders/npm'
  args: ['test']
  dir: 'function/dir/from/repo/root'
- name: 'gcr.io/cloud-builders/gcloud'
  args: ['functions', 'deploy', '[YOUR_DEPLOYED_FUNCTION_NAME]', '[YOUR_FUNCTION_TRIGGER]', '--runtime', '[YOUR_RUNTIME]', '--entry-point', '[YOUR_FUNCTION_NAME_IN_CODE]']
  dir: 'function/dir/from/repo/root'

Python

steps:
- name: 'docker.io/library/python:3.7'
  entrypoint: /bin/sh
  # Run pip install and pytest in the same build step
  # (pip packages won't be preserved in future steps!)
  args: [-c, 'pip install -r requirements.txt', '&&', 'pytest']
  dir: 'function/dir/from/repo/root'
- name: 'gcr.io/cloud-builders/gcloud'
  args: ['functions', 'deploy', '[YOUR_DEPLOYED_FUNCTION_NAME]', '[YOUR_FUNCTION_TRIGGER]', '--runtime', 'python37', '--entry-point', '[YOUR_FUNCTION_NAME_IN_CODE]']
  dir: 'function/dir/from/repo/root'

Go

steps:
  - name: 'mirror.gcr.io/library/golang'
    args: ['go', 'version']
  - name: 'mirror.gcr.io/library/golang'
    args: ['go', 'test']
    dir: 'function/dir/from/repo/root'
  - name: 'gcr.io/cloud-builders/gcloud'
    args: ['functions', 'deploy', '[YOUR_DEPLOYED_FUNCTION_NAME]', '[YOUR_FUNCTION_TRIGGER]', '--runtime', 'go113', '--entry-point', '[YOUR_FUNCTION_NAME_IN_CODE]']
    dir: 'function/dir/from/repo/root'

Java

steps:
- name: 'gcr.io/cloud-builders/mvn'
  args: ['clean', 'verify']
  dir: 'function/dir/from/repo/root'
- name: 'gcr.io/cloud-builders/gcloud'
  args: ['functions', 'deploy', '[YOUR_DEPLOYED_FUNCTION_NAME]', '[YOUR_FUNCTION_TRIGGER]', '--runtime', 'java11', '--entry-point', '[YOUR_FUNCTION_NAME_IN_CODE]']
  dir: 'function/dir/from/repo/root'

以下のように置き換えます。

  • [YOUR_DEPLOYED_FUNCTION_NAME] は、Google Cloud Console、Cloud SDK、URL で使用する Cloud Functions の名前で置き換えます。
  • [YOUR_FUNCTION_TRIGGER] は、適切なトリガー値--trigger-http など)で置き換えます。
  • [YOUR_RUNTIME] は、ランタイム ID(nodejs10 など)で置き換えます。
  • [YOUR_FUNCTION_NAME_IN_CODE] は、コード内に記述されている関数名で置き換えます。 --entry-point は、[YOUR_FUNCTION_NAME] 以外の値を使用する場合にのみ必要です。
  • function/dir/from/repo/root は、関数を含むディレクトリへのパスで置き換えます。

Cloud Build でニーズを満たせない場合は、継続的インテグレーション プラットフォームのリストをご覧ください。

ビルドとデプロイに必要な権限の付与

Cloud Build を使用して Cloud Functions をデプロイする場合は、Cloud Build サービス アカウントPROJECT_NUMBER@cloudbuild.gserviceaccount.com)に権限を付与する必要があります。Cloud Build サービス アカウントは、ユーザーに代わってビルドを実行する場合に使用されます。

  1. プロジェクト番号を確認します。

    gcloud projects describe PROJECT_ID
    

    プロジェクトの識別方法について詳しくは、プロジェクトの作成と管理をご覧ください。

  2. Cloud Build サービス アカウントが Cloud Functions ランタイム サービス アカウントとして機能します

    gcloud iam service-accounts add-iam-policy-binding PROJECT_ID@appspot.gserviceaccount.com \
     --member serviceAccount:PROJECT_NUMBER@cloudbuild.gserviceaccount.com \
     --role roles/iam.serviceAccountUser
    
  3. Cloud Functions 開発者のロールを Cloud Build サービス アカウントに割り当てます。これにより、Cloud Build で Cloud Functions をデプロイできます。

    gcloud projects add-iam-policy-binding PROJECT_ID \
     --member serviceAccount:PROJECT_NUMBER@cloudbuild.gserviceaccount.com \
     --role roles/cloudfunctions.developer
    

詳細については、Cloud Functions IAM のロールをご覧ください。

Cloud Build が有効になっているリポジトリに push するたびに、cloudbuild.yaml ファイルの手順が実施されます。