mirror of
https://github.com/Awuqing/BackupX.git
synced 2026-05-06 20:02:41 +08:00
节点池动态调度(企业集群核心需求): - model.Node 新增 Labels CSV;Node.HasLabel / LabelSet 辅助方法 - model.BackupTask 新增 NodePoolTag;与 NodeID 互斥(校验层拒绝同时设置) - BackupExecutionService.selectPoolNode:匹配标签的在线节点中选"运行中任务最少" 并列按 ID 升序稳定;空池返回 NODE_POOL_EMPTY 让用户立即感知 - 选中节点仅写 BackupRecord,不回写 task.NodeID —— 每次执行重选实现真轮转均衡 Grafana Dashboard(v2.1 指标的可视化闭环): - deploy/grafana/backupx-dashboard.json:11 个面板覆盖概览/时序/容量/集群 - deploy/grafana/README.md:Prometheus 抓取配置 + 告警建议 - release workflow 打包 grafana/ + nginx.conf 到 tar.gz 前端: - 节点列表:Agent 版本 vs Master 不一致时橙红 Tag + Tooltip 提示升级 - 节点列表新增"标签/节点池"列,支持 CSV 编辑 + 并发/带宽一起改 - 任务表单新增 NodePoolTag 输入框,与节点选择器互斥禁用 测试: - model/node_label_test.go:HasLabel / LabelSet / nil 安全 - service/node_pool_scheduler_test.go:负载最低优先 / 空池错误 / nil repo 降级 - go test ./... + npm run build 全绿
160 lines
4.5 KiB
YAML
160 lines
4.5 KiB
YAML
# 自动化发版流水线
|
||
#
|
||
# 触发方式:
|
||
# 1. 推送 tag:git tag v1.2.3 && git push --tags
|
||
# 2. 手动触发:GitHub Actions 页面 → Run workflow → 输入版本号
|
||
#
|
||
# 产出物:
|
||
# - GitHub Release:linux/amd64 + linux/arm64 预编译 tar.gz
|
||
# - Docker Hub:awuqing/backupx:latest + awuqing/backupx:v1.2.3(多架构)
|
||
#
|
||
# 前置配置:
|
||
# 在仓库 Settings → Secrets → Actions 添加:
|
||
# - DOCKERHUB_USERNAME(Docker Hub 用户名)
|
||
# - DOCKERHUB_TOKEN(Docker Hub Access Token)
|
||
|
||
name: Release
|
||
|
||
on:
|
||
push:
|
||
tags:
|
||
- 'v*'
|
||
workflow_dispatch:
|
||
inputs:
|
||
version:
|
||
description: '版本号(如 v1.2.3)'
|
||
required: true
|
||
type: string
|
||
|
||
permissions:
|
||
contents: write
|
||
packages: write
|
||
|
||
# 统一版本号:tag 推送取 ref_name,手动触发取 inputs.version
|
||
env:
|
||
VERSION: ${{ github.event.inputs.version || github.ref_name }}
|
||
|
||
jobs:
|
||
# ─── Job 1: 构建前端 ───
|
||
build-web:
|
||
name: Build Frontend
|
||
runs-on: ubuntu-latest
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
|
||
- name: Set up Node.js
|
||
uses: actions/setup-node@v4
|
||
with:
|
||
node-version: '20'
|
||
cache: 'npm'
|
||
cache-dependency-path: web/package-lock.json
|
||
|
||
- name: Install & Build
|
||
working-directory: web
|
||
run: |
|
||
npm ci
|
||
npm run build
|
||
|
||
- name: Upload frontend artifact
|
||
uses: actions/upload-artifact@v4
|
||
with:
|
||
name: web-dist
|
||
path: web/dist
|
||
retention-days: 1
|
||
|
||
# ─── Job 2: 预编译二进制 → GitHub Release ───
|
||
build-release:
|
||
name: Build ${{ matrix.goarch }}
|
||
needs: build-web
|
||
runs-on: ubuntu-latest
|
||
strategy:
|
||
matrix:
|
||
include:
|
||
- goos: linux
|
||
goarch: amd64
|
||
- goos: linux
|
||
goarch: arm64
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
|
||
- name: Set up Go
|
||
uses: actions/setup-go@v5
|
||
with:
|
||
go-version: '1.25'
|
||
cache-dependency-path: server/go.sum
|
||
|
||
- name: Download frontend artifact
|
||
uses: actions/download-artifact@v4
|
||
with:
|
||
name: web-dist
|
||
path: web/dist
|
||
|
||
- name: Build binary
|
||
working-directory: server
|
||
env:
|
||
GOOS: ${{ matrix.goos }}
|
||
GOARCH: ${{ matrix.goarch }}
|
||
CGO_ENABLED: '0'
|
||
run: |
|
||
go build \
|
||
-trimpath \
|
||
-ldflags "-s -w -X main.version=${{ env.VERSION }}" \
|
||
-o ../backupx \
|
||
./cmd/backupx
|
||
|
||
- name: Package release
|
||
run: |
|
||
ARCHIVE_NAME="backupx-${{ env.VERSION }}-${{ matrix.goos }}-${{ matrix.goarch }}"
|
||
mkdir -p "${ARCHIVE_NAME}"
|
||
cp backupx "${ARCHIVE_NAME}/"
|
||
cp -r web/dist "${ARCHIVE_NAME}/web"
|
||
cp server/config.example.yaml "${ARCHIVE_NAME}/"
|
||
cp deploy/install.sh "${ARCHIVE_NAME}/" 2>/dev/null || true
|
||
# v2.2+: 随发布包提供 Grafana dashboard 与 nginx.conf 模板
|
||
if [ -d deploy/grafana ]; then
|
||
cp -r deploy/grafana "${ARCHIVE_NAME}/grafana"
|
||
fi
|
||
cp deploy/nginx.conf "${ARCHIVE_NAME}/nginx.conf" 2>/dev/null || true
|
||
tar czf "${ARCHIVE_NAME}.tar.gz" "${ARCHIVE_NAME}"
|
||
|
||
- name: Upload to GitHub Release
|
||
uses: softprops/action-gh-release@v2
|
||
with:
|
||
tag_name: ${{ env.VERSION }}
|
||
files: backupx-${{ env.VERSION }}-${{ matrix.goos }}-${{ matrix.goarch }}.tar.gz
|
||
generate_release_notes: true
|
||
|
||
# ─── Job 3: Docker 多架构 → Docker Hub ───
|
||
build-docker:
|
||
name: Build & Push Docker
|
||
needs: build-web
|
||
runs-on: ubuntu-latest
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
|
||
- name: Set up QEMU
|
||
uses: docker/setup-qemu-action@v3
|
||
|
||
- name: Set up Docker Buildx
|
||
uses: docker/setup-buildx-action@v3
|
||
|
||
- name: Login to Docker Hub
|
||
uses: docker/login-action@v3
|
||
with:
|
||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||
|
||
- name: Build & Push
|
||
uses: docker/build-push-action@v6
|
||
with:
|
||
context: .
|
||
platforms: linux/amd64,linux/arm64
|
||
push: true
|
||
build-args: |
|
||
VERSION=${{ env.VERSION }}
|
||
tags: |
|
||
${{ secrets.DOCKERHUB_USERNAME }}/backupx:latest
|
||
${{ secrets.DOCKERHUB_USERNAME }}/backupx:${{ env.VERSION }}
|
||
cache-from: type=gha
|
||
cache-to: type=gha,mode=max
|