From 823293f01df1eb74a8d4390ed2f364d39c368594 Mon Sep 17 00:00:00 2001 From: yarnom Date: Mon, 1 Jun 2026 16:54:45 +0800 Subject: [PATCH] ci: add woodpecker pipeline Add Woodpecker build checks for backend, admin, and site, plus an SSH deploy script for the first non-Docker deployment flow. --- .woodpecker.yml | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ deploy/deploy.sh | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 .woodpecker.yml create mode 100755 deploy/deploy.sh diff --git a/.woodpecker.yml b/.woodpecker.yml new file mode 100644 index 0000000..6667c6b --- /dev/null +++ b/.woodpecker.yml @@ -0,0 +1,48 @@ +when: + - event: [push, pull_request] + +steps: + backend: + image: golang:1.25 + commands: + - cd backend + - go test ./... + - go build -o ../dist/osaet-admin ./cmd/osaet-admin + + admin: + image: node:22-bookworm + commands: + - cd frontend/admin + - npm ci + - npm run build + + site: + image: node:22-bookworm + commands: + - cd frontend/site + - npm ci + - npm run build + + deploy: + image: alpine:3.20 + when: + - event: push + branch: main + environment: + SSH_HOST: + from_secret: deploy_ssh_host + SSH_USER: + from_secret: deploy_ssh_user + SSH_PORT: + from_secret: deploy_ssh_port + SSH_PRIVATE_KEY: + from_secret: deploy_ssh_key + OSAET_ROOT: + from_secret: deploy_osaet_root + commands: + - apk add --no-cache openssh-client + - mkdir -p ~/.ssh + - printf '%s\n' "$SSH_PRIVATE_KEY" > ~/.ssh/id_ed25519 + - chmod 600 ~/.ssh/id_ed25519 + - ssh-keyscan -p "${SSH_PORT:-22}" "$SSH_HOST" >> ~/.ssh/known_hosts + - ssh -p "${SSH_PORT:-22}" "$SSH_USER@$SSH_HOST" "OSAET_ROOT='${OSAET_ROOT:-/opt/osaet}' bash '${OSAET_ROOT:-/opt/osaet}/app/deploy/deploy.sh'" diff --git a/deploy/deploy.sh b/deploy/deploy.sh new file mode 100755 index 0000000..26378ca --- /dev/null +++ b/deploy/deploy.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash +set -euo pipefail + +OSAET_ROOT="${OSAET_ROOT:-/opt/osaet}" +APP_DIR="${OSAET_APP_DIR:-$OSAET_ROOT/app}" +BIN_DIR="${OSAET_BIN_DIR:-$OSAET_ROOT/bin}" +SERVICE_NAME="${OSAET_SERVICE_NAME:-osaet-admin}" + +export OSAET_REPO_ROOT="${OSAET_REPO_ROOT:-$APP_DIR}" +export OSAET_LOCAL_CONFIG="${OSAET_LOCAL_CONFIG:-$OSAET_ROOT/config/local.yaml}" + +cd "$APP_DIR" +git fetch origin main +git checkout main +git pull --ff-only origin main + +cd "$APP_DIR/frontend/admin" +npm ci +npm run build + +cd "$APP_DIR/frontend/site" +npm ci +npm run build + +mkdir -p "$BIN_DIR" +cd "$APP_DIR/backend" +go test ./... +go build -o "$BIN_DIR/osaet-admin" ./cmd/osaet-admin + +"$BIN_DIR/osaet-admin" migrate + +sudo systemctl restart "$SERVICE_NAME" +sudo systemctl --no-pager --lines=20 status "$SERVICE_NAME"