Docker와 GitHub를 이용한 CI/CD 파이프라인 구축 가이드
KUKJIN LEE • 3개월 전 작성
1. Dockerfile 작성
프로젝트 루트에 Dockerfile을 생성합니다.
일반적으로 Dockerfile은 확장자를 사용하지 않습니다. 즉, 파일 이름은 단순히 Dockerfile
이 됩니다.
FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
2. GitHub Actions 워크플로우 설정
.github/workflows/main.yml
파일을 생성합니다.
기타 GitHub Actions 워크플로우, 예를들어 특정 시간에 자동 배포 등 별도의 설정이 존재한다면 코드를 복사 붙여넣기 하시면 안됩니다.
name: CI/CD Pipeline
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Node.js
uses: actions/setup-node@v2
with:
node-version: '14'
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test
- name: Build and push Docker image
env:
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
run: |
docker build -t $DOCKER_USERNAME/my-app:${{ github.sha }} .
echo $DOCKER_PASSWORD | docker login -u $DOCKER_USERNAME --password-stdin
docker push $DOCKER_USERNAME/my-app:${{ github.sha }}
- name: Deploy to server
env:
PRIVATE_KEY: ${{ secrets.SERVER_SSH_KEY }}
HOST: ${{ secrets.SERVER_HOST }}
USER: ${{ secrets.SERVER_USER }}
run: |
echo "$PRIVATE_KEY" > private_key && chmod 600 private_key
ssh -o StrictHostKeyChecking=no -i private_key ${USER}@${HOST} '
docker pull ${{ secrets.DOCKER_USERNAME }}/my-app:${{ github.sha }}
docker stop my-app || true
docker rm my-app || true
docker run -d --name my-app -p 3000:3000 ${{ secrets.DOCKER_USERNAME }}/my-app:${{ github.sha }}
'
3. GitHub Secrets 설정
GitHub 레포지토리의 Settings > Secrets에서 다음 시크릿을 추가합니다.
-
DOCKER_USERNAME
: Docker Hub 사용자명 -
DOCKER_PASSWORD
: Docker Hub 비밀번호 -
SERVER_SSH_KEY
: 배포 서버의 SSH 개인키 -
SERVER_HOST
: 배포 서버의 IP 주소 또는 호스트명 -
SERVER_USER
: 배포 서버의 SSH 사용자명
파이프라인 실행
-
코드를 변경하고 GitHub main 브랜치에 push합니다.
-
GitHub Actions 탭에서 워크플로우 실행 상태를 확인합니다.
-
성공적으로 완료되면, 애플리케이션이 서버에 배포됩니다.
4. 단계 설명
-
코드 체크아웃: GitHub 레포지토리에서 최신 코드를 가져옵니다.
-
의존성 설치 및 테스트: Node.js 환경을 설정하고, 의존성을 설치한 후 테스트를 실행합니다.
-
Docker 이미지 빌드 및 푸시: 애플리케이션의 Docker 이미지를 생성하고 Docker Hub에 푸시합니다.
-
서버 배포: SSH를 통해 원격 서버에 접속하여 최신 Docker 이미지를 pull하고 실행합니다.
CI/CD 파이프라인은 코드 변경사항을 자동으로 테스트하고 배포하여 개발 프로세스의 효율성과 신뢰성을 크게 향상시킬 수 있습니다.