feat: add admin dashboard backend and deployment workflow
This commit is contained in:
108
.gitea/workflows/deploy.yml
Normal file
108
.gitea/workflows/deploy.yml
Normal file
@@ -0,0 +1,108 @@
|
||||
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
|
||||
Reference in New Issue
Block a user