CI/CD

持续集成和持续部署 (CI/CD) 流水线有助于确保您的函数在本地和 Google Cloud 上的测试环境中都能正常运行。

完成本地开发后,您可以配置一个 CI/CD 平台(例如 Cloud Build),以便持续运行现有的 Cloud Functions 函数测试。持续测试有助于确保您的代码继续按预期运行,并确保您的依赖项保持最新状态。由于 Cloud Functions 函数不会自动更新,因此您还可以配置 CI/CD 流水线(包括在 Cloud Build 上构建的此类流水线),以便通过源代码库(例如 GitHub 代码库、Bitbucket 代码库或 Cloud Source Repositories 代码库)自动测试和重新部署您的函数。

准备工作

在开始使用本指南之前,请先设置您的环境。

测试框架

测试框架为自动化测试提供了一个执行环境,可让您以极少的部署精力实现经过全面测试的生产部署。借助模拟框架,您可以模拟外部依赖项。外部依赖项是指您的函数需要的不在函数代码之内的项。

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.10'
  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: golang
  args: ['go', 'version']
- name: 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 和网址中使用的 Cloud Functions 函数的名称。
  • [YOUR_FUNCTION_TRIGGER] 替换为适当的触发器值,例如 --trigger-http
  • [YOUR_RUNTIME] 替换为运行时标识符,例如 nodejs10
  • [YOUR_FUNCTION_NAME_IN_CODE] 替换为代码中显示的函数名称。仅当此值不是 [YOUR_DEPLOYED_FUNCTION_NAME] 时才需要 --entry-point
  • function/dir/from/repo/root 替换为包含您的函数的目录的路径。

授予执行构建和部署的权限

如果您使用 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 Developer 角色分配给 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 角色

现在,只要您将 cloudbuild.yaml 文件推送到启用了 Cloud Build 的代码库,该文件中的步骤就会运行。