diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml new file mode 100644 index 0000000..8768379 --- /dev/null +++ b/.github/workflows/workflow.yml @@ -0,0 +1,101 @@ +name: TripTalk CI/CD with Gradle, Test, and Docker + +on: + workflow_dispatch: + push: + branches: [ "develop" ] + pull_request: + branches: [ "develop" ] + +permissions: + contents: read + +jobs: + CI-CD: + runs-on: ubuntu-latest + permissions: + contents: read + + steps: + # 1. 코드 체크아웃 + - uses: actions/checkout@v4 + + # 2. JDK 21 설정 + - name: Set up JDK 21 + uses: actions/setup-java@v4 + with: + java-version: '21' + distribution: 'temurin' + + # 3. Gradle 캐시 + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v3 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + restore-keys: | + ${{ runner.os }}-gradle- + + # 4. application.yml 생성 + - name: Make application.yml from Secret + run: | + mkdir -p ./src/main/resources + echo "${{ secrets.APPLICATION_DEV_YML_BASE64 }}" | base64 --decode > ./src/main/resources/application.yml + echo "=== [DEBUG] application.yml ===" + cat ./src/main/resources/application.yml + + # 5. gradlew 권한 부여 + - name: Grant Execute Permission For Gradlew + run: chmod +x gradlew + + # 6. Gradle build + - name: Build Gradle (without test) + run: ./gradlew bootJar -x test + + # 7. Docker Build & Push + - name: Docker Build & Push + run: | + docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }} + docker build -t ${{ secrets.DOCKER_USERNAME }}/triptalk-spring:latest . + docker push ${{ secrets.DOCKER_USERNAME }}/triptalk-spring:latest + + # 8. 서버 배포 (Dev 서버) + - name: Deploy to Dev + uses: appleboy/ssh-action@master + if: contains(github.ref,'develop') + with: + key: ${{ secrets.PRIVATE_KEY }} + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + port: 22 + script: | + cd ~/app + + # 기존 컨테이너 정리 + docker-compose -f docker-compose.yml down || true + + # 최신 이미지 pull + docker pull ${{ secrets.DOCKER_USERNAME }}/triptalk-spring:latest + + # 컨테이너 재시작 + docker-compose -f docker-compose.yml up -d --remove-orphans + + # 사용하지 않는 이미지 삭제 + docker image prune -f + + # 9. 현재 시간 출력 + current-time: + needs: CI-CD + runs-on: ubuntu-latest + steps: + - name: Get Current Time + uses: 1466587594/get-current-time@v2 + id: current-time + with: + format: YYYY-MM-DDTHH:mm:ss + utcOffset: "+09:00" + + - name: Print Current Time + run: echo "Current Time=${{steps.current-time.outputs.formattedTime}}"