Merge branch 'fix/#52-ec2-oom' into release-server #23
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: Deploy (ECR + EC2 + Env upload) | |
| on: | |
| push: | |
| branches: [ "release-server" ] # release-server 브랜치에 푸시될 때마다 실행 | |
| workflow_dispatch: | |
| jobs: | |
| deploy: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 # 러너에 레포 소스코드를 내려받음 | |
| #러너에 jdk 설치 및 테스트 | |
| # - name: Set up JDK 21 | |
| # uses: actions/setup-java@v4 | |
| # with: | |
| # distribution: temurin | |
| # java-version: "21" | |
| # | |
| # - name: Grant execute permission for gradlew | |
| # run: chmod +x gradlew | |
| # | |
| # - name: Test | |
| # run: ./gradlew test --no-daemon # 테스트 실행 | |
| # AWS 인증 (러너가 aws에 접근할 수 있도록) | |
| - name: Configure AWS credentials | |
| uses: aws-actions/configure-aws-credentials@v4 | |
| with: | |
| aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} | |
| aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} | |
| aws-region: "ap-northeast-2" | |
| # 앞서 설정한 aws credential로 ECR 로그인 | |
| - name: Login to ECR | |
| uses: aws-actions/amazon-ecr-login@v2 | |
| # 이미지 빌드 & 푸시 | |
| - name: Build & Push Docker image | |
| env: | |
| ECR_REPO_URI: ${{ secrets.ECR_REPO_URI }} | |
| GIT_SHA: ${{ github.sha }} #롤백을 위해 sha 태그 설정 (github actions가 자동으로 제공하는 메타데이터) | |
| run: | | |
| docker build -t myapp:${GIT_SHA} ./backend | |
| docker tag myapp:${GIT_SHA} ${ECR_REPO_URI}:${GIT_SHA} | |
| docker tag myapp:${GIT_SHA} ${ECR_REPO_URI}:latest | |
| docker push ${ECR_REPO_URI}:${GIT_SHA} | |
| docker push ${ECR_REPO_URI}:latest | |
| # .env 파일 생성 (runner에서 임시 생성) | |
| - name: Create .env | |
| shell: bash | |
| run: | | |
| cat > .env << 'EOF' | |
| DB_URL=${{ secrets.DB_URL }} | |
| DB_USERNAME=${{ secrets.DB_USERNAME }} | |
| DB_PASSWORD=${{ secrets.DB_PASSWORD }} | |
| JWT_SECRET=${{ secrets.JWT_SECRET }} | |
| REDIS_HOST=${{ secrets.REDIS_HOST }} | |
| REDIS_PORT=${{ secrets.REDIS_PORT }} | |
| KAKAO_REST_API_KEY=${{ secrets.KAKAO_REST_API_KEY }} | |
| DDL_AUTO=${{ secrets.DDL_AUTO }} | |
| FIREBASE_CREDENTIALS_PATH=${{ secrets.FIREBASE_CREDENTIALS_PATH }} | |
| EOF | |
| # EC2로 .env 업로드 | |
| - name: Upload .env to EC2 | |
| uses: appleboy/scp-action@v0.1.7 | |
| with: | |
| host: ${{ secrets.EC2_HOST }} | |
| username: ${{ secrets.EC2_USER }} | |
| key: ${{ secrets.EC2_SSH_KEY }} | |
| source: ".env" | |
| target: "/home/${{ secrets.EC2_USER }}/app" | |
| overwrite: true | |
| # EC2로 docker-compose.prod.yml 업로드 (레포가 배포 파일의 단일 출처가 되도록) | |
| - name: Upload docker-compose.prod.yml to EC2 | |
| uses: appleboy/scp-action@v0.1.7 | |
| with: | |
| host: ${{ secrets.EC2_HOST }} | |
| username: ${{ secrets.EC2_USER }} | |
| key: ${{ secrets.EC2_SSH_KEY }} | |
| source: "backend/docker-compose.prod.yml" | |
| target: "/home/${{ secrets.EC2_USER }}/app" | |
| strip_components: 1 | |
| overwrite: true | |
| # EC2에서 최신 이미지 pull + 재기동 | |
| - name: Deploy on EC2 | |
| uses: appleboy/ssh-action@v1.0.3 | |
| with: | |
| host: ${{ secrets.EC2_HOST }} | |
| username: ${{ secrets.EC2_USER }} | |
| key: ${{ secrets.EC2_SSH_KEY }} | |
| envs: ECR_REPO_URI | |
| script: | | |
| set -e | |
| cd /home/${{ secrets.EC2_USER }}/app | |
| # ECR login (EC2에 AWS CLI 설치되어 있어야 함) | |
| aws ecr get-login-password --region ap-northeast-2 \ | |
| | docker login --username AWS --password-stdin ${{ secrets.ECR_REGISTRY }} | |
| export APP_IMAGE="${ECR_REPO_URI}:latest" | |
| docker pull "$APP_IMAGE" | |
| docker compose -f docker-compose.prod.yml up -d --pull always --force-recreate | |
| docker image prune -f | |
| env: | |
| ECR_REPO_URI: ${{ secrets.ECR_REPO_URI }} |