12.30 TIL - github actions CD 해보기

이서준·2025년 12월 30일

TIL

목록 보기
21/24

CD

  • CI를 통과한 코드를 자동으로 서버에 배포해주는 것

CD 흐름도

  1. github main push
  2. github actions
  3. ggradle build
  4. docker build
  5. docker hub push
  6. 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. 도커파일 없음

  • 도커 파일을 넣어야 하는줄 몰랐음
  • 도커 파일 루트에 추가
# Java 17 이미지 사용
FROM eclipse-temurin:17-jdk-jammy

# jar 파일을 컨테이너 내부에 복사
COPY build/libs/*.jar app.jar

# 외부 호스트 8080 포트로 노출
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로 변경 예정

  1. Environment 인지 Repository인지 어디다가 secrets 을 넣을 지 몰라 Environment에 넣음

1. Environment Secrets

  • 특정 environment에서만 사용가능
  • workflow에 반드시 environment : ~~~ 있어야 됨
  • 배포 승인 설정 가능
  • prod / dev 등 분리 가능
    → 장점
    - 실수 방지 : dev → prod 배포 시 승인 필요 같은 방파제
    - 멀티 환경 : dev / prod 분리

2. Repository Secrets

  • 모든 workflow에서 사용가능
  • environment 설정 없어도 바로 사용 됨
  • 설정이 단순
  • 빠르게 CI/CD 구성할 때 많이 사용
profile
Allons-y

0개의 댓글