Skip to content

[infra] 다시배포 #54

[infra] 다시배포

[infra] 다시배포 #54

Workflow file for this run

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 }}