在Git存储库中自动执行项目操作
在本教程中,您将学习如何设置管道,以便在配置更改合并到存储库中的主分支时触发项目更新。 通过完成本教程,您将学习如何使用您选择的管道和工具链自动执行项目中的常见任务,例如验证配置。'code1
这是一个实验性功能,仅用于评估和测试目的,可能会发生变化,恕不另行通知。
本教程重点介绍当更改合并到存储库中的主分支时更新项目中的配置的简单用例,如下图所示:
由于管道和工具链是可定制的,本教程中的原则可以帮助您自动执行项目内的其他常见操作,例如在将配置更改合并到存储库中的主分支后验证和部署配置更改。 本教程使用GitHub操作和工作流程来自动化存储库和项目之间的管道。 完成本教程后,请调整每个步骤以匹配存储库的 CI 和 CD 管道和流程。
仅当草稿配置合并到管理 CD 管道的存储库中的分支后,您才能验证和部署草稿配置。 您还必须通过更新配置将存储库中的更新同步到项目中,然后才能验证和部署这些配置。 您可以使用 project.config.update
API 方法(如本教程中所述)或使用 ibmcloud project config-update
CLI 命令自动执行此更新。
准备工作
- 确保您在IBM Cloud项目服务上具有编辑者角色。
- 完成 将您的项目连接到Git存储库的 步骤。 为了本教程的目的,将一个空项目连接到GitHub存储库。
向GitHub添加机密和变量
在连接到项目的GitHub存储库中创建机密和变量。 这些秘密和变量用于GitHub工作流程。 添加以下机密和变量:
-
要对您的项目进行身份验证,您必须在GitHub工作流程中包含IBM Cloud API 密钥。 为了保证 API 密钥的安全,请完成 为存储库创建密钥的步骤,以将 API 密钥保存为GitHub中的密钥。 出于本教程的目的,将秘密命名为
IBM_CLOUD_API_KEY
。 -
接下来,完成为您的GitHub存储库 创建配置变量的步骤。 保存以下变量:
要保存到GitHub存储库的变量列表 变量名称 值 描述 CONFIG_FOLDER_PATH
configs
与您的项目连接的存储库文件夹的路径。 此文件夹包含您的项目的配置文件。 IAM_URL
https://iam.cloud.ibm.com
URL 至 Cloud Identity and Access Management。 PROJECTS_API_BASE_URL
https://projects.api.cloud.ibm.com
项目 API 的 URL。
在GitHub中创建工作流程
完成在连接到项目的GitHub存储库中 编写工作流的步骤。
从 示例工作流文件 开始,您可以根据需要在GitHub中修改该文件。
您可以根据所需的任意数量的作业来定制工作流程。 但是,当更改从侧分支合并到存储库的主分支时,需要包含以下代码才能成功更新项目中的配置:
-
将
types: [closed]
添加到工作流的on
部分,以便在对主分支的拉取请求关闭时触发工作流:# Controls when the workflow will run on: # Triggers the workflow on push or pull request events but only for the "main" branch # push: # branches: [ "main" ] pull_request: branches: [ "main" ] types: [closed]
-
添加
if
语句,当更改合并到主分支时触发此工作流程:jobs: update-config: if: github.event.pull_request.merged == true runs-on: ubuntu-latest
-
在工作流中包含以下代码,以便您的存储库可以连接到您的项目,其中
IBM_CLOUD_API_KEY
是您添加到GitHub:IAM_TOKEN=$(curl -X POST "https://iam.test.cloud.ibm.com/identity/token" \ -H "Content-Type: application/x-www-form-urlencoded" \ -H "Accept: application/json" \ -d "grant_type=urn:ibm:params:oauth:grant-type:apikey&apikey=${{ secrets.IBM_CLOUD_API_KEY }}" | jq -r .access_token)
-
包括以下代码来识别哪些配置已被编辑:
# get files changed in the PR changed_files=$(git diff --name-only HEAD^ HEAD) echo "Changed files: $changed_files" for file in $changed_files; do # find config files that were changed if [[ "${file}" == ${{ vars.CONFIG_FOLDER_PATH }}/* ]] && [ -s "${file}" ]; then echo "Config file updated: ${file}" # extract data from config files PROJECT_ID=$(jq -r '.project_id' $file) CONFIG_ID=$(jq -r '.config_id' $file) DEF=$(jq '.definition' $file) echo "Project ID: ${PROJECT_ID}" echo "Config ID: ${CONFIG_ID}"
-
包含以下代码来更新项目中已编辑的配置:
# update config definition RESPONSE=$(curl -X PATCH "${BASE_URL}/v1/projects/${PROJECT_ID}/configs/${CONFIG_ID}" \ --header "Authorization: Bearer ${IAM_TOKEN}" \ --header "Accept: application/json" \ --header "Content-Type: application/json" \ --data "{ \"definition\": ${DEF} }")
示例工作流文件
以下代码片段可用作工作流文件的模板:
name: Projects Git Integration Workflow
# Controls when the workflow will run
on:
# Triggers the workflow on push or pull request events but only for the "main" branch
pull_request:
branches: [ "main" ]
types: [closed]
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
jobs:
update-configs:
if: github.event.pull_request.merged == true
runs-on: ubuntu-latest
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Update Project Configs
run: |
IAM_TOKEN=$(curl -X POST "${{ vars.IAM_URL }}/identity/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-H "Accept: application/json" \
-d "grant_type=urn:ibm:params:oauth:grant-type:apikey&apikey=${{ secrets.IBM_CLOUD_API_KEY }}" | jq -r .access_token)
BASE_URL=${{ vars.PROJECTS_API_BASE_URL }}
# get files changed in the PR
changed_files=$(git diff --name-only HEAD^ HEAD)
echo "Changed files: $changed_files"
for file in $changed_files; do
# find config files that were changed
if [[ "${file}" == ${{ vars.CONFIG_FOLDER_PATH }}/* ]] && [ -s "${file}" ]; then
echo "Config file updated: ${file}"
# extract data from config files
PROJECT_ID=$(jq -r '.project_id' $file)
CONFIG_ID=$(jq -r '.config_id' $file)
DEF=$(jq '.definition' $file)
echo "Project ID: ${PROJECT_ID}"
echo "Config ID: ${CONFIG_ID}"
# update config definition
RESPONSE=$(curl -X PATCH "${BASE_URL}/v1/projects/${PROJECT_ID}/configs/${CONFIG_ID}" \
--header "Authorization: Bearer ${IAM_TOKEN}" \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
--data "{ \"definition\": ${DEF} }")
echo $RESPONSE
ERR_CODE=$(echo $RESPONSE | jq '.code')
if [ "${ERR_CODE}" != "null" ]; then
exit 1
fi
else
echo "Not a project configuration file: ${file}"
fi
done
测试工作流程
现在您已在GitHub,请通过向项目添加配置来确保工作流程成功运行。 完成以下步骤:
-
在IBM Cloud控制台中,单击导航菜单图标
>**项目**并选择连接到您的GitHub存储库的项目。
-
单击 “创建” 可将配置添加到您的项目。 确保选择将保存配置的侧分支。
-
编辑配置。 例如,在配置面板中添加身份验证方法。
-
选择您想要提交更改的侧分支。
-
单击提交。
-
转到您的GitHub存储库,并打开拉取请求以将侧分支合并到存储库的主分支中。
-
验证侧分支合并到主分支时工作流程是否运行。 您可以在GitHub存储库和项目中验证:
- 在GitHub存储库中,转到 “操作” 选项卡并选择工作流程。 确认更新是否成功运行。
- 在您的项目中,单击您添加的配置的选项图标
>编辑,然后切换到主分支。 验证您的更新是否已应用。 例如,您之前添加的身份验证方法包含在配置面板中。