Git 저장소에서 프로젝트 작업 자동화

이 튜토리얼에서는 리포지토리의 메인 브랜치에 구성 변경 사항이 병합될 때 프로젝트에 업데이트를 트리거하는 파이프라인을 설정하는 방법을 알아봅니다. 이 튜토리얼을 완료하면 선택한 파이프라인과 툴체인을 사용하여 구성 검증과 같은 프로젝트의 일반적인 작업을 자동화하는 방법을 알아봅니다.

이는 평가 및 테스트 목적으로 사용 가능한 실험적 기능이므로 사전 통지 없이 변경될 수 있습니다.

이 튜토리얼은 다음 이미지에서 설명한 대로 저장소의 메인 브랜치에 변경 사항이 병합될 때 프로젝트의 구성을 업데이트하는 간단한 사용 사례에 초점을 맞춥니다.

 이미지는 프로젝트에서 저장소의 사이드 브랜치로 이동하는 업데이트를 보여줍니다. 그런 다음 화살표는 사이드 브랜치가 메인 브랜치에 병합되어 CD 파이프라인이 트리거됨을 나타냅니다. CD 파이프라인에는 메인 브랜치의 업데이트에 따라 프로젝트의 구성을 업데이트하는 트리거가 포함되어 있습니다.
변경 사항이 메인 브랜치에 병합된 후 프로젝트를 자동으로 업데이트합니다.

파이프라인과 툴체인은 사용자 정의가 가능하므로 이 튜토리얼의 원칙을 적용하면 프로젝트 내의 다른 일반적인 작업(예: 리포지토리의 메인 브랜치에 병합된 후 구성 변경 사항의 유효성 검사 및 배포)을 자동화하는 데 도움이 될 수 있습니다. 이 튜토리얼에서는 GitHub 작업과 워크플로를 사용하여 저장소와 프로젝트 간의 파이프라인을 자동화합니다. 튜토리얼을 완료하면서 각 단계를 저장소의 CI 및 CD 파이프라인과 프로세스에 맞게 조정하세요.

CD 파이프라인을 관리하는 저장소의 브랜치에 병합된 후에만 초안 구성을 검증하고 배포할 수 있습니다. 구성을 검증하고 배포하기 전에 구성을 업데이트하여 저장소의 업데이트를 프로젝트에 동기화해야 합니다. project.config.update API 메서드(이 튜토리얼에서 설명한 대로)를 사용하거나 ibmcloud project config-update CLI 명령을 사용하여 이 업데이트를 자동화할 수 있습니다.

시작하기 전에

  1. IBM Cloud 프로젝트 서비스에서 편집자 역할이 있는지 확인하세요.
  2. 프로젝트를 Git 저장소에 연결하는 단계를 완료하세요. 이 튜토리얼의 목적을 위해 빈 프로젝트를 GitHub 저장소에 연결합니다.

GitHub 에 비밀과 변수 추가

프로젝트에 연결한 GitHub 저장소에 비밀과 변수를 생성합니다. 이러한 비밀과 변수는 GitHub 워크플로에서 사용됩니다. 다음 비밀과 변수를 추가합니다.

  1. 프로젝트를 인증하려면 GitHub 워크플로에 IBM Cloud API 키를 포함해야 합니다. API 키를 안전하게 유지하려면 저장소에 대한 비밀을 만드는 단계를 완료하여 GitHub 에서 API 키를 비밀로 저장합니다. 이 튜토리얼의 목적을 위해 비밀 이름을 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.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. 프로젝트에서 추가한 구성에 대해 옵션 아이콘 > 옵션 아이콘 > 편집을 클릭하고 메인 브랜치로 전환합니다. 업데이트가 적용되었는지 확인하세요. 예를 들어, 이전에 추가한 인증 방법은 구성 패널에 포함됩니다.