From 4e732835c4fd7a20985a1600e0ade6c17397b0e8 Mon Sep 17 00:00:00 2001 From: KiSeungMin Date: Sat, 21 Sep 2024 22:51:02 +0900 Subject: [PATCH] update dev_docker_gradle.yml --- .github/workflows/dev_docker_gradle.yml | 108 ++++++++++++++---------- 1 file changed, 62 insertions(+), 46 deletions(-) diff --git a/.github/workflows/dev_docker_gradle.yml b/.github/workflows/dev_docker_gradle.yml index 88b1f52..07f6880 100644 --- a/.github/workflows/dev_docker_gradle.yml +++ b/.github/workflows/dev_docker_gradle.yml @@ -1,58 +1,74 @@ -name: Java CI with Gradle +name: Java CI with Gradle # 워크플로우의 이름 설정 on: push: - branches: ["dev" ] + branches: ["dev"] # dev 브랜치에 푸시될 때 워크플로우 실행 pull_request: - branches: ["dev" ] + branches: ["dev"] # dev 브랜치에 대한 PR이 생성되거나 업데이트될 때 워크플로우 실행 permissions: - contents: read + contents: read # 워크플로우의 권한 설정 (read-only) jobs: build: - runs-on: ubuntu-latest + runs-on: ubuntu-latest # 워크플로우가 실행될 환경 설정 (Ubuntu 최신 버전) steps: - - uses: actions/checkout@v3 - - name: Set up JDK 17 - uses: actions/setup-java@v3 - with: - java-version: '17' - distribution: 'temurin' - - - - name: make application-prod.yml - run: | - cd ./src/main/resources - touch ./application-prod.yml - echo "${{ secrets.APPLICATION_PROD }}" > ./application-prod.yml - - - - name: Grant execute permission for gradlew - run: chmod +x gradlew - - - name: Build with Gradle - run: ./gradlew build -x test - - - name: Docker build - run: | - docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }} - docker build -t app . - docker tag app ${{ secrets.DOCKER_USERNAME }}/sejongmate:latest - docker push ${{ secrets.DOCKER_USERNAME }}/sejongmate:latest - - - name: Deploy - uses: appleboy/ssh-action@master - with: - host: ${{ secrets.HOST }} # EC2 인스턴스 퍼블릭 DNS - username: ec2-user - key: ${{ secrets.PRIVATE_KEY }} # pem 키 - # 도커 작업 - script: | - docker pull ${{ secrets.DOCKER_USERNAME }}/sejongmate:latest - docker stop $(docker ps -a -q) - docker run -d --log-driver=syslog -p 8080:8080 ${{ secrets.DOCKER_USERNAME }}/sejongmate:latest - docker rm $(docker ps --filter 'status=exited' -a -q) - docker image prune -a -f + # 코드 체크아웃: GitHub Actions가 현재 리포지토리의 코드를 가져옵니다. + - uses: actions/checkout@v3 + + # JDK 17 설정: Java 17 버전을 사용하기 위해 JDK를 설치합니다. + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' # JDK 버전 17 설정 + distribution: 'temurin' # Temurin JDK 배포판 사용 + + # application-dev.yml 파일 생성: dev 환경의 설정 파일을 생성하고 secrets에서 값을 가져와 입력합니다. + - name: make application-dev.yml + run: | + cd ./src/main/resources # resources 디렉토리로 이동 + touch ./application-dev.yml # application-dev.yml 파일 생성 + echo "${{ secrets.APPLICATION_DEV }}" > ./application-dev.yml # GitHub Secrets에서 설정값을 가져와 파일에 저장 + + # Gradle Wrapper 실행 권한 부여: gradlew에 실행 권한을 부여합니다. + - name: Grant execute permission for gradlew + run: chmod +x gradlew + + # Gradle 빌드: Gradle을 사용해 프로젝트를 빌드하되, 테스트는 생략합니다. + - name: Build with Gradle + run: ./gradlew build -x test # 테스트는 실행하지 않고 빌드만 수행 + + # Docker 이미지 빌드 및 푸시 + - name: Docker build + run: | + docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }} # Docker Hub에 로그인 + docker build -t app . # Docker 이미지를 'app'이라는 이름으로 빌드 + docker tag app ${{ secrets.DOCKER_USERNAME }}/ono:latest # 이미지를 Docker Hub 저장소로 태깅 + docker push ${{ secrets.DOCKER_USERNAME }}/ono:latest # 이미지를 Docker Hub에 푸시 + + # Bastion 서버를 통해 스프링 서버로 배포 + - name: Deploy via Bastion Server + uses: appleboy/ssh-action@master + with: + host: ${{ secrets.BASTION_HOST }} # Bastion 서버의 퍼블릭 IP 또는 DNS 주소 + username: ec2-user # Bastion 서버의 사용자 이름 + key: ${{ secrets.BASTION_PRIVATE_KEY }} # Bastion 서버의 SSH 개인 키 (GitHub Secrets에서 가져옴) + port: 22 # SSH 연결에 사용할 포트 (기본값 22) + script: | + # Bastion 서버에서 스프링 서버로 SSH 연결 및 도커 작업 수행 + ssh -o StrictHostKeyChecking=no -i ~/your-spring-server-key.pem ec2-user@${{ secrets.SPRING_SERVER_IP }} << 'EOSSH' + # 스프링 서버에서 Docker Hub에 로그인 + docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }} + # 최신 Docker 이미지를 Docker Hub에서 Pull + docker pull ${{ secrets.DOCKER_USERNAME }}/ono:latest + # 실행 중인 모든 컨테이너를 중지 (실행 중인 컨테이너가 없을 경우 오류 무시) + docker stop $(docker ps -a -q) || true + # 중지된 모든 컨테이너를 제거 (없을 경우 오류 무시) + docker rm $(docker ps -a -q) || true + # 새로 받은 이미지를 기반으로 컨테이너 실행 (8080 포트 사용) + docker run -d --log-driver=syslog -p 8080:8080 ${{ secrets.DOCKER_USERNAME }}/ono:latest + # 24시간 동안 사용되지 않은 모든 Docker 이미지를 삭제하여 공간 확보 + docker image prune -a -f --filter "until=24h" + EOSSH \ No newline at end of file