Skip to content

Merge pull request #9 from YAPP-Github/ci/terraform #1

Merge pull request #9 from YAPP-Github/ci/terraform

Merge pull request #9 from YAPP-Github/ci/terraform #1

Workflow file for this run

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

View workflow run for this annotation

GitHub Actions / Deploy DEV & COMMON Infra, Service

Invalid workflow file

The workflow is not valid. .github/workflows/deploy-dev.yml (Line: 114, Col: 23): Unrecognized named-value: 'env'. Located at position 1 within expression: env.ECR_REPOSITORY .github/workflows/deploy-dev.yml (Line: 115, Col: 20): Unrecognized named-value: 'env'. Located at position 1 within expression: env.ECS_CLUSTER
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 }}