Deployment/github Actions
GitHub Actions + Docker로 CI/CD 구축
연향동큰손
2025. 5. 25. 21:28
GitHub Actions + Docker를 이용해 CI/CD 구축을 해봤다.
GitHub Actions는 다음과 같은 장점을 가진다.
- 다른 CI/CD툴에 비해 사용하기 쉽다.
- YAML 파일을 통해 원하는 워크플로우를 손쉽게 정의하고 커스터마이징 가능
- 공개 리포지토리의 경우 무료로 이용, 제한된 범위 내에서 사설 리포지토리도 무료로 사용 가능
- CI/CD를 위한 별도의 서버가 필요 없다.
구현 목표
1. deploy.yml를 통해 GitHub Actions가 워크플로우 수행
2. Dockerfile을 이용해서 Docker Image 빌드
3. DockerHub에 이미지를 업로드
4. EC2에서 최신 이미지를 pull 받아서 실행
개발 과정은 다음과 같다.
1. DockerHub에 리포지토리 생성
리포지토리 생성 후 Access token을 발급받아 GitHub의 Actions secrets and variables에 등록해줘야 GitHub Actions가 DockerHub에 로그인해서 자동으로 이미지 push/pull 할수 있게 된다.
2. deploy.yml 생성
프로젝트의.github/workflows 폴더 안에 deploy.yml을 만들어준다.
name: Backend CD # 워크플로우 이름
on:
push:
branches: [main]
env:
IMAGE_NAME: <도커허브_아이디>/<리포지토리 이름>
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: 저장소 Checkout
uses: actions/checkout@v3
- name: Gradle 캐시
uses: actions/cache@v3
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: gradle-${{ runner.os }}-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
- name: 스프링부트 애플리케이션 빌드
run: ./gradlew build -x test
- name: 도커 이미지 빌드
run: docker build -t <도커허브_아이디>/<리포지토리 이름> .
- name: Docker Hub 로그인
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Docker Hub 퍼블리시
run: docker push <도커허브_아이디>/<이미지_이름>
- name: EC2 인스턴스 접속 및 애플리케이션 실행
uses: appleboy/ssh-action@v0.1.6
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_SSH_PRIVATE_KEY }}
port: 22
script: |
docker stop spring-app || true
docker rm spring-app || true
docker pull <도커허브_아이디>/<리포지토리 이름>
docker run -d -p 8080:8080 --name spring-app <도커허브_아이디>/<리포지토리 이름>
GitHub에 push만 하면 → Spring 빌드 → Docker 이미지 빌드 → DockerHub에 푸시 → EC2에 자동 배포까지 완료되는 워크플로우가 완성된다.
3. 키값들을 GitHub에 등록
키값을 깃허브에 등록 해줘야 워크플로우가 정상적으로 수행된다.
나는 위 deploy.yml코드를 기준으로 5가지의 키값을 등록해줬다.
DOCKERHUB_TOKEN | 도커허브에서 발급받은 액세스 토큰 |
DOCKERHUB_USERNAME | 도커허브 계정 이름 |
EC2_HOST | 배포할 EC2 서버의 공인 IP 주소 |
EC2_SSH_PRIVATE_KEY | EC2 서버에 SSH로 접속할 수 있는 개인 키 |
EC2_USERNAME | EC2 서버에 SSH로 접속할 때 사용할 리눅스 사용자 이름 ex) Ubuntu |
4. EC2 인스턴스에 접속
EC2인스턴스에 Docker를 설치하고 도커 관련 설정들을 해준다.
# 시스템 업데이트
sudo apt update
# 도커 설치
sudo apt install -y docker.io
# 도커 자동 실행 설정
sudo systemctl enable docker
sudo systemctl start docker
# 현재 유저를 docker 그룹에 추가 (권한 없이 사용 가능하게)
sudo usermod -aG docker $USER
5. GitHub에 코드 Push하여 CI/CD가 정상적으로 수행되는지 확인