IaC/CI CD Tool

9. Github Action Steps Context 활용법

Somaz 2024. 11. 10. 00:51
728x90
반응형

Overview

Github Action의 Steps Context에 대해서 알아본다.

 

출처 : https://lo-victoria.com/github-actions-101-develop-a-cicd-workflow

 

 

 


Steps Context란?

GitHub Action에서 `steps` 컨텍스트를 사용하면 작업 내 step에 대한 정보를 참조할 수 있다. 이 컨텍스트는 동일한 작업 내에서 이전에 실행된 step에 대한 출력, 상태 및 기타 세부 정보에 액세스하는 데 필수적이다. 이를 통해 step은 후속 step에 데이터를 전달하고 종속성을 처리하며 step 결과에 따라 작업의 흐름을 제어할 수 있다.

 

`steps` 컨텍스트에는 지정되어 있고 이미 실행된 `id` 가 있는 현재 작업의 단계에 대한 정보가 포함된다.

 

 

steps 컨텍스트의 주요 구성요소

steps 컨텍스트에는 이전 단계의 데이터 및 출력 작업을 가능하게 하는 몇 가지 중요한 요소가 있다.

  • `steps` (object)
    • 이 컨텍스트는 작업의 각 step에 따라 변경된다. 작업의 모든 step에서 이 컨텍스트에 액세스할 수 있다. 이 개체에는 아래에 나열된 모든 속성이 포함된다.

 

  • `steps.<step_id>.outputs` (object)
    • 모든 step에 대한 output 값이다.

 

  • `steps.<step_id>.conclusion` (string)
    • `continue-on-error` 가 적용된 후 완료된 단계의 결과이다. 가능한 값은 `success`, `failure`, `cancelled`, `skipped` 이다. `continue-on-error` 단계가 실패하면 `outcome` 은 `failure` 이지만 최종 `conclusion` 는 `success` 이다.

 

  • `steps.<step_id>.outcome` (string)
    • `continue-on-error` 가 적용되기 전 완료된 단계의 결과이다. 가능한 값은 `success`, `failure`, `cancelled`, `skipped` 이다. `continue-on-error` 단계가 실패하면 `outcome` 은 `failure` 이지만 최종 `conclusion` 는 `success` 이다.

 

  • `steps.<step_id>.outputs.<output_name>` (string)
    • 특정 출력의 값이다.

 

continue-on-error 란?

`continue-on-error` 는 한 단계가 실패했을 때 작업이 실패하는 것을 방지한다. 이 단계가 실패했을 때 작업을 통과시키려면 true로 설정해야 한다. 이는 단계를 실행하고 싶지만 실패로 인해 후속 단계가 실행되는 것을 원하지 않을 때 유용하다.

 

name: Example Workflow with continue-on-error

on: [push]

jobs:
  test-job:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Code
        uses: actions/checkout@v2

      - name: Step that Might Fail
        id: may_fail
        run: |
          echo "Running a step that might fail"
          exit 1  # Simulate a failure
        continue-on-error: true

      - name: Check Outcome and Conclusion
        run: |
          echo "Outcome of may_fail: ${{ steps.may_fail.outcome }}"
          echo "Conclusion of may_fail: ${{ steps.may_fail.conclusion }}"

      - name: Final Step
        run: echo "This step runs regardless of the failure in 'Step that Might Fail'"

 

  • Step that Might Fail
    • 이 단계는 exit 1로 인해 의도적으로 실패한다.
    • `continue-on-error: true` 를 사용하면 이 단계가 실패하더라도 워크플로가 다음 단계로 진행할 수 있다.

 

  • Check Outcome and Conclusion
    • `may_fail` 단계의 `outcome` 과 `conclusion` 을 출력한다.
      • `outcome`: step 이 실패했기 때문에 `failure` 가 된다.
      • `conclusion`: `continue-on-error` 이 활성화되어 있으므로 이는 `success` 가 된다.
Outcome of may_fail: failure
Conclusion of may_fail: success

 

  • Final Step
    • 이전 단계의 실패와 관계없이 실행된다.
    • `continue-on-error: true` 가 없으면 `Step that Might Fail` 이후에 워크플로가 중지되었을 것이다.

 

 

 

 

steps 컨텍스트 예시

 

각 step 에는 후속 step 에서 해당 출력 및 상태에 액세스할 수 있도록 하는 `id` 가 할당될 수 있다.

`steps.<step_id>` 구문을 사용하여 ID로 단계 컨텍스트에 액세스할 수 있다.

- name: Build Project
  id: build
  run: echo "BUILD_VERSION=1.2.3" >> $GITHUB_OUTPUT

- name: Deploy Project
  run: echo "Using build version ${{ steps.build.outputs.BUILD_VERSION }}"
  • 여기서 `steps.build.outputs.BUILD_VERSION` 은 `id: build` 를 사용하여 단계의 `BUILD_VERSION` 출력에 액세스 한다.

 

 

`step.<step_id>.outcome` 을 활용해서 `skipped` 가 발생햇을때 새로운 변수를 할당하게 할 수 있다.

- name: Set GCP region JP for prod environment
  if: ${{ inputs.environment == 'stage' || inputs.environment == 'production' }}
  id: set-prod-region
  run: |
    echo "environment : ${{ inputs.environment }}"
    echo "GCP_REGION=asia-northeast1" >> $GITHUB_ENV

- name: Set GCP region KR
  if: ${{ steps.set-prod-region.outcome == 'skipped' }}
  run: |
    echo "environment : ${{ inputs.environment }}"
    echo "GCP_REGION=asia-northeast3" >> $GITHUB_ENV

 

 

`step.<step_id>.outcome` 을 활용해서 Build가 `success` 가 발생햇을 때 Deploy 하게 할 수 있다.

- name: Build
  id: build
  run: echo "Building..."

- name: Deploy
  if: steps.build.outcome == 'success'
  run: echo "Deploying..."

 

 

마지막으로 Github Action Workflow 으로 전체코드를 작성해본다.

jobs:
  build_and_test:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Set Version
        id: version
        run: echo "app_version=1.0.0" >> $GITHUB_OUTPUT

      - name: Run Build
        id: build
        run: echo "Build completed"

      - name: Run Tests
        id: tests
        run: |
          if [ "$RANDOM" -gt "20000" ]; then
            exit 1  # Simulating a failure
          fi
        continue-on-error: true

      - name: Deploy
        if: steps.tests.outcome == 'success'
        run: echo "Deploying version ${{ steps.version.outputs.app_version }}"
  • 버전 관리를 위한 출력 `app_version` 을 정의하며 후속 단계에서 `steps.version.outputs.app_version` 으로 액세스할 수 있다.
  • `continue-on-error: true` 구성으로 실패를 시뮬레이션하여 테스트를 실행한다. 이는 이 단계가 실패하더라도 워크플로가 중지되지 않음을 의미한다.
  • `if` 조건은 `tests` 단계가 성공했는지 확인한다. 그렇다면 `Set Version` 에 정의된 버전 출력을 사용하여 애플리케이션을 배포한다.

 

 


Reference

https://docs.github.com/ko/actions/writing-workflows/choosing-what-your-workflow-does/accessing-contextual-information-about-workflow-runs#steps-context

https://lo-victoria.com/github-actions-101-develop-a-cicd-workflow

https://docs.github.com/ko/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepscontinue-on-error

728x90
반응형