Profile picture

[Github Actions] Github Actions 핵심 개념

JaehyoJJAng2023년 04월 10일

Github Actions ?

Github Actions는 코드 저장소(repository)로 유명한 Github에서 제공하는 CI/CD 를 위한 비교적 최그에 추가된 서비스이다!.

최근에 추가된 서비스임에도 불가하고 기존 CI 서비스(Jekins,Travis 등)를 위협하고 있는 엄청난 서비스이다.

해당 서비스는 Github에서 코드를 관리하고 있는 소프트웨어 프로젝트에서 사용할 수 있고 Github 계정을 가지고 있는 누구나 사용이 가능하기 때문에 타 CI/CD 서비스 대비 진입장벽이 많이 낮다고 한다.


github actions를 사용하면 자동으로 코드 저장소에서 어떤 이벤트(event)가 발생했을 때 특정 작업이 일어나게 하거나 주기적으로 어떤 작업들을 반복해서 실행시킬 수도 있다.

예를 들어보자면, 누군가 코드 저장소에 PR을 생성하게 되면 Github Actions를 통해 변경된 코드가 문제가 없는지 각종 검사 진행이 가능하고 , 어떤 새로운 코드가 main 브랜치에 push되면 Github Actions를 통해 소프트웨어 빌드(build)하고 상용 서버에 배포(deploy)할 수도 있다.

Workflows

Github Actions에서 가장 상위 개념이라고 할 수있는 워크플로우는 쉽게 말해 자동화 해놓은 작업 과정이라고 보면 된다.

워크플로우는 코드 저장소 내에서 .github/workflows 폴더 아래에 위치한 YAML 파일로 설정하며, 하나의 코드 저장소에는 여러 개의 워크플로우,즉 여러 개의 YAML 파일을 생성할 수도 있다.


이 워크플로우 YAML 파일에는 크게 2가지를 정의해야 한다.

  1. on : 해당 워크플로우가 언제 실행될 지 정의
  2. jobs : 해당 워크플로우가 구체적으로 어떤 일을 해야하는지 명시

main 브랜치에 push 이벤트가 발생할 때 마다 워크플로우를 실행하도록 함

on:
  push:
    branches:
      - main
jobs:
  # ...(생략)...

Jobs

Github Actions에서 작업(job)이란 독립된 가상 머신 또는 컨테이너에서 돌아가는 하나의 처리 단위를 의미한다.

하나의 워크플로우는 여러 개의 작업으로 구성되며 적어도 하나의 작업은 존재해야 한다.

그리고 모든 작업은 기본적으로 동시에 실행되고 필요 시 작업 간에 의존 관계 설정도 가능하며 뿐만 아니라 작입어 실행되는 순서 또한 제어 가능하다.

작업은 워크플로우 YAML 파일 내에서 jobs 속성을 이용하며 작업 식별자(ID)와 작업 세부 내용 간의 맵핑 형태로 명시가 된다.

예를 들면, job1, job2, job3이라는 작업 ID를 가진 3개의 작업을 추가혀려면 아래와 같이 하면 된다.

jobs:
  job1:
    # job1 세부 작업 내용
  job2:
    # job2 세부 작업 내용
  job3:
    # job3 세부 작업 내용

작업의 세부 내용으로는 여러 가지 내용이 명시 가능하고, 필수로 들어가야 하는 runs-on 속성을 통해 해당 리눅스나 윈도우즈와 같은 실행 환경을 필수로 지정해줘야 한다


예를 들어 , 가장 많이 사용되는 우분투의 최신 실행 환경에서 작업을 실행하고 싶다면 다음과 같이 하면 된다

jobs:
  job1:
    runs-on: ubuntu-latest
    steps:
      # ...(생략)...

Steps

Github Actions에서는 각 작업(job)이 하나 이상의 단계(step)로 모델링이 된다.

작업 단계는 단순한 커맨드나 스크립트가 될 수도 있고 액션이라고 하는 조금 더 복잡한 명령일 수도 있다.

커맨드나 스크립트를 실행할 때는 run 속성을 이용하고 , 액션 사용 시에는 uses 속성을 사용한다


예를 들어보자, 파이썬 프로젝트에서 테스트를 돌리려면 코드 저장소에 코드를 작업 실행 환경으로 내려받고, 패키지를 설치하고, 테스트 스크립트를 실행해야 한다.

이 3단계의 작업은 아래와 같이 steps 속성을 통해 명시할 수 있다.

jobs:
  flask:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Install dependencies
        run: |
          if [[ -f scripts/requirements.txt ]]
          then
            pip install -r scripts/requirements.txt
          else 
            pip install bs4
          fi
      - name: Execute test code
        run: |
          python test.py

워크플로우 파일 내에서 작업 단계를 명시해줄 때는 주의할 부분이 있다!

YAML 문법에서 시퀀스 타입을 사용하기 때문에 각 단계 앞에 반드시 -를 붙여줘야 한다

Actions

Github Actions의 하이라이트인 Action이다.

액션은 Github Actions에서 빈번하게 필요한 반복 단계를 재사용하기 용이하도록 제공되는 일종의 작업 공유 매커니즘이라고 한다. 이 액션은 하나의 코드 저장소 범위내에서 여러 워크플로우 간에서 공유를 할 수 있도록 할 뿐 아니라, 공개 코드 저장소를 통해 액션을 공유하면 Github 상의 모든 코드 저장소에서 해당 액션이 사용 가능해진다.

대표적인 공개 액션으로는 위에서 사용한 actions/checkout@v2을 예시로 들 수 있겠다.


Loading script...