Gitリポジトリでのプロジェクトアクションの自動化
このチュートリアルでは、構成の変更がリポジトリのメイン ブランチにマージされたときにプロジェクトの更新をトリガーするパイプラインを設定する方法を学習します。 このチュートリアルを完了すると、選択したパイプラインとツールチェーンを使用して、構成の検証などのプロジェクト内の一般的なタスクを自動化する方法を学習します。
これは評価とテストの目的で利用できる実験的な機能であり、予告なく変更される可能性があります。
このチュートリアルでは、次の図に示すように、リポジトリ内のメイン ブランチに変更がマージされたときにプロジェクトの構成を更新するという単純なユース ケースに焦点を当てます。
パイプラインとツールチェーンはカスタマイズ可能なので、このチュートリアルの原則は、リポジトリのメイン ブランチにマージされた後の構成変更の検証とデプロイなど、プロジェクト内の他の一般的なアクションを自動化するのに役立ちます。 このチュートリアルでは、 GitHubアクションとワークフローを使用して、リポジトリとプロジェクト間のパイプラインを自動化します。 チュートリアルを完了したら、リポジトリの CI および CD パイプラインとプロセスに合わせて各ステップを調整します。
ドラフト構成は、CD パイプラインを管理するリポジトリ内のブランチにマージされた後にのみ検証およびデプロイできます。 構成を検証してデプロイする前に、構成を更新してリポジトリからの更新をプロジェクトに同期する必要もあります。 この更新は、 project.config.update
API メソッド (このチュートリアルで説明) を使用するか、 ibmcloud project config-update
CLI コマンドを使用して自動化できます。
開始前に
- IBM Cloud Projects サービスでエディターの役割を持っていることを確認してください。
- プロジェクト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で必要に応じて変更できる サンプル ワークフロー ファイル から始めましょう。
必要なジョブの数に応じてワークフローをカスタマイズできます。 ただし、変更がサイド ブランチからリポジトリのメイン ブランチにマージされたときにプロジェクトの構成を正常に更新するには、次のコードを含める必要があります。
-
メイン ブランチへのプル リクエストがクローズされたときにワークフローをトリガーするには、ワークフローの
on
セクションにtypes: [closed]
を追加します。# 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リポジトリで、 [アクション] タブに移動し、ワークフローを選択します。 アップデートが正常に実行されたことを確認します。
- プロジェクトで、追加した構成のオプションアイコン
>編集をクリックし、メイン ブランチに切り替えます。 更新が適用されていることを確認します。 たとえば、先ほど追加した認証方法は 、[構成] パネルに含まれています。