Skip to content

Deploy workflow on production environment #153

Deploy workflow on production environment

Deploy workflow on production environment #153

Workflow file for this run

name: Deploy workflow on production environment
on:
pull_request:
branches:
- main
types:
- closed
workflow_dispatch: # 수동 실행 가능
# 병합됐을 때
jobs:
Build:
runs-on: ubuntu-latest
steps:
# 체크아웃
- uses: actions/checkout@v4
# Gradle 권한 설정
- name: Grant execute permission for gradlew
run: chmod +x ./gradlew
# JDK 21 세팅
- name: Set up JDK 21
uses: actions/setup-java@v4
with:
java-version: 21
distribution: 'temurin'
# application.yml 운영 환경 용 생성
- name: Make application.yml
run: |
mkdir -p ./src/main/resources
chmod -R 777 ./src/main/resources
cd ./src/main/resources
touch ./application.yml
touch ./application-prod.yml
touch ./application-prod-secret.yml
echo "${{ secrets.PROD_COMMON }}" | base64 --decode > ./application.yml
echo "${{ secrets.PROD }}" | base64 --decode > ./application-prod.yml
echo "${{ secrets.PROD_SECRET }}" | base64 --decode > ./application-prod-secret.yml
# Gradle cache 설정
- name: Cache Gradle packages
uses: actions/cache@v4
with:
path: ~/.gradle/caches
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }}
restore-keys: ${{ runner.os }}-gradle
- name: S3에서 init.sql 다운로드
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_DEFAULT_REGION: ${{ secrets.AWS_REGION }}
run: |
mkdir -p docker
aws s3 cp s3://devcos4-team08-bucket/db/init.sql ./docker/init.sql
- name: Docker Compose 설치
run: |
sudo curl -L "https://github.com/docker/compose/releases/download/v2.17.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
- name: Docker Compose 실행
run: |
chmod -R 755 ./docker
docker-compose -f docker-compose.yml up -d
- name: 컨테이너 실행 대기
run: |
echo "Waiting for MySQL to be ready..."
for i in {1..10}; do
if docker-compose exec mysql mysqladmin ping -h "127.0.0.1" --silent; then
echo "MySQL is ready!"
break
fi
sleep 1
done
if ! docker-compose exec mysql mysqladmin ping -h "127.0.0.1" --silent; then
echo "MySQL did not start in time!"
exit 1
fi
echo "Waiting for PostgreSQL to be ready..."
for i in {1..10}; do
if docker-compose exec -T postgres pg_isready -d gis_db -U postgres; then
echo "PostgreSQL is ready!"
break
fi
sleep 2
done
if ! docker-compose exec -T postgres pg_isready -d gis_db -U postgres; then
echo "PostgreSQL did not start in time!"
docker-compose logs postgres
exit 1
fi
- name: Build and analyze
env:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
DB_URL: jdbc:mysql://localhost:3307/log4u
DB_USERNAME: dev
DB_PASSWORD: devcos4-team08
JWT_SECRET: ${{ secrets.JWT_SECRET }}
JWT_ACCESS_TOKEN_EXPIRE_TIME_SECONDS: ${{ secrets.JWT_ACCESS_TOKEN_EXPIRE_TIME_SECONDS }}
JWT_REFRESH_TOKEN_EXPIRE_TIME_SECONDS: ${{ secrets.JWT_ACCESS_TOKEN_EXPIRE_TIME_SECONDS }}
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_REGION: ${{ secrets.AWS_REGION }}
S3_BUCKET_NAME: ${{ secrets.S3_BUCKET_NAME }}
# 테스트용으로 dev 프로필 사용(시크릿 제외하고 prod 와 동일)
run: |
chmod +x ./gradlew
# 소나클라우드 임시 비활성화 ./gradlew build jacocoTestReport sonar --info -Pprofile=dev -Dsonar.branch.name=${{ github.ref_name }}
./gradlew build -i jacocoTestReport -Pprofile=dev
- name: Docker Compose 종료
run: docker-compose -f docker-compose.yml down
# AWS 인증 (IAM 사용자 Access Key, Secret Key 활용)
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ secrets.AWS_REGION }}
- name: Secret 파일 수동 생성(gitignore 무시)
run: |
mkdir -p ./src/main/resources
echo "${{ secrets.PROD_SECRET }}" | base64 --decode > ./src/main/resources/application-prod-secret.yml
mkdir -p ./deploy-package/src/main/resources
rsync -av --exclude='deploy-package' ./ ./deploy-package
cp ./src/main/resources/application-prod-secret.yml ./deploy-package/src/main/resources/application-prod-secret.yml
cp ./src/main/resources/application-prod.yml ./deploy-package/src/main/resources/application-prod.yml
- name: Docker Compose 및 Init.sql 파일 추가
run: |
mkdir -p ./deploy-package/docker
cp ./docker-compose.yml ./deploy-package/docker-compose.yml
cp ./docker/init.sql ./deploy-package/docker/init.sql
- name: 빌드 결과 수동 생성
run: |
mkdir -p ./deploy-package/build/libs
cp build/libs/Log4U-0.0.1-SNAPSHOT.jar ./deploy-package/build/libs/
- name: 배포 디렉토리 구조 출력
run: |
sudo apt-get update && sudo apt-get install -y tree
tree ./deploy-package
# 빌드 결과물을 S3 버킷에 업로드
- name: Upload to AWS S3
run: |
aws deploy push \
--application-name ${{ secrets.CODE_DEPLOY_APP_NAME }} \
--ignore-hidden-files \
--s3-location s3://${{ secrets.S3_BUCKET_NAME }}/prod/${{ github.sha }}.zip \
--source ./deploy-package
# S3 버킷에 있는 파일을 대상으로 CodeDeploy 실행
- name: Deploy to AWS EC2 from S3
run: |
aws deploy create-deployment \
--application-name ${{ secrets.CODE_DEPLOY_APP_NAME }} \
--deployment-config-name CodeDeployDefault.AllAtOnce \
--deployment-group-name ${{ secrets.CODE_DEPLOY_DEPLOYMENT_GROUP_NAME }} \
--s3-location bucket=${{ secrets.S3_BUCKET_NAME }},key=prod/${{ github.sha }}.zip,bundleType=zip
# 향후 빌드 파일 개선용 주석
# - name: 필요한 파일 수동 생성
# run: |
# mkdir -p ./deploy-package/src/main/resources
#
# # appspec.yml 복사
# cp ./appspec.yml ./deploy-package/
#
# # scripts 디렉토리 및 내부 .sh 파일 복사
# cp -r ./scripts/*.sh ./deploy-package/
#
# # yml 복사
# cp ./src/main/resources/application*.yml ./deploy-package/
#
# # jar 복사
# cp ./build/libs/Log4U-0.0.1-SNAPSHOT.jar ./deploy-package/