如何使用 Cloud Builds 为 Google Cloud Functions 运行 python 单元测试?

Hsn*_*Hsn 4 gcloud google-cloud-functions google-source-repositories google-cloud-build

我正在尝试为我的谷歌云功能构建 CI/CD 管道。我所知道的是,我有带有 gcloud 和 git 的本地开发环境。我在本地环境中编写代码并拥有 cloudbuilds.yaml 文件。编写代码后,我将其推送到我有构建触发器的 Google 源代码库。它构建函数并部署它。

现在我也想要一些测试文件。这意味着每当我将它推送到源存储库时,它也应该运行测试并构建我的 main.py 文件,然后部署它。我拥有的 cloudbuild.yaml 文件是

steps:
- name: 'gcr.io/cloud-builders/gcloud'
  args:
  - functions 
  - deploy
  - FunctionName
  - --runtime=python37
  - --source=.
  - --entry-point=function
  - --trigger-topic=topic_name
  - --region=europe-west3 
Run Code Online (Sandbox Code Playgroud)

gui*_*ere 5

您可以在 Cloud Build 中添加一个步骤。我不知道你如何运行你的测试,但这里有一个在 python3.7 上下文中运行你的脚本的例子

- name: 'python:3.7'
  entrypoint: 'bash'
  args:
    - '-c'
    - |
       run the python script that you want
       pip install and others.
Run Code Online (Sandbox Code Playgroud)

更新

在您的部署功能之前添加此步骤。如果步骤失败(退出代码不同于 0),则云构建过程停止并且不执行部署。

更新 2

Cloud Build 的概念非常简单。您加载一个容器(以 表示name)。在容器中,/workspace从一个步骤到下一个步骤只附加和保持体积。

这个概念非常重要。如果您在一个步骤中设置环境变量或其他,则后面的步骤将失去此上下文。只/workspace保留的文件。下一步是仅当当前正确完成(退出代码 = 0)时才调用。

当一个容器被加载时,一个命令被触发。如果您使用cloud builder,默认情况下会调用默认入口点(例如, gcloud Cloud Builder 会自动启动 gcloud 命令)。然后你只需要添加 args 数组来提交到这个入口点。例子

- name: 'gcr.io/cloud-builders/gcloud'
  args:
  - functions 
  - list
Run Code Online (Sandbox Code Playgroud)

该命令表示gcloud functions listgcloud作为入口点和functionslist作为ARGS。

如果你的容器没有入口点(比如 python 容器)或者你想覆盖你的入口点,你可以用entrypoint关键字来指定它。在我的第一个代码示例中,几乎不需要 linux 概念。入口点是 bash。arg-c用于执行命令。管|如果用于允许多命令(多线)命令输入。

如果你只有一个 python 命令要启动,你可以这样做:

- name: 'python:3.7'
  entrypoint: 'python3'
  args:
    - 'test_main.py'
    - '.'
Run Code Online (Sandbox Code Playgroud)

但是,您编写的步骤将不起作用。为什么?回到我解释的开头:只/workspace保留了 的文件。如果您执行 a,pip3 install则文件不会写入/workspace目录中,而是写入系统中的其他地方。当您切换步骤时,您会失去此系统上下文。

这就是为什么多行命令很有用

- name: 'python:3.7'
  entrypoint: 'bash'
  args:
    - '-c'
    - |
       pip3 install -r requirements.txt
       python3 test_main.py .
Run Code Online (Sandbox Code Playgroud)

希望这有帮助!