diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml new file mode 100644 index 0000000..4c076ac --- /dev/null +++ b/.github/workflows/gradle.yml @@ -0,0 +1,99 @@ +name: CI/CD + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + +jobs: + build: + runs-on: ubuntu-latest + permissions: + contents: read + + steps: + - uses: actions/checkout@v4 + + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'temurin' + + - name: Change wrapper permissions + run: chmod +x ./gradlew + + - name: Build with Gradle Clean + run: ./gradlew clean + + - name: Build with Gradle Build + run: ./gradlew build -x test + + - name: 1. DockerHub Login + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_PASSWORD }} + + - name: 2. Docker Image Build + run: docker build -t ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.PROJECT_NAME }} . + + - name: 3. DockerHub Push + run: docker push ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.PROJECT_NAME }} + + # deploy 라는 이름의 작업 정의 + deploy: + # main branch 에 push 가 발생할 때만 실행되도록 함 + if: github.ref == 'refs/heads/main' + # build 단계 완료 후에만 실행 가능 - build 가 성적적으로 완료된 후 EC2 배포 진행 + needs: build + runs-on: ubuntu-latest + steps: + # EC2 : 기존 이미지 삭제, 이미지 업데이트 + - name: Application setting + uses: appleboy/ssh-action@v0.1.8 + # EC2 instance 에 SSH 연결 설정 + with: + host: ${{ secrets.EC2_HOST }} + username: ${{ secrets.EC2_USERNAME }} + key: ${{ secrets.EC2_KEY }} + + # SSH 로 EC2 접속 후 실행할 명령어 + # 도커 컨테이너 중지 및 강제 삭제 + # 이때 컨테이너가 존재하지 않거나, 중지되지 않아도 스크립트 진행 + # server 에 저장된 이전 Docker image 삭제 + # image 존재하지 않아도 스크립트 진행 + # Docker Hub 에서 새로운 image 가져옴 + script: | + echo "Stopping and removing existing container..." + sudo docker kill ${{ secrets.PROJECT_NAME }} || true + sudo docker rm -f ${{ secrets.PROJECT_NAME }} || true + echo "Removing old image..." + sudo docker rmi ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.PROJECT_NAME }} || true + echo "Pulling new image..." + sudo docker pull ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.PROJECT_NAME }} + + # EC2 : 도커 이미지 실행 + - name: Application Run + uses: appleboy/ssh-action@v0.1.8 + with: + host: ${{ secrets.EC2_HOST }} + username: ${{ secrets.EC2_USERNAME }} + key: ${{ secrets.EC2_KEY }} + + # 새로운 Docker Container 백그라운드에서 실행 + # -p 8080:${{ secrets.PORT }}: EC2 서버의 8080 포트를 컨테이너의 포트와 매핑 + # --name : 생성할 container 의 이름 + # -e : 환경 변수를 container에 전달 + # -d : Docker Hub 에서 가져온 이미지를 백그라운드에서 실행 + script: | + echo "Running new container..." + sudo docker run -p 8080:${{ secrets.PORT }} \ + --name ${{ secrets.PROJECT_NAME }} \ + -e DOCKERHUB_USERNAME="${{ secrets.DOCKERHUB_USERNAME }}" \ + -e PROJECT_NAME="${{ secrets.PROJECT_NAME }}" \ + -e DB_URL="${{ secrets.DB_URL }}" \ + -e DB_USERNAME="${{ secrets.DB_USERNAME }}" \ + -e DB_PASSWORD="${{ secrets.DB_PASSWORD }}" \ + -d ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.PROJECT_NAME }} \ No newline at end of file