GitHub Actions를 활용한 CI/CD 파이프라인 구축 및 Docker Compose 자동 배포
이 글의 목적
이번 글에서는 GitHub Actions를 사용하여 CI/CD 파이프라인을 구축하고, Docker Compose를 통해 자동으로 애플리케이션을 배포하는 방법을 알아보겠습니다.
Next.js(프론트엔드)와 Express.js(백엔드), 그리고 PostgreSQL을 포함한 풀스택 애플리케이션을 Docker Compose로 관리하면서, 이를 GitHub Actions을 통해 자동화 배포하는 과정을 설명합니다.
지난 시간 글을 참고하시면 됩니다.
https://mynewcodings.tistory.com/172
Docker로 Next.js와 Express.js 개발 환경 완벽 구축 및 배포하기
Docker로 Next.js와 Express.js 개발 환경 완벽 구축 및 배포하기이 글의 목적이번 글에서는 Docker를 활용해 Next.js(프론트엔드)와 Express.js(백엔드)로 구성된 풀스택 개발 환경을 구축하고, 이를 최종적으
mynewcodings.tistory.com
전제 지식
이 글을 이해하려면 다음 기초 지식이 필요합니다:
- Git과 GitHub 사용법
- Docker와 Docker Compose의 기본 개념
- GitHub Actions의 기본 개념 (간단한 워크플로우 작성 정도의 경험)
CI/CD란?
CI/CD는 Continuous Integration (지속적인 통합)과 Continuous Delivery (지속적인 배포) 또는 Continuous Deployment (지속적인 배포)를 의미합니다.
이 개념은 소프트웨어가 변경될 때마다 자동으로 빌드, 테스트, 배포하는 프로세스를 구성하여, 개발자들이 소프트웨어 개발의 모든 단계를 자동화할 수 있도록 돕습니다.
- CI (지속적인 통합): 코드가 변경될 때마다 자동으로 빌드하고 테스트하는 과정.
- CD (지속적인 배포): 코드가 변경되고 테스트가 성공하면 자동으로 배포하는 과정.
이번 글에서는 GitHub Actions를 사용해 CI/CD 파이프라인을 구축하고, Docker Compose로 구성된 애플리케이션을 자동으로 배포하는 방법을 다룹니다.
GitHub Actions란?
GitHub Actions는 GitHub에서 제공하는 자동화 도구입니다.
GitHub Actions를 사용하면 워크플로우(Workflow)를 정의하여, 코드 변경 시 자동으로 빌드, 테스트, 배포하는 과정을 자동화할 수 있습니다.
워크플로우는 YAML 파일로 정의되며, 특정 이벤트(예: 코드 푸시, PR 생성)에 반응하여 실행됩니다.
1. GitHub Actions 워크플로우 개요
GitHub Actions를 사용해 CI/CD 파이프라인을 구축하려면, YAML 파일로 워크플로우를 정의해야 합니다.
이 워크플로우 파일은 .github/workflows/
디렉토리 아래에 위치하게 됩니다.
CI/CD 파이프라인의 흐름
- 코드 변경(Push 또는 Pull Request): 개발자가 코드 변경을 GitHub에 푸시하거나 PR을 보내면, GitHub Actions가 트리거됩니다.
- 자동 빌드 및 테스트: GitHub Actions는 Docker Compose를 사용해 애플리케이션을 빌드하고, 코드가 정상적으로 동작하는지 테스트합니다.
- 자동 배포: 빌드와 테스트가 성공하면, 애플리케이션을 배포 서버 또는 클라우드 인프라에 자동으로 배포합니다.
- 예: AWS, DigitalOcean, Heroku 등 여러 클라우드 서비스에 배포 가능.
2. GitHub Actions 워크플로우 설정
2.1 GitHub Secrets 설정
먼저, 배포 시 사용할 환경 변수나 비밀 정보(예: DockerHub의 로그인 정보, 서버의 SSH 키 등)를 GitHub Secrets에 저장해야 합니다.
GitHub Actions에서는 보안상 중요한 정보를 GitHub Secrets로 관리합니다.
- GitHub 리포지토리로 이동합니다.
- Settings 탭을 클릭합니다.
- Secrets and variables > Actions로 이동한 후, New repository secret을 클릭합니다.
- 아래와 같은 정보를 등록합니다. 예를 들어, DockerHub에 이미지를 푸시하려면 다음 정보를 추가합니다:
DOCKER_USERNAME
: DockerHub 사용자 이름DOCKER_PASSWORD
: DockerHub 비밀번호
이와 같이 필요한 비밀 정보를 모두 등록해두면, GitHub Actions에서 이를 참조할 수 있습니다.
2.2 GitHub Actions 워크플로우 파일 작성
이제 .github/workflows/
디렉토리에 YAML 파일을 작성하여 워크플로우를 정의하겠습니다.
예시: Docker Compose를 사용한 CI/CD 파이프라인
아래는 docker-compose.yml
파일을 사용하여 애플리케이션을 자동으로 빌드하고, DockerHub에 이미지를 푸시하는 GitHub Actions 워크플로우 예시입니다.
name: CI/CD for Docker Compose
# 워크플로우가 실행될 트리거 조건 (코드 푸시 또는 PR 생성 시)
on:
push:
branches:
- main
pull_request:
branches:
- main
# 사용할 환경 변수 (DockerHub 설정)
env:
DOCKER_REGISTRY: docker.io
DOCKER_REPOSITORY: username/myapp
jobs:
build:
runs-on: ubuntu-latest
steps:
# 코드를 체크아웃 (clone) 받습니다.
- name: Checkout repository
uses: actions/checkout@v3
# Docker를 설치합니다.
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
# DockerHub에 로그인합니다.
- name: Log in to DockerHub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
# Docker Compose로 이미지를 빌드합니다.
- name: Build and push Docker images
run: |
docker-compose -f docker-compose.yml build
docker tag myapp_front:latest $DOCKER_REGISTRY/$DOCKER_REPOSITORY:front-latest
docker tag myapp_back:latest $DOCKER_REGISTRY/$DOCKER_REPOSITORY:back-latest
docker push $DOCKER_REGISTRY/$DOCKER_REPOSITORY:front-latest
docker push $DOCKER_REGISTRY/$DOCKER_REPOSITORY:back-latest
# Docker Compose로 애플리케이션을 테스트합니다. (옵션)
- name: Test the app
run: |
docker-compose -f docker-compose.yml up -d
curl --fail http://localhost:3000 || exit 1
워크플로우 설명:
- 워크플로우 트리거:
on: push
및pull_request
설정을 통해 main 브랜치로의 푸시 또는 PR 생성 시 워크플로우가 실행됩니다.
- 환경 변수 설정:
env
키워드로 DockerHub의 레지스트리 주소와 사용할 이미지를 정의합니다.DOCKER_REPOSITORY
는 DockerHub의 저장소 이름입니다.
- 작업 단계(jobs):
- Checkout repository:
actions/checkout@v3
을 사용해 리포지토리 코드를 체크아웃합니다. - Install Docker:
docker/setup-buildx-action@v2
를 사용해 Docker 환경을 설정합니다. - DockerHub 로그인:
docker/login-action@v2
를 사용해 GitHub Secrets에서 DockerHub 로그인 정보를 가져와 로그인합니다. - Docker Compose 이미지 빌드 및 푸시:
docker-compose
명령어로 프론트엔드와 백엔드 이미지를 빌드합니다.- 빌드된 이미지를 DockerHub로 푸시합니다.
- 테스트 단계(옵션): 빌드 후, 애플리케이션을
docker-compose
로 테스트 실행하고 간단한curl
요청을 보내어 서버가 정상 동작하는지 확인합니다.
- Checkout repository:
3. 배포 단계 설정
GitHub Actions를 통해 애플리케이션을 빌드하고 테스트한 후, 이를 배포 서버에 자동으로 배포하는 과정을 설명하겠습니다.
여기서는 SSH를 사용해 원격 서버에 접속하고, Docker Compose 명령어를 실행하여 애플리케이션을 배포하는 방법에 대해 다뤄보겠습니다.
3.1 GitHub Secrets에 서버 SSH 키 추가
SSH 키를 사용하여 GitHub Actions가 배포 서버에 접속할 수 있도록 설정해야 합니다.
먼저, 서버에 SSH 접속을 설정한 후, 해당 SSH 비밀 키를 GitHub Secrets에 추가해야 합니다.
단계별 설정 방법:
- 배포 서버에서 SSH 키 생성:
- 배포 서버에서 SSH 키를 생성합니다.
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
- 생성된 SSH 키는
~/.ssh/id_rsa
에 저장됩니다. 공개 키는id_rsa.pub
파일에 있고, 비밀 키는id_rsa
파일에 있습니다.
- 서버 공개 키 등록:
- 서버의 공개 키를
authorized_keys
파일에 추가하여 SSH 접속을 허용합니다.
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
- 서버의 공개 키를
- GitHub Secrets에 SSH 비밀 키 등록:
- GitHub 리포지토리의 Settings > Secrets and variables > Actions에서 New repository secret을 클릭하여 비밀 키를 등록합니다.
SSH_PRIVATE_KEY
: 서버의 SSH 비밀 키 (~/.ssh/id_rsa
파일의 내용을 복사하여 추가).
- GitHub Secrets에 추가 정보 등록:
- DEPLOY_SERVER: SSH 접속할 서버의 주소 (예:
user@ip-address
). - DEPLOY_PATH: 애플리케이션이 배포될 서버의 경로 (예:
/var/www/myapp
).
- DEPLOY_SERVER: SSH 접속할 서버의 주소 (예:
3.2 서버에 배포하는 GitHub Actions 워크플로우 작성
다음은 SSH를 사용해 원격 서버에 배포하는 GitHub Actions 워크플로우 예시입니다.
이 워크플로우는 빌드된 Docker 이미지를 원격 서버로 배포하고, Docker Compose를 사용해 애플리케이션을 실행합니다.
name: Deploy to Server
on:
push:
branches:
- main # main 브랜치에 push될 때마다 배포
jobs:
deploy:
runs-on: ubuntu-latest
steps:
# 리포지토리 코드 체크아웃
- name: Checkout repository
uses: actions/checkout@v3
# SSH로 원격 서버에 배포하기 위한 설정
- name: Install SSH client
run: sudo apt-get install -y openssh-client
# SSH 키 설정
- name: Add SSH key
uses: webfactory/ssh-agent@v0.5.3
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
# 서버에 접속하여 Docker Compose 명령어 실행
- name: Deploy application via SSH
run: |
ssh -o StrictHostKeyChecking=no ${{ secrets.DEPLOY_SERVER }} << 'EOF'
cd ${{ secrets.DEPLOY_PATH }}
docker-compose pull # 최신 Docker 이미지를 가져옵니다.
docker-compose up -d # 애플리케이션을 재시작합니다.
EOF
워크플로우 설명:
- 워크플로우 트리거:
on: push
설정을 통해 main 브랜치로의 푸시가 발생할 때마다 워크플로우가 실행됩니다. 이 설정은 배포를 자동화할 때 유용합니다.
- SSH 설정:
webfactory/ssh-agent@v0.5.3
액션을 사용해 SSH 비밀 키를 로드하고, GitHub Secrets에 등록한SSH_PRIVATE_KEY
키를 사용하여 원격 서버에 접속할 수 있도록 설정합니다.
- 서버에 접속하여 배포:
- SSH를 통해 원격 서버에 접속한 후, 애플리케이션이 있는 디렉토리(
DEPLOY_PATH
)로 이동합니다. docker-compose pull
: 최신 Docker 이미지를 가져옵니다.docker-compose up -d
: Docker Compose로 애플리케이션을 백그라운드 모드에서 실행합니다. 이 명령어는 변경된 이미지로 애플리케이션을 업데이트하고 재시작합니다.
- SSH를 통해 원격 서버에 접속한 후, 애플리케이션이 있는 디렉토리(
3.3 배포 서버 설정
원격 서버에서 애플리케이션이 Docker Compose로 실행될 수 있도록 서버에 필요한 설정을 미리 완료해야 합니다.
1. Docker 및 Docker Compose 설치
배포 서버에 Docker와 Docker Compose가 설치되어 있어야 합니다.
# Docker 설치
sudo apt-get update
sudo apt-get install -y docker.io
# Docker Compose 설치
sudo curl -L "https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
2. 애플리케이션 초기 배포
서버에서 처음 애플리케이션을 배포할 때는 GitHub Actions을 통해 자동 배포하기 전에 초기 설정을 직접 해야 합니다.
- 서버에 접속한 후, 애플리케이션이 배포될 디렉토리(
DEPLOY_PATH
)를 생성합니다. mkdir -p /var/www/myapp
- 애플리케이션의 Docker Compose 파일과 필요한 파일들을 서버에 배포합니다.
cd /var/www/myapp git clone <your-repo-url> .
- Docker Compose로 애플리케이션을 실행합니다.
docker-compose up -d
이후에는 GitHub Actions를 통해 자동으로 빌드 및 배포가 이루어집니다.
4. 전체 워크플로우 요약
- 코드 변경이 GitHub에 푸시되면, GitHub Actions가 트리거됩니다.
- Docker Compose로 애플리케이션을 빌드하고, 필요한 경우 테스트를 실행합니다.
- 빌드가 성공하면, DockerHub 또는 원격 서버로 이미지를 푸시합니다.
- GitHub Actions는 SSH를 통해 원격 서버에 접속하고, 애플리케이션을 자동 배포합니다.
5. 보안 고려 사항
- SSH 키 관리: GitHub Secrets에 저장한 SSH 비밀 키는 안전하게 관리해야 합니다. GitHub의 Secrets 관리 기능은 보안이 강화되어 있지만, 필요할 때마다 주기적으로 SSH 키를 회전하는 것이 좋습니다.
- 환경 변수 관리: 배포할 때 필요한 환경 변수(예: 데이터베이스 비밀번호, API 키 등)는 GitHub Secrets에 안전하게 저장하고, 애플리케이션에서 이를 참조하도록 구성하세요.
'Docker' 카테고리의 다른 글
Docker로 Next.js와 Express.js 개발 환경 완벽 구축 및 배포하기 (0) | 2024.11.03 |
---|---|
도커 튜토리얼 2부: Go로 만든 REST API를 Dockerfile 이용해서 도커에 넣기 (0) | 2024.03.31 |
도커 튜토리얼 1부. 도커 기초 다지기 (0) | 2024.03.31 |
Docker 기초 배우기 (0) | 2024.03.30 |