GitHub Actions를 활용한 CI/CD 파이프라인: 완벽 설정 가이드
GitHub Actions를 활용한 CI/CD 파이프라인: 완벽 설정 가이드
현대 소프트웨어 개발에서 코드 변경 시마다 수동으로 테스트하고 배포 스크립트를 실행하는 방식은 전달 속도를 늦추고 사람의 실수를 유발하는 병목 현상을 초래합니다. CI/CD 파이프라인은 코드 테스트부터 프로덕션 배포까지 전체 프로세스를 자동화합니다. 이 가이드에서는 강력하고 통합된 자동화 플랫폼인 GitHub Actions를 사용하여 CI/CD 파이프라인을 설정하는 방법을 실용적이고 실제 업무에 적용 가능한 YAML 예제와 함께 알려드리므로, 더 빠르고 안정적으로 코드를 배포할 수 있습니다.
학습 목표
이 가이드를 마치면 지속적 통합(CI)과 지속적 배포(CD)의 핵심 개념을 이해하고 GitHub Actions를 사용한 다단계 파이프라인을 구현할 수 있게 됩니다. Python, Node.js 또는 컨테이너화된 애플리케이션 등 자신의 프로젝트를 테스트, 빌드, 배포하는 실제 작동하는 YAML 코드를 얻을 수 있습니다.
GitHub Actions 기본 이해하기
GitHub Actions는 GitHub 저장소에 직접 통합된 이벤트 기반 자동화 플랫폼입니다. push, pull_request, release와 같은 이벤트에 의해 트리거되는 자동화된 워크플로우를 실행할 수 있습니다. 핵심적으로 워크플로우는 .github/workflows/ 디렉토리에 있는 YAML 파일로 정의되며, 기본적으로 병렬로 실행되는 하나 이상의 작업(job)으로 구성되며, 각 작업은 일련의 단계(step)를 포함합니다.
핵심 구성 요소
- 이벤트 (
on): 특정 브랜치로의push또는pull_request와 같이 워크플로우를 시작하는 트리거입니다. - 러너 (
runs-on): 작업이 실행되는 머신입니다.ubuntu-latest는 성능과 광범위한 소프트웨어 가용성 측면에서 가장 일반적이고 권장되는 선택입니다. - 단계 (Steps): 작업 내의 개별 작업입니다. 셸 스크립트(
run) 또는 GitHub Marketplace의 사전 빌드된 액션(uses)이 될 수 있습니다. - 액션 (Actions): 저장소를 복제하는
actions/checkout@v4또는 Node.js를 설치하는actions/setup-node@v4와 같은 재사용 가능한 코드 단위입니다.
시작하기 위한 기본 워크플로우
가장 간단한 워크플로우는 모든 푸시에 대해 트리거될 수 있습니다. .github/workflows/main.yml 파일을 생성하여 기본 "Hello World" 명령을 실행합니다.
name: example
on: push
jobs:
greeting:
runs-on: ubuntu-latest
steps:
- run: echo "Hello, CI/CD World!"
이 파일을 저장소에 커밋하고 푸시한 후, GitHub 저장소의 "Actions" 탭에서 작업의 출력을 확인할 수 있습니다.
포괄적인 CI 파이프라인 구축
파이프라인의 "CI" 부분은 코드 변경 사항이 병합되기 전에 자동으로 테스트되고 검증되도록 보장합니다. 여기에는 일반적으로 린팅, 타입 검사 및 단위 테스트 실행이 포함됩니다.
CI 워크플로우 파일
.github/workflows/ci.yml을 생성합니다. 이 워크플로우는 main 브랜치에 대한 모든 push 및 pull_request에서 트리거됩니다. 아래 예제는 Node.js 프로젝트에 대한 완전한 파이프라인을 보여주지만, 이 패턴은 actions/setup-python을 사용하는 Python과 같은 다른 언어에도 적용됩니다.
name: CI Pipeline
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- run: npm ci
- run: npm run lint
test:
runs-on: ubuntu-latest
needs: lint
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- run: npm ci
- run: npm test
build:
runs-on: ubuntu-latest
needs: [lint, test]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- run: npm ci
- run: npm run build
주요 기능 설명
- 의존성 캐싱:
actions/setup-node의cache: 'npm'옵션은 이전 실행의 의존성을 재사용하여 워크플로우 속도를 크게 높입니다. - 작업 의존성:
needs키워드는 실행 순서를 정의합니다. 예를 들어,build작업은lint및test작업이 성공한 경우에만 실행됩니다. 이는 손상된 코드를 빌드하는 데 시간을 낭비하는 것을 방지합니다. - 환경 변수: 데이터베이스와 같은 서비스의 경우 환경 변수를 정의할 수 있습니다. 예를 들어,
test작업은 PostgreSQL 서비스 컨테이너를 실행하고env를 사용하여 연결할 수 있습니다.
고급 시나리오: 컨테이너화 및 다중 환경 배포
최신 애플리케이션의 경우 파이프라인에는 종종 컨테이너 이미지 빌드 및 배포가 포함됩니다. 다음 표는 일반적인 배포 전략과 해당 트리거를 간략하게 설명합니다.
배포 트리거 비교
| 전략 | 배포 트리거 | 최적 사용 사례 |
|---|---|---|
| 브랜치 기반 | main 브랜치로 push |
최신 개발 코드의 지속적 배포 |
| 태그 기반 | 새 태그 푸시 (예: v1.0.0) |
안정적이고 버전 관리된 소프트웨어를 프로덕션에 릴리스 |
| 릴리스 기반 | GitHub에 release 게시 |
릴리스 노트도 생성하는 공식 제품 릴리스 |
예제: CI/CD 워크플로우로 Docker 컨테이너 배포
이 포괄적인 예제는 Python 애플리케이션을 테스트하고, Docker 이미지를 빌드하고, 레지스트리로 푸시하는 파이프라인을 보여줍니다. 안전하고 고성능 빌드를 위해 일련의 공식 Docker 액션을 사용합니다.
.github/workflows/deploy.yml 생성:
name: Complete CI/CD Pipeline
on:
push:
branches: [ main ]
release:
types: [published]
env:
DOCKER_HUB_USERNAME: ${{ secrets.DOCKER_HUB_USERNAME }}
DOCKER_HUB_TOKEN: ${{ secrets.DOCKER_HUB_TOKEN }}
IMAGE_NAME: my-app
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v4
with:
python-version: '3.9'
- run: pip install -r requirements.txt
- run: pytest
build-and-push:
runs-on: ubuntu-latest
needs: test
if: github.event_name == 'push' || github.event_name == 'release'
steps:
- uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ env.DOCKER_HUB_USERNAME }}
password: ${{ env.DOCKER_HUB_TOKEN }}
- name: Extract metadata
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.DOCKER_HUB_USERNAME }}/${{ env.IMAGE_NAME }}
tags: |
type=ref,event=branch
type=semver,pattern={{version}}
type=raw,value=latest,enable={{is_default_branch}}
- name: Build and push
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
deploy:
runs-on: ubuntu-latest
needs: build-and-push
if: github.event_name == 'release'
steps:
- name: Execute Deployment Script
run: |
echo "Deploying image ${{ env.DOCKER_HUB_USERNAME }}/${{ env.IMAGE_NAME }}:${{ github.event.release.tag_name }}"
중요: 시크릿 관리
위 워크플로우가 작동하려면 GitHub 저장소에 자격 증명을 안전하게 저장해야 합니다. Settings > Secrets and variables > Actions로 이동하여 다음 시크릿을 추가합니다.
DOCKER_HUB_USERNAME: Docker Hub 사용자 이름.DOCKER_HUB_TOKEN: 읽기/쓰기 권한이 있는 Docker Hub 개인 액세스 토큰.
⚠️ 보안 경고: 비밀번호, 토큰 또는 기타 민감한 데이터를 YAML 파일에 직접 하드코딩하지 마십시오. 항상 암호화되어 워크플로우 실행 중에만 액세스할 수 있는 GitHub 시크릿을 사용하세요.
출처
- Set up GitHub Actions CI/CD pipeline · Issue #176 (CI, E2E 및 배포를 위한 실용적인 YAML 예제)
- DevOps: Set up GitHub Actions CI/CD pipeline · Issue #19 (린팅, 타입 검사 및 빌드 검증 시연)
- GitHub - kamrun111/GitHubActionTest (간단하고 초보자 친화적인 Python CI/CD 예제)
- @jamesives/github-pages-deploy-action (GitHub Pages 배포 문서)
- GitHub - CarlosQuintero8/cicdsimulation (테스트, 빌드 및 GitHub Pages 배포를 포함한 다단계 파이프라인 시연)
- GitHub - anuragstark/Py-app-CI-CD-Pipeline- (Docker 및 Minikube 배포를 포함한 포괄적인 가이드)
- Automated CI/CD with GitHub Actions, starting from scratch (CI/CD 워크플로우를 점진적으로 구축하는 방법에 대한 안내)
- Extend App with GitHub Actions · AccelByte Documentation (릴리스 이벤트에 의해 트리거되는 배포 예제)
- Configure CI/CD for your C++ application · Docker Docs (Docker Hub로 GitHub Actions 설정 시연)
- Hello CI World · HSF Training (첫 번째 워크플로우 생성 및 실행을 위한 기본 튜토리얼)
— Editorial Team
아직 댓글이 없습니다.