GitHub Actions

  • GitHub에서 CI/CD, 자동화 등 개발시 필요한 작업 흐름(workflow)을 유연하게 작성할 수 있도록 제공하는 도구.

  • GitHub의 여러 이벤트와 쉽게 연계해 작업을 수행할 수 있는 것이 특징.

Concept

.github/workflows/
└── *.yaml [Workflow] (1)
    ├── [Job] (2)
    └── [Job]
        ├── [Step] (3)
        └── [Step]
  1. Workflow: 워크플로우는 yaml 파일로 작성되었으며, 정해진 Event에 맞게 parallel로 실행됨

  2. Job: 워크플로우 실행시 Runner 위에서 실행되는 작업(jobs). 기본적으론 parallel, 선택적으로 seqential로 실행

  3. Step: Job 내에 정의된 스탭(steps). sequential하게 실행

Workflow

  • 최상의 개념으로, 하나 이상의 job으로 구성된 자동화 프로세스

  • .github/workflows/ 하위에 yaml 파일로 선언적으로 작성

Event

name: workflow-2

on:
  workflow_run:
    workflows: [ "workflow-1" ]
  type: [ complate ]
  • 워크플로우를 실행하는 트리거 (Events that trigger workflows)

  • 다양한 이벤트 지원

    • GitHub 이벤트 (push, pr, …​)

    • 스케줄러: UTC 기준의 cron syntax (e.g. 5 * * * *) (ref)

    • 수동 이벤트: GitHub API (e.g. workflow_dispatch)

    • webhook 이벤트: (e.g. workflow_run - 특정 워크플로우 시작, 완료시 수행)

Job

  • Runner에서 실행되는 Step들의 집합

  • 여러 Job이 있을 경우 병렬로 실행됨(default)

  • needs 지시어를 통해 Job같의 순차 실행을 강제할 수 있음

  • artifact를 이용해 job간에 데이터를 주고 받을 수 있음 (Storing workflow data as artifacts)

    - name: 'Upload Artifact'
      uses: actions/upload-artifact@v3
      with:
        name: my-artifact
        path: my_file.txt
        retention-days: 5
    - name: Download a single artifact
      uses: actions/download-artifact@v3
      with:
        name: my-artifact

Step

  • task 집합으로 command, action 실행

  • 순차적으로 실행됨

Action

Runner

  • GitHub Action runner App이 설치된 머신

  • GitHub Actions workflow가 실행될 서버/인스턴스

  • 각 Runner는 한번에 하나의 Job만 실행 가능

  • github-hosted runner, self-hosted runner로 나눠짐

    • shared runner

      1. 사용중인 organization의 'Settings’의 'Actions’을 들어가면 조회 가능

      2. 해당 runner 설정('Edit repository access')을 통해 사용할 repository에 권한 설정

환경변수 설정

  1. Repository의 'Settings > Secrets'

  2. 환경변수 추가

  3. yaml에서 아래와 같이 가져다 쓸 수 있음

    env:
      KEY: ${{ secrets.DEPLOY_KEY }}
    
    steps:
      - name:
        run: echo $KEY

병렬 작업

jobs:
  job1:
  job2:
    needs: job1
  job3:
    needs: [job1, job2]

submodules

vs. Jenkins

  • GitHub Action 언어의 *.yaml 파일

  • Groovy 문법의 Jenkinsfile`