Skip to content

Build, Push, and Deploy Docker Image to EC2 #192

Build, Push, and Deploy Docker Image to EC2

Build, Push, and Deploy Docker Image to EC2 #192

Workflow file for this run

name: Build, Push, and Deploy Docker Image to EC2
on:
workflow_run:
workflows: ["Kotlin Lint Check"] # lint.yml이 끝난 후 실행
types:
- completed
jobs:
build:
if: ${{ github.event.workflow_run.conclusion == 'success' &&
(github.ref == 'refs/heads/main' || github.ref == 'refs/heads/develop') }}
runs-on: ubuntu-latest
steps:
# 1. 코드 체크아웃
- name: Checkout code
uses: actions/checkout@v3
- name: Install Docker Compose
run: |
sudo apt-get update
sudo apt-get install -y docker-compose
# # 2. Docker Compose로 DB 시작
# - name: Start Database with Docker Compose
# run: |
# docker-compose up -d mysql
# working-directory: .
# 2. Gradle 빌드
- name: Build project
run: |
SPRING_PROFILES_ACTIVE=prod ./gradlew build
# 3. 빌드 결과 확인
- name: Verify build artifacts
run: ls -R build/libs
# 4. Docker 빌드 컨텍스트 준비
- name: Prepare Docker context
run: cp build/libs/*.jar .
# 5. AWS 자격 증명 설정
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v3
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-2
# 6. AWS ECR 로그인
- name: Log in to Amazon ECR
uses: aws-actions/amazon-ecr-login@v1
# 7. 도커 이미지 빌드
- name: Build Docker image
run: docker build -t memowithtags-backend:latest .
# 8. 도커 이미지를 ECR로 푸시
- name: Push Docker image to ECR
run: |
REPOSITORY_URI=739275468912.dkr.ecr.ap-northeast-2.amazonaws.com/memo-with-tags
TAG=$(echo $GITHUB_SHA | cut -c1-7) # 커밋 해시 앞 7자리로 태그 생성
echo "Pushing Docker image with TAG: $TAG"
docker tag memowithtags-backend:latest $REPOSITORY_URI:$TAG
docker push $REPOSITORY_URI:$TAG
# 9. Docker 이미지 실행 파일을 EC2로 전달
- name: Send Deploy File to EC2
run: |
# 1. SSH 개인 키 준비
echo "${{ secrets.EC2_SSH_PRIVATE_KEY }}" > private_key.pem
chmod 600 private_key.pem
# 2. 배포 스크립트 작성
echo "#!/bin/bash
REPOSITORY_URI=739275468912.dkr.ecr.ap-northeast-2.amazonaws.com/memo-with-tags
TAG=\$(echo $GITHUB_SHA | cut -c1-7)
echo \"Deploying Docker image with TAG: \$TAG\"
echo \"Deploying Docker image with REPOSITORY_URI: \$REPOSITORY_URI\"
aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin \$REPOSITORY_URI
echo \"Container exists: $(docker ps -aq -f name=memowithtags-backend)\"
docker stop memowithtags-backend || true
docker rm memowithtags-backend || true
docker pull \$REPOSITORY_URI:\$TAG
docker run -d \
-p 8080:8080 \
--env-file /home/ubuntu/.env \
--name memowithtags-backend \
\$REPOSITORY_URI:\$TAG" > deploy.sh
# 3. .env 파일 생성
echo "SPRING_PROFILES_ACTIVE=prod
DB_NAME=memowithtags_db
DB_ENDPOINT=${{ secrets.DB_ENDPOINT }}
DB_USERNAME=${{ secrets.DB_USERNAME }}
DB_PASSWORD=${{ secrets.DB_PASSWORD }}
MAIL_USERNAME=${{ secrets.MAIL_USERNAME }}
MAIL_PASSWORD=${{ secrets.MAIL_PASSWORD }}
KAKAO_CLIENT_ID=${{ secrets.KAKAO_CLIENT_ID }}
KAKAO_REDIRECT_URL=${{ secrets.KAKAO_REDIRECT_URL }}
NAVER_CLIENT_ID=${{ secrets.NAVER_CLIENT_ID }}
NAVER_CLIENT_SECRET=${{ secrets.NAVER_CLIENT_SECRET }}
GOOGLE_CLIENT_ID=${{ secrets.GOOGLE_CLIENT_ID }}
GOOGLE_CLIENT_SECRET=${{ secrets.GOOGLE_CLIENT_SECRET }}
GOOGLE_REDIRECT_URI=${{ secrets.GOOGLE_REDIRECT_URI }}" > .env
# 배포 스크립트 EC2로 전송
scp -i private_key.pem -o StrictHostKeyChecking=no deploy.sh .env ubuntu@${{ secrets.EC2_PUBLIC_IP }}:/home/ubuntu/
# 10. EC2에서 도커 실행
- name: Deploy to EC2
run: |
# EC2에서 스크립트 실행
ssh -i private_key.pem -o StrictHostKeyChecking=no ubuntu@${{ secrets.EC2_PUBLIC_IP }} "bash /home/ubuntu/deploy.sh"
# - name: Stop Database
# run: |
# docker-compose down
# working-directory: .