在 GCP 中,通过 Cloudbuild 我如何确保只触发文件中发生更改的那些步骤
In GCP, through Cloudbuild how can I ensure that only those steps get triggered for which changes have happened in file
我的问题是,给定以下 yaml 文件,如果我在 "dir: process/cbd-bu-data" 的任何文件中进行更改,例如,Cloud Build 在触发时会连续运行所有步骤。这会导致时间浪费。
我希望只有在 cloudbuild 中运行的那一步已在该目录的文件中进行了更改。我应该怎么做才能实现这一目标?
这是我的 cloudbuild.yaml
文件:
steps:
- args:
- beta
- functions
- deploy
- "--runtime=python37"
- "--trigger-http"
- "--entry-point=process_cbd_group_data"
- process_cbd_group_data
- "--region=us-central1"
dir: process/cbd-group-data
name: gcr.io/cloud-builders/gcloud
- args:
- beta
- functions
- deploy
- "--runtime=python37"
- "--trigger-http"
- "--entry-point=process_cbd_bu_data"
- process_cbd_bu_data
- "--region=us-central1"
dir: process/cbd-bu-data
name: gcr.io/cloud-builders/gcloud
- args:
- beta
- functions
- deploy
- "--runtime=python37"
- "--trigger-http"
- "--entry-point=process_cbd_structure_data"
- process_cbd_structure_data
- "--region=us-central1"
dir: process/cbd-structure-data
name: gcr.io/cloud-builders/gcloud
对于您的用例,最好的方法是使用不同的触发器(在您的用例中为 3 个)来监听不同的标签或分支,每个触发器都特定于您想要监听的文件更改。目前,当特定文件更改不可用时执行 Cloud Build 步骤。
您不能从一个云构建中执行此操作。您可以做的是使用 --included-files 选项创建三个不同的构建触发器。我认为用分支或标签完成同样的事情并不方便,就像我在另一个答案中读到的那样。阅读 documentation 了解更多详情。
您的 git 存储库布局:
function_one/
main.py
cloudbuild.yaml
function_two/
main.py
cloudbuild.yaml
function_three/
main.py
cloudbuild.yaml
cloudbuild.yaml
父布局cloudbuild.yaml:
steps:
- name: 'gcr.io/cloud-builders/gcloud'
entrypoint: 'bash'
args:
- '-c'
- |
cloud beta builds triggers create github build_one --included-files "function_one/*" --repo-name=XXX --repo-owner=XXX --branch-pattern=$BRANCH_NAME
cloud beta builds triggers create github build_two --included-files "function_two/*" --repo-name=XXX --repo-owner=XXX --branch-pattern=$BRANCH_NAME
cloud beta builds triggers create github build_three --included-files "function_three/*" --repo-name=XXX --repo-owner=XXX --branch-pattern=$BRANCH_NAME
子布局cloudbuild.yaml:
steps:
- args:
- functions
- deploy
- "--runtime=python37"
- "--trigger-http"
- "--entry-point=process_cbd_group_data"
- process_cbd_group_data
- "--region=us-central1"
name: gcr.io/cloud-builders/gcloud
如果你想用 gcloud CLI 做到这一点
gcloud beta builds triggers create cloud-source-repositories \
--repo=REPO_NAME \
--branch-pattern=BRANCH_PATTERN \ # or --tag-pattern=TAG_PATTERN
--build-config=BUILD_CONFIG_FILE \
--substitutions=_VARIABLE="VALUE"\
--included-files "DIRECTORY_NAME/**"
注:-
--included-files "directory_name/**" 将递归检测所有目录和文件。
--included-files "directory_name/*" 将只查找特定目录中的文件。
示例:-
gcloud beta builds triggers create cloud-source-repositories \
--repo=test-repo \
--branch-pattern=master \
--build-config=workflows/cloudbuild.yaml \
--substitutions=_REGION="asia-southeast1"\
--included-files "src/**"
我的问题是,给定以下 yaml 文件,如果我在 "dir: process/cbd-bu-data" 的任何文件中进行更改,例如,Cloud Build 在触发时会连续运行所有步骤。这会导致时间浪费。
我希望只有在 cloudbuild 中运行的那一步已在该目录的文件中进行了更改。我应该怎么做才能实现这一目标?
这是我的 cloudbuild.yaml
文件:
steps:
- args:
- beta
- functions
- deploy
- "--runtime=python37"
- "--trigger-http"
- "--entry-point=process_cbd_group_data"
- process_cbd_group_data
- "--region=us-central1"
dir: process/cbd-group-data
name: gcr.io/cloud-builders/gcloud
- args:
- beta
- functions
- deploy
- "--runtime=python37"
- "--trigger-http"
- "--entry-point=process_cbd_bu_data"
- process_cbd_bu_data
- "--region=us-central1"
dir: process/cbd-bu-data
name: gcr.io/cloud-builders/gcloud
- args:
- beta
- functions
- deploy
- "--runtime=python37"
- "--trigger-http"
- "--entry-point=process_cbd_structure_data"
- process_cbd_structure_data
- "--region=us-central1"
dir: process/cbd-structure-data
name: gcr.io/cloud-builders/gcloud
对于您的用例,最好的方法是使用不同的触发器(在您的用例中为 3 个)来监听不同的标签或分支,每个触发器都特定于您想要监听的文件更改。目前,当特定文件更改不可用时执行 Cloud Build 步骤。
您不能从一个云构建中执行此操作。您可以做的是使用 --included-files 选项创建三个不同的构建触发器。我认为用分支或标签完成同样的事情并不方便,就像我在另一个答案中读到的那样。阅读 documentation 了解更多详情。
您的 git 存储库布局:
function_one/
main.py
cloudbuild.yaml
function_two/
main.py
cloudbuild.yaml
function_three/
main.py
cloudbuild.yaml
cloudbuild.yaml
父布局cloudbuild.yaml:
steps:
- name: 'gcr.io/cloud-builders/gcloud'
entrypoint: 'bash'
args:
- '-c'
- |
cloud beta builds triggers create github build_one --included-files "function_one/*" --repo-name=XXX --repo-owner=XXX --branch-pattern=$BRANCH_NAME
cloud beta builds triggers create github build_two --included-files "function_two/*" --repo-name=XXX --repo-owner=XXX --branch-pattern=$BRANCH_NAME
cloud beta builds triggers create github build_three --included-files "function_three/*" --repo-name=XXX --repo-owner=XXX --branch-pattern=$BRANCH_NAME
子布局cloudbuild.yaml:
steps:
- args:
- functions
- deploy
- "--runtime=python37"
- "--trigger-http"
- "--entry-point=process_cbd_group_data"
- process_cbd_group_data
- "--region=us-central1"
name: gcr.io/cloud-builders/gcloud
如果你想用 gcloud CLI 做到这一点
gcloud beta builds triggers create cloud-source-repositories \
--repo=REPO_NAME \
--branch-pattern=BRANCH_PATTERN \ # or --tag-pattern=TAG_PATTERN
--build-config=BUILD_CONFIG_FILE \
--substitutions=_VARIABLE="VALUE"\
--included-files "DIRECTORY_NAME/**"
注:-
--included-files "directory_name/**" 将递归检测所有目录和文件。
--included-files "directory_name/*" 将只查找特定目录中的文件。
示例:-
gcloud beta builds triggers create cloud-source-repositories \
--repo=test-repo \
--branch-pattern=master \
--build-config=workflows/cloudbuild.yaml \
--substitutions=_REGION="asia-southeast1"\
--included-files "src/**"