2 Commits
main ... v0.1.5

Author SHA1 Message Date
61e7800b51 安装发布构建所需 Rust 目标
Some checks failed
发布 Linux 二进制 / release-linux-x86_64 (push) Failing after 3m8s
2026-05-25 17:59:17 +08:00
a97ec39a1c 兼容更多 Runner 基础镜像
Some checks failed
发布 Linux 二进制 / release-linux-x86_64 (push) Failing after 1h58m58s
2026-05-25 15:06:13 +08:00
3 changed files with 48 additions and 117 deletions

View File

@@ -7,22 +7,14 @@ on:
jobs: jobs:
release-linux-x86_64: release-linux-x86_64:
runs-on: ubuntu-latest runs-on: runner_admin
steps: steps:
- name: 检出代码 - name: 检出代码
env: env:
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
GIT_TERMINAL_PROMPT: "0"
run: | run: |
set -eux 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:-}}" TAG="${GITHUB_REF_NAME:-${GITEA_REF_NAME:-}}"
if [ -z "$REPOSITORY" ]; then
echo "无法识别触发仓库"
env | sort
exit 1
fi
if [ -z "$TAG" ] && [ -n "${GITHUB_REF:-}" ]; then if [ -z "$TAG" ] && [ -n "${GITHUB_REF:-}" ]; then
TAG="${GITHUB_REF##*/}" TAG="${GITHUB_REF##*/}"
fi fi
@@ -31,17 +23,16 @@ jobs:
env | sort env | sort
exit 1 exit 1
fi fi
CLONE_URL="${SERVER_URL%/}/${REPOSITORY}.git"
printf '%s' "$TAG" > /tmp/lightops-release-tag printf '%s' "$TAG" > /tmp/lightops-release-tag
rm -rf lightops-src rm -rf lightops-src
if [ -n "${GITEA_TOKEN:-}" ]; then if [ -n "${GITEA_TOKEN:-}" ]; then
AUTH_HEADER="Authorization: Basic $(printf 'oauth2:%s' "$GITEA_TOKEN" | base64 | tr -d '\n')" git clone "https://oauth2:${GITEA_TOKEN}@gitea.kmux.cn/Eeveid/lightOps.git" lightops-src
git -c http.extraHeader="$AUTH_HEADER" clone --branch "$TAG" --depth 1 --single-branch "$CLONE_URL" lightops-src
else else
git clone --branch "$TAG" --depth 1 --single-branch "$CLONE_URL" lightops-src git clone https://gitea.kmux.cn/Eeveid/lightOps.git lightops-src
fi fi
cd lightops-src cd lightops-src
git rev-parse --verify HEAD git fetch --tags --force
git checkout "$TAG"
- name: 安装系统依赖 - name: 安装系统依赖
run: | run: |
@@ -49,82 +40,71 @@ jobs:
if command -v apt-get >/dev/null 2>&1; then if command -v apt-get >/dev/null 2>&1; then
apt-get update 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
elif command -v apk >/dev/null 2>&1; then
apk add --no-cache build-base pkgconf sqlite curl wget tar ca-certificates nodejs npm bash git
elif command -v dnf >/dev/null 2>&1; then 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
elif command -v yum >/dev/null 2>&1; then 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
elif command -v pacman >/dev/null 2>&1; then 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
else
echo "未找到支持的包管理器,当前系统信息:"
uname -a || true
cat /etc/os-release || true
echo "PATH=$PATH"
exit 1
fi fi
command -v git
command -v tar
command -v node
command -v npm
command -v curl || command -v wget
- name: 安装 Rust - name: 安装 Rust
env:
RUSTUP_DIST_SERVER: https://rsproxy.cn
RUSTUP_UPDATE_ROOT: https://rsproxy.cn/rustup
run: | run: |
set -eux set -eux
if ! command -v rustup >/dev/null 2>&1; then if ! command -v cargo >/dev/null 2>&1; then
curl --proto '=https' --tlsv1.2 -fsSL https://sh.rustup.rs | sh -s -- -y --profile minimal if command -v curl >/dev/null 2>&1; then
fi curl --proto '=https' --tlsv1.2 -fsSL https://sh.rustup.rs | sh -s -- -y --profile minimal
. "$HOME/.cargo/env" elif command -v wget >/dev/null 2>&1; then
rustup toolchain install stable --profile minimal --no-self-update wget -qO- https://sh.rustup.rs | sh -s -- -y --profile minimal
rustup default stable else
HOST_TARGET="$(rustc -vV | sed -n 's/^host: //p')" echo "缺少 curl/wget无法安装 Rust"
BUILD_TARGET="$HOST_TARGET" exit 1
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
. "$HOME/.cargo/env"
fi fi
printf '%s' "$BUILD_TARGET" > /tmp/lightops-build-target
echo "使用 Rust 构建目标: $BUILD_TARGET"
rustc -V rustc -V
cargo -V cargo -V
mkdir -p "$HOME/.cargo" if command -v rustup >/dev/null 2>&1; then
printf '%s\n' \ rustup target add x86_64-unknown-linux-gnu
'[source.crates-io]' \ fi
'replace-with = "rsproxy-sparse"' \
'' \
'[source.rsproxy-sparse]' \
'registry = "sparse+https://rsproxy.cn/index/"' \
>"$HOME/.cargo/config.toml"
- name: 构建发布包 - name: 构建发布包
env:
RUSTUP_DIST_SERVER: https://rsproxy.cn
RUSTUP_UPDATE_ROOT: https://rsproxy.cn/rustup
run: | run: |
set -eux set -eux
. "$HOME/.cargo/env" . "$HOME/.cargo/env" 2>/dev/null || true
cd lightops-src cd lightops-src
TAG="$(cat /tmp/lightops-release-tag)" TAG="$(cat /tmp/lightops-release-tag)"
VERSION="${TAG#v}" VERSION="${TAG#v}"
BUILD_TARGET="$(cat /tmp/lightops-build-target 2>/dev/null || true)" bash scripts/build-release.sh --version "$VERSION" --target x86_64-unknown-linux-gnu
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 - name: 发布到 Gitea Release
env: env:
GITEA_TOKEN: ${{ secrets.RELEASE_TOKEN }} GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
GITEA_URL: https://gitea.kmux.cn
GITEA_OWNER: Eeveid
GITEA_REPO: lightOps
run: | run: |
set -eux 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 cd lightops-src
TAG="$(cat /tmp/lightops-release-tag)" TAG="$(cat /tmp/lightops-release-tag)"
TARGET_SHA="$(git rev-parse HEAD)"
bash scripts/publish-gitea-release.sh \ bash scripts/publish-gitea-release.sh \
--gitea-url "$GITEA_URL" \
--owner "$GITEA_OWNER" \
--repo "$GITEA_REPO" \
--tag "$TAG" \ --tag "$TAG" \
--title "LightOps ${TAG}" \ --title "LightOps ${TAG}" \
--target "main" \ --target "$TARGET_SHA" \
--no-create-tag \ --no-create-tag \
--no-push-tag \ --no-push-tag \
--package target/releases/*.tar.gz \ --package target/releases/*.tar.gz \

View File

@@ -111,11 +111,6 @@ PLATFORM="${TARGET:-$(detect_platform)}"
PACKAGE_NAME="lightops-${VERSION}-${PLATFORM}" PACKAGE_NAME="lightops-${VERSION}-${PLATFORM}"
STAGE_DIR="target/release-package/${PACKAGE_NAME}" STAGE_DIR="target/release-package/${PACKAGE_NAME}"
ARCHIVE_PATH="${OUTPUT_DIR}/${PACKAGE_NAME}.tar.gz" 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 if [[ "$SKIP_BUILD" != "true" ]]; then
log "构建前端" log "构建前端"
@@ -129,7 +124,10 @@ if [[ "$SKIP_BUILD" != "true" ]]; then
log "构建 Rust 二进制" log "构建 Rust 二进制"
cd "$ROOT" cd "$ROOT"
if [[ -n "$TARGET" && "$NATIVE_TARGET" != "true" ]]; then if [[ -n "$TARGET" ]]; then
if command -v rustup >/dev/null 2>&1; then
rustup target add "$TARGET"
fi
cargo build --release --target "$TARGET" -p lightops-server -p lightops-agent cargo build --release --target "$TARGET" -p lightops-server -p lightops-agent
BIN_DIR="target/${TARGET}/release" BIN_DIR="target/${TARGET}/release"
else else
@@ -138,7 +136,7 @@ if [[ "$SKIP_BUILD" != "true" ]]; then
fi fi
else else
cd "$ROOT" cd "$ROOT"
if [[ -n "$TARGET" && "$NATIVE_TARGET" != "true" ]]; then if [[ -n "$TARGET" ]]; then
BIN_DIR="target/${TARGET}/release" BIN_DIR="target/${TARGET}/release"
else else
BIN_DIR="target/release" BIN_DIR="target/release"

View File

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