대부분의 프로젝트에서는 CI/CD를 사용하고있다. CI/CD는 대체 뭐고 왜 이를 제공해주는 툴들을 많이들 사용하는 걸까?(Jenkins라던지 Github Action이라든지)
궁금증을 해결하기 위해서 CI/CD란 무엇을 뜻하는 것이고 CI툴 중에서 Github Action에 대해서 알아보자.
CI/CD의 목적은 무엇인가?
반복적인 일(빌드, 테스트, 배포 작업 등)들을 처리하고 문제가 있을 때 경고를 해주는 등 자동화된 파이프라인을 통해서 코드 변경과 배포 단계를 원활하게 진행할 수 있다.
즉, 자동화를 통해 시간 절약 및 사람이 직접적으로 처리할 때 실수할 수 있는 부분들을 관리할 수 있다.
CI(Continuous Integration)는 지속적인 통합을 뜻한다.
CD(Continuous Delivery, Deployment)는 지속적인 제공 및 배포를 뜻한다.
Github Action이란?
Github 저장소를 기반으로 Workflow를 자동화 할 수 있는 도구. Github가 제공하는 완전관리형 CI/CD 툴이다.
특징
- 컨테이너(도커) 기반으로 동작함
- 개발자는 Workflow를 작성하여 다양한 이벤트를 기반으로 실행시킬 수 있다.
- Workflow는 Runners(기본 Azure, self-hosted 가능)라 불리는 인스턴스에서 Linux, macOS, Windows 환경에서 실행됨 - 원하는 OS 지정할수 있음. 한 번에 여러 OS에서 테스트 가능
- Gihub 마켓 플레이스에서 여러 사람이 공유한 Workflow를 찾아서 사용할 수도 있고 직접 만들어서 공유할 수도 있음
- YAML로 작성
장점
- 다른 CI/CD툴(Jenkins)들 처럼 서버설치가 필요하지 않음. 제공해주는 클라우드(Azure)가 있음
- 비동기적 병렬실행이 가능한 CI/CD
- Github 마켓 플레이스를 이용하여 Workflow를 가져다 쓰거나 공유할 수 있음.
- Github에서 제공하는 완전 관리형 서비스이므로 설정이 매우 쉽움.
단점
- 캐싱이 필요한 경우에는 자체 캐싱 로직을 작성해야함
- 서버에 장애가 일어나거나 리소스를 초과할 경우 개발자가 직접 문제를 해결해야한다.
Workflows
자동화된 프로세스가 정의되어 있는 하나의 파일이다.
Github Action에서 가장 최상위 개념으로
- YAML 파일로 작성됨
- 해당 파일을 트리거(실행)할 규칙, 실행할 동작이 작성되어 있음.
Runners
Workflow가 실행될 인스턴스로 클라우드에서 동작한다.
다른 CI툴처럼 서버가 필요없는 이유로 기본적으로 Github Action이 인스턴스를 제공하기 때문이다.
기본적으로 MicroSoft의 Azure에서 동작하며 실행할 인스턴스(self-hosted-runner)를 등록할 수 있다.
Events
Workflow를 실행할 특정한 활동(push 등)이나 규칙이다.
당연하게도 Workflow 파일 내에 정의해 놓는다.
예를 들어, ‘git에 push 했을때’ 혹은 더 구체적으로 ‘어떤 branch에 push나 pull request를 했을때’ 등의 규칙을 정의할 수 있다.
Jobs
Workflow내에서 실행될 명령.
Event로 Workflow가 실행되면 Job에 작성된 명령들이 실행된다.
- Workflow내에서 여러개의 Job을 작성할 수 있다.
- 위에서 설명한 Runner에서 실행된다.
- 기본적으로 Job들은 병렬로 실행되지만 서로 의존관계를 가질 수도 있고 직렬로 실행할 수 있다.
- Job은 자신의 환경설정과 Steps를 가지고 있다.
Steps
Job내에 steps명령어 안에 존재한며 여러개의 step들로 구성되어 있다.
- 각 step들은 script, 명령어 또는 action을 실행할 수 있다.
- 각 step들은 데이터를 공유할 수 있다
Actions
재사용되는 명령어들의 집합으로 이루어진 작업이다. 컴포넌트라고 볼 수 있다.
- 직접 작성해도 되고 Markey에 등록되어 있는 Action을 가져와 사용할 수도 있다.
각 레포지토리의 최상단에 .github/workflows 디렉터리를 만들고 그 내부에 이름.yml 파일을 만들면 workflow 파일 생성 완료. 각 workflow 파일 내부에는
최상단에 name 작성 : workflow의 이름을 설정해주는 것
name: workflow test
workflow를 실행시킬 Event정의 : 아래는 master branch에 push이벤트가 일어날 때 라는 뜻
on:
push:
branches:
- master
Event에 부합했을때 실행 시킨 job정의
jobs:
workflow-test-job:
runs-on: ubuntu-latest
Step 정의
{owner}/{repo}@{ref|version}
의 형태jobs:
workflow-test-job:
runs-on: ubuntu-latest
steps:
- name: Checkout repo
uses: action/checkout@v3
- name: Use Node.js
uses: actions/setup-node@v3
with:
node-version: '14'
- name: Install npm
run: npm install