내게 CI/CD는
생각은 하고있었지만 실천은 못한..
그런것이다.
여태 그냥 알려준대로 사용하던 Jenkins,
또 서버에 파일을 직접 올려 배포를 해보면서,
저게 어떻게 동작하는지 알아봐야지,
배포 자동화를 내손으로 만들어보고싶다는 생각만 주구장창 했었다.
그러다 이젠 해봐야지싶어 시작해보기로했다.
먼저 이것저것 찾아본대로
DockerFile을 작성하고,
github actions의 .github/workflows/gradle.yml 작성하고,
하면되나..?
먼저 DockerFile은 루트디렉토리에 생성한 후
FROM openjdk:17
CMD ["./gradlew", "clean", "build"]
VOLUME /tmp
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
이처럼 작성했다.
추가로
docker-compose.yml과 .github/workflows/.yml 을 작성해주고,
services:
app:
container_name: concert_reservation_app
image: {dockerHub username}/{docker_image_name}:{tag}
expose:
- "8080"
ports:
- "8080:8080"
name: github actions, dokcer, EC2
# 어떤 조건에서 workflow를 실행할것인가.
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
permissions:
contents: read
jobs:
build:
# runs-on은 github action의 CI서버 runner가 어떤 환경을 갖출지
runs-on: ubuntu-latest
# name(옵션)이름을 적어주고 uses나 run으로 어떤일을 할지 적는다.
# uses는 이미 만들어져있는 것을 가져다쓰는 것, run은 직접 명령어를 적어주겠다
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
- name: Build with Gradle
run: |
chmod +x ./gradlew
./gradlew clean build -x test
# 테스트
- name: Run Tests
run: |
./gradlew test
- name: Docker build & push to docker repo
run: |
docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
docker build -f Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest .
docker push ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest
- name: Deploy to server
uses: appleboy/ssh-action@master
id: deploy
with:
host: ${{ secrets.HOST }}
username: ubuntu
key: ${{ secrets.KEY }}
envs: GITHUB_SHA
script: |
sudo docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
sudo docker rm -f $(sudo docker ps -qa)
cd ${{ secrets.DOCKER_COMPOSE_PATH }}
sudo docker-compose pull app
sudo docker-compose up -d
sudo docker image prune -f
Dockerfile을 사용해 이미지를 빌드하고,
docker-compose를 사용해 이미지를 배포 및 실행하도록 했다.
이후 EC2에 docker 및 docker-compose를 설치했고,
소스코드를 main에 push하면 위의 일련의 과정이 수행이되어
EC2에서 확인할 수 있었다 !
트러블 슈팅에 대해 간략히 모아봐야겠다..
docker build . -t myImage 이후
JAR_FILE에 대한 이슈가 나타났다.
ARG JAR_FILE=build/libs/*.jar
이 부분의 jar파일을 얻기위해 bootJar을 실행시켜준다.
그럼 build-libs-.......-SNAPSHOT.jar 파일이 생성된다 !


올바르지 않은 이미지 태그 형식으로 작성했다고한다.
나의 경우
docker build -f Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest .
이런식으로 작성했는데 docker login시 이메일로 로그인하게끔 작성해놨었다..
docker hub에서 내 username확인해서 바꿔주니 성공했다..

EC2서버에 git pull작업 이후에 해당 경로를
github action 파일 secrets.DOCKER_COMPOSE_PATH 부분에 넣어줘서 해결했다.
무지성 1회차 CICD를 경험해보고 많은 부족함을 느낀다...
다음번엔 제대로 이해하고 테스트 커버리지, 린트 등의 CI에 집중하여
도전해봐야겠다..