spring-boot-with-systemctl

github action을 사용하면 github에서 빌드용 컴퓨터를 빌려주게 된다. 그 컴퓨터에서 빌드를 진행 후, scp로 jar를 내 서버로 copy 후 실행을 시켜준다.

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