Skip to content

Deploy to AWS EC2

Deploy to AWS EC2 #18

name: Deploy to AWS EC2
on:
workflow_dispatch: # ✅ 수동 실행 트리거
env:
AWS_REGION: ${{ secrets.AWS_REGION }}
AWS_ACCOUNT_ID: ${{ secrets.AWS_ACCOUNT_ID }}
ECR_REPOSITORY: ${{ secrets.ECR_REPOSITORY }}
IMAGE_TAG: ${{ github.sha }}
CONTAINER_NAME: spring-app
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v3
- name: Set up AWS CLI
uses: aws-actions/configure-aws-credentials@v2
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ secrets.AWS_REGION }}
- name: Login to Amazon ECR
run: |
aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com
- name: Generate application-secret.yml
run: |
cat <<EOF > ./src/main/resources/application-secret.yml
spring:
datasource:
hikari:
jdbc-url: ${{ secrets.DB_JDBC_URL }}
driver-class-name: com.mysql.cj.jdbc.Driver
username: ${{ secrets.DB_USERNAME }}
password: ${{ secrets.DB_PASSWORD }}
EOF
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'adopt'
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: build with gradle
run: ./gradlew clean build -x test
- name: Build & Push Docker Image
run: |
docker build --build-arg PROFILE=dev -t $ECR_REPOSITORY:$IMAGE_TAG .
docker tag $ECR_REPOSITORY:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$ECR_REPOSITORY:$IMAGE_TAG
docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$ECR_REPOSITORY:$IMAGE_TAG
# 환경 변수 설정
- name: Set Environment Variables
run: |
if [ "${{ inputs.env }}" == 'dev' ]; then
echo "springProfile=dev" >> $GITHUB_ENV
echo "serverHost=${{ vars.DEV_SERVER_HOST }}" >> $GITHUB_ENV
echo "awsAccessKeyId=${{ secrets.DEV_SERVER_AWS_ACCESS_KEY_ID }}" >> $GITHUB_ENV
echo "awsSecretAccessKey=${{ secrets.DEV_SERVER_AWS_SECRET_ACCESS_KEY }}" >> $GITHUB_ENV
else
echo "springProfile=prod" >> $GITHUB_ENV
echo "serverHost=${{ vars.PROD_SERVER_HOST }}" >> $GITHUB_ENV
echo "awsAccessKeyId=${{ secrets.PROD_SERVER_AWS_ACCESS_KEY_ID }}" >> $GITHUB_ENV
echo "awsSecretAccessKey=${{ secrets.PROD_SERVER_AWS_SECRET_ACCESS_KEY }}" >> $GITHUB_ENV
fi
# 서버에 SSH로 접속하고 배포 진행
- name: SSH and deploy
uses: appleboy/ssh-action@master
with:
host: ${{ env.serverHost }}
username: ${{ secrets.GH_ACTIONS_USERNAME }}
key: ${{ secrets.GH_ACTIONS_KEY }}
passphrase: ${{ secrets.GH_ACTIONS_PASSPHRASE }}
port: ${{ vars.SSH_PORT }}
script: |
# ECR에 로그인
aws ecr get-login-password --region ${{ secrets.AWS_REGION }} | docker login --username AWS --password-stdin ${{ secrets.AWS_ACCOUNT_ID }}.dkr.ecr.${{ secrets.AWS_REGION }}.amazonaws.com
# Docker 이미지 풀
docker pull ${{ secrets.AWS_ACCOUNT_ID }}.dkr.ecr.${{ secrets.AWS_REGION }}.amazonaws.com/${{ secrets.ECR_REPOSITORY }}:${{ inputs.imageTag }}
# 기존 컨테이너 중지 및 제거
docker stop api-server || true
docker rm api-server || true
# 새로운 컨테이너 실행
docker run -d --name api-server -p 8080:8080 \
-e SPRING_PROFILES_ACTIVE=${{ env.springProfile }} \
-e AWS_ACCESS_KEY_ID=${{ env.awsAccessKeyId }} \
-e AWS_SECRET_ACCESS_KEY=${{ env.awsSecretAccessKey }} \
${{ secrets.AWS_ACCOUNT_ID }}.dkr.ecr.${{ secrets.AWS_REGION }}.amazonaws.com/${{ secrets.ECR_REPOSITORY }}:${{ inputs.imageTag }}
# 불필요한 Docker 이미지 제거
docker image prune -f
# - name: Deploy to EC2
# uses: appleboy/[email protected]
# with:
# host: ${{ secrets.EC2_HOST }}
# username: ${{ secrets.EC2_USER }}
# key: ${{ secrets.EC2_SSH_PRIVATE_KEY }}
# script: |
# # 환경변수 설정
# export AWS_ACCOUNT_ID="${{ secrets.AWS_ACCOUNT_ID }}"
# export AWS_REGION="${{ secrets.AWS_REGION }}"
# export ECR_REPOSITORY="${{ secrets.ECR_REPOSITORY }}"
# export IMAGE_TAG="${{ github.sha }}"
# export CONTAINER_NAME="spring-app"
# # 나머지 배포 명령어들
# echo "${{ secrets.APP_SECRET_YML }}" | base64 --decode > /home/ec2-user/application-secret.yml
# chmod 600 /home/ec2-user/application-secret.yml
# # Docker 로그인 및 이미지 풀
# aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com
# docker pull $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$ECR_REPOSITORY:$IMAGE_TAG
# # 기존 컨테이너 중지 및 삭제
# docker stop $CONTAINER_NAME || true
# docker rm $CONTAINER_NAME || true
# # 새로운 컨테이너 실행
# docker run -d --name $CONTAINER_NAME -p 8080:8080 \
# -e "SPRING_PROFILES_ACTIVE=dev" \
# -v /home/ec2-user/application-secret.yml:/app/config/application-secret.yml \
# $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$ECR_REPOSITORY:$IMAGE_TAG
# - name: Deploy to EC2
# uses: appleboy/[email protected]
# with:
# host: ${{ secrets.EC2_HOST }}
# username: ${{ secrets.EC2_USER }}
# key: ${{ secrets.EC2_SSH_PRIVATE_KEY }}
# script: |
# echo "${{ secrets.APP_SECRET_YML }}" | base64 --decode > /home/ec2-user/application-secret.yml
# chmod 600 /home/ec2-user/application-secret.yml
# docker pull $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$ECR_REPOSITORY:$IMAGE_TAG
# docker stop $CONTAINER_NAME || true
# docker rm $CONTAINER_NAME || true
# docker run -d --name $CONTAINER_NAME -p 8080:8080 \
# -e "SPRING_PROFILES_ACTIVE=dev" \
# -v /home/ec2-user/application-secret.yml:/app/config/application-secret.yml \
# $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$ECR_REPOSITORY:$IMAGE_TAG