github action을 사용하면 github에서 빌드용 컴퓨터를 빌려주게 된다. 그 컴퓨터에서 빌드를 진행 후, scp로 jar를 내 서버로 copy 후 실행을 시켜준다.
-
./.github/workflows/deploy.yml
name: CI/CD Deploy
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Set up JDK
uses: actions/setup-java@v3
with:
distribution: 'temurin'
java-version: '21'
- name: Setup SSH
run: |
mkdir -p ~/.ssh
echo "${{ secrets.SERVER_SSH_KEY }}" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan -H $DEPLOY_SERVER >> ~/.ssh/known_hosts
env:
DEPLOY_SERVER: ${{ secrets.SERVER_HOST }}
- name: Run deploy script
env:
DATABASE_PW: ${{ secrets.DATABASE_PW }}
DATABASE_URL: ${{ secrets.DATABASE_URL }}
DATABASE_USER: ${{ secrets.DATABASE_USER }}
run: bash remote-deploy.sh
여기서 중요한 점은 환경변수를 process 단위로 공유되기 때문에 systemctl set-environment를 사용해서 넘겨야한다.
- ./remote-deploy.sh
#!/bin/bash
set -e
# build
./gradlew clean build -x test
PROJECT_ROOT=$(pwd)
BUILD_PATH=$(ls $PROJECT_ROOT/build/libs/*.jar)
JAR_NAME=$(basename $BUILD_PATH)
# Copy To Server
scp $BUILD_PATH $DEPLOY_USER@$DEPLOY_SERVER:$DEPLOY_PATH
# Run Application
ssh $DEPLOY_USER@$DEPLOY_SERVER << EOF
sudo systemctl set-environment DATABASE_PW=$DATABASE_PW DATABASE_URL=$DATABASE_URL DATABASE_USER=$DATABASE_USER
sudo systemctl restart dudoji-server.service
EOF