IaC/CI CD Tool

2. Github Action (With Syntax)

Somaz 2023. 5. 22. 18:36
728x90
반응형

Overview

오늘은 Github Action 문법에 대해서 공부해보려고 한다.

 

2023.05.19 - [IaC/CI CD Tool] - 1. Github Action이란?

 

1. Github Action이란?

Overview 오늘은 Github Action에 대해서 공부해보려고 한다. Github Action이란? GitHub Actions는 빌드, 테스트 및 배포 파이프라인을 자동화할 수 있는 지속적 통합 및 지속적 배포(CI/CD) 플랫폼이다. 리포지

somaz.tistory.com

 


Github Action 문법

https://docs.github.com/ko/enterprise-cloud@latest/actions/using-workflows/about-workflows

 

 

Workflow란?

GitHub Actions에서 최상위 개념은 워크플로(Workflow)다.

워크플로는 쉽게 말해 '작업의 흐름'으로, 특정한 목적을 위한 일련의 실행 트리거, 환경, 기능들을 모두 포함한다.


Workflow syntax for GitHub Actions

워크플로는 하나 이상의 작업으로 구성된 구성 가능한 자동 프로세스이다.

워크플로 구성을 정의하려면 YAML 파일을 생성해야 한다.


on

워크플로를 자동으로 트리거하려면 를 사용하여 on 워크플로를 실행할 수 있는 이벤트를 정의한다.

on:
  push:
    branches:
      - main
      - 'releases/**'
  • 특정 예에서 'releases/**'는 계층 구조의 깊이에 관계없이 releases/로 시작하는 모든 branch와 일치한다. releases/v1, releases/v2, releases/2023/may/ver3 등과 같은 branch와 일치할 수 있다.
  • 반면에 releases/*를 사용한 경우 releases/ 바로 아래의 branch만 일치하고 releases/2023/may/ver3과 같은 하위 디렉토리의 branch는 일치하지 않는다.

 

on:
  pull_request:
    branches: [master]
  • push 뿐 아니라 pull request에 대해서도 트리거를 설정할 수 있다.

 

on:
  pull_request:
    # Sequence of patterns matched against refs/heads
    branches-ignore:    
      - 'mona/octocat'
      - 'releases/**-alpha'
  • 패턴이 branches-ignore패턴과 일치하면 워크플로가 실행되지 않는다.
  • A branch named mona/octocat (refs/heads/mona/octocat)
  • A branch whose name matches releases/**-alpha, like releases/beta/3-alpha (refs/heads/releases/beta/3-alpha)

 


on.workflow_call.inputs & .ouputs & .secrets 

재사용 가능한 워크플로의 입력 및 출력을 정의하는 데 사용한다. 호출된 워크플로에 사용할 수 있는 암호를 매핑할 수도 있다.

# call workflow 구문
  call-ts-generate:
    needs: [ check-diff, call-artifact, call-data-deploy ]
    name: Call ts-generate workflow
    uses: ./.github/workflows/somaz-generate.yml
    with:
      environment: ${{ needs.check-diff.outputs.environment }}
    secrets: inherit
  • with을 사용해 environment 변수를 somaz-generate.yml에 전달한다.
  • 재사용 가능한 워크플로를 호출하는 워크플로는 inherit키워드를 사용하여 암호를 암시적으로 전달할 수 있다.
    • 동일한 organization에 속한 경우 secrets을 공유한다.

키워드를 사용하여 inherit모든 호출 워크플로의 암호를 호출된 워크플로에 전달한다. 

여기에는 호출 워크플로가 액세스할 수 있는 모든 비밀, 즉 조직, 리포지토리 및 환경 비밀이 포함된다. 

키워드 inherit는 동일한 조직 내의 리포지토리 간에 또는 동일한 엔터프라이즈 내의 조직 간에 비밀을 전달하는 데 사용할 수 있다.

GitHub Organization secrets

 

name: Trigger somaz-generate

on:
  workflow_call:
    inputs:
      environment:
        description: Target Branch
        type: string
        required: true
    secrets:
      CICD_PAT:
        required: true
  • 위와 같이 environment와 secrets의 변수를 받을 수 있다.
  • required 옵션을 줘서 작업을 완료하는 데 필요한 모든 데이터가 워크플로에 있는지 확인할 수 있다. 

 

on:
  workflow_call:
    # Map the workflow outputs to job outputs
    outputs:
      workflow_output1:
        description: "The first job output"
        value: ${{ jobs.my_job.outputs.job_output1 }}
      workflow_output2:
        description: "The second job output"
        value: ${{ jobs.my_job.outputs.job_output2 }}
  • outputs은 말 그대로 출력내용이다. 위의 예시는 재사용 가능한 출력내용 예시이다.

 


 

on.workflow_run.<branches|branches-ignore>

이벤트 를 사용할 때 워크플로를 트리거하기 위해 트리거 워크플로가 실행되어야 하는 branch를 지정할 수 있다.

on:
  workflow_run:
    workflows: ["Build"]
    types: [requested]
    branches:
      - 'releases/**'
      
on:
  workflow_run:
    workflows: ["Build"]
    types: [requested]
    branches-ignore:
      - "canary"

on:
  workflow_run:
    workflows: ["Build"]
    types: [requested]
    branches:
      - 'releases/**'
      - '!releases/**-alpha'
  • 예를들어  빌드라는 워크플로가 ' releases/** ' 로 시작하는 모든 branch 에서만 실행되도록 할 수 있다.
  • branches-ignore 옵션을 줘서 빌드라는 워크플로가 canary 라는 이름이 아닌 분기에서 실행되는 경우에만 실행된다.
  • 빌드라는 워크플로가 releases/10 또는 releases/beta/mona라는 branch에서 실행되지만 releases/10-alpha, releases/beta/3-alpha 또는 main이 아닐때 다음 트리거가 있는 워크플로가 실행된다.

on.workflow_dispatch.inputs & .outputs & .secrets

웹에서 수동으로 트리거될때 해당 값들을 input 받을 수 있다.

workflow_dispatch는 workflow를 수동으로 trigger시킨다는 의미이다.

on:
  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:
    inputs:
      environment:
        type: environment
        description: Select the environment
        required: true
      service:
        description: Which service to be built. api or admin or etc...
        required: true
        type: choice
        options:
          - adam

Github action workflow run 화면

on.workflow_dispatch.inputs & .outputs & .secrets 은 workflow_call에서 사용했던 방법과 동일하다.

중요한 점은 수동으로 트리거시킬때 사용한다.

 


env

워크플로의 모든 작업 단계에서 사용할 수 있는 변수이다. type은 map이다.

env:
  SERVER: production

 

아래와 같이 여러가지 변수를 정의할수도 있다.

name: Greeting from Mona

on: push

jobs:
  my-job:
    name: My Job
    runs-on: ubuntu-latest
    steps:
      - name: Print a greeting
        env:
          MY_VAR: Hi there! My name is
          FIRST_NAME: Mona
          MIDDLE_NAME: The
          LAST_NAME: Octocat
        run: |
          echo $MY_VAR $FIRST_NAME $MIDDLE_NAME $LAST_NAME.

 


jobs

워크플로는 하나 이상의 작업으로 구성된다. 작업은 명령을 실행하거나, 스크립트를 실행하거나, 작업(별도의 리포지토리에 저장된 미리 작성된 스크립트)을 호출하는 단계이다.

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Set up Node.js
        uses: actions/setup-node@v2
        with:
          node-version: 14
      - name: Install dependencies
        run: npm ci
      - name: Run tests
        run: npm test

 


jobs.<job_id>.outputs & .secrets & .env 

jobs.<job_id>.outputs & .secrets & .env 사용법은 위에서 설명했던 내용과 동일하다.

 


jobs.<job_id>.needs

needs는 해당 작업이 시작되기전에 완료되어야 하는 작업을 정의한다.

  call-deploy:
    needs: [ build ]
    name: Call deploy workflow
    uses: ./.github/workflows/deploy.yml
    with:
      service: ${{ github.event.inputs.service }}
      environment: ${{ github.event.inputs.environment }}
      tag: ${{ needs.build.outputs.tag }}
      trigger_user: ${{ github.event.sender.login }}
    secrets: inherit
  • build 작업이 완료되기 전까지는 call-deploy 작업은 시작되지 않는다.
  • github.event는 워크플로를 트리거한 이벤트의 페이로드를 나타낸다.
    • pull_request 또는 push 또는 그 밖의 event
  • workflow_dispatch 이벤트로 수동으로 트리거된 경우에 github.event.inputs가 사용된다.
  • github.event.sender.login은 이벤트를 트리거한 사용자의 사용자 이름을 나타낸다.
jobs:
  job1:
    ...
  job2:
    needs: job1
    ...
  job3:
    needs: [job1, job2]
    runs-on: ubuntu-latest
    if: always()
    steps:
      - name: Check job1 and job2 outcome
        run: |
          echo "Job1 outcome: ${{ needs.job1.result }}"
          echo "Job2 outcome: ${{ needs.job2.result }}"
  • always()는 job1 및 job2의 결과에 관계없이 job3이 항상 실행되도록 한다.
  • always()가 없으면 job3은 job1과 job2가 모두 성공한 경우에만 실행된다.
  • needs.job1,2.result를 사용해서 해당 job의 결과를 확인할 수 있다.

 


 

jobs.<job_id>.if

조건이 충족되지 않는 한 작업이 실행되지 않도록 할 수 있다.

name: 1.Build

on:
  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:
    inputs:
      environment:
        type: environment
        description: Select the environment
        required: true

jobs:
  build:
    name: Build Image
    runs-on: ubuntu-20.04

    steps:
      - name: Check out branch
        uses: actions/checkout@v2

      - name: Set AWS region JP for prod environment
        if: ${{ github.event.inputs.environment == 'stage' || github.event.inputs.environment == 'production' }}
        id: set-prod-region
        run: echo "AWS_REGION=ap-northeast-1" >> $GITHUB_ENV

      - name: Set AWS region KR
        if: ${{ steps.set-prod-region.outcome == 'skipped' }}
        run: echo "AWS_REGION=ap-northeast-2" >> $GITHUB_ENV
  • environment 변수의 값이 stage 나 production이면 AWS_REGION의 변수의 값을 ap-northeast-1(도쿄)로 지정한다.
  • steps.set-prod-region.outcome의 값이 skipped이면 AWS_REGION의 변수의 값을 ap-northeast-2(한국)로 지정한다.

'outcome'은 다음과 같은 여러 상태 중 하나를 가질 수 있다.

  • success
  • failure
  • cancelled
  • skipped


jobs.<job_id>.runs-on

jobs.<job_id>.runs-on작업을 실행할 시스템 OS를 정의하는 데 사용한다.

https://docs.github.com/ko/enterprise-cloud@latest/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idruns-on

jobs:
  build:
    name: Build Image
    runs-on: ubuntu-20.04

 


jobs.<job_id>.uses

job으로 실행할 재사용 가능한 워크플로 파일의 위치를 지정하면 된다.

  • {owner}/{repo}/.github/workflows/{filename}@{ref} 
    • for reusable workflows in public, internal and private repositories.
  • ./.github/workflows/{filename} 
    • for reusable workflows in the same repository.
jobs:
  call-workflow-1-in-local-repo:
    uses: octo-org/this-repo/.github/workflows/workflow-1.yml@172239021f7ba04fe7327647b213799853a9eb89
  call-workflow-2-in-local-repo:
    uses: ./.github/workflows/workflow-2.yml
  call-workflow-in-another-repo:
    uses: octo-org/another-repo/.github/workflows/workflow.yml@v1

 


jobs.<job_id>.with

재사용 가능한 워크플로를 호출하는 데 작업이 사용되는 경우 with을 사용하여 호출된 워크플로에 전달시킬 수 있다.

전달하는 모든 변수는 호출된 워크플로에 정의된 변수와 일치해야 한다.

  call-deploy:
    needs: [ build ]
    name: Call deploy workflow
    uses: ./.github/workflows/deploy.yml
    with:
      service: ${{ inputs.service }}
      environment: ${{ inputs.environment }}
      tag: ${{ needs.build.outputs.tag }}
      trigger_user: ${{ github.event.sender.login }}
      is_build_triggered_by_workflow_dispatch: ${{ needs.build.outputs.is_build_triggered_by_workflow_dispatch }}
      build_branch: ${{ github.ref_name }}
    secrets: inherit
  workflow_call:
    inputs:
      service:
        type: string
        description: Which service to be built. api or admin or etc...
        required: true
      environment:
        type: string
        description: Select the environment
        required: true
      tag:
        type: string
        description: Built image tag
        required: true
      trigger_user:
        type: string
        description: CI&CD trigger user
        required: true
      is_build_triggered_by_workflow_dispatch:
        type: string
        description: Value for determine build workflow trigger
        required: true
      build_branch:
        type: string
        description: Build source branch
        required: true

Reference

https://docs.github.com/ko/enterprise-cloud@latest/actions/using-workflows/workflow-syntax-for-github-actions

 

https://www.daleseo.com/github-actions-steps/

 

 

728x90
반응형

'IaC > CI CD Tool' 카테고리의 다른 글

4. GitLab 버전 업그레이드  (0) 2023.08.08
3. Github Action (With Automate Pull Request)  (0) 2023.05.23
1. Github Action이란?  (0) 2023.05.19
ArgoCD란?  (0) 2023.05.17
3. GitLab이란? / GitLab CI/CD  (0) 2023.04.24