
CI/CD는 Continuous Integration(지속적인 통합)과 Continuous Deployment/Delivery(지속적인 배포/제공)의 약자로, 소프트웨어 개발에서 코드 변경을 자동으로 빌드, 테스트, 배포하는 프로세스를 의미한다. 이를 통해 개발자는 더욱 빠르고 안정적으로 제품을 출시할 수 있다.
지속적인 통합이라는 의미로, 개발자가 작업한 코드를 주기적으로 빌드하고 테스트한 후, 메인 레포지토리에 병합(merge)하는 과정을 말한다.
🔹 CI의 핵심 목표:
CD는 Continuous Deployment(지속적인 배포)와 Continuous Delivery(지속적인 제공) 두 가지 의미를 포함하며, CI 이후의 배포 과정을 자동화하는 단계이다.
🔹 CD의 주요 목적:
📌 CD의 두 가지 형태
Continuous Delivery(지속적인 제공)
1. CI 이후 자동으로 배포 가능한 상태까지 준비하지만, 실제 배포는 사람이 수동으로 결정
2. 예: QA 팀의 검토 후 프로덕션에 배포
Continuous Deployment(지속적인 배포)
1. 코드가 테스트를 통과하면 자동으로 프로덕션 환경에 배포
2. 빠른 반복과 신속한 기능 제공이 가능하지만, 높은 수준의 자동화가 필요
GitHub Actions는 Github에서 제공해주는 CI/CD(연속 통합 및 지속적인 배포)를 자동화할 수 있는 서비스이다. GitHub에서 코드를 관리하고 있는 소프트웨어 프로젝트에서 사용할 수 있으며 개인은 누구나 GitHub에서 코드 저장소를 무료로 만들 수 있기 때문에 다른 CI/CD 서비스 대비 진입장벽이 낮은 편이다.
GitHub Actions는 기존 CI/CD 서비스 대비 간편한 설정과 높은 접근성으로 특히 개발자들 사이에서 많은 호응을 얻고 있다. 예전에는 CI/CD가 DevOps 엔지니어의 전유물로만 여겨지곤 했었는데, GitHub Actions을 통해서 일반 개발자들도 스스로 CI/CD 설정을 어렵지 않게 할 수 있다.
- 개발자가 코드를 수정하고 GitHub에 push
- GitHub Actions Workflow가 자동으로 실행되어 빌드 및 테스트 진행
- 테스트에 통과하면 PR을 병합하거나 자동으로 배포 프로세스 진행
- GitHub Actions가 스테이징 또는 프로덕션 환경에 배포
- 배포 후 GitHub Actions에서 모니터링 및 오류 감지 (Slack, Discord 알림 연동 가능)
.github/workflows/ 폴더 내의 YAML 파일로 설정하며, 여러 개의 Workflow를 만들 수 있다.push, pull_request, schedule 등)를 트리거로 실행된다.name: CI/CD Workflow # Workflow 이름
on: push # push 이벤트 발생 시 실행
jobs:
(생략...)
runs-on을 사용하여 실행 환경(예: ubuntu-latest, windows-latest)을 지정한다.jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Run Build
run: echo "Building the project..."
위 예제에서 build Job이 실행되며, ubuntu-latest 환경에서 실행된다.
uses를 사용하여 미리 정의된 Action을 실행하거나, run을 사용하여 직접 명령어를 실행할 수 있다.jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v3 # 미리 정의된 Action 사용
- name: Run Tests
run: npm test # 직접 실행할 명령어
uses를 통해 호출하며, 공식 GitHub Actions Marketplace에서 제공하는 Action을 사용할 수도 있고, 직접 생성할 수도 있다.actions/checkout, actions/setup-nodesteps:
- name: Checkout Code
uses: actions/checkout@v3 # 레포지토리 코드 다운로드
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: 18 # Node.js 버전 지정
actions/checkout@v3 → GitHub 레포지토리의 코드를 가져오는 Actionactions/setup-node@v3 → Node.js 환경을 설정하는 Actionruns-on을 설정하여 어떤 Runner에서 실행할지 지정할 수 있다.ubuntu-latest(기본값), windows-latest, macos-latest 등jobs:
build:
runs-on: ubuntu-latest
steps:
(생략...)
self-hosted Runner 등록 후 사용이 가능하다.jobs:
deploy:
runs-on: self-hosted # 직접 운영하는 Runner 사용
.github/workflows 폴더와 YAML 파일.github/workflows/ 폴더에 위치한다.📦 프로젝트 루트
┣ 📂 .github
┃ ┗ 📂 workflows
┃ ┣ 📜 ci.yml # CI 관련 Workflow
┃ ┣ 📜 cd.yml # CD 관련 Workflow
┃ ┗ 📜 deploy.yml # 배포 관련 Workflow
push : 브랜치에 코드가 푸시될 때 실행pull_request : PR이 생성, 업데이트, 병합될 때 실행schedule : 일정 시간마다 자동 실행 (CRON 방식)workflow_dispatch : 수동 실행 (GitHub UI에서 실행 가능)on:
push:
branches:
- main # main 브랜치에 푸시될 때 실행
pull_request:
branches:
- main # main 브랜치로 PR이 생성될 때 실행
schedule:
- cron: "0 0 * * *" # 매일 자정에 실행 (UTC 기준)
workflow_dispatch: # 수동 실행
push → main 브랜치에 코드가 푸시되면 실행pull_request → main 브랜치에 대한 PR이 생성되면 실행schedule → 매일 자정(UTC 00:00)에 실행workflow_dispatch → GitHub Actions에서 직접 실행 버튼을 눌러 실행name: CI Workflow # Workflow 이름
on: push # push 이벤트 발생 시 실행
jobs:
build:
runs-on: ubuntu-latest # 실행 환경 지정
steps:
- name: Checkout Repository
uses: actions/checkout@v3 # 코드 가져오기
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: 18 # Node.js 18 버전 사용
- name: Install Dependencies
run: npm install # 패키지 설치
- name: Run Tests
run: npm test # 테스트 실행
이렇게 설정하면 코드가 푸시될 때마다 자동으로 빌드 및 테스트가 실행된다! 🚀
CI(지속적 통합)는 코드가 변경될 때마다 자동으로 빌드, 테스트, 코드 스타일 검사를 수행하여 품질을 유지하는 과정이다.
name: CI Pipeline
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
build-test:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: 18
- name: Install Dependencies
run: npm install
- name: Run Linter
run: npm run lint # ESLint 실행
- name: Run Tests
run: npm test # Jest 테스트 실행
CD(지속적 배포)는 CI 과정이 끝난 후, 테스트를 통과한 코드가 자동으로 배포되는 과정이다.
name: CD Pipeline
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v3
- name: Install Dependencies
run: npm install
- name: Build Project
run: npm run build
- name: Deploy to EC2
uses: appleboy/ssh-action@v0.1.6
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USER }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
script: |
cd /home/ec2-user/app
git pull origin main
npm install
npm run build
pm2 restart all
배포 과정에서 API 키, SSH 키, DB 정보 같은 중요한 정보는 GitHub Secrets에 저장하여 관리한다.
GitHub 저장소 → Settings → Secrets → New repository secret
환경변수 추가
참고로 환경변수의 변수명은 사용자 임의로 지어도 된다.
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USER }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
.env 파일을 저장소에 올리지 않고 GitHub Secrets에 등록secrets에서 .env 파일을 생성 후 사용- name: Create .env file
run: |
echo "API_KEY=${{ secrets.API_KEY }}" >> .env
echo "DB_URL=${{ secrets.DB_URL }}" >> .env
https://www.youtube.com/watch?v=0Emq5FypiMM&t=2s
https://docs.github.com/ko/actions/about-github-actions/about-continuous-integration-with-github-actions
https://www.daleseo.com/github-actions-basics/