reference: https://github.com/pillyohae/pillyohae
name: CI/CD
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
build:
name: Build and Deploy
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
cache: gradle
- name: Grant execute permission for Gradle
run: chmod +x ./gradlew
- name: Build with Gradle
run: ./gradlew bootJar
- name: Docker Build and Push main server image
env:
DOCKER_USER: ${{ secrets.DOCKER_USERNAME }}
DOCKER_PASS: ${{ secrets.DOCKER_PASSWORD }}
DOCKER_HUB_REPOSITORY: ${{ secrets.DOCKER_HUB_REPOSITORY }}
run: |
echo "$DOCKER_PASS" | docker login -u "$DOCKER_USER" --password-stdin
docker build -t "$DOCKER_HUB_REPOSITORY":pillyohae -f main-server/Dockerfile ./main-server
docker push "$DOCKER_HUB_REPOSITORY":pillyohae
- name: Docker Build and Push payment server image
env:
DOCKER_USER: ${{ secrets.DOCKER_USERNAME }}
DOCKER_PASS: ${{ secrets.DOCKER_PASSWORD }}
DOCKER_HUB_REPOSITORY: ${{ secrets.DOCKER_HUB_REPOSITORY }}
run: |
echo "$DOCKER_PASS" | docker login -u "$DOCKER_USER" --password-stdin
docker build -t "$DOCKER_HUB_REPOSITORY":payment -f payment-server/Dockerfile ./payment-server
docker push "$DOCKER_HUB_REPOSITORY":payment
- 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: Create .env file
run: |
cat <<EOF > .env
DOCKER_HUB_REPOSITORY=${{ secrets.DOCKER_HUB_REPOSITORY }}
DATABASE_USERNAME=${{ secrets.DATABASE_ID }}
DATABASE_PASSWORD=${{ secrets.DATABASE_PASSWORD }}
DATABASE_URL=${{ secrets.DATABASE_URL }}
JPA_HIBERNATE_DDL=${{ secrets.JPA_HIBERNATE_DDL }}
BUCKET_NAME=${{ secrets.BUCKET_NAME }}
AWS_REGION=${{ secrets.AWS_REGION }}
ACCESS_KEY=${{ secrets.AWS_ACCESS_KEY }}
SECRET_KEY=${{ secrets.AWS_SECRET_ACCESS_KEY }}
TOSS_SECRET_KEY=${{ secrets.TOSS_SECRET_KEY }}
JWT_SECRET_KEY=${{ secrets.JWT_SECRET_KEY }}
RABBITMQ_HOST=${{ secrets.RABBITMQ_HOST }}
RABBITMQ_PORT=${{ secrets.RABBITMQ_PORT }}
RABBITMQ_USERNAME=${{ secrets.RABBITMQ_USERNAME }}
RABBITMQ_PASSWORD=${{ secrets.RABBITMQ_PASSWORD }}
REDIS_HOST=${{ secrets.REDIS_HOST }}
OPENAI_API_KEY=${{ secrets.OPENAI_API_KEY }}
TZ=Asia/Seoul
EOF
- name: List files in repo root
run: ls -R
- name: Copy docker files to main server
uses: appleboy/scp-action@master
with:
host: ${{ secrets.AWS_MAIN_SERVER_SSH_HOST }}
username: ${{ secrets.AWS_SSH_USERNAME }}
key: ${{ secrets.AWS_SSH_KEY }}
port: 22
source: "./main-server/docker-compose.yml,./main-server/.env
target: "~/app/"
strip_components: 1 # main-server/ 경로 제거
- name: Copy docker files to payment server
uses: appleboy/scp-action@master
with:
host: ${{ secrets.AWS_PAYMENT_SERVER_SSH_HOST }}
username: ${{ secrets.AWS_SSH_USERNAME }}
key: ${{ secrets.AWS_SSH_KEY }}
port: 22
source: "./payment-server/docker-compose.yml,./payment-server/.env
target: "~/app/"
strip_components: 1
- name: SSH into server and deploy main server
uses: appleboy/ssh-action@master
env:
DOCKER_USER: ${{ secrets.DOCKER_USERNAME }}
DOCKER_PASS: ${{ secrets.DOCKER_PASSWORD }}
with:
host: ${{ secrets.AWS_MAIN_SERVER_SSH_HOST }}
username: ${{ secrets.AWS_SSH_USERNAME }}
key: ${{ secrets.AWS_SSH_KEY }}
port: 22
script: |
echo "$DOCKER_PASS" | sudo docker login -u "$DOCKER_USER" --password-stdin
cd ~/app
sudo docker rm -f server || true
sudo docker compose pull
sudo docker compose up -d --remove-orphans
- name: SSH into server and deploy payment server
uses: appleboy/ssh-action@master
env:
DOCKER_USER: ${{ secrets.DOCKER_USERNAME }}
DOCKER_PASS: ${{ secrets.DOCKER_PASSWORD }}
with:
host: ${{ secrets.AWS_PAYMENT_SERVER_SSH_HOST }}
username: ${{ secrets.AWS_SSH_USERNAME }}
key: ${{ secrets.AWS_SSH_KEY }}
port: 22
script: |
echo "$DOCKER_PASS" | sudo docker login -u "$DOCKER_USER" --password-stdin
cd ~/app
sudo docker rm -f server || true
sudo docker compose pull
sudo docker compose up -d --remove-orphans