正在使用GCP Cloud Build为云功能建立CI管道。我们的组织喜欢使用Behave来测试python,所以我试着用Cloud Build做以下事情:
- 使用functions-framework运行行为测试
- 将这些测试的结果上传到存储桶
- 如果测试成功,将功能部署到我们的测试环境
就这样,唯一不工作的部分是步骤3中的IF。无论行为测试是否成功,都将部署该函数。我相信,因为我在写结果,写结果是成功的。我希望步骤1和2始终运行,如果行为测试失败,则跳过步骤3并使构建失败。
在第一步中,我尝试在命令字符串的末尾使用[ 0 -eq ${PIPESTATUS[0]} ]
保存测试的退出代码,但是我不知道如何使用该值来实现我上面描述的内容。
我的cloudbuild的内容。yaml文件:
steps:
- id: 'run-behave-tests'
name: 'gcr.io/my-project/my-docker-image:v1'
entrypoint: /bin/bash
args: [-c, 'pip install -r ./gcfs/hello/requirements.txt && cd ./gcfs/hello && (functions-framework --target=hello --signature-type=http --port=8080) & sleep 10 && cd ./gcfs/hello && behave --tags=local --format json --no-skipped --no-source --no-summary | jq ''.[] |= {"function_name": "hello"} + .'' | jq -c ".[]" > /workspace/behave_output_hello.json']
- id: 'upload-behave-results'
name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
args:
- gcloud
- storage
- cp
- --content-type=text/plain
- /workspace/behave_output_hello.json
- gs://bucketbucketbucket/behave_output.json
- id: 'deploy-function'
name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
args:
- gcloud
- functions
- deploy
- function-name
- --region=us-central1
- --source=https://MYCLOUDREPO/revisions/dev/paths/gcfs/hello
- --trigger-http
- --runtime=python311
- --project=myproject
options:
logging: CLOUD_LOGGING_ONLY
"my-docker-image"dockerfile:
FROM python:3.11
RUN pip install behave
RUN pip install requests
RUN apt-get update
RUN apt-get install sudo
RUN sudo apt-get install jq -y
您认为可能通过在yaml文件中使用bash脚本来开发一些条件逻辑吗?
如果可行的话- yaml文件的最后一步可能看起来像:
- id: "some identifier"
name: 'gcr.io/cloud-builders/gcloud'
entrypoint: 'bash'
args:
- '-c'
- |
if [[ -z "${example}" ]]
then
echo "deploy the cloud function using your preferred method"
else
echo "don't deploy the cloud function"
fi
如果您需要在步骤之间传输任何数据(即一些测试结果),您可能希望在一个步骤中将该数据保存在本地(用于Cloud Build运行时)文件中,并在随后的步骤中读取它。
echo ${some_data} > /workspace/some_data_file
some_data=$(cat /workspace/some_data_file)