
spring boot로 개발한 project를 docker compose를 이용해서 cicd 자동화 환경을 만들어 보았습니다.
이 글을 참고해서 ec2에 redis랑 spring을 actions를 활용해 cicd환경을 구성해보고 싶으신 분들은 참고 하면 좋을 것 같습니다.
이 블로그 글은 github actions, ec2, redis, docker, docker-compose에 대한 사전지식을 먼저 습득하는 것을 권장드립니다.

docker 설치는 앞서 작성한 블로그를 참고하시면 될거같습니다.
sudo curl \
-L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" \
-o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
# project cicd를 위한 환경설정
name: skilled_project 배포 자동화
# 아래의 브랜치에 해당 트리거가 발생하면 자동 배포
on:
pull_request:
branches: [ "develop" ]
# 코드가 변경되면 실행할 작업들
jobs:
CI-CD:
runs-on: ubuntu-latest
# 이 workflow에 리포지토리에 대한 읽기 권한을 부여한다.
permissions:
contents: read
# 단계 설정
steps:
- uses: actions/checkout@v4
# 1. jdk 버전 설정
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
# 2. Github secrets로부터 데이터를 받아서, 워크 플로우에 파일을 생성
- name: Make application.properties
run: |
cd ./src/main/resources
touch ./application.properties
echo "${{ secrets.PROPERTIES }}" >> ./application.properties
shell: bash
# 3. project에 맞는 gradle 설정
- name: Setup Gradle
uses: gradle/actions/setup-gradle@417ae3ccd767c252f5661f1ace9f835f9654f2b5 # v3.1.0
# 4. gradle build
- name: gradlew에 실행권한 부여
run: chmod +x ./gradlew
# 5. build
- name: Build with Gradle Wrapper ( 프로젝트 빌드 )
run: ./gradlew build
# 6. docker build & push
- name: docker build & push
run: |
docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
docker build -t ${{ secrets.DOCKER_REPO }}/skilled_project:2.0 .
docker push ${{ secrets.DOCKER_REPO }}/skilled_project:2.0
# 7. docker deploy to ec2
- name: Docker deploy to ec2
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST }}
username: ubuntu
key: ${{ secrets.SSH_KEY }}
port: 22
script: |
sudo docker rm -f $(docker ps -aq)
sudo docker pull ${{ secrets.DOCKER_REPO }}/skilled_project:2.0
docker-compose up -d
sudo docker image prune -f
on:
pull_request:
branches: [ "develop" ]
runs-on: ubuntu-latest
permissions:
contents: read
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
로컬환경에서는 build를 수동으로 하면 application 파일을 따로 뺄 필요가 없이 로컬파일이 그대로 남아있기 때문에 신경쓰지 않고 build가 가능했습니다
하지만 github의 cicd환경에서는 application 파일이 .gitignore에 등록이 되어 github의 repository에 존재하지 않게 됩니다. 그렇기에 actions 파일 설정에 application 파일을 만들어 build 할 수 있도록 설정을 추가해주는 작업이 필요합니다.
application 파일은 민감한 정보가 많이 들어있기 때문에 repository에 secret key로 등록을 해주어야합니다.

- name: Make application.properties
run: |
cd ./src/main/resources
touch ./application.properties
echo "${{ secrets.PROPERTIES }}" >> ./application.properties
shell: bash
cd ./src/main/resources
ㄴ resources 폴더 위치로 이동합니다.
touch ./application.properties
ㄴ application.properties 파일을 생성합니다.
echo "${{ secrets.PROPERTIES }}" >> ./application.properties
ㄴ secrets.PROPERTIES의 내용을 application.properties 파일에 기입합니다.
- name: Setup Gradle
uses: gradle/actions/setup-gradle@417ae3ccd767c252f5661f1ace9f835f9654f2b5
- name: gradlew에 실행권한 부여
run: chmod +x ./gradlew
- name: Build with Gradle Wrapper ( 프로젝트 빌드 )
run: ./gradlew build
- name: docker build & push
run: |
docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
docker build -t ${{ secrets.DOCKER_REPO }}/skilled_project:2.0 .
docker push ${{ secrets.DOCKER_REPO }}/skilled_project:2.0
docker build -t [ image name ]
ㄴ docker image를 만듭니다.
docker push [ image name ]
ㄴ docker image를 docker hub에 push합니다.
- name: Docker deploy to ec2
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST }}
username: ubuntu
key: ${{ secrets.SSH_KEY }}
script: |
sudo docker rm -f $(docker ps -aq)
sudo docker pull ${{ secrets.DOCKER_REPO }}/skilled_project:2.0
docker-compose up -d
sudo docker image prune -f
secrets.HOST
ㄴ ec2의 주소를 입력해줍니다.
username
ㄴ ec2의 환경이름을 적어줍니다.

위 부분에서 Ubuntu를 선택하였다면 ubuntu라고 적어줍니다.
secrets.SSH_KEY
ㄴ ec2를 접속 할 때 사용한 ssh key를 넣어줍니다.
sudo docker rm -f $(docker ps -aq)
ㄴ 실행하고 있는 모든 docker 파일을 종료합니다.
sudo docker pull ${{ secrets.DOCKER_REPO }}/skilled_project:2.0
ㄴ docker hub에서 docker images를 pull하여 가져옵니다.
docker-compose up -d
ㄴ docker-compose.yml 파일을 사용하여 백그라운드 환경에서 실행시킵니다.
docker-compose 파일이 ec2에 존재하지 않을시 ec2에 업로드를 해주어야합니다.
version: '3.8'
services:
redis:
image: redis
ports:
- "6379:6379"
spring:
image: yiyaaa/skilled-project
container_name: skilled_project
ports:
- "8080:8080"
depends_on:
- redis