Skip to content

제목: release: 이메일 인증 500 수정 + 배달팟 수정 API 배포 #121

제목: release: 이메일 인증 500 수정 + 배달팟 수정 API 배포

제목: release: 이메일 인증 500 수정 + 배달팟 수정 API 배포 #121

Workflow file for this run

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
"