Merge pull request #9 from YAPP-Github/ci/terraform #1
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 DEV & COMMON Infra, Service | ||
| on: | ||
| push: | ||
| branches: [ develop ] | ||
| paths: | ||
| - 'terraform/common/**' | ||
| - 'terraform/dev/**' | ||
| - '.github/workflows/deploy-dev.yml' | ||
| workflow_dispatch: | ||
| permissions: | ||
| contents: read | ||
| env: | ||
| AWS_REGION: ap-northeast-2 | ||
| jobs: | ||
| terraform-apply-common: | ||
| name: Terraform Apply COMMON | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - uses: hashicorp/setup-terraform@v3 | ||
| - name: Terraform Init (common) | ||
| run: terraform init | ||
| working-directory: ./terraform/common | ||
| - name: Terraform Apply COMMON | ||
| env: | ||
| AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} | ||
| AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} | ||
| run: terraform apply -auto-approve | ||
| working-directory: ./terraform/common | ||
| terraform-apply-dev: | ||
| name: Terraform Apply dev | ||
| runs-on: ubuntu-latest | ||
| needs: terraform-apply-common | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - uses: hashicorp/setup-terraform@v3 | ||
| - name: Terraform Init (dev) | ||
| run: terraform init | ||
| working-directory: ./terraform/dev | ||
| - name: Terraform Apply dev | ||
| env: | ||
| AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} | ||
| AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} | ||
| run: terraform apply -auto-approve | ||
| working-directory: ./terraform/dev | ||
| check-aws-resources: | ||
| runs-on: ubuntu-latest | ||
| needs: terraform-apply-dev | ||
| steps: | ||
| - 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: ${{ env.AWS_REGION }} | ||
| - name: Get AWS Resource Names (dev) | ||
| id: get-aws-names | ||
| run: | | ||
| CLUSTER=$(aws ecs list-clusters --region $AWS_REGION --query "clusterArns[]" --output text | tr '\t' '\n' | grep 'dev' | head -n 1 | awk -F'/' '{print $2}') | ||
| if [ -z "$CLUSTER" ]; then | ||
| echo "Error: No ECS cluster name containing 'dev' found." >&2 | ||
| exit 1 | ||
| fi | ||
| echo "ECS_CLUSTER=$CLUSTER" >> $GITHUB_ENV | ||
| SERVICE=$(aws ecs list-services --cluster $CLUSTER --region $AWS_REGION --query "serviceArns[]" --output text | tr '\t' '\n' | grep 'dev' | head -n 1 | awk -F'/' '{print $2}') | ||
| if [ -z "$SERVICE" ]; then | ||
| echo "Error: No ECS service name containing 'dev' found." >&2 | ||
| exit 1 | ||
| fi | ||
| echo "ECS_SERVICE=$SERVICE" >> $GITHUB_ENV | ||
| TASK_DEF_ARN=$(aws ecs describe-services --cluster $CLUSTER --services $SERVICE --region $AWS_REGION --query "services[0].taskDefinition" --output text) | ||
| if [ -z "$TASK_DEF_ARN" ]; then | ||
| echo "Error: No ECS task definition ARN found." >&2 | ||
| exit 1 | ||
| fi | ||
| TASK_DEF_NAME=$(basename "$TASK_DEF_ARN" | cut -d':' -f1) | ||
| echo "ECS_TASK_DEFINITION=$TASK_DEF_NAME" >> $GITHUB_ENV | ||
| CONTAINER_NAME=$(aws ecs describe-task-definition --task-definition $TASK_DEF_ARN --region $AWS_REGION --query "taskDefinition.containerDefinitions[].name" --output text | tr '\t' '\n' | grep 'dev' | head -n 1) | ||
| if [ -z "$CONTAINER_NAME" ]; then | ||
| CONTAINER_NAME=$(aws ecs describe-task-definition --task-definition $TASK_DEF_ARN --region $AWS_REGION --query "taskDefinition.containerDefinitions[0].name" --output text) | ||
| fi | ||
| if [ -z "$CONTAINER_NAME" ]; then | ||
| echo "Error: No ECS container name found." >&2 | ||
| exit 1 | ||
| fi | ||
| echo "CONTAINER_NAME=$CONTAINER_NAME" >> $GITHUB_ENV | ||
| REPO=$(aws ecr describe-repositories --region $AWS_REGION --query "repositories[].repositoryName" --output text | tr '\t' '\n' | grep 'dev' | head -n 1) | ||
| if [ -z "$REPO" ]; then | ||
| REPO=$(aws ecr describe-repositories --region $AWS_REGION --query "repositories[0].repositoryName" --output text) | ||
| fi | ||
| if [ -z "$REPO" ]; then | ||
| echo "Error: No ECR repository found." >&2 | ||
| exit 1 | ||
| fi | ||
| echo "ECR_REPOSITORY=$REPO" >> $GITHUB_ENV | ||
| deploy-service: | ||
| name: Deploy to Amazon ECS | ||
| runs-on: ubuntu-latest | ||
| environment: develop | ||
| needs: check-aws-resources | ||
| env: | ||
| ECR_REPOSITORY: ${{ env.ECR_REPOSITORY }} | ||
|
Check failure on line 114 in .github/workflows/deploy-dev.yml
|
||
| ECS_CLUSTER: ${{ env.ECS_CLUSTER }} | ||
| ECS_SERVICE: ${{ env.ECS_SERVICE }} | ||
| ECS_TASK_DEFINITION: ${{ env.ECS_TASK_DEFINITION }} | ||
| CONTAINER_NAME: ${{ env.CONTAINER_NAME }} | ||
| steps: | ||
| - 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: ${{ env.AWS_REGION }} | ||
| - name: Set up Node.js | ||
| uses: actions/setup-node@v4 | ||
| with: | ||
| node-version: '22' | ||
| - name: Prepare semantic-release config (release all types) | ||
| run: | | ||
| cat <<EOF > release.config.js | ||
| module.exports = { | ||
| branches: ['develop'], | ||
| plugins: [ | ||
| [ | ||
| '@semantic-release/commit-analyzer', | ||
| { | ||
| preset: 'conventionalcommits', | ||
| releaseRules: [ | ||
| { type: 'feat', release: 'minor' }, | ||
| { type: 'fix', release: 'patch' }, | ||
| { type: 'perf', release: 'patch' }, | ||
| { type: 'refactor', release: 'patch' }, | ||
| { type: 'test', release: 'patch' }, | ||
| { type: 'chore', release: 'patch' }, | ||
| { type: 'ci', release: 'patch' }, | ||
| { type: 'revert', release: 'patch' } | ||
| ] | ||
| } | ||
| ], | ||
| [ | ||
| '@semantic-release/release-notes-generator', | ||
| { preset: 'conventionalcommits' } | ||
| ] | ||
| ] | ||
| }; | ||
| EOF | ||
| - name: Semantic Release | ||
| run: | | ||
| OUTPUT=$(npx semantic-release --no-ci) | ||
| echo "$OUTPUT" | ||
| VERSION=$(echo "$OUTPUT" | grep -oP 'Published release \K[0-9.]+') | ||
| if [ ! -z "$VERSION" ]; then | ||
| echo "SEMANTIC_VERSION=$VERSION" >> $GITHUB_ENV | ||
| else | ||
| echo "Error: SEMANTIC_VERSION not extracted" && exit 1 | ||
| fi | ||
| env: | ||
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||
| - name: Set up JDK 21 | ||
| uses: actions/setup-java@v4 | ||
| with: | ||
| distribution: 'temurin' | ||
| java-version: 21 | ||
| java-package: jdk | ||
| architecture: 'x64' | ||
| cache: 'gradle' | ||
| - name: Build with Gradle | ||
| run: | | ||
| cd ${{ github.workspace }} | ||
| chmod +x gradlew | ||
| ./gradlew clean build | ||
| - name: Login to Amazon ECR | ||
| id: login-ecr | ||
| uses: aws-actions/amazon-ecr-login@v2 | ||
| with: | ||
| mask-password: 'true' | ||
| - name: Build, tag, and push image to Amazon ECR | ||
| env: | ||
| ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} | ||
| run: | | ||
| docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$SEMANTIC_VERSION . | ||
| docker tag $ECR_REGISTRY/$ECR_REPOSITORY:$SEMANTIC_VERSION $ECR_REGISTRY/$ECR_REPOSITORY:latest | ||
| docker push $ECR_REGISTRY/$ECR_REPOSITORY:$SEMANTIC_VERSION | ||
| docker push $ECR_REGISTRY/$ECR_REPOSITORY:latest | ||
| echo "image=$ECR_REGISTRY/$ECR_REPOSITORY:$SEMANTIC_VERSION" >> $GITHUB_ENV | ||
| - name: Get latest ECS task definition | ||
| id: get-latest-task-def | ||
| run: | | ||
| TASK_DEF=$(aws ecs describe-services --cluster ${ECS_CLUSTER} --services ${ECS_SERVICE} --region ${AWS_REGION} --query "services[0].taskDefinition" --output text) | ||
| aws ecs describe-task-definition --task-definition $TASK_DEF --region ${AWS_REGION} --query "taskDefinition" --output json > task-definition.json | ||
| - name: Fill in the new image ID in the Amazon ECS task definition | ||
| id: task-def | ||
| uses: aws-actions/amazon-ecs-render-task-definition@v1 | ||
| with: | ||
| task-definition: task-definition.json | ||
| container-name: ${{ env.CONTAINER_NAME }} | ||
| image: ${{ env.image }} | ||
| - name: Deploy Amazon ECS task definition | ||
| uses: aws-actions/amazon-ecs-deploy-task-definition@v1 | ||
| with: | ||
| task-definition: ${{ steps.task-def.outputs.task-definition }} | ||
| service: ${{ env.ECS_SERVICE }} | ||
| cluster: ${{ env.ECS_CLUSTER }} | ||
| wait-for-service-stability: true | ||
| - name: Discord Notify (Success) | ||
| if: success() | ||
| run: | | ||
| curl -H "Content-Type: application/json" \ | ||
| -X POST \ | ||
| -d "{\"content\": \"✅ (개발 서버) 새로운 버전이 배포 되었어요!\n레포: ${GITHUB_REPOSITORY}\n브랜치: ${GITHUB_REF}\n버전: ${SEMANTIC_VERSION}\"}" \ | ||
| ${{ secrets.DISCORD_WEBHOOK_URL }} | ||
| - name: Discord Notify (Failure) | ||
| if: failure() | ||
| run: | | ||
| curl -H "Content-Type: application/json" \ | ||
| -X POST \ | ||
| -d "{\"content\": \"❌ (개발 서버) 배포 실패!\n레포: ${GITHUB_REPOSITORY}\n브랜치: ${GITHUB_REF}\n버전: ${SEMANTIC_VERSION}\"}" \ | ||
| ${{ secrets.DISCORD_WEBHOOK_URL }} | ||