Github Actions에 대해 알아보자

짱J·2022년 8월 18일
1

DevOps

목록 보기
1/8
post-thumbnail

CI & CD

CI (Continuous Integration - 지속적 통합)
코드 버전 관리를 하는 VCS 시스템(Git, SVN ...)에 푸시가 되면 자동으로 테스트와 빌드가 수행되어 안정적인 배포 파일을 만드는 과정

CD (Continuous Deployment - 지속적 배포
빌드 결과를 자동으로 운영 서버에 무중단 배포까지 진행되는 과정
일반적으로 CI만 구축되어 있지는 않고, CD도 함께 구축된 경우가 대부분이다.

우리가 주의할 점이 있다.
💥단순히 CI 도구를 도입했다고 해서 CI를 하고 있는 것이 아니다.💥

마틴 파울러의 블로그를 참고하면 CI에 대해 4가지 규칙을 이야기한다.

  • 모든 소스 코드가 살아 있고(현재 실행되고) 누구든 현재의 소스에 접근할 수 있는 단일 지점을 유지할 것
  • 빌드 프로세스를 자동화해서 누구든 소스로부터 시스템을 빌드하는 단일 명령어를 사용할 수 있게 할 것
  • 테스팅을 자동화해서 단일 명령어로 언제든지 시스템에 대한 건전한 테스트 수트를 실행할 수 있게 할 것
  • 누구나 현재 실행 파일을 얻으면 지금까지 가장 완전한 실행 파일을 얻었다는 확신을 하게 할 것

여기서 특히 중요한 것은 테스팅 자동화이다.
지속적으로 통합하기 위해서는 무엇보다 이 프로젝트가 완전한 상태임을 보장하기 위해 테스트 코드가 구현되어 있어야만 한다.


Github Actions을 선택한 이유

CI/CD를 지원하는 대표적인 도구는 다음과 같다.

  • Circle CI
  • Travis CI
  • Jenkins CI
  • Teamcity
  • Github Actions

이 중 Travis CI, Jenkins CI 또한 고려해보았지만 유료 문제로 사용하지 않았다.

Jenkins CI는 호스팅을 직접 해야 하기 때문에 추가적인 서버 비용이 들며, Travis CI는 원래 무료였지만, 최근에 100000크래딧만 무료로 변경되었다.


Github Actions란?

Github에서 제공하는 워크플로우(workflow)를 자동화하도록 도와주는 도구이다.
테스트, 빌드, 배포 등 다양한 작업들을 자동화하여 처리한다.

🤑 요금과 제한

  • public 저장소의 경우 무료로 사용 가능하며,
  • private 저장소는 월마다 제공되는 무료 사용량 초과 시에 요금이 부가된다.
    • 무료 계정 기준 500MB의 스토리지와 월마다 2,000분의 실행시간이 제공됨
    • 참고 링크

Github Actions의 구성

🐱 Workflow

  • 최상위 개념
  • 여러 Job으로 구성되며, Event에 의해 트리거될 수 있는 자동화된 프로세스
  • workflow 파일은 yaml으로 작성되고, ./github/workflows 폴더 아래에 저장됨
    • Github 저장소에서 등록할 수도 있고, 폴더 아래에 .yml 파일을 직접 추가하여 등록할 수도 있다.
    • 전자의 경우, Github이 workflow 템플릿을 추천해준다.

🐱 Event

  • Workflow를 Trigger(실행)하는 특정 활동이나 규칙
  • 사용 예시
    • 특정 브랜치로 Push
    • 특정 브랜치로 Pull Request
    • 특정 시간대에 반복(Cron)
    • Webhook을 사용해 외부 이벤트를 통해 실행
    • 자세한 내용은 Events that trigger workflows 참고

🐱 Job

  • 여러 Step으로 구성되며, 가상 환경의 인스턴스에서 실행됨
  • 다른 Job에 의존 관계를 가질 수 있고, 독립적으로 병렬 실행도 가능
    • ex) 빌드와 테스트 코드의 수행인 두 작업을 순차적으로 실행할 수도 있으며, 이 경우에는 빌드 작업이 실패하면 테스트 작업은 실행되지 않는다.

🐱 Step

  • Job에서 커맨드를 실행하는 독립적인 단위
  • Task들의 집합으로, 커맨드를 날리거나 action을 실행할 수 있음
  • 한 작업(job)의 각 스텝들은 동일한 러더에서 실행되므로 해당 작업의 액션들은 서로 데이터를 공유

🐱 Action

  • Workflow의 가장 작은 블럭
  • Job을 만들기 위해 Step들을 연결할 수 있음
  • 재사용이 가능한 컴포넌트
  • 개인적으로 만든 Action을 사용할 수도 있고, Marketplace에 있는 공용 Action을 사용할 수도 있음

🐱 Runner

  • Github Action Runner 어플리케이션이 설치된 머신으로, Workflow가 실행될 인스턴스
  • Github에서 호스팅해주는 Github-hosted runner와 직접 호스팅하는 Self-hosted runner로 나뉨
  • Workflow의 각 작업은 새로운 가상 환경에서 실행됨
  • Github-hosted runner의 스펙 : Azure Standard_DS2_v2, vCPU 2, 메모리 7GB, 임시 스토리지 14GB

Github Action 생성 흐름

1) 코드 작성
2) Workflow 정의
3) 정상 작동하는지 Test


Github 저장소에서 Actions > set up a workflow yourself로 간단한 workflow를 생성할 수 있다.

아래 예시는

  • main 브랜치에 push나 pull request가 올 경우 실행되는
  • CI란 이름을 갖는 Workflow
    이다.
# This is a basic workflow to help you get started with Actions

name: CI

# Controls when the workflow will run
on:
  # Triggers the workflow on push or pull request events but only for the "main" branch
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  # This workflow contains a single job called "build"
  build:
    # The type of runner that the job will run on
    runs-on: ubuntu-latest

    # Steps represent a sequence of tasks that will be executed as part of the job
    steps:
      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
      - uses: actions/checkout@v3

      # Runs a single command using the runners shell
      - name: Run a one-line script
        run: echo Hello, world!

      # Runs a set of commands using the runners shell
      - name: Run a multi-line script
        run: |
          echo Add other actions to build,
          echo test, and deploy your project.
  • name : Workflow의 이름을 지정
  • on : Event(어떤 조건에 Workflow를 Trigger 시킬지)에 대해 작성하는 부분
    • push(Branch or Tag), pull_request, shcedule 사용 가능
    • 다른 CI/CD 도구에 있는 즉시 실행 버튼 없음
    • 단일 Event를 사용할수도 있고, array로 작성할 수도 있음
      • array로 작성하는 예시 : on: [pull_request, issues]
# Controls when the workflow will run
on:
  # Triggers the workflow on push or pull request events but only for the "main" branch
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]
  • job : Workflow는 다양한 작업으로 구성되며, 여러 job이 있을 경우 Default로 병렬 실행된다.
    • build : job을 생성하고, 아래에 2개의 steps이 존재하는 구조
    • runs-on : 어떤 OS에서 실행될지 지정
    • uses : 어떤 액션을 사용할지 지정하며, 이미 만들어진 액션을 사용할 때 지정
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  # This workflow contains a single job called "build"
  build:
    # The type of runner that the job will run on
    runs-on: ubuntu-latest

    # Steps represent a sequence of tasks that will be executed as part of the job
    steps:
      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
      - uses: actions/checkout@v3

      # Runs a single command using the runners shell
      - name: Run a one-line script
        run: echo Hello, world!

      # Runs a set of commands using the runners shell
      - name: Run a multi-line script
        run: |
          echo Add other actions to build,
          echo test, and deploy your project.

🔮 Reference

https://meetup.toast.com/posts/286
https://zzsza.github.io/development/2020/06/06/github-action/

profile
[~2023.04] 블로그 이전했습니다 ㅎㅎ https://leeeeeyeon-dev.tistory.com/

0개의 댓글