ci: publish with the token that actually works
The job token belongs to the gitea-actions pseudo user, which is not an organisation member, and Gitea grants package write only to members of the owning organisation; v1.0.2 proved it with E401 on the job token and a successful publish on the PAT. The step now prefers NPM_TOKEN and only falls back to the job token, printing its identity when it does.
This commit is contained in:
@@ -11,14 +11,12 @@
|
|||||||
# 已发布的版本不会让工作流失败:注册表返回 409(version already exists)时这一步记为
|
# 已发布的版本不会让工作流失败:注册表返回 409(version already exists)时这一步记为
|
||||||
# “已存在,本次跳过”,所以手动重跑同一个版本是安全的。
|
# “已存在,本次跳过”,所以手动重跑同一个版本是安全的。
|
||||||
#
|
#
|
||||||
# 需要的凭据:
|
# 需要的凭据(实测结论,Gitea 1.27.2,本仓库 v1.0.2 那次发布):
|
||||||
# 发包需要一个「对目标包命名空间有写权限」的令牌。工作流优先用 secret NPM_TOKEN
|
# 内置任务令牌**不能**发布包。它在注册表眼里是伪用户 gitea-actions(id -2),不是组织成员,
|
||||||
# (个人访问令牌,权限勾 write:package;仓库级或组织级 secret 均可),没配才退回
|
# 而 Gitea 的包写权限要求「组织成员且具 admin/write 权限」——于是即使工作流声明了
|
||||||
# 内置任务令牌 ${{ secrets.GITEA_TOKEN }}。
|
# permissions: packages: write、组织也把 Actions 令牌权限设成宽松,npm publish 仍返回
|
||||||
# 内置任务令牌能否发包,取决于实例/组织 Settings → Actions 的令牌权限(permissive 还是
|
# E401 Incorrect or missing password。(组织设置里那张“最大令牌权限”表也没有 packages 这一项。)
|
||||||
# restricted,以及上限),以及该令牌是否覆盖目标的包命名空间;Gitea 文档只承诺它访问
|
# 所以发布用 secret NPM_TOKEN = 个人访问令牌,权限勾 write:package;内置令牌只在没配它时兜底。
|
||||||
# “本仓库”。因此**想稳定发布就配 NPM_TOKEN**,除非你实测过本实例的内置令牌可用。
|
|
||||||
# 工作流已声明 permissions: packages: write —— 没有这行时,restricted 模式下令牌是只读的。
|
|
||||||
#
|
#
|
||||||
# 依赖前提:
|
# 依赖前提:
|
||||||
# - 实例启用了 Actions 并注册了 act_runner;runs-on 的标签要与 runner 一致。
|
# - 实例启用了 Actions 并注册了 act_runner;runs-on 的标签要与 runner 一致。
|
||||||
@@ -95,16 +93,8 @@ jobs:
|
|||||||
npm config set @dsh-plugin:registry "${REGISTRY}"
|
npm config set @dsh-plugin:registry "${REGISTRY}"
|
||||||
echo "registry = $(npm config get registry)"
|
echo "registry = $(npm config get registry)"
|
||||||
|
|
||||||
# 内置任务令牌到底是谁、能不能写这个包命名空间:先打印身份,便于事后判断。
|
|
||||||
if [ -n "${JOB_TOKEN:-}" ]; then
|
|
||||||
server="${GITHUB_SERVER_URL:-https://gitea.iwake.top}"
|
|
||||||
who="$(curl -fsS -H "Authorization: token ${JOB_TOKEN}" "${server}/api/v1/user" 2>/dev/null | head -c 300 || true)"
|
|
||||||
echo "内置任务令牌身份:${who:-(查询失败,可能是 curl 不可用或令牌被拒)}"
|
|
||||||
else
|
|
||||||
echo "实例没有注入内置任务令牌(secrets.GITEA_TOKEN 为空)"
|
|
||||||
fi
|
|
||||||
|
|
||||||
RESULT=""
|
RESULT=""
|
||||||
|
LAST_LABEL=""
|
||||||
# 结果分类:published 成功 / exists 版本已存在(不视为失败)/ auth 令牌被拒 / error 其他
|
# 结果分类:published 成功 / exists 版本已存在(不视为失败)/ auth 令牌被拒 / error 其他
|
||||||
run_publish() {
|
run_publish() {
|
||||||
label="$1"
|
label="$1"
|
||||||
@@ -124,19 +114,19 @@ jobs:
|
|||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
if [ -n "${JOB_TOKEN:-}" ]; then
|
|
||||||
run_publish "内置任务令牌 GITEA_TOKEN" "${JOB_TOKEN}"
|
|
||||||
fi
|
|
||||||
if [ "${RESULT}" = "auth" ]; then
|
|
||||||
echo "内置任务令牌无法发布这个包(见上面的错误码),改用 NPM_TOKEN 重试"
|
|
||||||
RESULT=""
|
|
||||||
if [ -n "${NPM_TOKEN:-}" ]; then
|
if [ -n "${NPM_TOKEN:-}" ]; then
|
||||||
run_publish "个人访问令牌 NPM_TOKEN" "${NPM_TOKEN}"
|
run_publish "个人访问令牌 NPM_TOKEN" "${NPM_TOKEN}"
|
||||||
|
elif [ -n "${JOB_TOKEN:-}" ]; then
|
||||||
|
# 兜底路径:本实例实测内置令牌写不了包命名空间(见文件头),这里仍会打印它的身份,
|
||||||
|
# 方便在其它实例上判断到底是"令牌不存在"还是"权限不够"。
|
||||||
|
server="${GITHUB_SERVER_URL:-https://gitea.iwake.top}"
|
||||||
|
who="$(curl -fsS -H "Authorization: token ${JOB_TOKEN}" "${server}/api/v1/user" 2>/dev/null | head -c 300 || true)"
|
||||||
|
echo "没有配置 NPM_TOKEN,退回内置任务令牌;它的身份是:${who:-(查询失败)}"
|
||||||
|
run_publish "内置任务令牌 GITEA_TOKEN" "${JOB_TOKEN}"
|
||||||
else
|
else
|
||||||
echo "没有配置 NPM_TOKEN,无处回退" >&2
|
echo "既没有 NPM_TOKEN 也没有内置任务令牌,无法发布" >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
fi
|
|
||||||
|
|
||||||
case "${RESULT}" in
|
case "${RESULT}" in
|
||||||
published)
|
published)
|
||||||
|
|||||||
Reference in New Issue
Block a user