feat: add admin dashboard backend and deployment workflow
All checks were successful
Deploy Blog Backend / test (push) Successful in 2m41s
Deploy Blog Backend / deploy (push) Successful in 1m29s

This commit is contained in:
wypark
2026-05-28 21:44:05 +09:00
parent 4c1bd8197f
commit c14d123fcc
25 changed files with 2271 additions and 11 deletions

108
.gitea/workflows/deploy.yml Normal file
View 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