109 lines
3.0 KiB
YAML
109 lines
3.0 KiB
YAML
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
|