IBM Cloud Docs
Gitリポジトリでのプロジェクトアクションの自動化

Gitリポジトリでのプロジェクトアクションの自動化

このチュートリアルでは、構成の変更がリポジトリのメイン ブランチにマージされたときにプロジェクトの更新をトリガーするパイプラインを設定する方法を学習します。 このチュートリアルを完了すると、選択したパイプラインとツールチェーンを使用して、構成の検証などのプロジェクト内の一般的なタスクを自動化する方法を学習します。

これは評価とテストの目的で利用できる実験的な機能であり、予告なく変更される可能性があります。

このチュートリアルでは、次の図に示すように、リポジトリ内のメイン ブランチに変更がマージされたときにプロジェクトの構成を更新するという単純なユース ケースに焦点を当てます。

画像は、プロジェクトからリポジトリ内のサイド ブランチに行われる更新を示しています。 次に、矢印はサイド ブランチがメイン ブランチにマージされ、CD パイプラインがトリガーされることを示します。 CD パイプラインには、メイン ブランチの更新に基づいてプロジェクトの構成を更新するトリガーが含まれています。
変更がメインブランチにマージされた後、プロジェクトを自動的に更新します

パイプラインとツールチェーンはカスタマイズ可能なので、このチュートリアルの原則は、リポジトリのメイン ブランチにマージされた後の構成変更の検証とデプロイなど、プロジェクト内の他の一般的なアクションを自動化するのに役立ちます。 このチュートリアルでは、 GitHubアクションとワークフローを使用して、リポジトリとプロジェクト間のパイプラインを自動化します。 チュートリアルを完了したら、リポジトリの CI および CD パイプラインとプロセスに合わせて各ステップを調整します。

ドラフト構成は、CD パイプラインを管理するリポジトリ内のブランチにマージされた後にのみ検証およびデプロイできます。 構成を検証してデプロイする前に、構成を更新してリポジトリからの更新をプロジェクトに同期する必要もあります。 この更新は、 project.config.update API メソッド (このチュートリアルで説明) を使用するか、 ibmcloud project config-update CLI コマンドを使用して自動化できます。

開始前に

  1. IBM Cloud Projects サービスでエディターの役割を持っていることを確認してください。
  2. プロジェクトGitリポジトリに接続する をための手順を完了します。 このチュートリアルでは、空のプロジェクトをGitHubリポジトリに接続します。

GitHubにシークレットと変数を追加する

プロジェクトに接続したGitHubリポジトリにシークレットと変数を作成します。 これらのシークレットと変数は、 GitHubワークフローで使用されます。 次のシークレットと変数を追加します。

  1. プロジェクトで認証するには、 GitHubワークフローにIBM Cloud API キーを含める必要があります。 API キーを安全に保つには、リポジトリのシークレットを作成する手順を完了して、API キーをGitHubにシークレットとして保存します。 このチュートリアルでは、シークレットに IBM_CLOUD_API_KEY という名前を付けます。

  2. 次に、 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で必要に応じて変更できる サンプル ワークフロー ファイル から始めましょう。

必要なジョブの数に応じてワークフローをカスタマイズできます。 ただし、変更がサイド ブランチからリポジトリのメイン ブランチにマージされたときにプロジェクトの構成を正常に更新するには、次のコードを含める必要があります。

  1. メイン ブランチへのプル リクエストがクローズされたときにワークフローをトリガーするには、ワークフローの 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]
    
  2. 変更がメイン ブランチにマージされたときにこのワークフローをトリガーする if ステートメントを追加します。

    jobs:
      update-config:
        if: github.event.pull_request.merged == true
        runs-on: ubuntu-latest
    
  3. リポジトリがプロジェクトに接続できるように、ワークフローに次のコードを含めます。ここで、 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)
    
  4. 編集された構成を識別するには、次のコードを含めます。

              # 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}"
    
  5. プロジェクト内の編集された構成を更新するには、次のコードを含めます。

                  # 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,プロジェクトに構成を追加して、ワークフローが正常に実行されることを確認します。 以下のステップを実行します。

  1. IBM Cloudコンソールで、ナビゲーション メニューアイコン ナビゲーションメニュー アイコン>プロジェクト をクリックし、 GitHubリポジトリに接続されているプロジェクトを選択します。

  2. プロジェクトに構成を追加するには、 「作成」 をクリックします。 構成を保存するサイド ブランチを選択してください。

  3. 構成を編集します。 たとえば、 [構成] パネルで認証方法を追加します。

  4. 変更をコミットするサイド ブランチを選択します。

  5. **「コミット」**をクリックします。

  6. GitHubリポジトリに移動し、プル リクエストを開いて、サイド ブランチをリポジトリのメイン ブランチにマージします。

  7. サイド ブランチがメイン ブランチにマージされたときにワークフローが実行されることを確認します。 GitHubリポジトリとプロジェクトで確認できます:

    1. GitHubリポジトリで、 [アクション] タブに移動し、ワークフローを選択します。 アップデートが正常に実行されたことを確認します。
    2. プロジェクトで、追加した構成のオプションアイコンオプション アイコン>編集をクリックし、メイン ブランチに切り替えます。 更新が適用されていることを確認します。 たとえば、先ほど追加した認証方法は 、[構成] パネルに含まれています。