CD
- CI를 통과한 코드를 자동으로 서버에 배포해주는 것
CD 흐름도
- github main push
- github actions
- ggradle build
- docker build
- docker hub push
- EC2 docker pull & run
에러 해결 과정
1. 권한 (gradlew Permission denied)

- build 하기 전 권한 오류
- Build Jar 하기 전 권한 부여
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build Jar
run: ./gradlew clean build
2. 도커 빌드 오류

- Environment secret 사용이 제대로 되지 않는 상황
environment: EC2 추가
jobs:
deploy:
runs-on: ubuntu-latest
environment: EC2
3. 도커파일 없음

- 도커 파일을 넣어야 하는줄 몰랐음
- 도커 파일 루트에 추가
FROM eclipse-temurin:17-jdk-jammy
COPY build/libs/*.jar app.jar
EXPOSE 8080
CMD ["java", "-jar", "app.jar"]
4. 도커 권한 문제

- 도커 권한을 제대로 주지 않아 push를 못하는 상황
- 도커 액세스 토큰을 생성할 때 read& write로 충분

완성된 전체 CD workflow 코드
name: CD
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build Jar
run: ./gradlew clean build
- name: Docker build
run: docker build -t ${{ secrets.DOCKER_USERNAME }}/my-app:latest .
- name: Docker login
run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin
- name: Docker push
run: docker push ${{ secrets.DOCKER_USERNAME }}/my-app:latest
- name: Deploy to EC2
uses: appleboy/ssh-action@v1.0.0
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USER }}
key: ${{ secrets.EC2_SSH_KEY }}
script: |
docker pull ${{ secrets.DOCKER_USERNAME }}/my-app:latest
docker stop my-app || true
docker rm my-app || true
docker run -d --name my-app -p 8080:8080 ${{ secrets.DOCKER_USERNAME }}/my-app:latest
변경해야할 것
Repository secrets로 변경 예정
- Environment 인지 Repository인지 어디다가 secrets 을 넣을 지 몰라 Environment에 넣음

1. Environment Secrets
- 특정 environment에서만 사용가능
- workflow에 반드시
environment : ~~~ 있어야 됨
- 배포 승인 설정 가능
- prod / dev 등 분리 가능
→ 장점
- 실수 방지 : dev → prod 배포 시 승인 필요 같은 방파제
- 멀티 환경 : dev / prod 분리
2. Repository Secrets
- 모든 workflow에서 사용가능
- environment 설정 없어도 바로 사용 됨
- 설정이 단순
- 빠르게 CI/CD 구성할 때 많이 사용