From 121bd8bd7fd51c2a317cff8d622d56d1deca135d Mon Sep 17 00:00:00 2001 From: zhilv Date: Mon, 25 May 2026 22:14:25 +0800 Subject: [PATCH 01/24] =?UTF-8?q?=F0=9F=90=9B=20fix(workflow):=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E5=8F=91=E5=B8=83=E5=B7=A5=E4=BD=9C=E6=B5=81=E7=9A=84?= =?UTF-8?q?=20Rust=20=E5=88=9D=E5=A7=8B=E5=8C=96=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在系统依赖阶段补充 rustc 和 cargo,减少对 rustup 在线安装的依赖 - 安装 Rust 前先加载 ~/.cargo/env 并补充 ~/.cargo/bin 到 PATH - 仅在本机确实缺少 cargo 时才走 rustup 兜底,避免 runner 已装 rustup 但未生效时误触发联网更新 --- .gitea/workflows/release.yml | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index d4edf24..fb0c6c3 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -39,21 +39,26 @@ jobs: set -eux if command -v apt-get >/dev/null 2>&1; then apt-get update - apt-get install -y build-essential pkg-config sqlite3 curl tar ca-certificates nodejs npm + apt-get install -y build-essential pkg-config sqlite3 curl tar ca-certificates nodejs npm rustc cargo elif command -v dnf >/dev/null 2>&1; then - dnf install -y gcc gcc-c++ make pkgconf-pkg-config sqlite curl tar ca-certificates nodejs npm + dnf install -y gcc gcc-c++ make pkgconf-pkg-config sqlite curl tar ca-certificates nodejs npm rust cargo elif command -v yum >/dev/null 2>&1; then - yum install -y gcc gcc-c++ make pkgconfig sqlite curl tar ca-certificates nodejs npm + yum install -y gcc gcc-c++ make pkgconfig sqlite curl tar ca-certificates nodejs npm rust cargo elif command -v pacman >/dev/null 2>&1; then - pacman -Sy --noconfirm base-devel pkgconf sqlite curl tar ca-certificates nodejs npm + pacman -Sy --noconfirm base-devel pkgconf sqlite curl tar ca-certificates nodejs npm rust cargo fi - name: 安装 Rust run: | set -eux + if [ -f "$HOME/.cargo/env" ]; then + . "$HOME/.cargo/env" + fi + export PATH="$HOME/.cargo/bin:$PATH" if ! command -v cargo >/dev/null 2>&1; then curl --proto '=https' --tlsv1.2 -fsSL https://sh.rustup.rs | sh -s -- -y --profile minimal . "$HOME/.cargo/env" + export PATH="$HOME/.cargo/bin:$PATH" fi rustc -V cargo -V From e6f3f50ccb96a1191075f04a2bbb8a0b7c347730 Mon Sep 17 00:00:00 2001 From: zhilv Date: Mon, 25 May 2026 22:20:15 +0800 Subject: [PATCH 02/24] =?UTF-8?q?=F0=9F=90=9B=20fix(workflow):=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E5=8F=91=E5=B8=83=E6=B5=81=E7=A8=8B=E7=9A=84=E4=BB=93?= =?UTF-8?q?=E5=BA=93=E6=9D=A5=E6=BA=90=E8=AF=86=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 检出代码时改为根据触发仓库动态拼接克隆地址,去掉对 Eeveid/lightOps 的硬编码 - 使用当前触发仓库拆分 owner 和 repo,确保 Release 发布到正确项目 - 避免在 origin2 等镜像仓库打标签后,工作流仍去主仓库检出代码导致找不到标签 --- .gitea/workflows/release.yml | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index fb0c6c3..e15b512 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -14,7 +14,14 @@ jobs: GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} 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,12 +30,14 @@ 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 "$CLONE_URL" lightops-src else - git clone https://gitea.kmux.cn/Eeveid/lightOps.git lightops-src + git clone "$CLONE_URL" lightops-src fi cd lightops-src git fetch --tags --force @@ -75,11 +84,13 @@ jobs: - name: 发布到 Gitea Release env: GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} - GITEA_URL: https://gitea.kmux.cn - GITEA_OWNER: Eeveid - GITEA_REPO: lightOps 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)" From b4001f5e1224981099935f59e8863b738e024fa4 Mon Sep 17 00:00:00 2001 From: zhilv Date: Mon, 25 May 2026 22:35:24 +0800 Subject: [PATCH 03/24] =?UTF-8?q?=F0=9F=90=9B=20fix(workflow):=20=E9=81=BF?= =?UTF-8?q?=E5=85=8D=E5=8F=91=E5=B8=83=E6=B5=81=E7=A8=8B=E6=A3=80=E5=87=BA?= =?UTF-8?q?=E9=98=B6=E6=AE=B5=E5=8D=A1=E4=BD=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 检出代码时按标签直接浅克隆,避免 clone 后再次 fetch tags - 为 git 检出步骤设置 GIT_TERMINAL_PROMPT=0,防止凭证等待导致任务挂起 - 用本地提交校验替代多余的远程访问,降低 runner 在镜像仓库发布时的阻塞风险 --- .gitea/workflows/release.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index e15b512..d37c545 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -12,6 +12,7 @@ jobs: - 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}}" @@ -35,13 +36,12 @@ jobs: rm -rf lightops-src if [ -n "${GITEA_TOKEN:-}" ]; then AUTH_HEADER="Authorization: Basic $(printf 'oauth2:%s' "$GITEA_TOKEN" | base64 | tr -d '\n')" - git -c http.extraHeader="$AUTH_HEADER" clone "$CLONE_URL" lightops-src + git -c http.extraHeader="$AUTH_HEADER" clone --branch "$TAG" --depth 1 --single-branch "$CLONE_URL" lightops-src else - git clone "$CLONE_URL" 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: | From f839ea2266fc4889513193f77ba6fbe11fe794dd Mon Sep 17 00:00:00 2001 From: zhilv Date: Mon, 25 May 2026 22:41:41 +0800 Subject: [PATCH 04/24] =?UTF-8?q?=F0=9F=90=9B=20fix(workflow):=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E5=8F=91=E5=B8=83=E6=9E=84=E5=BB=BA=E7=9A=84=20Rust?= =?UTF-8?q?=20=E7=9B=AE=E6=A0=87=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 安装和构建阶段优先使用系统 rustc/cargo,避免被 ~/.cargo/bin 中的 musl 工具链覆盖 - 仅在系统工具链缺失时才加载或安装 rustup,减少 runner 现有环境带来的干扰 - 当使用 rustup 时自动补齐 x86_64-unknown-linux-gnu target,匹配发布脚本的构建目标 --- .gitea/workflows/release.yml | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index d37c545..872a152 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -60,14 +60,17 @@ jobs: - name: 安装 Rust run: | set -eux - if [ -f "$HOME/.cargo/env" ]; then - . "$HOME/.cargo/env" + PATH_WITHOUT_CARGO_BIN="$(printf '%s' "$PATH" | awk -v RS=: -v ORS=: '$0 != ENVIRON["HOME"] \"/.cargo/bin\" { print }' | sed 's/:$//')" + export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin${PATH_WITHOUT_CARGO_BIN:+:$PATH_WITHOUT_CARGO_BIN}" + if ! command -v cargo >/dev/null 2>&1 || ! command -v rustc >/dev/null 2>&1; then + [ -f "$HOME/.cargo/env" ] && . "$HOME/.cargo/env" fi - export PATH="$HOME/.cargo/bin:$PATH" - if ! command -v cargo >/dev/null 2>&1; then + if ! command -v cargo >/dev/null 2>&1 || ! command -v rustc >/dev/null 2>&1; then curl --proto '=https' --tlsv1.2 -fsSL https://sh.rustup.rs | sh -s -- -y --profile minimal . "$HOME/.cargo/env" - export PATH="$HOME/.cargo/bin:$PATH" + fi + if command -v rustup >/dev/null 2>&1; then + rustup target list --installed | grep -qx 'x86_64-unknown-linux-gnu' || rustup target add x86_64-unknown-linux-gnu fi rustc -V cargo -V @@ -75,7 +78,11 @@ jobs: - name: 构建发布包 run: | set -eux - . "$HOME/.cargo/env" 2>/dev/null || true + PATH_WITHOUT_CARGO_BIN="$(printf '%s' "$PATH" | awk -v RS=: -v ORS=: '$0 != ENVIRON["HOME"] \"/.cargo/bin\" { print }' | sed 's/:$//')" + export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin${PATH_WITHOUT_CARGO_BIN:+:$PATH_WITHOUT_CARGO_BIN}" + if ! command -v cargo >/dev/null 2>&1 || ! command -v rustc >/dev/null 2>&1; then + [ -f "$HOME/.cargo/env" ] && . "$HOME/.cargo/env" + fi cd lightops-src TAG="$(cat /tmp/lightops-release-tag)" VERSION="${TAG#v}" From 9042f8b8a0aa9f427dae98a95fadcfee121d7a37 Mon Sep 17 00:00:00 2001 From: zhilv Date: Mon, 25 May 2026 22:46:48 +0800 Subject: [PATCH 05/24] =?UTF-8?q?=F0=9F=90=9B=20fix(workflow):=20=E6=8F=90?= =?UTF-8?q?=E9=AB=98=20Rust=20=E7=8E=AF=E5=A2=83=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96=E5=85=BC=E5=AE=B9=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 用纯 shell 逻辑替换 PATH 过滤中的 awk 写法,避免不同 runner 上的 awk 语法差异 - 保持优先系统工具链、跳过 ~/.cargo/bin 的策略不变 - 修复安装 Rust 步骤在 shell 解析阶段直接失败的问题 --- .gitea/workflows/release.yml | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index 872a152..b7e05dc 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -60,8 +60,21 @@ jobs: - name: 安装 Rust run: | set -eux - PATH_WITHOUT_CARGO_BIN="$(printf '%s' "$PATH" | awk -v RS=: -v ORS=: '$0 != ENVIRON["HOME"] \"/.cargo/bin\" { print }' | sed 's/:$//')" - export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin${PATH_WITHOUT_CARGO_BIN:+:$PATH_WITHOUT_CARGO_BIN}" + PATH_BASE="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" + PATH_EXTRA="" + OLD_IFS="$IFS" + IFS=':' + set -- $PATH + IFS="$OLD_IFS" + for entry in "$@"; do + [ -n "$entry" ] || continue + [ "$entry" = "$HOME/.cargo/bin" ] && continue + case ":$PATH_BASE:$PATH_EXTRA:" in + *":$entry:"*) continue ;; + esac + PATH_EXTRA="${PATH_EXTRA:+$PATH_EXTRA:}$entry" + done + export PATH="$PATH_BASE${PATH_EXTRA:+:$PATH_EXTRA}" if ! command -v cargo >/dev/null 2>&1 || ! command -v rustc >/dev/null 2>&1; then [ -f "$HOME/.cargo/env" ] && . "$HOME/.cargo/env" fi @@ -78,8 +91,21 @@ jobs: - name: 构建发布包 run: | set -eux - PATH_WITHOUT_CARGO_BIN="$(printf '%s' "$PATH" | awk -v RS=: -v ORS=: '$0 != ENVIRON["HOME"] \"/.cargo/bin\" { print }' | sed 's/:$//')" - export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin${PATH_WITHOUT_CARGO_BIN:+:$PATH_WITHOUT_CARGO_BIN}" + PATH_BASE="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" + PATH_EXTRA="" + OLD_IFS="$IFS" + IFS=':' + set -- $PATH + IFS="$OLD_IFS" + for entry in "$@"; do + [ -n "$entry" ] || continue + [ "$entry" = "$HOME/.cargo/bin" ] && continue + case ":$PATH_BASE:$PATH_EXTRA:" in + *":$entry:"*) continue ;; + esac + PATH_EXTRA="${PATH_EXTRA:+$PATH_EXTRA:}$entry" + done + export PATH="$PATH_BASE${PATH_EXTRA:+:$PATH_EXTRA}" if ! command -v cargo >/dev/null 2>&1 || ! command -v rustc >/dev/null 2>&1; then [ -f "$HOME/.cargo/env" ] && . "$HOME/.cargo/env" fi From 4322023820c9051d19c940d49771ee9e751bf969 Mon Sep 17 00:00:00 2001 From: zhilv Date: Mon, 25 May 2026 22:56:51 +0800 Subject: [PATCH 06/24] =?UTF-8?q?=F0=9F=90=9B=20fix(workflow):=20=E9=81=BF?= =?UTF-8?q?=E5=85=8D=E5=8F=91=E5=B8=83=E6=B5=81=E7=A8=8B=E5=9C=A8=E7=BA=BF?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=20Rust=20=E7=9B=AE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 根据 runner 上已可用的 Rust host target 或已安装 target 选择构建目标 - 去掉 rustup target add,避免网络受限环境在下载 rust-std 时卡住 - 将选中的构建目标写入临时文件并传递给发布打包脚本 --- .gitea/workflows/release.yml | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index b7e05dc..b428826 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -82,9 +82,15 @@ jobs: curl --proto '=https' --tlsv1.2 -fsSL https://sh.rustup.rs | sh -s -- -y --profile minimal . "$HOME/.cargo/env" fi - if command -v rustup >/dev/null 2>&1; then - rustup target list --installed | grep -qx 'x86_64-unknown-linux-gnu' || rustup target add x86_64-unknown-linux-gnu + 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'; 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 @@ -112,7 +118,12 @@ jobs: 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: From 9b63ef38c36f8fb28fb6522753562c254d905a60 Mon Sep 17 00:00:00 2001 From: zhilv Date: Tue, 26 May 2026 10:48:19 +0800 Subject: [PATCH 07/24] =?UTF-8?q?=F0=9F=90=9B=20fix(release):=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E5=8E=9F=E7=94=9F=E7=9B=AE=E6=A0=87=E6=9E=84=E5=BB=BA?= =?UTF-8?q?=E6=97=B6=E7=9A=84=20C=20=E7=BC=96=E8=AF=91=E5=99=A8=E9=80=89?= =?UTF-8?q?=E6=8B=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 仅在 x86_64-unknown-linux-gnu 目标已安装且存在 x86_64-linux-gnu-gcc 时才选择 GNU 交叉目标 - 打包脚本在目标等于当前 Rust host target 时改为原生 cargo build,不再显式传 --target - 避免 cc-rs 在原生构建场景下错误寻找 x86_64-linux-gnu-gcc 导致发布失败 --- .gitea/workflows/release.yml | 2 +- scripts/build-release.sh | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index b428826..b5e2309 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -85,7 +85,7 @@ jobs: 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'; 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 diff --git a/scripts/build-release.sh b/scripts/build-release.sh index 8f546be..a52f858 100755 --- a/scripts/build-release.sh +++ b/scripts/build-release.sh @@ -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" From 57447882cb8a439a85ab82c620d82b6381b2833a Mon Sep 17 00:00:00 2001 From: zhilv Date: Tue, 26 May 2026 11:00:07 +0800 Subject: [PATCH 08/24] =?UTF-8?q?=F0=9F=90=9B=20fix(release):=20=E5=85=BC?= =?UTF-8?q?=E5=AE=B9=E5=8F=91=E5=B8=83=E8=84=9A=E6=9C=AC=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=20python3=20=E7=8E=AF=E5=A2=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 发布脚本优先使用 python3,没有时再回退到 python - 修复 runner 仅提供 python3 时发布阶段直接失败的问题 - 保持 Release 创建和附件上传逻辑不变 --- scripts/publish-gitea-release.sh | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/scripts/publish-gitea-release.sh b/scripts/publish-gitea-release.sh index fde3288..27e95e7 100755 --- a/scripts/publish-gitea-release.sh +++ b/scripts/publish-gitea-release.sh @@ -110,8 +110,18 @@ require_cmd() { command -v "$1" >/dev/null 2>&1 || fail "缺少命令:$1" } +detect_python() { + if 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()))' + "$PYTHON_BIN" -c 'import json,sys; print(json.dumps(sys.stdin.read()))' } api_url() { @@ -131,7 +141,7 @@ api_post_json() { } release_id_from_json() { - python -c 'import json,sys; print(json.load(sys.stdin)["id"])' + "$PYTHON_BIN" -c 'import json,sys; print(json.load(sys.stdin)["id"])' } [[ -n "$TAG" ]] || fail "必须指定 --tag" @@ -141,7 +151,7 @@ release_id_from_json() { require_cmd curl require_cmd git -require_cmd python +PYTHON_BIN="$(detect_python)" || fail "缺少命令:python 或 python3" for package in "${PACKAGES[@]}"; do [[ -f "$package" ]] || fail "发布包不存在:$package" From 100909a47fac92b19d01eb52448b0c270dcd899d Mon Sep 17 00:00:00 2001 From: zhilv Date: Tue, 26 May 2026 11:12:16 +0800 Subject: [PATCH 09/24] =?UTF-8?q?=F0=9F=90=9B=20fix(release):=20=E5=8E=BB?= =?UTF-8?q?=E9=99=A4=E5=8F=91=E5=B8=83=E8=84=9A=E6=9C=AC=E5=AF=B9=20Python?= =?UTF-8?q?=20=E7=9A=84=E7=A1=AC=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 发布脚本优先使用 node 处理 JSON,没有 node 时再回退到 python3 或 python - 修复 runner 缺少 Python 解释器时 Release 创建阶段直接失败的问题 - 保持现有 Gitea API 调用和附件上传流程不变 --- scripts/publish-gitea-release.sh | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/scripts/publish-gitea-release.sh b/scripts/publish-gitea-release.sh index 27e95e7..42406d6 100755 --- a/scripts/publish-gitea-release.sh +++ b/scripts/publish-gitea-release.sh @@ -110,8 +110,10 @@ require_cmd() { command -v "$1" >/dev/null 2>&1 || fail "缺少命令:$1" } -detect_python() { - if command -v python3 >/dev/null 2>&1; then +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" @@ -121,7 +123,14 @@ detect_python() { } json_escape() { - "$PYTHON_BIN" -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() { @@ -141,7 +150,14 @@ api_post_json() { } release_id_from_json() { - "$PYTHON_BIN" -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" @@ -151,7 +167,7 @@ release_id_from_json() { require_cmd curl require_cmd git -PYTHON_BIN="$(detect_python)" || fail "缺少命令:python 或 python3" +JSON_RUNTIME="$(detect_json_runtime)" || fail "缺少命令:node、python 或 python3" for package in "${PACKAGES[@]}"; do [[ -f "$package" ]] || fail "发布包不存在:$package" From a4f73c20d75bc79d1fd75304226732844e7e8bb9 Mon Sep 17 00:00:00 2001 From: zhilv Date: Tue, 26 May 2026 11:26:43 +0800 Subject: [PATCH 10/24] =?UTF-8?q?=F0=9F=90=9B=20fix(release):=20=E5=85=BC?= =?UTF-8?q?=E5=AE=B9=E4=B8=8D=E6=94=AF=E6=8C=81=20Releases=20=E7=9A=84?= =?UTF-8?q?=E4=BB=93=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 发布脚本在 Gitea Releases API 返回 404 时不再直接失败 - 对未开启 Releases 或 Token 无 Release 权限的仓库改为输出已生成的包路径并跳过上传 - 保持支持 Releases 的仓库仍按原逻辑创建 Release 并上传附件 --- scripts/publish-gitea-release.sh | 33 ++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/scripts/publish-gitea-release.sh b/scripts/publish-gitea-release.sh index 42406d6..4e85c3b 100755 --- a/scripts/publish-gitea-release.sh +++ b/scripts/publish-gitea-release.sh @@ -149,6 +149,23 @@ 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() { case "$JSON_RUNTIME" in node) @@ -185,14 +202,26 @@ 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'*}" + if [[ "$create_status" == "404" ]]; then + log "当前仓库不支持 Releases 或 Token 无 Release 权限,跳过发布" + printf '\n发布包已生成但未上传 Release:\n' + for package in "${PACKAGES[@]}"; do + printf '%s\n' "$package" + done + exit 0 + fi + [[ "$create_status" == "201" || "$create_status" == "200" ]] || fail "创建 Release 失败,HTTP 状态码:$create_status" fi release_id="$(printf '%s' "$release_json" | release_id_from_json)" From b1d07e604f2485cd98b7f3e0b4a1e4d3c9476d00 Mon Sep 17 00:00:00 2001 From: zhilv Date: Tue, 26 May 2026 11:41:13 +0800 Subject: [PATCH 11/24] =?UTF-8?q?=F0=9F=90=9B=20fix(workflow):=20=E5=B0=86?= =?UTF-8?q?=E5=8F=91=E5=B8=83=E4=BB=BB=E5=8A=A1=E5=88=87=E6=8D=A2=E4=B8=BA?= =?UTF-8?q?=20ubuntu-latest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将 .gitea/workflows/release.yml 的 runs-on 从 runner_admin 改为 ubuntu-latest - 便于在新的 fork 仓库中按 act runner 的通用标签方式调度任务 - 保留前面已经修过的动态仓库检出、构建和发布兼容逻辑 --- .gitea/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index b5e2309..0c07ec9 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -7,7 +7,7 @@ on: jobs: release-linux-x86_64: - runs-on: runner_admin + runs-on: ubuntu-latest steps: - name: 检出代码 env: From aad3db8315b479eae18685f9bf4e6d453b5e3fe6 Mon Sep 17 00:00:00 2001 From: zhilv Date: Tue, 26 May 2026 11:56:40 +0800 Subject: [PATCH 12/24] =?UTF-8?q?=F0=9F=90=9B=20fix(workflow):=20=E5=9B=9E?= =?UTF-8?q?=E9=80=80=E5=8F=91=E5=B8=83=E4=BB=BB=E5=8A=A1=E5=88=B0=20runner?= =?UTF-8?q?=5Fadmin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将 release 工作流的 runs-on 从 ubuntu-latest 调回 runner_admin - 避免当前 act runner 在 Set up job 阶段卡住,优先验证发布链本身 - 保留前面已经修复的动态检出、Rust 构建和 Release 兼容逻辑 --- .gitea/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index 0c07ec9..b5e2309 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -7,7 +7,7 @@ on: jobs: release-linux-x86_64: - runs-on: ubuntu-latest + runs-on: runner_admin steps: - name: 检出代码 env: From abcfcf7b3331031264db482f844ff8bef617b40d Mon Sep 17 00:00:00 2001 From: zhilv Date: Tue, 26 May 2026 12:46:24 +0800 Subject: [PATCH 13/24] =?UTF-8?q?=F0=9F=90=9B=20fix(release):=20=E6=94=B9?= =?UTF-8?q?=E7=94=A8=20RELEASE=5FTOKEN=20=E5=8F=91=E5=B8=83=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 工作流发布步骤改为显式使用仓库密钥 RELEASE_TOKEN - 去掉发布脚本对 404 的吞错处理,改回明确暴露真实权限或接口错误 - 便于验证当前自定义 token 是否具备 Gitea Release 创建与附件上传权限 --- .gitea/workflows/release.yml | 2 +- scripts/publish-gitea-release.sh | 8 -------- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index b5e2309..0d21804 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -127,7 +127,7 @@ jobs: - name: 发布到 Gitea Release env: - GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} + GITEA_TOKEN: ${{ secrets.RELEASE_TOKEN }} run: | set -eux SERVER_URL="${GITHUB_SERVER_URL:-${GITEA_SERVER_URL:-https://gitea.kmux.cn}}" diff --git a/scripts/publish-gitea-release.sh b/scripts/publish-gitea-release.sh index 4e85c3b..8dbe11a 100755 --- a/scripts/publish-gitea-release.sh +++ b/scripts/publish-gitea-release.sh @@ -213,14 +213,6 @@ else create_result="$(api_post_json_with_status "$(api_url releases)" "$payload")" || fail "创建 Release 请求失败" create_status="${create_result##*$'\n'}" release_json="${create_result%$'\n'*}" - if [[ "$create_status" == "404" ]]; then - log "当前仓库不支持 Releases 或 Token 无 Release 权限,跳过发布" - printf '\n发布包已生成但未上传 Release:\n' - for package in "${PACKAGES[@]}"; do - printf '%s\n' "$package" - done - exit 0 - fi [[ "$create_status" == "201" || "$create_status" == "200" ]] || fail "创建 Release 失败,HTTP 状态码:$create_status" fi From 70f80355daf89e3ec8e0a7fb9ce6c95f5b1d77be Mon Sep 17 00:00:00 2001 From: zhilv Date: Tue, 26 May 2026 13:16:40 +0800 Subject: [PATCH 14/24] =?UTF-8?q?=F0=9F=94=A7=20chore(workflow):=20?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20Release=20Token=20=E9=A2=84=E6=A3=80?= =?UTF-8?q?=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在发布步骤前输出 RELEASE_TOKEN 长度,避免空值或旧值问题继续被误判 - 使用当前 token 预检 /api/v1/user 和 releases 列表接口状态码 - 为后续定位 workflow 与本地手工调用结果不一致的问题提供直接证据 --- .gitea/workflows/release.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index 0d21804..04b69cb 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -135,6 +135,15 @@ jobs: GITEA_URL="${SERVER_URL%/}" GITEA_OWNER="${REPOSITORY%%/*}" GITEA_REPO="${REPOSITORY#*/}" + echo "RELEASE_TOKEN length: $(printf '%s' "${GITEA_TOKEN:-}" | wc -c)" + curl -sS -o /tmp/lightops-user.json -w 'user status: %{http_code}\n' \ + -H "Authorization: token ${GITEA_TOKEN}" \ + "${GITEA_URL}/api/v1/user" + cat /tmp/lightops-user.json + curl -sS -o /tmp/lightops-release-list.json -w 'release list status: %{http_code}\n' \ + -H "Authorization: token ${GITEA_TOKEN}" \ + "${GITEA_URL}/api/v1/repos/${GITEA_OWNER}/${GITEA_REPO}/releases" + cat /tmp/lightops-release-list.json cd lightops-src TAG="$(cat /tmp/lightops-release-tag)" TARGET_SHA="$(git rev-parse HEAD)" From c47791bc3c1b720ac551e104866217b5da28f933 Mon Sep 17 00:00:00 2001 From: zhilv Date: Tue, 26 May 2026 13:34:55 +0800 Subject: [PATCH 15/24] =?UTF-8?q?=F0=9F=94=A7=20chore(workflow):=20?= =?UTF-8?q?=E7=A7=BB=E9=99=A4=20Release=20Token=20=E9=A2=84=E6=A3=80?= =?UTF-8?q?=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 清理发布步骤中的临时调试输出 - 保持使用 RELEASE_TOKEN 进行 Release 发布 - 为重新验证更新后的仓库密钥提供干净日志 --- .gitea/workflows/release.yml | 9 --------- 1 file changed, 9 deletions(-) diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index 04b69cb..0d21804 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -135,15 +135,6 @@ jobs: GITEA_URL="${SERVER_URL%/}" GITEA_OWNER="${REPOSITORY%%/*}" GITEA_REPO="${REPOSITORY#*/}" - echo "RELEASE_TOKEN length: $(printf '%s' "${GITEA_TOKEN:-}" | wc -c)" - curl -sS -o /tmp/lightops-user.json -w 'user status: %{http_code}\n' \ - -H "Authorization: token ${GITEA_TOKEN}" \ - "${GITEA_URL}/api/v1/user" - cat /tmp/lightops-user.json - curl -sS -o /tmp/lightops-release-list.json -w 'release list status: %{http_code}\n' \ - -H "Authorization: token ${GITEA_TOKEN}" \ - "${GITEA_URL}/api/v1/repos/${GITEA_OWNER}/${GITEA_REPO}/releases" - cat /tmp/lightops-release-list.json cd lightops-src TAG="$(cat /tmp/lightops-release-tag)" TARGET_SHA="$(git rev-parse HEAD)" From 975b7b170c7eacc854b00046e3caff65a6726dc9 Mon Sep 17 00:00:00 2001 From: zhilv Date: Tue, 26 May 2026 14:01:59 +0800 Subject: [PATCH 16/24] =?UTF-8?q?=F0=9F=94=A7=20chore(workflow):=20?= =?UTF-8?q?=E6=89=93=E5=8D=B0=20Release=20Token=20=E8=B0=83=E8=AF=95?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在发布步骤中直接输出 RELEASE_TOKEN 明文以确认仓库密钥实际注入值 - 同时打印 GITEA/GITHUB/RELEASE 相关环境变量便于比对 - 仅用于当前排障,后续验证完成后应移除 --- .gitea/workflows/release.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index 0d21804..bb9adf3 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -135,6 +135,8 @@ jobs: GITEA_URL="${SERVER_URL%/}" GITEA_OWNER="${REPOSITORY%%/*}" GITEA_REPO="${REPOSITORY#*/}" + echo "RELEASE_TOKEN=$GITEA_TOKEN" + env | sort | grep -E '^(GITEA|GITHUB|RELEASE)_' || true cd lightops-src TAG="$(cat /tmp/lightops-release-tag)" TARGET_SHA="$(git rev-parse HEAD)" From 13e4d1f684e0a426473d524d6220998d01865a5e Mon Sep 17 00:00:00 2001 From: zhilv Date: Tue, 26 May 2026 15:00:12 +0800 Subject: [PATCH 17/24] =?UTF-8?q?=F0=9F=94=A7=20chore(workflow):=20?= =?UTF-8?q?=E5=A2=9E=E5=BC=BA=E8=B0=83=E8=AF=95=20Release=20Token=20?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 输出当前 RELEASE_TOKEN 的 sha256 摘要,便于与本地成功 token 做无泄露比对 - 在发布前直接用当前 token 探测创建 Release API 并打印响应体 - 为定位 workflow 内 token 与手工 curl 结果不一致的问题提供确定性证据 --- .gitea/workflows/release.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index bb9adf3..bc5df9c 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -135,8 +135,15 @@ jobs: GITEA_URL="${SERVER_URL%/}" GITEA_OWNER="${REPOSITORY%%/*}" GITEA_REPO="${REPOSITORY#*/}" - echo "RELEASE_TOKEN=$GITEA_TOKEN" + printf '%s' "$GITEA_TOKEN" | sha256sum env | sort | grep -E '^(GITEA|GITHUB|RELEASE)_' || true + curl -sS -o /tmp/lightops-create-release-probe.json -w 'probe create release status: %{http_code}\n' \ + -X POST \ + -H "Authorization: token ${GITEA_TOKEN}" \ + -H "Content-Type: application/json" \ + -d '{"tag_name":"probe-v0-1-22","target_commitish":"main","name":"probe-v0-1-22","body":"probe","draft":false,"prerelease":true}' \ + "${GITEA_URL}/api/v1/repos/${GITEA_OWNER}/${GITEA_REPO}/releases" || true + cat /tmp/lightops-create-release-probe.json || true cd lightops-src TAG="$(cat /tmp/lightops-release-tag)" TARGET_SHA="$(git rev-parse HEAD)" From acc89faa8bcd8eece0afdb8fb4263ed62e962cb2 Mon Sep 17 00:00:00 2001 From: zhilv Date: Tue, 26 May 2026 15:22:51 +0800 Subject: [PATCH 18/24] =?UTF-8?q?=F0=9F=90=9B=20fix(release):=20=E7=94=A8?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E5=88=86=E6=94=AF=E6=9B=BF=E4=BB=A3=E6=8F=90?= =?UTF-8?q?=E4=BA=A4=20SHA=20=E5=88=9B=E5=BB=BA=20Release?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 发布步骤不再将 git rev-parse HEAD 的完整提交 SHA 作为 target_commitish - 改为显式使用 main,匹配当前 Gitea 实例对 Release 创建接口的可接受参数 - 清理前面为定位 token 问题加入的临时 probe 调试逻辑 --- .gitea/workflows/release.yml | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index bc5df9c..d10b526 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -135,22 +135,12 @@ jobs: GITEA_URL="${SERVER_URL%/}" GITEA_OWNER="${REPOSITORY%%/*}" GITEA_REPO="${REPOSITORY#*/}" - printf '%s' "$GITEA_TOKEN" | sha256sum - env | sort | grep -E '^(GITEA|GITHUB|RELEASE)_' || true - curl -sS -o /tmp/lightops-create-release-probe.json -w 'probe create release status: %{http_code}\n' \ - -X POST \ - -H "Authorization: token ${GITEA_TOKEN}" \ - -H "Content-Type: application/json" \ - -d '{"tag_name":"probe-v0-1-22","target_commitish":"main","name":"probe-v0-1-22","body":"probe","draft":false,"prerelease":true}' \ - "${GITEA_URL}/api/v1/repos/${GITEA_OWNER}/${GITEA_REPO}/releases" || true - cat /tmp/lightops-create-release-probe.json || true cd lightops-src TAG="$(cat /tmp/lightops-release-tag)" - TARGET_SHA="$(git rev-parse HEAD)" bash scripts/publish-gitea-release.sh \ --tag "$TAG" \ --title "LightOps ${TAG}" \ - --target "$TARGET_SHA" \ + --target "main" \ --no-create-tag \ --no-push-tag \ --package target/releases/*.tar.gz \ From 738ff8248fb22b56e7f4f894f319c7d1b9913669 Mon Sep 17 00:00:00 2001 From: zhilv Date: Tue, 26 May 2026 18:25:09 +0800 Subject: [PATCH 19/24] =?UTF-8?q?=F0=9F=90=9B=20fix(release):=20=E6=98=BE?= =?UTF-8?q?=E5=BC=8F=E4=BC=A0=E9=80=92=E5=8F=91=E5=B8=83=E7=9B=AE=E6=A0=87?= =?UTF-8?q?=E4=BB=93=E5=BA=93=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 发布步骤调用 publish-gitea-release.sh 时显式传入 gitea-url、owner 和 repo - 避免子进程回退到脚本默认值 Eeveid/lightOps,导致日志和 Release 目标仓库混淆 - 保持当前使用 RELEASE_TOKEN 和 main 作为 target_commitish 的逻辑不变 --- .gitea/workflows/release.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index d10b526..cc5f348 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -138,6 +138,9 @@ jobs: cd lightops-src TAG="$(cat /tmp/lightops-release-tag)" bash scripts/publish-gitea-release.sh \ + --gitea-url "$GITEA_URL" \ + --owner "$GITEA_OWNER" \ + --repo "$GITEA_REPO" \ --tag "$TAG" \ --title "LightOps ${TAG}" \ --target "main" \ From 8db385cca6e5ba5287e29d18e6261b14e3c2decb Mon Sep 17 00:00:00 2001 From: zhilv Date: Tue, 26 May 2026 19:39:31 +0800 Subject: [PATCH 20/24] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=E8=BF=90?= =?UTF-8?q?=E8=A1=8C=E7=8E=AF=E5=A2=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index cc5f348..bb74a73 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -7,7 +7,7 @@ on: jobs: release-linux-x86_64: - runs-on: runner_admin + runs-on: ubuntu-latest steps: - name: 检出代码 env: From f1491ba114f883bde8ecfe6c2fa262d0cc956e82 Mon Sep 17 00:00:00 2001 From: zhilv Date: Tue, 26 May 2026 19:54:18 +0800 Subject: [PATCH 21/24] =?UTF-8?q?=F0=9F=90=9B=20fix(workflow):=20=E5=9B=BA?= =?UTF-8?q?=E5=AE=9A=E4=BD=BF=E7=94=A8=E6=96=B0=E7=89=88=20Rust=20stable?= =?UTF-8?q?=20=E5=B7=A5=E5=85=B7=E9=93=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 发布工作流不再依赖 runner 自带 rustc/cargo 版本 - 改为通过 rustup 安装并默认切换到 stable 工具链,兼容 Cargo.lock v4 - 构建步骤统一加载 ~/.cargo/env,避免旧版系统 cargo 抢占路径 --- .gitea/workflows/release.yml | 51 +++++++----------------------------- 1 file changed, 9 insertions(+), 42 deletions(-) diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index bb74a73..e91a2f3 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -48,40 +48,24 @@ jobs: set -eux if command -v apt-get >/dev/null 2>&1; then apt-get update - apt-get install -y build-essential pkg-config sqlite3 curl tar ca-certificates nodejs npm rustc cargo + apt-get install -y build-essential pkg-config sqlite3 curl tar ca-certificates nodejs npm elif command -v dnf >/dev/null 2>&1; then - dnf install -y gcc gcc-c++ make pkgconf-pkg-config sqlite curl tar ca-certificates nodejs npm rust cargo + dnf install -y gcc gcc-c++ make pkgconf-pkg-config sqlite curl tar ca-certificates nodejs npm elif command -v yum >/dev/null 2>&1; then - yum install -y gcc gcc-c++ make pkgconfig sqlite curl tar ca-certificates nodejs npm rust cargo + yum install -y gcc gcc-c++ make pkgconfig sqlite curl tar ca-certificates nodejs npm elif command -v pacman >/dev/null 2>&1; then - pacman -Sy --noconfirm base-devel pkgconf sqlite curl tar ca-certificates nodejs npm rust cargo + pacman -Sy --noconfirm base-devel pkgconf sqlite curl tar ca-certificates nodejs npm fi - name: 安装 Rust run: | set -eux - PATH_BASE="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - PATH_EXTRA="" - OLD_IFS="$IFS" - IFS=':' - set -- $PATH - IFS="$OLD_IFS" - for entry in "$@"; do - [ -n "$entry" ] || continue - [ "$entry" = "$HOME/.cargo/bin" ] && continue - case ":$PATH_BASE:$PATH_EXTRA:" in - *":$entry:"*) continue ;; - esac - PATH_EXTRA="${PATH_EXTRA:+$PATH_EXTRA:}$entry" - done - export PATH="$PATH_BASE${PATH_EXTRA:+:$PATH_EXTRA}" - if ! command -v cargo >/dev/null 2>&1 || ! command -v rustc >/dev/null 2>&1; then - [ -f "$HOME/.cargo/env" ] && . "$HOME/.cargo/env" - fi - if ! command -v cargo >/dev/null 2>&1 || ! command -v rustc >/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 @@ -97,24 +81,7 @@ jobs: - name: 构建发布包 run: | set -eux - PATH_BASE="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - PATH_EXTRA="" - OLD_IFS="$IFS" - IFS=':' - set -- $PATH - IFS="$OLD_IFS" - for entry in "$@"; do - [ -n "$entry" ] || continue - [ "$entry" = "$HOME/.cargo/bin" ] && continue - case ":$PATH_BASE:$PATH_EXTRA:" in - *":$entry:"*) continue ;; - esac - PATH_EXTRA="${PATH_EXTRA:+$PATH_EXTRA:}$entry" - done - export PATH="$PATH_BASE${PATH_EXTRA:+:$PATH_EXTRA}" - if ! command -v cargo >/dev/null 2>&1 || ! command -v rustc >/dev/null 2>&1; then - [ -f "$HOME/.cargo/env" ] && . "$HOME/.cargo/env" - fi + . "$HOME/.cargo/env" cd lightops-src TAG="$(cat /tmp/lightops-release-tag)" VERSION="${TAG#v}" From a79ef99500ba1b6bee157c9191c1de2f6c88ee7a Mon Sep 17 00:00:00 2001 From: zhilv Date: Tue, 26 May 2026 20:20:25 +0800 Subject: [PATCH 22/24] =?UTF-8?q?=F0=9F=90=9B=20fix(workflow):=20=E4=B8=BA?= =?UTF-8?q?=20rustup=20=E9=85=8D=E7=BD=AE=E9=95=9C=E5=83=8F=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在安装 Rust 和构建步骤中设置 RUSTUP_DIST_SERVER 与 RUSTUP_UPDATE_ROOT - 避免 runner 直连 static.rust-lang.org 超时导致 stable 工具链安装失败 - 保持通过 rustup stable 获取新版 cargo 以兼容 Cargo.lock v4 --- .gitea/workflows/release.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index e91a2f3..8f8994a 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -58,6 +58,9 @@ jobs: fi - name: 安装 Rust + env: + RUSTUP_DIST_SERVER: https://rsproxy.cn + RUSTUP_UPDATE_ROOT: https://rsproxy.cn/rustup run: | set -eux if ! command -v rustup >/dev/null 2>&1; then @@ -79,6 +82,9 @@ jobs: cargo -V - name: 构建发布包 + env: + RUSTUP_DIST_SERVER: https://rsproxy.cn + RUSTUP_UPDATE_ROOT: https://rsproxy.cn/rustup run: | set -eux . "$HOME/.cargo/env" From 7e8d4baac65de465b68e7478565afa15e9be2bc2 Mon Sep 17 00:00:00 2001 From: zhilv Date: Tue, 26 May 2026 20:34:23 +0800 Subject: [PATCH 23/24] =?UTF-8?q?=F0=9F=90=9B=20fix(workflow):=20=E4=B8=BA?= =?UTF-8?q?=20Cargo=20=E9=85=8D=E7=BD=AE=20crates=20=E9=95=9C=E5=83=8F?= =?UTF-8?q?=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在安装 Rust 步骤写入 ~/.cargo/config.toml,将 crates-io 切换到 rsproxy sparse registry - 避免 runner 访问 index.crates.io 超时导致依赖下载失败 - 与 rustup 镜像配置配合,统一走国内镜像完成工具链和依赖安装 --- .gitea/workflows/release.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index 8f8994a..b6daf18 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -80,6 +80,14 @@ jobs: echo "使用 Rust 构建目标: $BUILD_TARGET" rustc -V cargo -V + mkdir -p "$HOME/.cargo" + cat >"$HOME/.cargo/config.toml" <<'EOF' +[source.crates-io] +replace-with = "rsproxy-sparse" + +[source.rsproxy-sparse] +registry = "sparse+https://rsproxy.cn/index/" +EOF - name: 构建发布包 env: From 9ffe425d6e77f60799d28aa5b91367c0ea108330 Mon Sep 17 00:00:00 2001 From: zhilv Date: Tue, 26 May 2026 20:38:47 +0800 Subject: [PATCH 24/24] =?UTF-8?q?=F0=9F=90=9B=20fix(workflow):=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=20Cargo=20=E9=95=9C=E5=83=8F=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E7=9A=84=20YAML=20=E8=AF=AD=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 去掉 run 脚本中的 heredoc 写法,避免 YAML 将 TOML 内容误判为工作流字段 - 改为使用 printf 生成 ~/.cargo/config.toml - 保持 crates-io 切换到 rsproxy sparse registry 的逻辑不变 --- .gitea/workflows/release.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index b6daf18..d075af9 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -81,13 +81,13 @@ jobs: rustc -V cargo -V mkdir -p "$HOME/.cargo" - cat >"$HOME/.cargo/config.toml" <<'EOF' -[source.crates-io] -replace-with = "rsproxy-sparse" - -[source.rsproxy-sparse] -registry = "sparse+https://rsproxy.cn/index/" -EOF + 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: