name: Deploy Blog Backend on: push: branches: - main workflow_dispatch: jobs: test: runs-on: ubuntu-latest steps: - name: Check out repository uses: actions/checkout@v4 - name: Set up Java 21 uses: actions/setup-java@v4 with: distribution: temurin java-version: "21" - name: Run tests run: ./gradlew test --no-daemon deploy: runs-on: ubuntu-latest needs: test steps: - name: Check out repository uses: actions/checkout@v4 - name: Set up Java 21 uses: actions/setup-java@v4 with: distribution: temurin java-version: "21" - name: Build boot jar run: ./gradlew clean bootJar -x test --no-daemon - name: Deploy jar over SSH env: DEPLOY_HOST: ${{ secrets.DEPLOY_HOST }} DEPLOY_PORT: ${{ secrets.DEPLOY_PORT }} DEPLOY_USER: ${{ secrets.DEPLOY_USER }} DEPLOY_KEY: ${{ secrets.DEPLOY_KEY }} run: | set -euo pipefail port="${DEPLOY_PORT:-22}" remote_dir="/root/blog-backend" service_name="blog-api.service" jar_name="blog-backend.jar" remote_tmp="/tmp/${jar_name}.new" jar_file="$(find build/libs -maxdepth 1 -type f -name '*.jar' ! -name '*plain.jar' | sort | head -n 1)" if [ -z "$jar_file" ]; then echo "No boot jar found under build/libs" exit 1 fi mkdir -p ~/.ssh printf '%s\n' "$DEPLOY_KEY" > ~/.ssh/blog-backend-deploy chmod 600 ~/.ssh/blog-backend-deploy ssh-keyscan -p "$port" "$DEPLOY_HOST" >> ~/.ssh/known_hosts scp -i ~/.ssh/blog-backend-deploy -P "$port" "$jar_file" "$DEPLOY_USER@$DEPLOY_HOST:$remote_tmp" ssh -i ~/.ssh/blog-backend-deploy -p "$port" "$DEPLOY_USER@$DEPLOY_HOST" \ "REMOTE_DIR='$remote_dir' SERVICE_NAME='$service_name' JAR_NAME='$jar_name' REMOTE_TMP='$remote_tmp' bash -s" <<'EOF' set -euo pipefail mkdir -p "$REMOTE_DIR" cd "$REMOTE_DIR" backup_path="" if [ -f "$JAR_NAME" ]; then backup_path="$JAR_NAME.$(date +%Y%m%d%H%M%S).bak" cp "$JAR_NAME" "$backup_path" fi mv "$REMOTE_TMP" "$JAR_NAME" chown root:root "$JAR_NAME" chmod 0644 "$JAR_NAME" rollback() { if [ -n "$backup_path" ] && [ -f "$backup_path" ]; then cp "$backup_path" "$JAR_NAME" systemctl restart "$SERVICE_NAME" || true fi } if ! systemctl restart "$SERVICE_NAME"; then rollback journalctl -u "$SERVICE_NAME" -n 120 --no-pager exit 1 fi sleep 8 if ! systemctl is-active --quiet "$SERVICE_NAME"; then rollback journalctl -u "$SERVICE_NAME" -n 120 --no-pager exit 1 fi systemctl is-active "$SERVICE_NAME" EOF