[infra] 다시배포 #54
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 to Production | |
| on: | |
| push: | |
| branches: | |
| - main | |
| env: | |
| AWS_REGION: ap-northeast-2 | |
| S3_BUCKET: moviezip-s3-source | |
| CODEDEPLOY_APP_NAME: moviezip-deploy | |
| CODEDEPLOY_DEPLOYMENT_GROUP: moviezip-deploy-group | |
| jobs: | |
| deploy: | |
| runs-on: ubuntu-latest | |
| steps: | |
| # 1. 코드 체크아웃 | |
| - name: Checkout source code | |
| uses: actions/checkout@v4 | |
| # 2. JDK 17 설치 | |
| - name: Set up JDK 17 | |
| uses: actions/setup-java@v3 | |
| with: | |
| java-version: '17' | |
| distribution: 'temurin' | |
| # 3. Maven 캐시 | |
| - name: Cache Maven packages | |
| uses: actions/cache@v3 | |
| with: | |
| path: ~/.m2/repository | |
| key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} | |
| restore-keys: | | |
| ${{ runner.os }}-maven- | |
| # 4. resources 폴더 생성 및 application-prod.yml 작성 | |
| - name: Create src/main/resources and write application-prod.yml | |
| shell: bash | |
| env: | |
| APPLICATION: ${{ secrets.APPLICATION_PROD }} # 나머지 설정 내용 | |
| DB_URL: ${{ secrets.DB_URL }} | |
| DB_USERNAME: ${{ secrets.DB_USERNAME }} | |
| DB_PASSWORD: ${{ secrets.DB_PASSWORD }} | |
| REDIS_HOST: ${{ secrets.REDIS_HOST }} # 도커 컴포즈의 redis 서비스 이름: redis | |
| REDIS_PORT: ${{ secrets.REDIS_PORT }} | |
| MONGODB_URI: ${{ secrets.MONGODB_URI }} # 도커 컴포즈의 mongo 서비스 이름: mongodb://mongo:27017/dbname | |
| JWT_SECRET: ${{ secrets.JWT_SECRET }} | |
| run: | | |
| cd demo | |
| mkdir -p src/main/resources | |
| # 기존 APPLICATION 내용을 먼저 쓰고, 환경 변수를 뒤에 추가하거나 치환 | |
| printf '%s\n' "$APPLICATION" \ | |
| | sed "s|\${DB_URL}|$DB_URL|" \ | |
| | sed "s|\${DB_USERNAME}|$DB_USERNAME|" \ | |
| | sed "s|\${DB_PASSWORD}|$DB_PASSWORD|" \ | |
| | sed "s|\${REDIS_HOST}|$REDIS_HOST|" \ | |
| | sed "s|\${REDIS_PORT}|$REDIS_PORT|" \ | |
| | sed "s|\${MONGODB_URI}|$MONGODB_URI|" \ | |
| | sed "s|\${JWT_SECRET}|$JWT_SECRET|" \ | |
| > src/main/resources/application-prod.yml | |
| echo "== application-prod.yml created and values inserted ==" | |
| # 5. Maven 빌드 | |
| - name: Build with Maven | |
| run: | | |
| cd demo | |
| mvn clean package -DskipTests | |
| # 6. zip 파일 생성 | |
| - name: Make zip file | |
| run: | | |
| # deploy 디렉토리 생성 | |
| mkdir -p deploy | |
| # 파일 복사 | |
| cp docker-compose-blue.yml deploy/ || true | |
| cp docker-compose-green.yml deploy/ || true | |
| cp appspec.yml deploy/ || true | |
| cp Dockerfile deploy/ || true | |
| cp scripts/*.sh deploy/ || true | |
| cp deploy.sh deploy/ || true | |
| # Maven 산출물 복사 | |
| if [ -d "demo/target" ]; then | |
| cp demo/target/*.jar deploy/ || (echo "No jar found in demo/target" && exit 1) | |
| else | |
| echo "demo/target not found; did build step run?" && exit 1 | |
| fi | |
| # 실행 권한 부여 | |
| chmod -R a+x deploy/*.sh || true | |
| # 생성된 deploy 내용 확인 (디버그용) | |
| ls -la deploy | |
| ls -la deploy/*.sh | |
| ls -la deploy/*.jar | |
| # zip 생성 (경로 제거) | |
| zip -r -qq -j spring-build.zip deploy | |
| echo "== spring-build.zip created ==" | |
| ls -la spring-build.zip | |
| # 7. AWS 자격증명 설정 | |
| - name: Configure AWS credentials | |
| uses: aws-actions/configure-aws-credentials@v2 | |
| with: | |
| aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} | |
| aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} | |
| aws-region: ${{ env.AWS_REGION }} | |
| # 8. S3 업로드 | |
| - name: Upload to S3 | |
| id: s3_upload | |
| run: | | |
| aws s3 cp ./spring-build.zip s3://${S3_BUCKET}/spring-build-${{ github.run_id }}.zip --region ${AWS_REGION} | |
| echo "s3_key=spring-build-${{ github.run_id }}.zip" >> $GITHUB_OUTPUT | |
| # 9. CodeDeploy 배포 (AWS CLI 방식) | |
| - name: Deploy via CodeDeploy | |
| run: | | |
| aws deploy create-deployment \ | |
| --application-name ${{ env.CODEDEPLOY_APP_NAME }} \ | |
| --deployment-config-name CodeDeployDefault.OneAtATime \ | |
| --deployment-group-name ${{ env.CODEDEPLOY_DEPLOYMENT_GROUP }} \ | |
| --s3-location bucket=${{ env.S3_BUCKET }},bundleType=zip,key=${{ steps.s3_upload.outputs.s3_key }} \ | |
| --region ${{ env.AWS_REGION }} |