[CI/CD] Github Action으로 CI/CD 파이프라인 구축하기

배현호·2021년 4월 28일
4

CICD 구축하기

목록 보기
2/3

CI/CD 파이프라인을 구축하는 툴에는 여러 종류가 존재한다.
이번 글에서는 Github Action을 통하여 CI/CD를 구축하는 것을 정리해 보았다.

Github Action이란?

Github Action이란 Github 저장소를 기반으로 소프트웨어 개발 Workflow를 자동화 할 수 있는 도구이다.
Github 내부에서 프로젝트를 빌드, 테스트, 릴리즈 또는 배포를 지원하는 기능으로서, Github에서 제공하는 CI/CD 도구라고 생각하면 될 것이다.
추가적인 CI/CD 툴을 사용하지 않고 깃허브 하나로 버전관리부터 테스트 배포까지 가능한 점이 Github Action의 장점이라고 생각한다.

Github Action에는 4가지 개념이 존재한다.
workflow, Job, event, stop이렇게 4가지가 존재한다.
이들의 관계와 흐름을 이해해야만 각종 조건과 그에 따른 액션을 스스로 정의할 수 있다.

workflow

workflow는 프로젝트를 빌드, 테스트, 패키지, 릴리스 또는 배포하기 위한 전체적인 프로세스이다.
workflow는 여러개의 Job으로 구성되어 event기반으로 동작한다.
이 Job 설정을 통해 workflow를 커스텀 할 수 있다.
GitHub에게 나만의 동작을 정의한 workflow file를 만들어 전달하면 GitHub Actions이 그것을 보고 그대로 실행 시켜준다.

Job

Job은 하나의 인스턴스(리눅스, 맥, 윈도우 등등)에서 여러 Step을 그룹시켜 실행하는 역할을 한다.

step

Step은 순차적으로 명령어를 수행한다.
크게 Uses와 Run으로 작업 단위가 나뉘는데, Uses는 이미 다른 사람들이 정의한 명령어를 가져와 실행하는 것이고, Run은 npm installmkdir example과 같이 가상환경 내에서 실행할 수 있는 스크립트를 말한다.

event

워크플로우를 실행시키는 조건을 설정한다.
예를 들어 Github에 Push나 Pull Request 같은 이벤트가 발생 했을때 실행하도록 설정하는 것이 있다.

사용 한도가 존재한다?

workflow는 저장소마다 최대 20개까지 등록할 수 있다.
Job은 workflow에서 실행되는 Job에 따라 최대 6시간까지 실행이 될 수 있으며, workflow의 실행 제한은 최대 72시간이다.
만약 제한된 시간을 넘게된다면 작업은 자동으로 종료된다.

비용은?

public repository는 기본적으로 무료로 사용할 수 있으며, private repository는 해당 계정에 부여된 무료 사용량 이후에 과금된다고 한다.
private repository는 한달에 500MB, 2,000분까지 무료로 사용가능하지만, 그 이상은 밑의 표에 따라 과금이 발생한다.

ProductStorageMinutes (per month)
GitHub Free500 MB2,000
GitHub Pro1 GB3,000
GitHub Free for organizations500 MB2,000
GitHub Team2 GB3,000
GitHub Enterprise Cloud50 GB50,000

Workflow 생성하기

Github Action workflow를 생성하기 위해선 workflow를 생성할 repository로 들어간다.
레포지토리에 들어가면 목록에 Actions라는 목록이 존재하는 것을 확인할 수 있다.

Actions에 들어가면 다음과 같은 화면이 뜨는 것을 확인할 수 있다.

화면에 나오는 Set up this workflow를 통해 기본적인 workflow틀을 생성할 수도 있지만, 그 밑에 Deploy your code with these popular servicesContinuous integration workflows목록에서 자신이 필요한 workflow 파일을 찾아서 생성할 수 있다.

필자는 Java with Gradle workflow를 생성할 것이다.
만들고자 하는 workflow를 set up this workflow를 통해 생성하면 다음과 같은 화면이 나오게 된다.

위 화면에서 yml의 이름을 지정할 수 있으며, 코드 맨 위에 나오는 name이 workflow의 이름이 된다.
위 화면에서 나오는 코드는 다음과 같다.

# This workflow will build a Java project with Gradle
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle

name: Java CI with Gradle

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - name: Set up JDK 11
      uses: actions/setup-java@v2
      with:
        java-version: '11'
        distribution: 'adopt'
    - name: Grant execute permission for gradlew
      run: chmod +x gradlew
    - name: Build with Gradle
      run: ./gradlew build

위 코드에서 나오는 on에 해당하는 것이 event, 나머지는 위에서 설명한 대로이다.

CI 구축하기

CI는 사실상 위에 나와있는 코드가 CI자체라고 볼 수 있다.
on에서 언제 이 workflow가 실행될지 이벤트를 지정하면, 그 이벤트가 실행될 때 jobs에 해당하는 것들이 시작이 된다.
다만 위 코드에서 조금 바뀐다면, build 전에 CI인지 CD인지, CI-CD 둘 다인지를 지정해줘야 한다.

jobs:
  CI:
    runs-on: ubuntu-latest

jobs 밑에 CI, CD, CI-CD를 넣어서 각각의 역할에 맞게 step을 지정하면 된다.

- name: Build with Gradle
  run: ./gradlew build

이 부분에서 build는 build와 test가 합쳐친 부분이다.
만일 test에서 에러나는지, build에서 에러나는지를 따로 확인하고 싶다면 다음과 같이 쓰면 된다.

- name: run test
  run: ./gradlew test

- name: run build
  run: ./gradlew clean build -x test

순서대로 한다면 먼저 단위 테스트를 돌리고, 그 다음 test를 건너뛰로 빌드하는 작업이다.
나누기 귀찮다면 그냥 합쳐서 build로 해도 아무 상관이 없다.

CD 구축하기

CI-CD로 한번에 구축하는 경우는 상관 없지만 CI와 CD를 따로 구축하는 경우, CI가 끝나야지만 CD가 돌아가야 한다.
그런 경우는 다음과 같이 작성할 수 있다.

CD:
  runs-on: ubuntu-latest
  needs: CI

needs를 붙여 CI가 통과해야지만 CD가 실행되도록 설정할 수 있다.
그 외 나머지 step들의 경우는 CI와 똑같이 checkout과 test, build등을 돌리면 된다.

CD가 CI와 다른점이 존재한다면 그것은 배포 설정도 CD에 같이 해줘야 한다는 점이다.
예를들어 docker로 배포를 할 경우, docker와 관련된 설정을 해주어야 한다.

- name: Build Docker Image
  run: docker build --tag (docker container name) .

- name: Upload to Registry
  uses: elgohr/Publish-Docker-Github-Action@master
  with:
	name: (docker user name)/(docker container name)
	username: ${{ secrets.DOCKER_USERNAME }}
	password: ${{ secrets.DOCKER_PASSWORD }}

배포 설정에 대해서는 본인이 Github Action으로 배포를 할 경우, 배포하는 환경에 맞게 설정해주면 된다.


위와 같이 설정하여 생성하면 repositoy 메인에 다음과 같은 폴더가 생길 것이다.

위 화면은 필자가 실제 진행하던 프로젝트 repository이다.
위 폴더로 들어가면 workflow 설정한 것으로 workflowName.yml로 파일이 생성된 것을 확인할 수 있다.

이제 event가 발생할 때마다 Actions 탭에서 빌드 결과를 확인할 수 있다.
빌드에 성공하면 초록색 체크로, 빨간색 엑스면 workflow가 실패한 것으로 확인하면 된다.

  • 성공
  • 실패

Reference

profile
Spring Boot 공부하고 있는 고등학생입니다.

0개의 댓글