diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 804a84a9..07db760d 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -2,14 +2,14 @@ name: CI on: push: - branches: [ "develop" ] + branches: [ "main" ] env: PROJECT_NAME: CS-Quiz-BE BUCKET_NAME: cotato-ci-cd-bucket CODE_DEPLOY_APP_NAME: cotato-deploy DEPLOYMENT_GROUP_NAME: cotato-deploy-group - RESOURCE_PATH: ./src/main/resources/application.yml + RESOURCE_PATH: ./src/main/resources/application-prod.yml jobs: build: @@ -51,7 +51,7 @@ jobs: # [3] 프로젝트 빌드 - name: Build with Gradle Wrapper - run: ./gradlew build + run: ./gradlew prodJar # [4] Zip 파일 만들기 - name: Make Zip File diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..c314c84f --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,75 @@ +name: TEST-CI + +on: + push: + branches: [ "release" ] + +env: + PROJECT_NAME: COTATO-BE-TEST + BUCKET_NAME: cotato-ci-cd-bucket-test + CODE_DEPLOY_APP_NAME: cotato-deploy-test + DEPLOYMENT_GROUP_NAME: cotato-deploy-group-test + RESOURCE_PATH: ./src/main/resources/application-stage.yml + +jobs: + build: + runs-on: ubuntu-latest + + steps: + # [0] JDK 세팅 + - uses: actions/checkout@v3 + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'zulu' + + # [1] Set up Yaml File + - name: Set up Yaml File + uses: microsoft/variable-substitution@v1 + with: + files: ${{ env.RESOURCE_PATH }} + env: + spring.datasource.url: ${{ secrets.TEST_DB_PATH }} + spring.datasource.username: ${{ secrets.TEST_DB_USERNAME }} + spring.datasource.password: ${{ secrets.TEST_DB_PWD }} + spring.jpa.hibernate.ddl-auto: ${{ secrets.TEST_DDL_AUTO }} + spring.mail.username: ${{ secrets.SENDER_EMAIL }} + spring.mail.password: ${{ secrets.SENDER_PASSWORD }} + jwt.secretKey: ${{ secrets.JWT_SECRET_KEY}} + cloud.aws.s3.bucket: ${{ secrets.S3_BUCKET_NAME }} + cloud.aws.credentials.accessKey: ${{ secrets.S3_ACCESS_KEY }} + cloud.aws.credentials.secretKey: ${{ secrets.S3_ACCESS_PASSWORD }} + aes.secret.key: ${{ secrets.AES_SECRET_KEY }} + aes.secret.salt: ${{ secrets.AES_SECRET_SALT }} + + + # [2] 실행 권한 부여 + - name: Grant permission for gradlew + run: chmod +x ./gradlew + shell: bash + + # [3] 프로젝트 빌드 + - name: Build with Gradle Wrapper + run: ./gradlew stageJar + + # [4] Zip 파일 만들기 + - name: Make Zip File + run: zip -r $GITHUB_SHA.zip . + shell: bash + + # [5] AWS 키 설정 + - 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 }} + + # [6] 빌드한 jar파일 S3업로드 + - name: Upload to s3 + run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://${{ env.BUCKET_NAME }}/$GITHUB_SHA.zip + + # [7] CodeDeploy에 S3에서 파일 받고 배포 + - name: Code Deploy + run: aws deploy create-deployment --deployment-config-name CodeDeployDefault.AllAtOnce --application-name ${{ env.CODE_DEPLOY_APP_NAME }} --deployment-group-name ${{ env.DEPLOYMENT_GROUP_NAME }} --s3-location bucket=${{ env.BUCKET_NAME }},bundleType=zip,key=$GITHUB_SHA.zip diff --git a/build.gradle b/build.gradle index b7baea0a..29897875 100644 --- a/build.gradle +++ b/build.gradle @@ -53,3 +53,13 @@ tasks.named('test') { jar { enabled = false } + +task stageJar(type: Jar) { + archiveBaseName.set("${project.name}-stage") + from sourceSets.main.output +} + +task prodJar(type: Jar) { + archiveBaseName.set("${project.name}-prod") + from sourceSets.main.output +} diff --git a/scripts/deploy.sh b/scripts/deploy.sh index 5ec346ae..8b1fd8ef 100644 --- a/scripts/deploy.sh +++ b/scripts/deploy.sh @@ -1,11 +1,30 @@ #!/bin/bash +# 현재 브랜치 이름 가져오기 +CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD) + +# 기본 환경 변수 세팅 PROJECT_NAME="CS-Quiz-BE" -JAR_PATH="/home/ubuntu/backend/$PROJECT_NAME/build/libs/*.jar" -DEPLOY_PATH=/home/ubuntu/backend/$PROJECT_NAME/ -DEPLOY_LOG_PATH="/home/ubuntu/backend/$PROJECT_NAME/deploy_$(date +%Y%m%d).log" -DEPLOY_ERR_LOG_PATH="/home/ubuntu/backend/$PROJECT_NAME/deploy_err_$(date +%Y%m%d).log" -APPLICATION_LOG_PATH="/home/ubuntu/backend/$PROJECT_NAME/application_$(date +%Y%m%d).log" + +# 브랜치에 따른 설정 값 분리 +if [ "$CURRENT_BRANCH" == "main" ]; then + PROFILE="prod" + DIRECTORY="production" + PORT=8080 +elif [ "$CURRENT_BRANCH" == "release" ]; then + PROFILE="stage" + DIRECTORY="release" + PORT=8082 +else + echo "지원되지 않는 브랜치입니다: $CURRENT_BRANCH" >&2 + exit 1 +fi + +JAR_PATH="/home/ubuntu/backend/$PROJECT_NAME/build/libs/*$PROFILE.jar" +DEPLOY_PATH=/home/ubuntu/backend/$DIRECTORY/$PROJECT_NAME/ #jar 파일이 복사되고 실행될 경로 +DEPLOY_LOG_PATH="/home/ubuntu/backend/$DIRECTORY/log/deploy/$PROJECT_NAME/deploy_$(date +%Y%m%d).log" +DEPLOY_ERR_LOG_PATH="/home/ubuntu/backend/$DIRECTORY/log/deploy/$PROJECT_NAME/deploy_err_$(date +%Y%m%d).log" +APPLICATION_LOG_PATH="/home/ubuntu/backend/$DIRECTORY/log/$PROJECT_NAME/application_$(date +%Y%m%d).log" BUILD_JAR=$(ls $JAR_PATH) JAR_NAME=$(basename $BUILD_JAR) @@ -32,7 +51,7 @@ fi DEPLOY_JAR=$DEPLOY_PATH$JAR_NAME echo "> DEPLOY_JAR 배포" >> $DEPLOY_LOG_PATH -nohup java -jar -Dspring.profiles.active=local $DEPLOY_JAR --server.port=8080 >> $APPLICATION_LOG_PATH 2> $DEPLOY_ERR_LOG_PATH & +nohup java -jar -Dspring.profiles.active=$PROFILE $DEPLOY_JAR --server.port=$PORT >> $APPLICATION_LOG_PATH 2> $DEPLOY_ERR_LOG_PATH & sleep 3 echo "> 배포 종료 : $(date +%c)" >> $DEPLOY_LOG_PATH diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml new file mode 100644 index 00000000..aca58c92 --- /dev/null +++ b/src/main/resources/application-local.yml @@ -0,0 +1,23 @@ +# dev-local + +server: + port: 8080 + +spring: + + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://${DB_PATH} + username: ${DB_USERNAME} + password: ${DB_PWD} + + jpa: + hibernate: + ddl-auto: update + properties: + hibernate: + format_sql: true + +springdoc: + swagger-ui: + enabled: true diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml new file mode 100644 index 00000000..a544164f --- /dev/null +++ b/src/main/resources/application-prod.yml @@ -0,0 +1,19 @@ +server: + port: 8080 + +spring: + jpa: + hibernate: + ddl-auto: ${DDL_AUTO} + show_sql: true + + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://${DB_PATH} + username: ${DB_USERNAME} + password: ${DB_PWD} + + +springdoc: + swagger-ui: + enabled: false \ No newline at end of file diff --git a/src/main/resources/application-stage.yml b/src/main/resources/application-stage.yml new file mode 100644 index 00000000..8d1d48c1 --- /dev/null +++ b/src/main/resources/application-stage.yml @@ -0,0 +1,24 @@ +# test - server + +server: + port: 8082 + +spring: + jpa: + hibernate: + ddl-auto: ${TEST_DDL_AUTO} + show_sql: true + properties: + hibernate: + format_sql: true + + + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://${TEST_DB_PATH} + username: ${TEST_DB_USERNAME} + password: ${TEST_DB_PWD} + +springdoc: + swagger-ui: + enabled: true \ No newline at end of file diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 062d6619..a747069e 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,17 +1,8 @@ spring: - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://${DB_PATH}/cotato - username: ${DB_USERNAME} - password: ${DB_PWD} + profiles: + active: local - jpa: - hibernate: - ddl-auto: ${DDL_AUTO} - properties: - hibernate: - format_sql: true - show_sql: true +# 로컬, 개발, 운영 환경의 공통된 설정 data: redis: @@ -62,7 +53,6 @@ cloud: springdoc: show-login-endpoint: true - server: servlet: session: