제목: release: 이메일 인증 500 수정 + 배달팟 수정 API 배포 #121
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Backend CI/CD | |
| on: | |
| push: | |
| branches: | |
| - develop | |
| - main | |
| pull_request: | |
| branches: | |
| - develop | |
| - main | |
| permissions: | |
| contents: read | |
| jobs: | |
| test: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/setup-java@v4 | |
| with: | |
| distribution: temurin | |
| java-version: '21' | |
| cache: gradle | |
| - run: chmod +x gradlew | |
| - run: ./gradlew test bootJar --no-daemon | |
| # 테스트를 통과한 그 산출물을 그대로 배포한다. EC2에서 다시 빌드하지 않는다. | |
| - name: Upload application jar | |
| if: github.event_name == 'push' && github.ref == 'refs/heads/main' | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: tdd-api-jar | |
| path: build/libs/*.jar | |
| retention-days: 1 | |
| if-no-files-found: error | |
| deploy: | |
| if: github.event_name == 'push' && github.ref == 'refs/heads/main' | |
| needs: test | |
| runs-on: ubuntu-latest | |
| concurrency: | |
| group: tdd-api-production-deploy | |
| cancel-in-progress: false | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Download application jar | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: tdd-api-jar | |
| path: ${{ runner.temp }}/artifact | |
| - name: Configure SSH | |
| env: | |
| EC2_HOST: ${{ secrets.EC2_HOST }} | |
| EC2_KNOWN_HOSTS: ${{ secrets.EC2_KNOWN_HOSTS }} | |
| EC2_SSH_KEY: ${{ secrets.EC2_SSH_KEY }} | |
| run: | | |
| mkdir -p ~/.ssh | |
| printf '%s\n' "$EC2_SSH_KEY" > ~/.ssh/tdd-github-actions | |
| chmod 600 ~/.ssh/tdd-github-actions | |
| printf '%s\n' "$EC2_KNOWN_HOSTS" > ~/.ssh/known_hosts | |
| chmod 600 ~/.ssh/known_hosts | |
| - name: Transfer release artifact | |
| env: | |
| EC2_HOST: ${{ secrets.EC2_HOST }} | |
| EC2_USER: ${{ secrets.EC2_USER }} | |
| run: | | |
| # EC2로는 실행 JAR과 Dockerfile만 보낸다. 소스 전체를 보내고 EC2에서 빌드하면 | |
| # t3.micro의 1GB 메모리로 Gradle 빌드를 감당하지 못한다. | |
| RELEASE_DIR="$RUNNER_TEMP/release" | |
| mkdir -p "$RELEASE_DIR" | |
| cp "$RUNNER_TEMP"/artifact/*.jar "$RELEASE_DIR/app.jar" | |
| cp Dockerfile "$RELEASE_DIR/Dockerfile" | |
| ARCHIVE="$RUNNER_TEMP/tdd-release.tar.gz" | |
| tar -czf "$ARCHIVE" -C "$RELEASE_DIR" . | |
| scp -i ~/.ssh/tdd-github-actions "$ARCHIVE" "$EC2_USER@$EC2_HOST:/tmp/tdd-release.tar.gz" | |
| rm -f "$ARCHIVE" | |
| - name: Transfer runtime configuration | |
| env: | |
| EC2_HOST: ${{ secrets.EC2_HOST }} | |
| EC2_USER: ${{ secrets.EC2_USER }} | |
| SPRING_DATASOURCE_URL: ${{ secrets.SPRING_DATASOURCE_URL }} | |
| SPRING_DATASOURCE_USERNAME: ${{ secrets.SPRING_DATASOURCE_USERNAME }} | |
| SPRING_DATASOURCE_PASSWORD: ${{ secrets.SPRING_DATASOURCE_PASSWORD }} | |
| JWT_SECRET: ${{ secrets.JWT_SECRET }} | |
| CLIENT_ALLOWED_ORIGINS: ${{ secrets.CLIENT_ALLOWED_ORIGINS }} | |
| MAIL_USERNAME: ${{ secrets.MAIL_USERNAME }} | |
| MAIL_APP_PASSWORD: ${{ secrets.MAIL_APP_PASSWORD }} | |
| S3_PRIVATE_BUCKET: ${{ vars.S3_PRIVATE_BUCKET }} | |
| S3_PUBLIC_BUCKET: ${{ vars.S3_PUBLIC_BUCKET }} | |
| S3_PUBLIC_BASE_URL: ${{ vars.S3_PUBLIC_BASE_URL }} | |
| AWS_REGION: ${{ vars.AWS_REGION }} | |
| run: | | |
| test -n "$JWT_SECRET" || { | |
| echo "::error::JWT_SECRET is not configured" | |
| exit 1 | |
| } | |
| for name in S3_PRIVATE_BUCKET S3_PUBLIC_BUCKET S3_PUBLIC_BASE_URL AWS_REGION MAIL_USERNAME MAIL_APP_PASSWORD; do | |
| test -n "${!name}" || { | |
| echo "::error::$name is not configured" | |
| exit 1 | |
| } | |
| done | |
| umask 077 | |
| { | |
| printf 'SPRING_DATASOURCE_URL=%s\n' "$SPRING_DATASOURCE_URL" | |
| printf 'SPRING_DATASOURCE_USERNAME=%s\n' "$SPRING_DATASOURCE_USERNAME" | |
| printf 'SPRING_DATASOURCE_PASSWORD=%s\n' "$SPRING_DATASOURCE_PASSWORD" | |
| printf 'JWT_SECRET=%s\n' "$JWT_SECRET" | |
| printf 'CLIENT_ALLOWED_ORIGINS=%s\n' "$CLIENT_ALLOWED_ORIGINS" | |
| printf 'MAIL_USERNAME=%s\n' "$MAIL_USERNAME" | |
| printf 'MAIL_APP_PASSWORD=%s\n' "$MAIL_APP_PASSWORD" | |
| printf 'S3_PRIVATE_BUCKET=%s\n' "$S3_PRIVATE_BUCKET" | |
| printf 'S3_PUBLIC_BUCKET=%s\n' "$S3_PUBLIC_BUCKET" | |
| printf 'S3_PUBLIC_BASE_URL=%s\n' "$S3_PUBLIC_BASE_URL" | |
| printf 'AWS_REGION=%s\n' "$AWS_REGION" | |
| } > tdd-runtime.env | |
| scp -i ~/.ssh/tdd-github-actions tdd-runtime.env "$EC2_USER@$EC2_HOST:/tmp/tdd-runtime.env" | |
| rm -f tdd-runtime.env | |
| - name: Build and run container | |
| env: | |
| EC2_DEPLOY_PATH: ${{ secrets.EC2_DEPLOY_PATH }} | |
| EC2_HOST: ${{ secrets.EC2_HOST }} | |
| EC2_USER: ${{ secrets.EC2_USER }} | |
| run: | | |
| ssh -i ~/.ssh/tdd-github-actions "$EC2_USER@$EC2_HOST" " | |
| set -e | |
| mkdir -p '$EC2_DEPLOY_PATH/release' | |
| rm -rf '$EC2_DEPLOY_PATH/release'/* | |
| tar -xzf /tmp/tdd-release.tar.gz -C '$EC2_DEPLOY_PATH/release' | |
| rm -f /tmp/tdd-release.tar.gz | |
| install -m 600 /tmp/tdd-runtime.env '$EC2_DEPLOY_PATH/.env' | |
| rm -f /tmp/tdd-runtime.env | |
| docker build -t tdd-api:latest '$EC2_DEPLOY_PATH/release' | |
| docker rm -f tdd-api || true | |
| docker run -d --name tdd-api --restart unless-stopped -p 8080:8080 \ | |
| --env-file '$EC2_DEPLOY_PATH/.env' \ | |
| tdd-api:latest | |
| docker image prune -f | |
| " |