129 lines
4.1 KiB
YAML
129 lines
4.1 KiB
YAML
name: Build and Deploy Server
|
||
|
||
on:
|
||
push:
|
||
branches:
|
||
- main
|
||
paths:
|
||
- "server/**"
|
||
- ".gitea/workflows/server-deploy.yml"
|
||
|
||
jobs:
|
||
build:
|
||
# 专属运行器:docker://golang:1.22-bookworm(注册于 doc79)
|
||
runs-on: lunar-ci
|
||
steps:
|
||
- uses: https://gitea.neatcn.com/gouki/action-checkout@v4
|
||
with:
|
||
fetch-depth: 20
|
||
|
||
- name: Verify Go runtime
|
||
run: go version
|
||
|
||
- name: Install dependencies
|
||
working-directory: server
|
||
run: go mod download
|
||
|
||
- name: Run tests
|
||
working-directory: server
|
||
run: go test ./...
|
||
|
||
- name: Build application
|
||
working-directory: server
|
||
env:
|
||
GITEA_SHA: ${{ gitea.sha }}
|
||
GITEA_RUN_NUMBER: ${{ gitea.run_number }}
|
||
run: |
|
||
mkdir -p bin
|
||
|
||
# 生成版本号(使用构建编号)
|
||
VERSION="1.0.${GITEA_RUN_NUMBER}"
|
||
BUILD_TIME="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
|
||
COMMIT_SHORT="${GITEA_SHA:0:7}"
|
||
|
||
echo "Building server version: $VERSION"
|
||
echo "Build time: $BUILD_TIME"
|
||
echo "Commit SHA: $COMMIT_SHORT"
|
||
|
||
# 使用 ldflags 注入版本信息
|
||
go build -ldflags "\
|
||
-X main.Version=$VERSION \
|
||
-X main.BuildTime=$BUILD_TIME \
|
||
-X main.CommitSha=$COMMIT_SHORT" \
|
||
-o bin/server cmd/main.go
|
||
|
||
# 同时保存版本信息到文件(用于部署时读取)
|
||
cat > bin/version.env <<EOF
|
||
APP_VERSION=$VERSION
|
||
APP_BUILD_TIME=$BUILD_TIME
|
||
APP_COMMIT_SHA=$COMMIT_SHORT
|
||
EOF
|
||
|
||
echo "Version info saved to bin/version.env:"
|
||
cat bin/version.env
|
||
|
||
- name: Build frontend (if exists)
|
||
working-directory: server
|
||
run: |
|
||
if [ -d "web" ]; then
|
||
echo "Building frontend..."
|
||
cd web
|
||
if [ -f "package.json" ]; then
|
||
npm ci
|
||
npm run build
|
||
fi
|
||
else
|
||
echo "No frontend directory found, skipping frontend build"
|
||
fi
|
||
|
||
- name: Create deployment package
|
||
working-directory: server
|
||
run: |
|
||
mkdir -p deploy
|
||
cp -r bin/ deploy/
|
||
cp -r migrations/ deploy/
|
||
cp -r scripts/ deploy/
|
||
if [ -d "web/dist" ]; then
|
||
cp -r web/dist/ deploy/public/
|
||
fi
|
||
tar -czf deploy.tar.gz deploy/
|
||
|
||
- name: Persist deployment package on runner host
|
||
run: |
|
||
test -f server/deploy.tar.gz
|
||
test -d /ci-artifacts
|
||
cp server/deploy.tar.gz "/ci-artifacts/server-deploy-${{ gitea.sha }}.tar.gz"
|
||
cp server/deploy.tar.gz /ci-artifacts/server-deploy-latest.tar.gz
|
||
ls -la /ci-artifacts/server-deploy-latest.tar.gz
|
||
echo "Deployment package saved on runner host: /opt/lunar/ci-artifacts/server-deploy-latest.tar.gz"
|
||
|
||
- name: Send success notification
|
||
if: success()
|
||
env:
|
||
TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }}
|
||
TELEGRAM_CHAT_ID: ${{ secrets.TELEGRAM_CHAT_ID }}
|
||
DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }}
|
||
GITEA_RUN_NUMBER: ${{ gitea.run_number }}
|
||
run: |
|
||
VERSION="1.0.${GITEA_RUN_NUMBER}"
|
||
bash .gitea/scripts/notify.sh success \
|
||
"后端服务部署成功" \
|
||
"版本: v${VERSION}\n部署包: /opt/lunar/ci-artifacts/server-deploy-latest.tar.gz"
|
||
|
||
- name: Send failure notification
|
||
if: failure()
|
||
env:
|
||
TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }}
|
||
TELEGRAM_CHAT_ID: ${{ secrets.TELEGRAM_CHAT_ID }}
|
||
DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }}
|
||
run: |
|
||
bash .gitea/scripts/notify.sh failure \
|
||
"后端服务部署失败" \
|
||
"请检查 Actions 日志了解失败原因"
|
||
|
||
- name: Cleanup
|
||
if: always()
|
||
run: |
|
||
rm -rf server/deploy/
|
||
rm -f server/deploy.tar.gz
|