标识
自托管的 Server API 模式会拒绝没有 Action Token(即 Deploy Token)的 GitHub Action 修改请求。这是给自动化使用的机器凭据,不是 Web 控制台的登录会话,不应该写进仓库配置、Workflow 文件正文、URL 查询字符串或日志。
输入字段、默认值与校验
普通的 SSH 安装不会自动创建 Action Token。需要立即接入 GitHub Action Server API 模式时,安装时加上 --bootstrap-deploy-token,安装器会在容器健康后打印一次 Bootstrap JSON:
{
"schemaVersion": "deploy-token.bootstrap/v1",
"created": true,
"organizationId": "org_self_hosted",
"actionSecretName": "APPALOFT_TOKEN",
"tokenId": "dpt_...",
"secretSuffix": "abcd1234",
"token": "aplt_dt_..."
}token 字段只在首次创建时出现——把它的值保存到 GitHub Repository 或 Organization Secret,名称使用 APPALOFT_TOKEN。重新运行安装器时,如果已经存在有效 Token,输出只包含安全元数据,不会再次显示原始 Token。
Deploy Token 可以限制到工作流命令、Project、Environment、Resource、Server 和仓库范围。当 Token 唯一指定这些目标时,普通的自托管 Action 部署可以省略对应的 id 参数,由 Server 结合 Token 范围、Source Link 和仓库事实自动解析目标。
输出字段与状态值
管理员可以通过 CLI 或受产品会话保护的 HTTP/API 入口管理 Deploy Token:
appaloft deploy-token create --organization-id org_self_hosted --display-name "GitHub Action" \
--workflow-commands source-link-deploy,server-config-deploy,preview-cleanup
appaloft deploy-token list --organization-id org_self_hosted
appaloft deploy-token show <tokenId> --organization-id org_self_hostedPOST /api/deploy-tokens
GET /api/deploy-tokens?organizationId=...
GET /api/deploy-tokens/{tokenId}?organizationId=...创建接口的响应中,原始 Token 只显示一次;列表和详情接口只返回安全元数据。
使用示例
- uses: appaloft/deploy-action@v1
with:
control-plane-mode: self-hosted
control-plane-url: https://console.example.com
appaloft-token: ${{ secrets.APPALOFT_TOKEN }}错误码与恢复提示
| Code | 含义 | 处理方式 |
|---|---|---|
401 action_auth_missing | Action 没有发送 Bearer Token | 检查 Workflow 是否传了 appaloft-token,以及 Secret 名称是否正确 |
401 action_auth_invalid | Token 格式错误、未知、过期或已撤销 | 重新复制 GitHub Secret 时只复制 aplt_dt_... Token 值,不要复制整个 Bootstrap JSON |
403 action_auth_forbidden | Token 有效,但作用域不允许当前请求 | 检查仓库、Project、Environment、Resource、Server 或 Workflow 命令是否匹配 Token 范围 |
轮换和撤销
原始 Token 只显示一次,不要把它放在 Issue、PR 评论、Workflow 日志或部署输出里。如果 Token 泄露:
- 先从 GitHub Secrets 删除或替换
APPALOFT_TOKEN,暂停使用该 Secret 的 Workflow。 - 用管理员会话轮换或撤销:
appaloft deploy-token rotate <tokenId> --organization-id org_self_hosted --confirm <tokenId>
appaloft deploy-token revoke <tokenId> --organization-id org_self_hosted --confirm <tokenId>POST /api/deploy-tokens/{tokenId}/rotate
POST /api/deploy-tokens/{tokenId}/revoke轮换会生成新的原始 Token(同样只显示一次);撤销后,旧 Token 的后续请求会按无效凭据被拒绝。