이전에 Docker와 EC2를 활용하여 내가 만든 스프링부트 사이트를 띄우는 것까지 했다.
이번 시간엔 Github Actions를 활용한 CI/CD 파이프라인을 구축하여 자동배포를 해보는 시간을 가지겠다.
1. Github Actions 접속
먼저 깃허브에서 내 레포지토리에 들어온 후 상단에 있는 actions에 들어간다.
2. 워크플로우 작성
이제 워크플로우를 작성하면 된다. 스프링 프로젝트 이므로 Java with Gradle을 선택해준다.
yml 파일의 이름을 설정하고 스크립트를 넣어준다. workflow 이름이나 브랜치명, jdk 버전은 내가 하고 있는 프로젝트의 환경에 맞춰서 수정하면 된다.
# Workflow 이름
name: Spring Boot & AWS CI/CD
# 어떤 이벤트가 발생하면 workflow 실행할 지 명시
on:
# main 브랜치에 push나 pull request 발생 시
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
# 위 이벤트 발생 시 실행될 작업들
jobs:
build:
# VM의실행 환경 지정
runs-on: ubuntu-latest
# 실행될 jobs를 순서대로 명시
steps:
- name: Checkout
uses: actions/checkout@v4
# JDK 17 설치
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
# Gradle Build를 위한 권한 부여
- name: Grant execute permission for gradlew
run: chmod +x gradlew
# Gradle Build (test 제외)
- name: Build with Gradle
run: ./gradlew clean build --exclude-task test
# DockerHub 로그인
- name: DockerHub Login
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
# Docker 이미지 빌드
- name: Docker Image Build
run: docker build -t ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.PROJECT_NAME }} .
# DockerHub Push
- name: DockerHub Push
run: docker push ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.PROJECT_NAME }}
# EC2 인스턴스 접속 및 애플리케이션 실행
- name: Application Run
uses: appleboy/ssh-action@v0.1.6
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_KEY }}
script: |
sudo docker kill ${{ secrets.PROJECT_NAME }}
sudo docker rm -f ${{ secrets.PROJECT_NAME }}
sudo docker rmi ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.PROJECT_NAME }}
sudo docker pull ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.PROJECT_NAME }}
sudo docker run -p ${{ secrets.PORT }}:${{ secrets.PORT }} \
--name ${{ secrets.PROJECT_NAME }} \
-d ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.PROJECT_NAME }}
여기서 변수들은 settings에서 secret 부분에 추가해주면 된다.
변수에 대한 설명
DOCKERHUB_USERNAME :
- 도커 허브 유저네임
DOCKERHUB_PASSWORD :
- 도커 허브 패스워드 (일단 패스워드로 해보고 문제가 생긴다면 토큰으로 수정해보면 될 것이다.)
PROJECT_NAME :
- 프로젝트 이름 (도커 허브에 컨테이너 이름이 이 이름으로 설정된다. 나는 도커 허브의 내 레포 이름으로 했다.)
PORT :
- 도커를 실행시킬 포트이다. 나는 8080으로 했다.
EC2_HOST :
- 인스턴스의 퍼블릭 IPv4 주소나 DNS 주소로 하면 된다. 8080은 포트에 해놨으므로 추가 안해도 된다.
EC2_USERNAME :
- 인스턴스를 생성할 때 os에 따라 다른 Username을 설정해야 한다.
- Amazon Linux 2 버전이면 ec2-user이고 Ubuntu이면 ubuntu로 해주면 된다.
EC2_KEY :
- EC2 인스턴스를 생성할 때 발급받았던 pem 키를 넣어주면 된다.
- -----BEGIN or END RSA PRIVATEKEY----- 문구까지 포함한다.
변수 세팅이 끝났다면 workflow를 실행시켜서 성공하는지 확인한다. 성공했다면 앞으로 main 브랜치로 push 하거나 PR을 하면 자동적으로 배포될 수 있도록 한다.
빌드 성공 화면
하면서 생겼던 문제들
EC2에서 도커를 stop해야 정상적인 수행이 가능했다. 도커가 중지가 되어있지 않았을 때 Application Run 부분에서 오류가 생겼다. 이 부분도 추후에 보완할 수 있으면 해볼 것.
3. 배포 완료
잘 적용된 것을 확인했다.
'Git, CICD > CICD' 카테고리의 다른 글
Github Actions에서 RDS 접근 불가 문제 해결 (2) | 2025.08.06 |
---|---|
[CI/CD] terraform 찍먹하기 (55) | 2024.08.14 |
CI/CD란? (5) | 2024.04.23 |