1
0
forked from Eeveid/lightOps

24 Commits
v0.1.5 ... main

Author SHA1 Message Date
9ffe425d6e 🐛 fix(workflow): 修复 Cargo 镜像配置的 YAML 语法
- 去掉 run 脚本中的 heredoc 写法,避免 YAML 将 TOML 内容误判为工作流字段
- 改为使用 printf 生成 ~/.cargo/config.toml
- 保持 crates-io 切换到 rsproxy sparse registry 的逻辑不变
2026-05-26 20:38:47 +08:00
7e8d4baac6 🐛 fix(workflow): 为 Cargo 配置 crates 镜像源
- 在安装 Rust 步骤写入 ~/.cargo/config.toml,将 crates-io 切换到 rsproxy sparse registry
- 避免 runner 访问 index.crates.io 超时导致依赖下载失败
- 与 rustup 镜像配置配合,统一走国内镜像完成工具链和依赖安装
2026-05-26 20:34:23 +08:00
a79ef99500 🐛 fix(workflow): 为 rustup 配置镜像下载源
- 在安装 Rust 和构建步骤中设置 RUSTUP_DIST_SERVER 与 RUSTUP_UPDATE_ROOT
- 避免 runner 直连 static.rust-lang.org 超时导致 stable 工具链安装失败
- 保持通过 rustup stable 获取新版 cargo 以兼容 Cargo.lock v4
2026-05-26 20:20:25 +08:00
f1491ba114 🐛 fix(workflow): 固定使用新版 Rust stable 工具链
- 发布工作流不再依赖 runner 自带 rustc/cargo 版本
- 改为通过 rustup 安装并默认切换到 stable 工具链,兼容 Cargo.lock v4
- 构建步骤统一加载 ~/.cargo/env,避免旧版系统 cargo 抢占路径
2026-05-26 19:54:18 +08:00
8db385cca6 fix: 修改运行环境 2026-05-26 19:39:31 +08:00
738ff8248f 🐛 fix(release): 显式传递发布目标仓库参数
- 发布步骤调用 publish-gitea-release.sh 时显式传入 gitea-url、owner 和 repo
- 避免子进程回退到脚本默认值 Eeveid/lightOps,导致日志和 Release 目标仓库混淆
- 保持当前使用 RELEASE_TOKEN 和 main 作为 target_commitish 的逻辑不变
2026-05-26 18:25:09 +08:00
acc89faa8b 🐛 fix(release): 用默认分支替代提交 SHA 创建 Release
- 发布步骤不再将 git rev-parse HEAD 的完整提交 SHA 作为 target_commitish
- 改为显式使用 main,匹配当前 Gitea 实例对 Release 创建接口的可接受参数
- 清理前面为定位 token 问题加入的临时 probe 调试逻辑
2026-05-26 15:22:51 +08:00
13e4d1f684 🔧 chore(workflow): 增强调试 Release Token 校验
- 输出当前 RELEASE_TOKEN 的 sha256 摘要,便于与本地成功 token 做无泄露比对
- 在发布前直接用当前 token 探测创建 Release API 并打印响应体
- 为定位 workflow 内 token 与手工 curl 结果不一致的问题提供确定性证据
2026-05-26 15:00:12 +08:00
975b7b170c 🔧 chore(workflow): 打印 Release Token 调试信息
- 在发布步骤中直接输出 RELEASE_TOKEN 明文以确认仓库密钥实际注入值
- 同时打印 GITEA/GITHUB/RELEASE 相关环境变量便于比对
- 仅用于当前排障,后续验证完成后应移除
2026-05-26 14:01:59 +08:00
c47791bc3c 🔧 chore(workflow): 移除 Release Token 预检日志
- 清理发布步骤中的临时调试输出
- 保持使用 RELEASE_TOKEN 进行 Release 发布
- 为重新验证更新后的仓库密钥提供干净日志
2026-05-26 13:34:55 +08:00
70f80355da 🔧 chore(workflow): 增加 Release Token 预检日志
- 在发布步骤前输出 RELEASE_TOKEN 长度,避免空值或旧值问题继续被误判
- 使用当前 token 预检 /api/v1/user 和 releases 列表接口状态码
- 为后续定位 workflow 与本地手工调用结果不一致的问题提供直接证据
2026-05-26 13:16:40 +08:00
abcfcf7b33 🐛 fix(release): 改用 RELEASE_TOKEN 发布版本
- 工作流发布步骤改为显式使用仓库密钥 RELEASE_TOKEN
- 去掉发布脚本对 404 的吞错处理,改回明确暴露真实权限或接口错误
- 便于验证当前自定义 token 是否具备 Gitea Release 创建与附件上传权限
2026-05-26 12:46:24 +08:00
aad3db8315 🐛 fix(workflow): 回退发布任务到 runner_admin
- 将 release 工作流的 runs-on 从 ubuntu-latest 调回 runner_admin
- 避免当前 act runner 在 Set up job 阶段卡住,优先验证发布链本身
- 保留前面已经修复的动态检出、Rust 构建和 Release 兼容逻辑
2026-05-26 11:56:40 +08:00
b1d07e604f 🐛 fix(workflow): 将发布任务切换为 ubuntu-latest
- 将 .gitea/workflows/release.yml 的 runs-on 从 runner_admin 改为 ubuntu-latest
- 便于在新的 fork 仓库中按 act runner 的通用标签方式调度任务
- 保留前面已经修过的动态仓库检出、构建和发布兼容逻辑
2026-05-26 11:41:13 +08:00
a4f73c20d7 🐛 fix(release): 兼容不支持 Releases 的仓库
- 发布脚本在 Gitea Releases API 返回 404 时不再直接失败
- 对未开启 Releases 或 Token 无 Release 权限的仓库改为输出已生成的包路径并跳过上传
- 保持支持 Releases 的仓库仍按原逻辑创建 Release 并上传附件
2026-05-26 11:26:43 +08:00
100909a47f 🐛 fix(release): 去除发布脚本对 Python 的硬依赖
- 发布脚本优先使用 node 处理 JSON,没有 node 时再回退到 python3 或 python
- 修复 runner 缺少 Python 解释器时 Release 创建阶段直接失败的问题
- 保持现有 Gitea API 调用和附件上传流程不变
2026-05-26 11:12:16 +08:00
57447882cb 🐛 fix(release): 兼容发布脚本中的 python3 环境
- 发布脚本优先使用 python3,没有时再回退到 python
- 修复 runner 仅提供 python3 时发布阶段直接失败的问题
- 保持 Release 创建和附件上传逻辑不变
2026-05-26 11:00:07 +08:00
9b63ef38c3 🐛 fix(release): 修复原生目标构建时的 C 编译器选择
- 仅在 x86_64-unknown-linux-gnu 目标已安装且存在 x86_64-linux-gnu-gcc 时才选择 GNU 交叉目标
- 打包脚本在目标等于当前 Rust host target 时改为原生 cargo build,不再显式传 --target
- 避免 cc-rs 在原生构建场景下错误寻找 x86_64-linux-gnu-gcc 导致发布失败
2026-05-26 10:48:19 +08:00
4322023820 🐛 fix(workflow): 避免发布流程在线下载 Rust 目标
- 根据 runner 上已可用的 Rust host target 或已安装 target 选择构建目标
- 去掉 rustup target add,避免网络受限环境在下载 rust-std 时卡住
- 将选中的构建目标写入临时文件并传递给发布打包脚本
2026-05-25 22:56:51 +08:00
9042f8b8a0 🐛 fix(workflow): 提高 Rust 环境初始化兼容性
- 用纯 shell 逻辑替换 PATH 过滤中的 awk 写法,避免不同 runner 上的 awk 语法差异
- 保持优先系统工具链、跳过 ~/.cargo/bin 的策略不变
- 修复安装 Rust 步骤在 shell 解析阶段直接失败的问题
2026-05-25 22:46:48 +08:00
f839ea2266 🐛 fix(workflow): 修复发布构建的 Rust 目标配置
- 安装和构建阶段优先使用系统 rustc/cargo,避免被 ~/.cargo/bin 中的 musl 工具链覆盖
- 仅在系统工具链缺失时才加载或安装 rustup,减少 runner 现有环境带来的干扰
- 当使用 rustup 时自动补齐 x86_64-unknown-linux-gnu target,匹配发布脚本的构建目标
2026-05-25 22:41:41 +08:00
b4001f5e12 🐛 fix(workflow): 避免发布流程检出阶段卡住
- 检出代码时按标签直接浅克隆,避免 clone 后再次 fetch tags
- 为 git 检出步骤设置 GIT_TERMINAL_PROMPT=0,防止凭证等待导致任务挂起
- 用本地提交校验替代多余的远程访问,降低 runner 在镜像仓库发布时的阻塞风险
2026-05-25 22:35:24 +08:00
e6f3f50ccb 🐛 fix(workflow): 修复发布流程的仓库来源识别
- 检出代码时改为根据触发仓库动态拼接克隆地址,去掉对 Eeveid/lightOps 的硬编码
- 使用当前触发仓库拆分 owner 和 repo,确保 Release 发布到正确项目
- 避免在 origin2 等镜像仓库打标签后,工作流仍去主仓库检出代码导致找不到标签
2026-05-25 22:20:15 +08:00
121bd8bd7f 🐛 fix(workflow): 修复发布工作流的 Rust 初始化逻辑
- 在系统依赖阶段补充 rustc 和 cargo,减少对 rustup 在线安装的依赖
- 安装 Rust 前先加载 ~/.cargo/env 并补充 ~/.cargo/bin 到 PATH
- 仅在本机确实缺少 cargo 时才走 rustup 兜底,避免 runner 已装 rustup 但未生效时误触发联网更新
2026-05-25 22:14:25 +08:00
3 changed files with 117 additions and 22 deletions

View File

@@ -7,14 +7,22 @@ on:
jobs:
release-linux-x86_64:
runs-on: runner_admin
runs-on: ubuntu-latest
steps:
- name: 检出代码
env:
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
GIT_TERMINAL_PROMPT: "0"
run: |
set -eux
SERVER_URL="${GITHUB_SERVER_URL:-${GITEA_SERVER_URL:-https://gitea.kmux.cn}}"
REPOSITORY="${GITHUB_REPOSITORY:-${GITEA_REPOSITORY:-}}"
TAG="${GITHUB_REF_NAME:-${GITEA_REF_NAME:-}}"
if [ -z "$REPOSITORY" ]; then
echo "无法识别触发仓库"
env | sort
exit 1
fi
if [ -z "$TAG" ] && [ -n "${GITHUB_REF:-}" ]; then
TAG="${GITHUB_REF##*/}"
fi
@@ -23,16 +31,17 @@ jobs:
env | sort
exit 1
fi
CLONE_URL="${SERVER_URL%/}/${REPOSITORY}.git"
printf '%s' "$TAG" > /tmp/lightops-release-tag
rm -rf lightops-src
if [ -n "${GITEA_TOKEN:-}" ]; then
git clone "https://oauth2:${GITEA_TOKEN}@gitea.kmux.cn/Eeveid/lightOps.git" lightops-src
AUTH_HEADER="Authorization: Basic $(printf 'oauth2:%s' "$GITEA_TOKEN" | base64 | tr -d '\n')"
git -c http.extraHeader="$AUTH_HEADER" clone --branch "$TAG" --depth 1 --single-branch "$CLONE_URL" lightops-src
else
git clone https://gitea.kmux.cn/Eeveid/lightOps.git lightops-src
git clone --branch "$TAG" --depth 1 --single-branch "$CLONE_URL" lightops-src
fi
cd lightops-src
git fetch --tags --force
git checkout "$TAG"
git rev-parse --verify HEAD
- name: 安装系统依赖
run: |
@@ -49,39 +58,73 @@ jobs:
fi
- name: 安装 Rust
env:
RUSTUP_DIST_SERVER: https://rsproxy.cn
RUSTUP_UPDATE_ROOT: https://rsproxy.cn/rustup
run: |
set -eux
if ! command -v cargo >/dev/null 2>&1; then
if ! command -v rustup >/dev/null 2>&1; then
curl --proto '=https' --tlsv1.2 -fsSL https://sh.rustup.rs | sh -s -- -y --profile minimal
. "$HOME/.cargo/env"
fi
. "$HOME/.cargo/env"
rustup toolchain install stable --profile minimal --no-self-update
rustup default stable
HOST_TARGET="$(rustc -vV | sed -n 's/^host: //p')"
BUILD_TARGET="$HOST_TARGET"
if [ "$HOST_TARGET" != "x86_64-unknown-linux-gnu" ] && command -v rustup >/dev/null 2>&1; then
if rustup target list --installed | grep -qx 'x86_64-unknown-linux-gnu' && command -v x86_64-linux-gnu-gcc >/dev/null 2>&1; then
BUILD_TARGET="x86_64-unknown-linux-gnu"
fi
fi
printf '%s' "$BUILD_TARGET" > /tmp/lightops-build-target
echo "使用 Rust 构建目标: $BUILD_TARGET"
rustc -V
cargo -V
mkdir -p "$HOME/.cargo"
printf '%s\n' \
'[source.crates-io]' \
'replace-with = "rsproxy-sparse"' \
'' \
'[source.rsproxy-sparse]' \
'registry = "sparse+https://rsproxy.cn/index/"' \
>"$HOME/.cargo/config.toml"
- name: 构建发布包
env:
RUSTUP_DIST_SERVER: https://rsproxy.cn
RUSTUP_UPDATE_ROOT: https://rsproxy.cn/rustup
run: |
set -eux
. "$HOME/.cargo/env" 2>/dev/null || true
. "$HOME/.cargo/env"
cd lightops-src
TAG="$(cat /tmp/lightops-release-tag)"
VERSION="${TAG#v}"
bash scripts/build-release.sh --version "$VERSION" --target x86_64-unknown-linux-gnu
BUILD_TARGET="$(cat /tmp/lightops-build-target 2>/dev/null || true)"
if [ -z "$BUILD_TARGET" ]; then
BUILD_TARGET="$(rustc -vV | sed -n 's/^host: //p')"
fi
echo "构建发布目标: $BUILD_TARGET"
bash scripts/build-release.sh --version "$VERSION" --target "$BUILD_TARGET"
- name: 发布到 Gitea Release
env:
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
GITEA_URL: https://gitea.kmux.cn
GITEA_OWNER: Eeveid
GITEA_REPO: lightOps
GITEA_TOKEN: ${{ secrets.RELEASE_TOKEN }}
run: |
set -eux
SERVER_URL="${GITHUB_SERVER_URL:-${GITEA_SERVER_URL:-https://gitea.kmux.cn}}"
REPOSITORY="${GITHUB_REPOSITORY:-${GITEA_REPOSITORY:-}}"
GITEA_URL="${SERVER_URL%/}"
GITEA_OWNER="${REPOSITORY%%/*}"
GITEA_REPO="${REPOSITORY#*/}"
cd lightops-src
TAG="$(cat /tmp/lightops-release-tag)"
TARGET_SHA="$(git rev-parse HEAD)"
bash scripts/publish-gitea-release.sh \
--gitea-url "$GITEA_URL" \
--owner "$GITEA_OWNER" \
--repo "$GITEA_REPO" \
--tag "$TAG" \
--title "LightOps ${TAG}" \
--target "$TARGET_SHA" \
--target "main" \
--no-create-tag \
--no-push-tag \
--package target/releases/*.tar.gz \

View File

@@ -111,6 +111,11 @@ PLATFORM="${TARGET:-$(detect_platform)}"
PACKAGE_NAME="lightops-${VERSION}-${PLATFORM}"
STAGE_DIR="target/release-package/${PACKAGE_NAME}"
ARCHIVE_PATH="${OUTPUT_DIR}/${PACKAGE_NAME}.tar.gz"
HOST_TARGET="$(rustc -vV 2>/dev/null | sed -n 's/^host: //p')"
NATIVE_TARGET="false"
if [[ -n "$TARGET" && -n "$HOST_TARGET" && "$TARGET" == "$HOST_TARGET" ]]; then
NATIVE_TARGET="true"
fi
if [[ "$SKIP_BUILD" != "true" ]]; then
log "构建前端"
@@ -124,7 +129,7 @@ if [[ "$SKIP_BUILD" != "true" ]]; then
log "构建 Rust 二进制"
cd "$ROOT"
if [[ -n "$TARGET" ]]; then
if [[ -n "$TARGET" && "$NATIVE_TARGET" != "true" ]]; then
cargo build --release --target "$TARGET" -p lightops-server -p lightops-agent
BIN_DIR="target/${TARGET}/release"
else
@@ -133,7 +138,7 @@ if [[ "$SKIP_BUILD" != "true" ]]; then
fi
else
cd "$ROOT"
if [[ -n "$TARGET" ]]; then
if [[ -n "$TARGET" && "$NATIVE_TARGET" != "true" ]]; then
BIN_DIR="target/${TARGET}/release"
else
BIN_DIR="target/release"

View File

@@ -110,8 +110,27 @@ require_cmd() {
command -v "$1" >/dev/null 2>&1 || fail "缺少命令:$1"
}
detect_json_runtime() {
if command -v node >/dev/null 2>&1; then
echo "node"
elif command -v python3 >/dev/null 2>&1; then
echo "python3"
elif command -v python >/dev/null 2>&1; then
echo "python"
else
return 1
fi
}
json_escape() {
python -c 'import json,sys; print(json.dumps(sys.stdin.read()))'
case "$JSON_RUNTIME" in
node)
node -e 'let s=""; process.stdin.setEncoding("utf8"); process.stdin.on("data", d => s += d); process.stdin.on("end", () => process.stdout.write(JSON.stringify(s)));'
;;
*)
"$JSON_RUNTIME" -c 'import json,sys; print(json.dumps(sys.stdin.read()))'
;;
esac
}
api_url() {
@@ -130,8 +149,32 @@ api_post_json() {
"$1"
}
api_post_json_with_status() {
local output_file status
output_file="$(mktemp)"
status="$(curl -sS -o "$output_file" -w '%{http_code}' -X POST \
-H "Authorization: token ${GITEA_TOKEN}" \
-H "Content-Type: application/json" \
-d "$2" \
"$1")" || {
cat "$output_file" >&2 || true
rm -f "$output_file"
return 1
}
cat "$output_file"
rm -f "$output_file"
printf '\n%s' "$status"
}
release_id_from_json() {
python -c 'import json,sys; print(json.load(sys.stdin)["id"])'
case "$JSON_RUNTIME" in
node)
node -e 'let s=""; process.stdin.setEncoding("utf8"); process.stdin.on("data", d => s += d); process.stdin.on("end", () => process.stdout.write(String(JSON.parse(s).id)));'
;;
*)
"$JSON_RUNTIME" -c 'import json,sys; print(json.load(sys.stdin)["id"])'
;;
esac
}
[[ -n "$TAG" ]] || fail "必须指定 --tag"
@@ -141,7 +184,7 @@ release_id_from_json() {
require_cmd curl
require_cmd git
require_cmd python
JSON_RUNTIME="$(detect_json_runtime)" || fail "缺少命令node、python 或 python3"
for package in "${PACKAGES[@]}"; do
[[ -f "$package" ]] || fail "发布包不存在:$package"
@@ -159,14 +202,18 @@ fi
release_url="$(api_url "releases/tags/${TAG}")"
release_json=""
if release_json="$(api_get "$release_url" 2>/dev/null)"; then
release_status="$(curl -sS -o /dev/null -w '%{http_code}' -H "Authorization: token ${GITEA_TOKEN}" "$release_url" || true)"
if [[ "$release_status" == "200" ]] && release_json="$(api_get "$release_url" 2>/dev/null)"; then
log "Release 已存在:$TAG"
else
log "创建 Release$TAG"
title_json="$(printf '%s' "$TITLE" | json_escape)"
notes_json="$(printf '%s' "$NOTES" | json_escape)"
payload="{\"tag_name\":\"${TAG}\",\"target_commitish\":\"${TARGET}\",\"name\":${title_json},\"body\":${notes_json},\"draft\":false,\"prerelease\":${PRERELEASE}}"
release_json="$(api_post_json "$(api_url releases)" "$payload")"
create_result="$(api_post_json_with_status "$(api_url releases)" "$payload")" || fail "创建 Release 请求失败"
create_status="${create_result##*$'\n'}"
release_json="${create_result%$'\n'*}"
[[ "$create_status" == "201" || "$create_status" == "200" ]] || fail "创建 Release 失败HTTP 状态码:$create_status"
fi
release_id="$(printf '%s' "$release_json" | release_id_from_json)"