Github Action에 대한 소개와 사용법

ggong·2021년 6월 21일
26

Github Action은 github에서 공식적으로 제공하는 CI/CD 툴, 다시 말해 개발의 work flow를 자동화할 수 있게 도와주는 툴이다.

CI/CD란?

CI는 Continuous Integration(지속적 통합), CD는 Continuous Delivery(지속적 전달)의 줄임말이다.

  • CI : 테스트, 빌드, Dockerizing, 저장소에 전달하는 것까지 프로덕션 환경으로 서비스를 배포할 수 있도록 준비하는 프로세스
  • CD : 저장소로 전달된 프로덕션 서비스를 실제 사용자들에게 배포하는 프로세스

작업한 소스 코드를 빌드하고, 저장소에 전달 후 배포까지 하는 과정을 통상적으로 CI/CD라고 부른다.

Github Action의 코어 개념

- Workflow
자동화된 전체 프로세스. 하나 이상의 Job으로 구성되고, Event에 의해 예약되거나 트리거될 수 있는 자동화된 절차를 말한다.
Workflow 파일은 YAML으로 작성되고, Github Repository의 .github/workflows 폴더 아래에 저장된다. Github에게 YAML 파일로 정의한 자동화 동작을 전달하면, Github Actions는 해당 파일을 기반으로 그대로 실행시킨다.

- Event
Workflow를 트리거(실행)하는 특정 활동이나 규칙. 예를 들어, 누군가가 커밋을 리포지토리에 푸시하거나 풀 요청이 생성 될 때 GitHub에서 활동이 시작될 수 있다.

- Job
Job은 여러 Step으로 구성되고, 단일 가상 환경에서 실행된다. 다른 Job에 의존 관계를 가질 수도 있고, 독립적으로 병렬로 실행될 수도 있다.

- Step
Job 안에서 순차적으로 실행되는 프로세스 단위. step에서 명령을 내리거나, action을 실행할 수 있다.

- Action
job을 구성하기 위한 step들의 조합으로 구성된 독립적인 명령. workflow의 가장 작은 빌드 단위이다. workflow에서 action을 사용하기 위해서는 action이 step을 포함해야 한다. action을 구성하기 위해서 레포지토리와 상호작용하는 커스텀 코드를 만들 수도 있다. 사용자가 직접 커스터마이징하거나, 마켓플레이스에 있는 action을 가져다 사용할 수도 있다. (더 자세한 설명은 아래에!)

- Runner
Gitbub Action Runner 어플리케이션이 설치된 머신으로, Workflow가 실행될 인스턴스

Github Action 생성해보기

Github Action은 event, job, step을 정의하기 위해 YAML 파일을 사용한다. workflow를 구성할 레포지토리에 .github/workflows 디렉토리 안에 test-github-actions.yml 형태로 파일을 생성한다.

아래 예시를 보자.

name: learn-github-actions
on:
    push:
      branches: [ master, dev ]
    pull_request:
      branches: [ master ]
      paths:
        - "**.js"
      paths-ignore:
        - "doc/**"
jobs:
  build:
    strategy:
      matrix:
        node-version: [10.x, 12.x]

    runs-on: ubuntu-latest
    steps:
      - name: Checkout source code
        uses: actions/checkout@v2
        
      - name: My First Step
        run:
          npm install
          npm test
          npm build

      - name: Cache yarn dependencies
        uses: actions/cache@v1
        id: yarn-cache
        with:
          path: node_modules
          key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-yarn-

한 부분씩 파일 설정을 살펴보자.

name: learn-github-actions 

깃헙 레포지토리의 액션 탭에 노출되는 workflow의 이름. 옵셔널한 값이다.

on:
    push:
      branches: [ master, dev ]
    pull_request:
      branches: [ master ]
      paths:
        - "**.js"
      paths-ignore:
        - "doc/**"

workflow 파일을 자동으로 트리거하는 이벤트를 명시한다. push 이벤트를 명시하면, 누군가가 깃 레포지토리에 변경사항을 push 하는 시점마다 job이 실행된다.
특정한 브랜치나, tag나, path에서만 실행되도록 할 수도 있다. 위 코드처럼 paths로 특정 패턴을 설정하여 해당 패턴에 일치하는 파일이 변경되었을 때 workflow가 실행되도록 설정할 수도 있고, !paths나 paths-ignore를 사용하여 무시할 패턴을 설정할 수도 있다.

jobs:
  build:
    strategy:
      matrix:
        node-version: [10.x, 12.x]

    runs-on: ubuntu-latest
    steps:
      - name: Checkout source code 
        uses: actions/checkout@v2
        
      - name: My First Step
        run:
          npm install
          npm test
          npm build

      - name: Cache yarn dependencies 
        uses: actions/cache@v1
        id: yarn-cache
        with:
          path: node_modules
          key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-yarn-

job에 대한 설정들이다. job에는 아래와 같은 정보들이 들어갈 수 있다.

  • runs-on: 해당 job을 어떤 OS에서 실행할 것인지 명시한다.
  • steps: job이 가질 수 있는 동작의 나열. 각각의 step은 독립적인 프로세스를 가진다.
    • uses: 해당 step에서 사용할 액션. Github 마켓플레이스에 올라온 action들을 사용할 수도 있다.{owner}/{repo}@{ref|version} 의 형태를 지닌다.
    • name: step의 이름
    • run: job에 할당된 컴퓨팅 자원의 shell을 이용하여 커맨드 라인을 실행한다. node.js 프로젝트의 경우, 이 과정에 npm package의 scripts를 구동할 수 있다.
  • env: 해당 job에서 사용할 환경 변수를 key/value의 형태로 설정한다.
  • strategy: 여러 환경에서의 테스트/배포를 위해서 빌드 matrix를 구성한다. 위 코드처럼 사용하면 다양한 node 버전에서 같은 job을 실행할 수도 있다.
  • with: 해당 action에 의해 정의되는 input 파라미터. key/value 페어로 되어 있다. input 파라미터는 환경 변수로 설정되고, 'INPUT_'이라는 prefix가 붙는다.

Quick Start

Github 홈페이지에 보면 간단하게 Github Action을 구성해볼 수 있는 안내가 있다. (링크는 요기)
workflow를 추가하고 Github Action의 간단한 기능들을 써볼 수 있는 과정이다. 테스트를 위해서는 깃헙 레포지토리가 필요하다.

1) 원하는 레포지토리에 .github/workflows 라는 디렉토리 안에 github-actions-demo.yml 파일을 생성한다. 홈페이지에서는 테스트를 위한 yml 파일 데모 소스를 제공한다.

name: GitHub Actions Demo
on: [push]
jobs:
  Explore-GitHub-Actions:
    runs-on: ubuntu-latest
    steps:
      - run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event."
      - run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by GitHub!"
      - run: echo "🔎 The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}."
      - name: Check out repository code
        uses: actions/checkout@v2
      - run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner."
      - run: echo "🖥️ The workflow is now ready to test your code on the runner."
      - name: List files in the repository
        run: |
          ls ${{ github.workspace }}
      - run: echo "🍏 This job's status is ${{ job.status }}."

2) 새 브랜치 생성 후 pull request 시작하기를 선택하고, Propose new file을 클릭한다.

3) 커밋 후 push 이벤트가 트리거되면 workflow가 실행된다.
실행되는 job은 Action 탭에서 확인할 수 있다. 해당 레포지토리의 Action 탭을 클릭한다.

4) 좌측에서 보고 싶은 workflow의 name을 클릭한다. 테스트의 경우 name이 'Github-Action-Demo'였으므로 클릭!

5) 리스트에 보이는 yml을 클릭하면 좌측에 실행되는 job의 name이 뜬다.

6) 로그를 보면 아래처럼 각 step들이 어떻게 실행되는지를 볼 수 있다. expand하면 디테일한 내용도 볼 수 있다.



참고 :
Introduction to GitHub Actions
(https://docs.github.com/en/actions/learn-github-actions/introduction-to-github-actions)
Github Actions를 이용해 CI/CD 파이프라인 구성하기
(https://hwasurr.io/git-github/github-actions/)
Github Action 사용법 정리
(https://zzsza.github.io/development/2020/06/06/github-action/)

profile
파닥파닥 FE 개발자의 기록용 블로그

1개의 댓글

comment-user-thumbnail
2022년 1월 8일

질문 있습니다.
Action에 대한 설명 중에
"step들의 조합으로 구성된", " action이 step을 포함해야 한다"가 있었는데,
이게 무슨 뜻인지 잘 모르겠습니다.
가르쳐 주실 수 있나요?

steps:
uses: actions/..
의 형태로, steps 아래에 있는 거 아닌가요?

답글 달기