GitHub Actions이 어떤 역할을 하는 툴이지?
GitHub Actions은 CI/CD를 구현할 수 있는 도구이며, 빌드, 테스트, 배포 등의 파이프라인을 자동화할 수 있다.
그럼 CI/CD는 뭐고 파이프라인은 뭐지?
- CI/CD는 소프트웨어 개발 프로세스를 자동화하고 효율화하는 방법론이다.
- 파이프라인은 소프트웨어 개발 과정의 여러 단계를 자동화하는 일련의 프로세스이다.
둘이 뭐가 다른거지? 비슷해 보이는데?
CI/CD (방법론): 부품들을 자주, 작은 단위로 조립하는 방식 및 완성된 차를 바로 출고하거나 판매장으로 이동시키는 방식
파이프라인 (구현): 공장의 조립 라인 자체 및 부품 투입부터 최종 검수, 출고까지의 전체 자동화된 과정
CI/CD는 소프트웨어 개발의 방법론이고, 파이프라인은 이를 실제로 구현하는 자동화된 프로세스이구나.
근데 그럼 CI와 CD는 각각 뭘 뜻하는거지?
- CI (Continuous Integration, 지속적 통합)
- 개발자들이 코드 변경사항을 자주 메인 브랜치에 병합하는 practice이다.
- 변경사항이 병합될 때마다 자동으로 빌드하고 테스트한다.
- 목적은 버그를 빨리 발견하고, 소프트웨어 품질을 개선하며, 검증 시간을 줄이기 위함이다.
- CD (Continuous Delivery/Deployment, 지속적 제공/배포):
- Continuous Delivery: 소프트웨어를 언제든지 릴리스할 수 있는 상태로 유지한다.
- Continuous Deployment: 변경사항을 자동으로 프로덕션 환경에 배포한다.
CI/CD를 좀더 쉽게 이해할 수는 없을까?
레고 블록으로 집을 만드는 과정이라고 생각해보면 어떨까
- CI (지속적 통합):
- 여러 사람이 각자 레고 블록을 만들고 있다.
- 새 블록을 만들 때마다, 전체 구조에 맞는지 확인한다 (자동 테스트).
- 문제가 없으면 메인 구조물에 추가한다 (코드 병합).
- CD (지속적 제공/배포):
- 지속적 제공: 집의 일부분이 완성될 때마다, 전시할 준비를 한다.
- 지속적 배포: 새로운 부분이 완성되면 자동으로 전시장에 옮긴다.
GitHub Actions가 어떤건지, CI/CD가 뭔지 이해했다.
그렇다면 GitHub Actions를 잘 사용하려면 어떤 개념을 알아야 하지?
- 이벤트 (Events)
- 워크플로우를 트리거하는 특정 활동이나 규칙
- 예: 코드 푸시, 풀 리퀘스트 생성, 이슈 생성 등
- 비유: 요리 로봇을 작동시키는 버튼. 누군가 버튼을 누르면 로봇이 일을 시작
- 워크플로우 (Workflows):
- 자동화하려는 전체 프로세스
- YAML 파일로 정의되며, 하나 이상의 잡으로 구성된다.
- 비유: 전체 요리 과정의 레시피. 재료 준비부터 요리, 서빙까지의 전체 과정
- 잡스 (Jobs):
- 워크플로우 내에서 독립적으로 실행되는 일련의 단계
- 기본적으로 병렬로 실행되지만, 순차적으로 실행되도록 설정할 수도 있다.
- 비유: 레시피 내의 각 요리 과정. 예를 들어 '재료 손질', '조리', '플레이팅' 등등
- 액션 (Actions):
- 작업을 수행하는 가장 작은 단위의 명령
- 재사용 가능한 코드 단위로, 커뮤니티에서 공유하거나 직접 만들 수 있다.
- 비유: 요리 로봇이 수행할 수 있는 개별 동작들. '썰기', '볶기', '끓이기' 등의 기본 동작들
- 러너 (Runners):
- 워크플로우 잡을 실행하는 서버
- GitHub에서 호스팅하는 러너를 사용하거나 직접 호스팅할 수 있다.
- 비유: 요리 로봇이 일하는 주방. GitHub에서 제공하는 주방을 쓸 수도 있고, 자신의 주방에서 로봇을 작동시킬 수도 있다.
개념들은 알겠고 그럼 이걸 코드로 어떻게 쓰는거지?
# 예시코드
# 워크플로우의 이름을 지정
name: Node.js CI
# 워크플로우를 실행시킬 이벤트를 정의
on:
push:
branches: [ main ] # main 브랜치에 push가 발생하면 실행
pull_request:
branches: [ main ] # main 브랜치로 pull request가 생성되면 실행
# 실행할 작업들을 정의
jobs:
# 'build'라는 이름의 작업을 정의
build:
# 작업을 실행할 운영 체제를 지정
runs-on: ubuntu-latest
# 여러 버전의 Node.js에서 테스트를 실행하기 위한 매트릭스 전략을 정의
strategy:
matrix:
node-version: [14.x, 16.x, 18.x] # 테스트할 Node.js 버전들
# 작업의 각 단계를 정의
steps:
# 저장소의 코드를 작업 환경으로 체크아웃
- uses: actions/checkout@v3
# 지정된 버전의 Node.js를 설정
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
# 프로젝트의 의존성을 설치
- run: npm ci
# 프로젝트를 빌드 (빌드 스크립트가 있는 경우에만 실행)
- run: npm run build --if-present
# 테스트를 실행
- run: npm test
이 파일을 어디에 위치시켜야 하는거지?
.github/workflows/파일명.yml