Today I Learned
험난하고도 길었던ㅠ 배포 여정...
name: Deploy to AWS EC2
on:
push:
branches:
- develop
pull_request:
branches:
- develop
# 사용할 인프라의 이름을 변수 형태로 저장
jobs:
build-and-deploy:
# 실행 환경 지정
runs-on: ubuntu-latest
# Task sequence 명시
steps:
- uses: actions/checkout@v2
- name: Set up JDK 17
uses: actions/setup-java@v1
with:
java-version: 17
# Github Actions 워크플로우가 실행되는 가상 환경내에 application-dev 설정
- name: Generate application-secret.yml
run: |
echo "${{ secrets.APPLICATION_SECRET_CONTENT }}" > ./src/main/resources/yml/application-secret.yml
# Github Actions 워크플로우가 실행되는 가상 환경내에 application-dev 설정
- name: Generate application-oauth.yml
run: |
echo "${{ secrets.APPLICATION_OAUTH }}" > ./src/main/resources/yml/application-oauth.yml
# Gradle 빌드 할 때, 이미 저장한 데이터를 캐싱하여 빌드시 이를 사용하도록함.
- name: Gradle Caching
uses: actions/cache@v3
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
# Github Actions 워크플로우 가상환경이 grdlew 실행할 수 있도록 ./gradlew 파일에 실행 권한을 부여
- name: Grant execute permission for gradlew
run: chmod +x ./gradlew
shell: bash
# Gradle build (Test 제외)
- name: Build with Gradle
run: ./gradlew clean build -x test
# Docker 이미지 빌드
- name: Build Docker image
run: docker build -f Dockerfile -t myapp:${{ github.sha }} .
# ECR에 docker image push
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-2
# ECR에 Login
- name: Log in to Amazon ECR
run: |
aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin ${{ secrets.AWS_ECR_REPOSITORY_URL }}
# ECR에 이미지 push
- name: Push image to Amazon ECR
run: |
docker tag myapp:${{ github.sha }} ${{ secrets.AWS_ECR_REPOSITORY_URL }}:latest
docker push ${{ secrets.AWS_ECR_REPOSITORY_URL }}:latest
# EC2에 ssh로 접속 후 ECR에서 docker로 이미지 pull & docker container
- name: Deploy to EC2
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.SSH_KEY }}
port: 22
script: |
sudo docker login -u AWS -p $(aws ecr get-login-password --region ap-northeast-2) ${{ secrets.AWS_ECR_REPOSITORY_URL }}
sudo docker pull ${{ secrets.AWS_ECR_REPOSITORY_URL }}:latest
sudo docker-compose down
sudo docker-compose up -d
sudo docker image prune -f