Merge pull request #49 from mju-facilty-organization/dev #68
This file contains 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
# 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 |