Skip to content

Merge pull request #49 from mju-facilty-organization/dev #68

Merge pull request #49 from mju-facilty-organization/dev

Merge pull request #49 from mju-facilty-organization/dev #68

Workflow file for this run

# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-gradle
name: CI/CD Pipeline
on:
push:
branches:
- main
workflow_dispatch:
jobs:
build-docker-image:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- name: make application.yml
run: |
cd ./src/main/resources
touch ./application.yml
echo "${{ secrets.APPLICATION_YML }}" > ./application.yml
shell: bash
# 환경별 yml 파일 생성 - dev
- name: make application-prod.yml
run: |
cd ./src/main/resources
touch ./application-dev.yml
echo "${{ secrets.APPLICATION_PROD }}" > ./application-prod.yml
shell: bash
- name: Gradle Caching
uses: actions/cache@v3
with:
path: |
~/.gradle/caches
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
# 2. Spring Boot 애플리케이션 빌드
- name: Build with Gradle
run: ./gradlew clean bootJar
- name: Build Docker Image
run: |
docker build -t my-application:latest .
# 4. aws 자격 설정
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-2
# ecr에 로그인
- name: Login to Amazon ECR
id: ecr-login
uses: aws-actions/amazon-ecr-login@v2
- name: Delete previous image in Amazon ECR Public
run: |
aws ecr-public batch-delete-image \
--repository-name dding-gi/repo \
--image-ids imageTag=latest \
--region ap-northeast-2 || echo "No existing image with tag latest found."
- name: Build, tag, and push image to ECR
env:
ECR_REGISTRY: ${{ steps.ecr-login.outputs.registry }}
ECR_REPOSITORY: dding-gi/repo
IMAGE_TAG: ${{ github.sha }}
run: |
docker tag my-application:latest $ECR_REGISTRY/$ECR_REPOSITORY:latest
docker push $ECR_REGISTRY/$ECR_REPOSITORY:latest
- name: Logout from Amazon ECR
run: docker logout ${{ steps.ecr-login.outputs.registry }}
# 위 과정에서 푸시한 이미지를 ec2에서 풀받아서 실행시키는 과정
run-docker-image-on-ec2:
# build-docker-image (위)과정이 완료되어야 실행됩니다.
needs: build-docker-image
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-2
- name: Login to Amazon ECR
id: ecr-login
uses: aws-actions/amazon-ecr-login@v2
- name: SSH into EC2 and Deploy with Docker Compose
run: |
echo "${{ secrets.EC2_SSH_KEY }}" > ec2_key.pem
chmod 600 ec2_key.pem
ssh -o StrictHostKeyChecking=no -i ec2_key.pem ubuntu@${{ secrets.SERVER_IP }} << 'EOF'
sudo usermod -aG docker $USER || true
newgrp docker || true
# Stop existing containers
if [ -f docker-compose.yml ]; then
echo "Stopping existing containers..."
sudo docker-compose down
else
echo "No existing Docker Compose setup. Proceeding with deployment..."
fi
# Clean up previous files
sudo rm -f docker-compose.yml
EOF
- name: Install Docker if not present
uses: appleboy/[email protected]
with:
host: ${{ secrets.SERVER_IP }}
username: ubuntu
key: ${{ secrets.EC2_SSH_KEY }}
script: |
# Update package index
sudo apt-get update -y
# Install Docker if not installed
if ! command -v docker >/dev/null 2>&1; then
echo "Installing Docker..."
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo systemctl enable docker
sudo systemctl start docker
else
echo "Docker is already installed."
fi
if ! command -v docker-compose >/dev/null 2>&1; then
echo "Installing Docker Compose..."
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
else
echo "Docker Compose already installed."
fi
- name: Copy docker-compose.yml to EC2
run: |
echo "${{ secrets.EC2_SSH_KEY }}" > ec2_key.pem
chmod 600 ec2_key.pem
scp -o StrictHostKeyChecking=no -i ec2_key.pem ./docker-compose.yml ubuntu@${{ secrets.SERVER_IP }}:~/docker-compose.yml
- name: Create and Copy .env to EC2
run: |
echo "SERVER_IMAGE_URL=${{ steps.ecr-login.outputs.registry }}/dding-gi/repo:latest" > .env
echo "${{ secrets.EC2_SSH_KEY }}" > ec2_key.pem
chmod 600 ec2_key.pem
scp -o StrictHostKeyChecking=no -i ec2_key.pem ./.env ubuntu@${{ secrets.SERVER_IP }}:~/.env
- name: Install AWS CLI if not present
run: |
echo "${{ secrets.EC2_SSH_KEY }}" > ec2_key.pem
chmod 600 ec2_key.pem
# Update package index
sudo apt-get update -y
# Install unzip if not present
if ! command -v unzip >/dev/null 2>&1; then
echo "Installing unzip..."
sudo apt-get install -y unzip
fi
# Install AWS CLI if not installed
if ! command -v aws >/dev/null 2>&1; then
echo "Installing AWS CLI..."
sudo curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
sudo unzip awscliv2.zip
sudo ./aws/install
else
echo "AWS CLI is already installed."
fi
- name: Start services using Docker Compose
run: |
echo "${{ secrets.EC2_SSH_KEY }}" > ec2_key.pem
chmod 600 ec2_key.pem
ssh -o StrictHostKeyChecking=no -i ec2_key.pem ubuntu@${{ secrets.SERVER_IP }} << 'EOF'
cd /home/ubuntu
docker login -u AWS -p $(aws ecr get-login-password --region ap-northeast-2) ${{ steps.ecr-login.outputs.registry }}
docker-compose -f docker-compose.yml pull
docker-compose -f docker-compose.yml up -d
EOF
- name: Cleanup SSH Key
run: rm -f ec2_key.pem