Git 集成、多分支与不可信代码隔离
验证:未记录
- 适用版本
- 未记录
- 验证范围
- 尚未登记验证记录。
SCM(Source Code Management)是源代码管理;PR(Pull Request)是合并请求。目标:PR 自动测试,受保护主分支通过后才进入发布流程。
1. 先划分信任边界#
| 环境 | 允许的代码 | 可用权限 |
|---|---|---|
verify Controller |
分支、外部 PR | 只读源码、只读依赖源,无云发布权限 |
release Controller |
已审查的受保护主分支 | 限定镜像仓库、预生产和生产发布身份 |
when { branch 'main' }、Agent label、Folder 和 Groovy sandbox 都不能独自防止恶意 Jenkinsfile 窃取凭据。 不可信代码可能改流水线、调用其他步骤或探测元数据服务;本路径使用独立 Controller、执行节点、云账号/角色和网络边界。官方说明
2. GitHub 多分支 Hands-on#
- 管理员安装固定版本 GitHub Branch Source、Git、Pipeline 插件;GitLab 项目改用其受支持的 Branch Source 插件并单独核对权限。
- 创建只安装在实验仓库的 GitHub App:按插件要求授予仓库元数据、Contents 与 Pull requests 只读,以及实际需要的 Checks/Commit Status 写权限。Webhook 管理权限仅在自动管理 webhook 时授予;不使用个人全权限 token。
- 在
verifyController 创建 Folder,再建 Multibranch Pipeline;Branch Source 选择 GitHub,配置 App 凭据、组织与仓库。 - 开启 branch discovery、origin PR discovery;明确选择测试 PR head 还是合并目标分支后的结果,避免重复构建。外部 fork 的 trust policy 选最严格选项,测试前确认陌生作者不能提供可信 Jenkinsfile。
- 配置仓库 webhook 到
https://jenkins.example.com/github-webhook/;启用所选插件支持的 webhook secret 验签,密钥不放仓库。内网 Jenkins 使用平台 webhook relay,只开放该受控路径,不把管理界面暴露公网。 - 设置 Jenkinsfile 路径、丢弃旧分支构建的数量/天数,并运行 Scan Repository Now。Webhook 丢失时配置合理的定期索引作为补偿,避免每分钟扫整个组织。
3. 保护主分支和验证结果#
仓库设置:禁止直接 push、要求审查、要求对应 Jenkins 检查成功;保护 Jenkinsfile、ci/、Dockerfile 和共享库的变更。release Controller 创建固定主分支 Pipeline,仓库 URL、分支和凭据由平台控制,不能由构建参数任意指定。
执行四个验收:普通分支通过测试;失败测试阻止合并;fork PR 不出现发布凭据且无法访问云元数据/生产网络;合并后发布 Job 能精确记录构建的 commit。Webhook 多次投递不能产生重复发布,需对提交号去重;并发控制只避免同时执行,不能消除重复触发。
故障时先查 webhook delivery、签名、反向代理、仓库权限,再查分支索引日志。重新索引不会证明某个旧构建的代码已更新,必须核对 commit。GitHub Branch Source