自動執行Git儲存庫中的專案操作
在本教程中,您將了解如何設定管道以在配置變更合併到儲存庫中的主分支時觸發專案中的更新。 透過完成本教學課程,您將了解如何使用您選擇的管道和工具鏈自動執行專案中的常見任務,例如驗證配置。
這是一項實驗性功能,可用於評估和測試目的,可能會發生更改,恕不另行通知。
本教學重點在於一個簡單的用例,即當變更合併到儲存庫中的主分支時更新專案中的配置,如下圖所示:
由於管道和工具鍊是可自訂的,因此本教學課程中的原則可以幫助您自動執行專案中的其他常見操作,例如在將設定變更合併到儲存庫中的主分支後驗證和部署設定變更。 本教學使用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_PATHconfigs連接到您的專案的儲存庫資料夾的路徑。 該資料夾包含項目中的設定檔。 IAM_URLhttps://iam.cloud.ibm.comURL 至 Cloud Identity and Access Management. PROJECTS_API_BASE_URLhttps://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.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儲存庫中,前往 「操作」 標籤並選擇工作流程。 驗證更新是否成功執行。
- 在您的專案中,點擊選項圖示
>編輯您新增的配置並切換到主分支。 驗證您的更新是否已套用。 例如,您先前新增的身份驗證方法包含在 「設定」 面板中。