Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/baseline-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,8 @@ jobs:
run: |
set -euo pipefail
shellcheck scripts/*.sh tests/test-audit.sh tests/bin/gh
.ci-venv/bin/ruff check scripts/audit_github_baseline.py
.ci-venv/bin/ruff format --check scripts/audit_github_baseline.py
.ci-venv/bin/ruff check scripts/audit_github_baseline.py tests/unit
.ci-venv/bin/ruff format --check scripts/audit_github_baseline.py tests/unit
PYTHONPYCACHEPREFIX="${RUNNER_TEMP}/engineering-baseline-pycache" \
.ci-venv/bin/python -m py_compile scripts/audit_github_baseline.py
PATH="${PWD}/.ci-venv/bin:${PATH}" bash tests/test-audit.sh
50 changes: 48 additions & 2 deletions .github/workflows/baseline-drift-audit.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ jobs:
runs-on: ubuntu-latest
environment: audit
timeout-minutes: 20
outputs:
status: ${{ steps.audit.outputs.status }}
steps:
- name: Checkout
uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
Expand Down Expand Up @@ -55,9 +57,53 @@ jobs:
mdurl==0.1.2

- name: Audit maintained repositories
id: audit
env:
GH_TOKEN: ${{ steps.app-token.outputs.token }}
run: |
set -euo pipefail
# 不使用 set -e:需要保留退出码用于区分 1(漂移)与 3(审计未完成)。
set -uo pipefail
status=0
PATH="${PWD}/.audit-venv/bin:${PATH}" \
bash scripts/audit-maintained-repositories.sh
bash scripts/audit-maintained-repositories.sh || status=$?
echo "status=${status}" >>"${GITHUB_OUTPUT}"
exit "${status}"

# 计划任务失败必须主动落地成 issue,否则周任务的红色没人看见。
# 通知只使用基线仓库自身的 GITHUB_TOKEN;只读审计 App 保持零写权限。
notify:
name: Report unattended audit failure
needs: audit
if: failure() && github.event_name == 'schedule'
runs-on: ubuntu-latest
timeout-minutes: 5
permissions:
contents: read
issues: write
steps:
- name: Open or update drift issue
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
AUDIT_STATUS: ${{ needs.audit.outputs.status }}
RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
run: |
set -euo pipefail
case "${AUDIT_STATUS:-}" in
1) summary="检测到基线漂移" ;;
3) summary="审计未能完成(GitHub API 不可用)" ;;
2) summary="审计参数或本地依赖错误" ;;
*) summary="审计异常退出" ;;
esac
title="工程基线周审计失败:${summary}"
# 审计输出可能包含 secret 名称等元数据,公开仓库的 issue 里只放运行链接。
body=$(printf '%s\n\n%s\n\n%s\n' \
"计划任务 \`Engineering baseline drift audit\` 失败:${summary}(退出码 ${AUDIT_STATUS:-未知})。" \
"完整逐仓结论见运行日志:${RUN_URL}" \
"退出码含义:1=基线漂移,3=审计未完成结论不可信,2=参数或依赖错误。")
existing=$(gh issue list --state open --search "${title} in:title" \
--json number --jq '.[0].number // empty')
if [[ -n "${existing}" ]]; then
gh issue comment "${existing}" --body "${body}"
else
gh issue create --title "${title}" --body "${body}"
fi
3 changes: 2 additions & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
## 语言与提交

- 所有回复、代码注释和 Git 提交信息使用中文。
- Git 提交标题使用 `<type>: <中文描述>`;正文说明背景、改动和验证,并包含 `Co-Authored-By: Codex <noreply@anthropic.com>`。
- Git 提交标题使用 `<type>: <中文描述>`;正文说明背景、改动和验证。
- 不强制 `Co-Authored-By:` trailer。AI 协作的提交由 GitHub App 的 bot 身份(如 `chatgpt-codex-connector`)在 author/committer 上体现,contributors 由此产生;邮箱无法解析到真实账号的 trailer 在 GitHub 上只是纯文本,不构成协作者,也不要为此编造地址。

## 开发与验证

Expand Down
48 changes: 48 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# 变更记录

版本号用于纳管项目声明"当前对齐到哪一版基线"。审计器每次运行都会回显版本,
漂移排查时可以据此判断是项目变了还是公共规则变了。

发布流程见 [MAINTENANCE.md](MAINTENANCE.md) 的"发布基线版本"。

## v1.1.0

### 修复

- **release workflow 引用的本地 Action 不再绕过审计。** `.github/actions/**` 之外的本地
Action 只在被引用时惰性解析,而供应链检查此前跑在解析之前,且 `inspect_release`
从不计算受控 release 自身的 local action closure。结果是权限最高的 workflow
可以通过 `./ci/actions/x` 引入未锁定的第三方 Action,审计仍返回 `PASS`;
prepare job 也能借同样的路径隐藏部署能力。现在所有 `uses:` 引用检查移动到全部
inspect 之后执行,`inspect_release` 会解析并上报 release 侧 closure,
prepare 的纯净性判断覆盖其本地 Action。

### 变更

- **区分"基线漂移"与"审计没跑完"。** 新增退出码 `3` 与 `ERROR owner/repo` 前缀、
`[API_UNAVAILABLE]` 错误码。GitHub 5xx/429/连接失败不再表现为漂移。
- **`gh api` 增加指数退避重试**(4 次尝试,2s/4s/8s,可用
`BASELINE_AUDIT_RETRY_BASE_SECONDS` 覆盖)。持续不可用的 optional 端点
(如 `environments/dev`)报 `[API_UNAVAILABLE]`,不再降级成"Environment 缺失"。
- **默认分支参数化。** 新增 `BASELINE_DEFAULT_BRANCH`,默认 `master`。API 路径、
`github.ref` guard 原子、PR `branches` 与 branch protection 判定全部随之变化,
基线不再硬编码 `master`。
- **计划任务失败会开 issue。** 漂移 workflow 新增 `notify` job,使用基线仓库自身的
`GITHUB_TOKEN`(`issues: write`);只读审计 App 权限不变,issue 正文只放运行链接,
不回显可能包含 secret 名称的审计输出。
- 审计输出首行回显基线版本与受保护分支。

### 测试

- 新增 `tests/unit/`:对表达式解析器、secret 静态可枚举性、`gh api` 重试与分支
参数化做直接单元测试,不再只靠 fixture 间接覆盖。
- 新增 fixture:`release-local-action-mutable`、`release-local-action-missing`、
`release-prepare-local-action-deploy`、`api-unavailable`、`main-default-branch`。
- 契约测试改为校验错误码与文档的双向覆盖,不再钉死文档的中文措辞。

## v1.0.0

首个固化版本:PR/release 事件与权限边界、供应链锁定、`dev` Environment 与 secret
边界、`.github/release-safety.yml` 声明式适配与发布/回滚语义校验、`master` branch
protection、根 `AGENTS.md` 的 `## Code Review Rules` 标题校验,以及基于只读 GitHub App
的中央漂移审计。
Loading