개발

Github Actions (깃허브 액션)란?

jwonelife 2024. 7. 27. 10:53

Github Actions 은 Github에서 공식적으로 제공하는 CI/CD 와 같은 Workflow를 자동화할 수 있는 도구입니다.

Github 내 어떠한 Event가 발생하면 해당 이벤트에 대해 정해진 Job을 실행하게 하는 도구라고 이해할 수 있습니다.

 

💡 Github Actions: https://github.com/features/actions

 

Workflow의 대표적인 예

  • 자동화 스크립트
    • 예) 문서화, 코드 번들링, 주기적 배치
  • 테스트
    • 예) 코드 테스트, 여러 가지 버전의 환경 테스트(예: 여러 개의 node 버전에서 실행 가능)
  • 배포
    • 예) 서버 배포, npm publish, github pages

주요 용어

Workflows

  • 하나 이상의 Job(작업)을 실행하는 구성 가능한 자동화 프로세스이다.
  • Repository의 어떠한 이벤트(push, release 등)에 의해 실행되거나, 수동 또는 정의된 일정에 실행될 수 있다.

Events

  • Workflow 를 실행하는 특정 활동이나 규칙이다.
  • Push, Pull Request, Release 등과 같은 저장소 내의 활동에서 발생할 수 있고, Github 외부에서 발생할 수 있는 repository_dispatch , 스케쥴 시간, 수동으로 발생시킬 수도 있다.

Runners

Jobs

  • Workflow 의 기본 단위이다.
  • Workflow는 하나 이상의 Job으로 구성되어 있고, 다시 Job 은 하나 이상의 Step으로 구성될 수 있다.
  • Job 은 기본적으로 병렬로 실행 되거나, 다른 Job에 의존 관계를 갖고 순차적으로 실행될 수 있다.

Steps

  • Job 에서 순차적으로 실행되는 독립적인 프로세스 단위이다.
  • 하나의 Job 내의 Step 들은 동일한 Runner에서 실행되고 서로 데이터를 공유한다.

Actions

  • Workflow 의 가장 작은 단위로 Step에 포함되는 독립적인 명령을 말한다.
  • 마켓플레이스에 등록된 Action 을 사용할 수도 있고, 직접 만들어 사용할 수도 있다.

 

작성 샘플

  1. .github/workflows 경로의 폴더가 아직 없다면 폴더를 만듭니다.
  2. .github/workflows 폴더 안에 hello-github-actions.yml 파일을 만들고, 다음과 같이 작성합니다.
  3. 저장소에 push 하면 Hello-Github-Actions 가 실행 됩니다.
name: Hello Github Actions
on: [push]
jobs:
  Hello-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@v3
      - 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 }}."

 

💡 위의 예는 Github에서 자세히 보실 수 있습니다. https://docs.github.com/en/actions/quickstart

 

 

작성 예 - 빌드 및 테스트

name: Build & Test # 해당 액션의 이름
on: # 실행 조건
  pull_request: # master 브랜치를 대상으로 PR 이 발생하면 jobs 을 실행합니다.
    branches: [master]
jobs:
  Build-n-Test:
    runs-on: ubuntu-latest # 실행될 가상환경
    steps:
      - uses: actions/checkout@v3 # 가상환경에 저장소의 코드를 내려 받습니다.
      - uses: actions/setup-node@v3 # 가상환경에 nodejs 를 설치합니다.
        with:
          node-version: 16
			
        # 아래는 node package 를 설치하고, build / test 스크립트를 실행하도록 합니다.
      - name: Install dependencies
        run: yarn install --frozen-lockfile # run: npm ci

      - name: Build & Test
        run: |
          yarn run my-build-script
          yarn run my-test-script
  • runs-on ubuntu-latest 은 실행될 가상 환경을 지정하며, 자체 러너 호스팅도 가능합니다.
💡 사용 가능한 가상 환경은 GitHub Actions Virtual Environments를 참고하세요.
💡 자체 러너 호스팅 구축은 About self-hosted runners 를 참고하세요.

 

 

 

작성 예 - NPM publish 및 Github pages

name: Release deploy
on:
  release: # v0.1.0 과 같은 태그가 생성되면 실행한다.
    types:
      - created
    tags:
      - 'v[0-9]+.[0-9]+.[0-9]+**'
jobs:
  release:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: 16
          registry-url: https://registry.npmjs.org/ # npm 퍼블리시

      - name: Test and Generate # 패키지를 build 하고 doc 을 만든다
        run: |
          yarn install --frozen-lockfile
          yarn run my-build-script
          yarn run my-document-generate-script

      - name: NPM publish
        run: npm publish ./packages/lib # 경로(./packages/lib) 을 publish 한다
        env:
          NODE_AUTH_TOKEN: ${{secrets.NODE_AUTH_TOKEN}} # Github 레파지토리의 Settings 탭에서 secrets 변수를 설정할 수 있다.

      - name: Github pages publish
        uses: peaceiris/actions-gh-pages@v3
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }} # 해당 토큰은 개인용 액세스 토큰이 아닙니다.
          publish_dir: './docs' # generate 한 문서 폴더

 

💡NPM publish에 관한 Github 문서 Publishing Node.js packages  
💡GITHUB_TOKEN 은 개인용 액세스 토큰이 아닙니다. 해당 문서를 참고하세요.