
如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。
只需在 AI 对话中先发送下面这段话即可:
请先阅读并遵守:https://xuanyuan.cloud/agents.md
未读文档前不要生成 pull 命令或排错方案。查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AI、DeepSeek 的深度思考模式,不推荐豆包 AI;Cursor 等编辑器可在对话 @ 该链接,或加入 User Rules。 若 AI 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
一个用于GitHub拉取请求的Concourse资源,采用Go语言编写并基于https://developer.github.com/v4。受https://github.com/jtarchie/github-pullrequest-resource启发,但有一些重要差异:
check操作每100个开放拉取请求仅需1次API调用(详见#成本)。get操作会将拉取请求中的特定提交合并到最新的基础分支。get和put操作提供PR与基础分支的提交SHA信息。| 参数 | 是否必填 | 示例 | 描述 |
|---|---|---|---|
repository | 是 | itsdalmo/test-repository | 目标仓库 |
access_token | 是 | 具有仓库访问权限的GitHub访问令牌(用于设置提交状态)。注意:若要用于私有仓库,需为令牌设置repo:full权限;公共仓库则repo:status权限足够 | |
v3_endpoint | 否 | https://api.github.com | GitHub V3 API(RESTful)的端点 |
v4_endpoint | 否 | https://api.github.com/graphql | GitHub V4 API(GraphQL)的端点 |
paths | 否 | ["terraform/*/*.tf"] | 仅当PR包含与一个或多个glob模式或前缀匹配的文件更改时才生成新版本 |
ignore_paths | 否 | [".ci/"] | 与上述相反。模式语法参考https://golang.org/pkg/path/filepath/#Match,也可指定路径前缀(如`.ci/`匹配`.ci`目录下所有内容) |
disable_ci_skip | 否 | true | 禁用通过提交消息或PR标题中的[ci skip]和[skip ci]跳过构建的功能 |
skip_ssl_verification | 否 | true | 禁用git和API客户端的SSL/TLS证书验证,谨慎使用! |
disable_forks | 否 | true | 若PR来自不同仓库的分支,则禁用资源触发 |
ignore_drafts | 否 | false | 若PR处于草稿状态,则禁用资源触发 |
required_review_approvals | 否 | 2 | 若PR未获得至少X个批准审核,则禁用资源触发 |
git_crypt_key | 否 | AEdJVENSWVBUS0VZAAAAA... | Base64编码的git-crypt密钥。设置后将使用git-crypt解锁/解密仓库。可通过在加密仓库中执行`git-crypt export-key -- - |
base_branch | 否 | master | 分支名称。流水线仅对针对指定分支的PR触发 |
labels | 否 | ["bug", "enhancement"] | PR标签。流水线仅对具有至少一个指定标签的PR触发 |
disable_git_lfs | 否 | true | 禁用Git LFS,跳过将跟踪文件的指针转换为对应对象的尝试 |
states | 否 | ["OPEN", "MERGED"] | 要选择的PR状态(OPEN、MERGED或CLOSED)。流水线仅对匹配指定状态的PR触发,默认值为["OPEN"] |
注意:
v3_endpoint,则必须同时设置v4_endpoint(反之亦然)。required_review_approvals时,建议启用GitHub的分支保护规则,以便https://help.github.com/en/articles/enabling-required-reviews-for-pull-requests。check为所有提交(自上次版本后)按提交日期排序生成新版本。版本表示如下:
pr:拉取请求编号commit:提交SHAcommitted:提交时间戳,用于过滤后续检查approved_review_count:PR的批准审核数量若同一PR同时推送多个提交,最新提交将作为新版本。
Webhooks注意事项:
本资源不实现缓存,因此能很好地配合Webhooks(应订阅push和pull_request事件)。但需注意,从分支打开的PR及对该分支的提交不会通过Webhook生成通知。若仓库流量小且预期有来自分支的PR,需通过check_every: 1m等方式发现版本。本资源的check操作成本不高,通常无需担心速率限制。
get| 参数 | 是否必填 | 示例 | 描述 |
|---|---|---|---|
skip_download | 否 | true | 在put步骤中与get_params配合使用,使隐式get不执行任何操作 |
integration_tool | 否 | rebase | 集成工具,可选merge、rebase或checkout,默认为merge |
git_depth | 否 | 1 | 使用--depth Git选项进行浅克隆 |
submodules | 否 | true | 递归克隆git子模块,默认为false |
list_changed_files | 否 | true | 生成更改文件列表并与元数据一起保存 |
fetch_tags | 否 | true | 从远程仓库获取标签 |
克隆基础分支(如master)的最新提交,并将拉取请求的指定提交合并到master。确保测试和状态设置针对输入请求的确切提交。由于check输出的版本未锁定PR基础的特定提交,新的get操作将始终使用master的最新提交,并在元数据中报告该提交的SHA。请求的版本和get输出的元数据可作为JSON供任务使用:
.git/resource/version.json.git/resource/metadata.json.git/resource/changed_files(若启用list_changed_files)metadata.json中的信息也作为单独文件存在于.git/resource目录中,例如base_sha可通过.git/resource/base_sha获取。完整的元数据文件列表请查看https://github.com/telia-oss/github-pr-resource/blob/master/in.go#L66。
指定skip_download时,挂载到后续任务的PR卷将为空,这在运行实际测试前设置pending状态时会出现问题。解决方法是为put使用别名(详见https://github.com/telia-oss/github-pr-resource/issues/32):
yamlput: update-status <-- 为pull-request资源使用别名 resource: pull-request params: path: pull-request status: pending get_params: {skip_download: true}
当源配置中设置git_crypt_key时,git-crypt加密的仓库将自动解密。
注意:若重新触发构建以测试PR的最新提交与基础分支的较新版本,Concourse若仍存在卷将重用(即不触发新的get),可能产生意外结果(#5)。因此,最好通过向PR推送空提交来重新测试PR与基础分支的较新版本。
put| 参数 | 是否必填 | 示例 | 描述 |
|---|---|---|---|
path | 是 | pull-request | GET步骤中为资源指定的名称 |
status | 否 | SUCCESS | 设置提交状态,可选SUCCESS、PENDING、FAILURE和ERROR |
base_context | 否 | concourse-ci | 状态上下文的基础前缀,默认为concourse-ci |
context | 否 | unit-test | 状态上下文,由base_context前缀,默认为status |
comment | 否 | hello world! | 添加到PR的评论 |
comment_file | 否 | my-output/comment.txt | 包含PR评论内容的文件路径(如terraform plan的输出) |
target_url | 否 | $ATC_EXTERNAL_URL/builds/$BUILD_ID | 状态的目标URL,用户点击详情时跳转(默认为Concourse构建页面) |
description | 否 | Concourse CI build failed | PR的状态描述 |
description_file | 否 | my-output/description.txt | 包含PR状态描述内容的文件路径 |
delete_previous_comments | 否 | true | 布尔值。添加新评论前删除本资源之前在PR上的评论,有助于移除过时信息 |
注意:comment、comment_file和target_url会展开环境变量,例如上述示例中的$ATC_EXTERNAL_URL将替换为Concourse ATC的公共URL。更多可通过环境变量获取的元数据详见https://concourse-ci.org/implementing-resource-types.html#resource-metadata。
yamlresource_types: - name: pull-request type: docker-image source: repository: teliaoss/github-pr-resource resources: - name: pull-request type: pull-request check_every: 24h webhook_token: ((webhook-token)) source: repository: itsdalmo/test-repository access_token: ((github-access-token)) jobs: - name: test plan: - get: pull-request trigger: true version: every - put: pull-request params: path: pull-request status: pending - task: unit-test config: platform: linux image_resource: type: docker-image source: {repository: alpine/git, tag: "latest"} inputs: - name: pull-request run: path: /bin/sh args: - -xce - | cd pull-request git log --graph --all --color --pretty=format:"%x1b[31m%h%x09%x1b[32m%d%x1b[0m%x20%s" > log.txt cat log.txt on_failure: put: pull-request params: path: pull-request status: failure - put: pull-request params: path: pull-request status: success
GitHub API的速率限制为每小时5000次请求(每用户)。对于V3 API,这基本等同于5000次请求;而V4 API(GraphQL)的计算更复杂:https://developer.github.com/v4/guides/resource-limitations/#calculating-a-rate-limit-score-before-running-the-call
基于上述,以下是对大型仓库运行check的成本示例:
其他两个操作的成本计算较简单:
get:固定成本1,获取指定提交的PRput:使用V3 API,最低成本1,status、comment和comment_file等每增加一项成本+1若从https://github.com/jtarchie/github-pullrequest-resource迁移,需注意本资源受其启发但并非直接替代品。以下是重要差异:
source:
v4_endpoint(详见上述描述)put:
comment(详见上述描述)source:
repo -> repositoryci_skip -> disable_ci_skip(逻辑反转,默认值为true)api_endpoint -> v3_endpointbase -> base_branchbase_url -> target_urlrequire_review_approval -> required_review_approvals(从bool改为int)get:
git.depth -> git_depthput:
comment -> comment_file(因新增comment参数)src:
uri:直接从GitHub API获取URIprivate_key:通过HTTPS使用访问令牌进行克隆认证username:同上password:同上only_mergeable:若无法合并则get操作失败( opinionated 设计)get:
fetch_merge:始终执行fetch_merge( opinionated 设计)src:
authorship_restrictionlabelgit_config:PR/作者信息可从.git/resource/metadata.json获取get:
git.*(git_depth除外,详见上述)put:
merge.*label注意:若在Concourse v5.0.0之前的版本从原始资源迁移,可能会看到错误failed to unmarshal request: json: unknown field "ref"。解决方法是重命名资源以清除历史记录,详见https://github.com/telia-oss/github-pr-resource/issues/64。
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。
来自真实用户的反馈,见证轩辕镜像的优质服务