이제 docker로 CI/CD를 설정해줄 것이다.
그전에!! 해야하는 것들을 해줘야한다.
우선 스왑 메모리를 설정해준다.
sudo fallocate -l 2G /swapfile # 2GB 크기의 swap 파일 생성
sudo chmod 600 /swapfile # 권한 설정 (소유자만 읽기/쓰기)
sudo mkswap /swapfile # swap 형식으로 포맷
sudo swapon /swapfile # swap 활성화
자바랑 mysql을 사용해줄것이니까 필요한 것들을 ec2내에 설치한다.
sudo apt install mysql-server
mysql -u {마스터 사용자 이름} -p -h {엔드포인트}
sudo apt install openjdk-21-jdk-y
echo "export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java))))" >> ~/.bashrc
echo "export PATH=\$JAVA_HOME/bin:\$PATH" >> ~/.bashrc
source ~/.bashrc
로 자바 설치 및 자바 홈 경로까지 설정해준다. Gradle은 21로 빌드하기 때문에 21로 해야 나중에 오류 안 남!!
Ubuntu에서는 Docker를 설치하기 위해 공식 Docker 저장소를 먼저 추가해야하기 때문에 아래 명령어를 통해 도커 저장소를 설치해준다.
sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
sudo apt install docker -y
로 도커를 설치해준다.
이제 설치해야하는 것을 다 설치해줬으면!! 본격적으로 CI/CD를 위해 필요한 것들을 작성해준다.
Dockerfile로
FROM openjdk:21-jdk-slim
EXPOSE 8080
COPY ./build/libs/*.jar ./app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
작성해주는데 자바 버전같은거랑 다른 부분은 맞춰서 수정해야한다.
name: CI/CD for Spring Boot with Docker
on:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: 코드 체크아웃
uses: actions/checkout@v3
- name: JDK 설정
uses: actions/setup-java@v3
with:
distribution: 'temurin'
java-version: '21'
- name: application.yml 설정
run: |
mkdir -p ./src/main/resources
echo "${{ secrets.APPLICATION }}" > ./src/main/resources/application.yml
- name: Gradle 빌드
run: ./gradlew clean build -x test
- name: Docker 이미지 빌드 및 푸시
run: |
docker build -t ${{ secrets.DOCKER_USERNAME }}/blockguard_server .
echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
docker push ${{ secrets.DOCKER_USERNAME }}/blockguard_server:latest
deploy:
runs-on: ubuntu-latest
needs: build
steps:
- name: EC2에 SSH 접속하여 Docker 컨테이너 재배포
uses: appleboy/ssh-action@v0.1.10
with:
host: ${{ secrets.EC2_HOST }}
username: ubuntu
key: ${{ secrets.EC2_PRIVATE_KEY }}
script: |
docker pull ${{ secrets.DOCKER_USERNAME }}/blockguard_server:latest
docker stop blockguard_server || true
docker rm blockguard_server || true
docker run -d -p 8080:8080 --name blockguard_server ${{ secrets.DOCKER_USERNAME }}/blockguard_server:latest
github에 workflows/.deploy.yml 파일을 올려준다.
여기서 APPLICATION, DOCKER_USERNAME, DOCKER_PASSWORD, EC2_HOST, EC2_PRIVATE_KEY 는 github setting에 Secretes로 등록해준다.
APPLICATION: application.yml 파일 전체
DOCKER_USERNAME: docker id
DOCKER_PASSWORD: docker password
EC2_HOST: EC2 퍼블릭 IP
EC2_PRIVATE_KEY: .pem 내용 복사 <- cat {.pem 이름}.pem 로 내용 확인 가능 (---BEGIN 부터 END-- 까지 전체 내용 복사)
github repository에 있는 프로젝트를 클론해서 EC2에 받아온다.
git clone {repository 주소}
그리고 application.yml 파일을 작성해준다. application.yml 파일은 절대! 깃허브에 안 올리기 때문에 따로 작성해줘야한다.
mkdir -p src/main/resources
nano src/main/resources/application.yml
vi src/main/resources/application.yml
다 작성했으면 github action 돌리기 전에 수동으로 실행해보고 확인해본다!
./gradlew clean build -x test
docker build -t blockguard_server .
docker run -d -p 8080:8080 --name blockguard_server blockguard_server
docker ps
정상 작동 확인하면 이후에 Github actions 실행하면 됨