1. CI/CD를 코드 몇 줄로 구현할 수 있다면
CI/CD를 구현하려면 별도 서버를 구축하고 Jenkins를 설치하고 복잡한 설정을 해야 한다고 생각할 수 있습니다. 하지만 GitHub Actions를 사용하면 저장소에 파일 하나만 추가하면 됩니다.
GitHub Actions는 GitHub에 내장된 자동화 플랫폼입니다. 코드 push, PR 생성 같은 GitHub 이벤트에 반응해 정해진 작업을 자동으로 실행합니다.
2. GitHub Actions의 핵심 개념 정리
워크플로우(Workflow): 자동화 작업 전체를 정의하는 YAML 파일입니다. .github/workflows/ 폴더에 저장합니다.
이벤트(Event): 워크플로우를 실행하는 트리거입니다. push, pull_request, schedule 등이 있습니다.
잡(Job): 워크플로우 안에서 실행되는 작업 단위입니다. 각 잡은 독립된 가상 환경에서 실행됩니다.
스텝(Step): 잡 안에서 순서대로 실행되는 개별 명령입니다.
액션(Action): 재사용 가능한 스텝 블록입니다. GitHub Marketplace에서 다른 사람이 만든 액션을 가져다 쓸 수 있습니다.
3. 워크플로우 파일 작성하기
저장소에 .github/workflows/ 폴더를 만들고 ci.yml 파일을 생성합니다.
워크플로우 기본 구조입니다. name은 워크플로우 이름, on은 트리거 이벤트, jobs는 실행할 잡 목록입니다.
name: CI 파이프라인
on: push: branches: [ main ] pull_request: branches: [ main ]
jobs: build: runs-on: ubuntu-latest steps: – name: 코드 체크아웃 uses: actions/checkout@v4 – name: 완료 메시지 run: echo “파이프라인 실행 완료!”
이 파일을 저장소에 push하면 Actions 탭에서 실행 결과를 확인할 수 있습니다.
4. 실전 예시 1 – 자동 테스트 파이프라인
Node.js 프로젝트에서 main 브랜치에 push 또는 PR이 생성될 때마다 자동으로 테스트를 실행하는 워크플로우입니다.
name: Node.js 자동 테스트
on: push: branches: [ main ] pull_request: branches: [ main ]
jobs: test: runs-on: ubuntu-latest steps: – uses: actions/checkout@v4
- name: Node.js 18 설치
uses: actions/setup-node@v4
with:
node-version: '18'
cache: 'npm'
- name: 패키지 설치
run: npm ci
- name: 테스트 실행
run: npm test
테스트가 실패하면 GitHub PR 화면에 빨간 X가 표시되고 머지가 차단됩니다. 테스트를 통과해야만 머지할 수 있도록 브랜치 보호 규칙을 설정하면 코드 품질을 강제할 수 있습니다.
5. 실전 예시 2 – EC2 서버 자동 배포
main 브랜치에 push가 발생하면 EC2 서버에 자동으로 배포하는 워크플로우입니다.
name: EC2 자동 배포
on: push: branches: [ main ]
jobs: deploy: runs-on: ubuntu-latest steps: – uses: actions/checkout@v4
- name: SSH로 EC2 배포
uses: appleboy/ssh-action@v1.0.0
with:
host: ${{ secrets.EC2_HOST }}
username: ubuntu
key: ${{ secrets.EC2_SSH_KEY }}
script: |
cd /home/ubuntu/myapp
git pull origin main
npm ci --production
pm2 restart myapp
${{ secrets.EC2_HOST }}처럼 secrets. 접두사로 저장된 비밀값을 참조합니다. 실제 값은 GitHub Secrets에 저장하고 워크플로우 파일에는 노출되지 않습니다.
6. GitHub Secrets로 민감한 정보 보호하기
서버 IP, SSH 키, API 키 같은 민감한 정보는 워크플로우 파일에 직접 쓰면 안 됩니다. GitHub Secrets에 저장하면 암호화되어 보관되고 워크플로우에서 안전하게 참조할 수 있습니다.
저장 방법입니다. 저장소 Settings > Secrets and variables > Actions로 이동합니다. New repository secret을 클릭합니다. 이름(예: EC2_HOST)과 값(예: 실제 IP 주소)을 입력합니다.
워크플로우에서 ${{ secrets.EC2_HOST }} 형태로 참조합니다. 로그에도 실제 값이 ***로 마스킹되어 노출되지 않습니다.
7. 워크플로우 디버깅하는 방법
워크플로우가 예상대로 동작하지 않을 때 디버깅하는 방법입니다.
저장소 Actions 탭에서 실패한 워크플로우를 클릭합니다. 실패한 잡과 스텝을 클릭하면 상세 로그를 확인할 수 있습니다. 대부분의 오류 원인이 로그에 명확하게 표시됩니다.
자주 발생하는 오류는 다음과 같습니다. 패키지 설치 실패는 package.json 또는 캐시 문제입니다. SSH 접속 실패는 Secrets에 저장된 키 값이 올바른지, 보안 그룹에서 22번 포트가 열려있는지 확인합니다. 명령어 실패는 run 블록의 스크립트 오류를 확인합니다.
8. 정리 및 다음 단계
오늘 배운 핵심을 정리합니다.
- GitHub Actions는 .github/workflows/ 폴더에 YAML 파일을 추가해 CI/CD를 구현합니다.
- 이벤트 → 잡 → 스텝 구조로 워크플로우를 정의합니다.
- 민감한 정보는 GitHub Secrets에 저장하고 ${{ secrets.키이름 }}으로 참조합니다.
- Actions 탭에서 실행 로그를 확인해 오류를 디버깅합니다.
다음 글에서는 Python 가상환경을 설정하고 의존성을 관리하는 방법을 알아보겠습니다.