新增 Gitea 自动发布流程
Some checks failed
发布 Linux 二进制 / release-linux-x86_64 (push) Failing after 14m38s

This commit is contained in:
2026-05-25 11:44:51 +08:00
parent 4b2b5a2df6
commit f3162fba44
4 changed files with 388 additions and 0 deletions

186
scripts/publish-gitea-release.sh Executable file
View File

@@ -0,0 +1,186 @@
#!/usr/bin/env bash
set -Eeuo pipefail
GITEA_URL="${GITEA_URL:-https://gitea.kmux.cn}"
OWNER="${GITEA_OWNER:-Eeveid}"
REPO="${GITEA_REPO:-lightOps}"
TAG=""
TITLE=""
NOTES=""
TARGET="main"
CREATE_TAG="true"
PUSH_TAG="true"
PRERELEASE="false"
PACKAGES=()
usage() {
cat <<'EOF'
LightOps Gitea Release 自动发布脚本
用法:
GITEA_TOKEN=<token> bash scripts/publish-gitea-release.sh --tag v0.1.0 --package target/releases/lightops.tar.gz
选项:
--gitea-url <url> Gitea 地址,默认 https://gitea.kmux.cn
--owner <owner> 仓库所有者,默认 Eeveid
--repo <repo> 仓库名,默认 lightOps
--tag <tag> 发布标签,例如 v0.1.0,必填
--title <title> Release 标题,默认等于 tag
--notes <text> Release 说明
--target <ref> tag 指向的分支或提交,默认 main
--package <path> 要上传的发布包,可重复传入
--no-create-tag 不自动创建本地 tag
--no-push-tag 不自动推送 tag
--prerelease 标记为预发布
-h, --help 显示帮助
环境变量:
GITEA_TOKEN Gitea Access Token必须具备仓库 Release 写入权限
EOF
}
while [[ $# -gt 0 ]]; do
case "$1" in
--gitea-url)
GITEA_URL="${2:?缺少 --gitea-url 参数值}"
shift 2
;;
--owner)
OWNER="${2:?缺少 --owner 参数值}"
shift 2
;;
--repo)
REPO="${2:?缺少 --repo 参数值}"
shift 2
;;
--tag)
TAG="${2:?缺少 --tag 参数值}"
shift 2
;;
--title)
TITLE="${2:?缺少 --title 参数值}"
shift 2
;;
--notes)
NOTES="${2:?缺少 --notes 参数值}"
shift 2
;;
--target)
TARGET="${2:?缺少 --target 参数值}"
shift 2
;;
--package)
PACKAGES+=("${2:?缺少 --package 参数值}")
shift 2
;;
--no-create-tag)
CREATE_TAG="false"
shift
;;
--no-push-tag)
PUSH_TAG="false"
shift
;;
--prerelease)
PRERELEASE="true"
shift
;;
-h|--help)
usage
exit 0
;;
*)
echo "未知参数:$1" >&2
usage >&2
exit 2
;;
esac
done
log() {
printf '\033[1;32m[LightOps]\033[0m %s\n' "$*"
}
fail() {
printf '\033[1;31m[LightOps]\033[0m %s\n' "$*" >&2
exit 1
}
require_cmd() {
command -v "$1" >/dev/null 2>&1 || fail "缺少命令:$1"
}
json_escape() {
python -c 'import json,sys; print(json.dumps(sys.stdin.read()))'
}
api_url() {
printf '%s/api/v1/repos/%s/%s/%s' "${GITEA_URL%/}" "$OWNER" "$REPO" "$1"
}
api_get() {
curl -fsS -H "Authorization: token ${GITEA_TOKEN}" "$1"
}
api_post_json() {
curl -fsS -X POST \
-H "Authorization: token ${GITEA_TOKEN}" \
-H "Content-Type: application/json" \
-d "$2" \
"$1"
}
release_id_from_json() {
python -c 'import json,sys; print(json.load(sys.stdin)["id"])'
}
[[ -n "$TAG" ]] || fail "必须指定 --tag"
[[ -n "${GITEA_TOKEN:-}" ]] || fail "必须设置 GITEA_TOKEN"
[[ ${#PACKAGES[@]} -gt 0 ]] || fail "至少指定一个 --package"
[[ -n "$TITLE" ]] || TITLE="$TAG"
require_cmd curl
require_cmd git
require_cmd python
for package in "${PACKAGES[@]}"; do
[[ -f "$package" ]] || fail "发布包不存在:$package"
done
if [[ "$CREATE_TAG" == "true" ]] && ! git rev-parse "$TAG" >/dev/null 2>&1; then
log "创建本地 tag$TAG"
git tag -a "$TAG" "$TARGET" -m "$TITLE"
fi
if [[ "$PUSH_TAG" == "true" ]]; then
log "推送 tag$TAG"
git push origin "$TAG"
fi
release_url="$(api_url "releases/tags/${TAG}")"
release_json=""
if 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")"
fi
release_id="$(printf '%s' "$release_json" | release_id_from_json)"
for package in "${PACKAGES[@]}"; do
name="$(basename "$package")"
log "上传附件:$name"
curl -fsS -X POST \
-H "Authorization: token ${GITEA_TOKEN}" \
-F "attachment=@${package}" \
"$(api_url "releases/${release_id}/assets")?name=${name}" >/dev/null
done
cat <<EOF
Release 发布完成:
${GITEA_URL%/}/${OWNER}/${REPO}/releases/tag/${TAG}
EOF