GitHub Actions
새로운 기능을 개발하고자 하면 개발, 코드 테스트, 빌드, 원격 저장소에 반영, 배포하는 일련의 과정을 거쳐야 한다.
이러한 일련의 작업 과정을 자동화하는 다양한 도구 중 하나가 Github Actions이다.
Github는 GitHub Actions라는 도구를 제공해서 해당 과정의 자동화를 돕는다.
https://docs.github.com/ko/actions
GitHub Actions 설명서 - GitHub Docs
GitHub Actions를 사용하여 리포지토리에서 바로 소프트웨어 개발 워크플로를 자동화, 사용자 지정 및 실행합니다. CI/CD를 포함하여 원하는 작업을 수행하기 위한 작업을 검색, 생성 및 공유하고 완
docs.github.com
1. 개요
GitHub Actions는 소프트웨어 개발에서 코드 개발, 테스트, 빌드, 배포까지의 일련 작업을 자동화할 수 있는 도구이다.
GitHub의 고유 기능으로서, 특정 이벤트가 발생하면 사전 정의된 명령어를 자동으로 실행할 수 있어 개발자의 반복 작업을 줄이고, 코드 품질과 배포 속도를 높이는 데 도움을 준다.
- 이벤트 기반 동작: GitHub Actions는 이벤트 기반으로 작동한다. 즉,
Push
,Pull Request
와 같은 이벤트가 발생할 때마다 해당 작업을 자동으로 실행한다. - Workflow 구조: GitHub Actions에서 실행되는 작업은
Workflow
라는 단위로 관리된다. Workflow는 YAML 파일로 정의되며,.github/workflows
디렉토리에 저장된다.
구성 요소
- Jobs: 각 Job은 단일 환경에서 실행할 명령어 집합이다.
- Steps: Job 내에서 실행되는 명령어의 개별 단계이다.
- Actions: 실제 명령어 자체로, GitHub에서 제공하는 공식 액션이나 커뮤니티가 만든 액션을 활용할 수 있다.
2. 작성 예시
아래 예시는 특정 브랜치에 Push
또는 Pull Request
가 발생할 때 실행되는 GitHub Actions 워크플로의 예시이다.
# 워크플로 이름
name: CI Pipeline
# 이벤트 설정: push와 pull_request 이벤트가 트리거되면 작동
on:
push:
branches: [main, dev] # 브랜치 이름 나열
pull_request:
branches: [main, dev] # 브랜치 이름 나열
# 수행할 내용 정의
jobs:
build:
runs-on: ubuntu-latest # Ubuntu 환경에서 실행
steps:
- name: 코드 체크아웃
uses: actions/checkout@v2 # GitHub에서 제공하는 checkout 액션 사용
- name: 환경 설정 (예: Node.js 셋업)
uses: actions/setup-node@v2 # Node.js 셋업
with:
node-version: '14'
- name: 종속성 설치
run: npm install
- name: 테스트 실행
run: npm test
- name: 빌드 및 배포
run: npm run build && npm run deploy
위 예시는 다음과 같은 순서로 실행된다: 빌드 → 테스트 → 이미지 생성 → 배포
@warning
여기서 실행할 명령의 순서를 주의해야 하는데, 이미지를 생성 한 후 테스트가 아니라, 테스트를 먼저 한 후에 이미지를 생성해야 한다.
테스트를 하지 않고 무작정 이미지를 생성하면, 오류가 있어도 그대로 이미지를 생성하기 때문이다.
3. 활용 방법과 사례
- CI/CD 파이프라인 자동화: 개발자가 코드 수정 후 푸시하면 자동으로 테스트, 빌드, 배포까지 이어지도록 설정하여 일관된 품질을 유지하고 배포 시간을 단축할 수 있다.
- 예: 프론트엔드 프로젝트에서,
Push
이벤트가 발생할 때마다 테스트가 실행되고 성공하면 자동으로 배포 서버에 반영하는 경우.
- 예: 프론트엔드 프로젝트에서,
- 코드 품질 검사 및 보안 점검: PR 생성 시 코드의 정적 분석 도구를 활용해 코드 품질과 보안 점검을 수행할 수 있다.
- 예:
pull_request
이벤트가 발생하면ESLint
,Prettier
를 실행하여 코드 규칙 준수 여부를 확인하는 작업.
- 예:
- 자동화된 릴리스 관리: 코드가
main
브랜치에 머지될 때 릴리스를 생성하고 GitHub Packages 또는 Docker Hub에 이미지를 배포할 수 있다.- 예: 새로운 버전의 코드가
main
에 머지되면 자동으로 태그를 생성하고 도커 이미지를 빌드해 Docker Hub에 배포하는 워크플로.
- 예: 새로운 버전의 코드가
4. 언제 사용하면 좋을까?
- 복잡한 CI/CD 파이프라인이 필요한 경우: GitHub Actions는 다양한 액션과 환경 설정을 제공하므로 복잡한 CI/CD 파이프라인을 간단하게 구성할 수 있다.
- 테스트 자동화가 필요한 경우: 테스트 코드를 자동화하여 PR마다 테스트가 자동으로 실행되도록 설정할 수 있어 개발 초기부터 품질 관리가 용이하다.
- 지속적인 배포(CD)를 구현할 때: 특정 브랜치에 변경이 발생할 때마다 자동으로 프로덕션 또는 테스트 환경에 배포되도록 설정할 수 있다.
5. 주의해야 할 점
- 빌드 및 배포 자원 관리: GitHub Actions는 빌드와 배포에 자원을 사용하므로, 과도한 워크플로 실행이 발생하지 않도록 이벤트 트리거를 신중히 설정해야 한다.
- 비용 고려: 개인 프로젝트의 경우 무료 요금제를 사용할 수 있지만, 팀 프로젝트 또는 과도한 워크플로 실행 시 비용이 발생할 수 있다.
- 민감 정보 관리: GitHub Actions에서 사용하는 환경 변수에 민감 정보(API 키 등)가 포함될 경우, GitHub Secrets를 활용해 보안을 유지해야 한다.
- 의존성 충돌 주의: 각 Job은 기본적으로 독립적으로 실행되기 때문에 의존성이 필요한 경우
needs
키워드를 사용해 실행 순서를 지정하거나, 캐시 액션을 활용해 의존성을 관리해야 한다.
GitHub Actions는 GitHub 레포지토리와 통합된 강력한 CI/CD 도구로, 적절히 활용하면 프로젝트 관리에 큰 도움이 될 수 있다.
Heroku와의 차이점
이전에 헤로쿠를 이용해서 배포를 할 때에도 깃허브에 push하면 자동으로 배포할 수 있었다.
GitHub Actions는 Heroku와 어떤 차이점이 있을지 찾아서 정리해보았다.
🤔 Heroku와는 어떤 차이점이 있을까?
간단히 말하면, Heroku는 간편한 자동 배포를 제공하고, GitHub Actions는 더 많은 제어와 유연성을 제공한다.
항목 | Heroku | GitHub Actions |
배포 방식 | GitHub 브랜치에 푸시하면 자동 배포 | GitHub에서 워크플로를 작성하여 배포 |
설정 과정 | Heroku 대시보드에서 간단히 설정 | YAML 파일을 만들어 정의해야 한다. |
CI/CD 기능 | 기본 자동 배포 기능 | 빌드, 테스트 등 다양한 작업 추가 가능 |
유연성 | 설정이 간단하지만, 유연성이 적다. | 복잡한 CI/CD 파이프라인 구축 가능 |
자원 관리 | Heroku 서버 리소스 사용 | GitHub Actions의 무료 리소스 사용 |