常见问题
本故障排除指南涵盖了 管理员(组件部署、配置)和 普通用户(仓库设置、pipeline 执行)可能遇到的问题。
重要:在本文档中,我们使用两个不同的 namespace:
<pac-namespace>:部署 PAC 组件(controller、watcher、webhook)的 namespace。默认值为tekton-pipelines,但可以通过TektonConfigCR 中的targetNamespace进行自定义。<namespace>:创建 PipelineRuns 的 namespace。在创建 Repository CR 时指定,可以是集群中的任意 namespace。
请将这些占位符替换为你实际的 namespace 名称。
本文档提供了使用 Pipelines-as-Code(PAC)时遇到的常见问题的故障排除步骤。
目录
开始之前1. 检查 PAC 组件是否正在运行2. 确认你的 namespace3. 获取资源名称4. 本文档中使用的常见占位符PAC 组件未部署症状故障排除步骤常见原因解决方案PAC Pod 未启动症状故障排除步骤自动 webhook 注册失败症状故障排除步骤自动 webhook 注册失败的常见原因说明webhook 不接收事件症状故障排除步骤常见原因解决方案验证pipeline 未触发症状故障排除步骤常见原因解决方案验证未创建 PipelineRuns症状故障排除步骤常见原因解决方案验证找不到 task症状故障排除步骤常见原因解决方案变量未解析症状故障排除步骤常见原因解决方案验证未向 GitLab 报告状态症状故障排除步骤常见原因解决方案验证注释命令不起作用症状故障排除步骤常见原因解决方案PAC 设置不生效症状故障排除步骤常见原因解决方案获取帮助下一步开始之前
在排查具体问题之前,请先确认以下基本项:
1. 检查 PAC 组件是否正在运行
验证所有 PAC Pod 都在运行(将 <pac-namespace> 替换为你的 PAC namespace,默认为 tekton-pipelines):
示例输出(所有 Pod 都应为 Running):
2. 确认你的 namespace
获取 PAC namespace(PAC 组件部署所在的 namespace):
如果命令失败或返回为空,请使用默认值:tekton-pipelines
获取 Pipeline namespace(创建 PipelineRuns 的 namespace):
这会显示所有 Repository CR 及其 namespace。namespace 列显示 PipelineRuns 将在何处创建。
3. 获取资源名称
获取 Pod 名称:
获取 Repository CR 名称:
获取 PipelineRun 名称:
4. 本文档中使用的常见占位符
<pac-namespace>:PAC 部署 namespace(默认值:tekton-pipelines)<namespace>:PipelineRun namespace(因仓库而异)<repo-name>:Repository CR 名称(使用kubectl get repository -n <namespace>列出)<pod-name>:Pod 名称(使用kubectl get pods -n <pac-namespace>列出)<name>:PipelineRun 名称(使用kubectl get pipelinerun -n <namespace>列出)<gitlab-secret>:GitLab token Secret 名称(检查 Repository CR spec)
PAC 组件未部署
症状
OpenShiftPipelinesAsCode CR 显示 Ready: False,Pod 无法启动,或者该 CR 根本不存在。
故障排除步骤
-
检查
TektonConfig是否请求 PAC。operator 会根据TektonConfig派生OpenShiftPipelinesAsCodeCR,且仅在 profile 为all并且启用 PAC 时才会这样做。如果 CR 完全缺失,请从这里开始:预期输出:
profile 为
basic或lite表示 operator 根本不会进入 PAC 逻辑——它既不会创建该 CR,也不会删除已存在的 CR。enable为空表示spec.platforms.kubernetes.pipelinesAsCode完全缺失。默认值 webhook 会将该块填充为enable: true,但前提是有东西写入了TektonConfig;因此,对于自 operator 升级后从未被写回的TektonConfig,该块仍然缺失。在profile: all下——这是唯一会进入 PAC 逻辑的 profile——reconciler 会将这个缺失块视为 PAC 已禁用,并删除派生的 CR。按照 Deploy PAC Component 中所示显式写入该块,既能立刻修复问题,也能让意图在 CR 中保持可见。 -
检查 CR 状态:
示例输出(节选):
-
检查 CR 事件:
示例输出(节选):
-
检查 TektonInstallerSet:
注意:
TektonInstallerSet是 cluster-scoped 资源。此处的检查仅用于故障排除且为只读操作。不要直接修改或删除它。如果问题仍然存在,请通过TektonConfig和派生的OpenShiftPipelinesAsCodeCR 进行排查。
示例输出:
-
检查 operator 日志:
示例输出(日志示例):
常见原因
TektonConfig中未请求 PAC:profile 不是all,或者 profile 是all但spec.platforms.kubernetes.pipelinesAsCode缺失或enable: false。这通常是 CR 缺失而不是未就绪的原因。这两种情况不同:在basic或lite下,operator 从不创建该 CR,也不会触碰已存在的 CR;而在all下,缺失的块或enable: false会导致它删除该 CR。缺失块的情况在原地升级后很容易出现,因为该块只有在有东西写入TektonConfig时才会被填充- operator 未运行:检查 Tekton Operator 状态
- namespace 问题:确认
targetNamespace存在 - 资源冲突:检查是否存在已有资源
解决方案
- 在
TektonConfig中设置spec.profile: all和spec.platforms.kubernetes.pipelinesAsCode.enable: true - 确保 Tekton Operator 正在运行
- 检查 namespace 是否存在(将
<pac-namespace>替换为实际 PAC namespace):kubectl get namespace <pac-namespace> - 如果派生的 CR 处于卡住状态而不是缺失,在
profile: all且TektonConfig中仍启用 PAC 的情况下,删除它——operator 会在下一次 reconcile 时重新创建它。不要在basic或lite上执行此操作:在那里不会有任何东西重新创建该 CR,因此删除它会永久移除 PAC
PAC Pod 未启动
症状
PAC Pod 处于 Pending 或 CrashLoopBackOff 状态。
故障排除步骤
-
检查 Pod 状态(将
<pac-namespace>替换为你的 PAC namespace):
示例输出:
-
检查 Pod 日志:
先获取 Pod 名称(将
<pac-namespace>替换为你的 PAC namespace):然后检查日志(将
<pod-name>替换为实际 Pod 名称):
示例输出(错误示例):
-
检查 Pod 事件:
先获取 Pod 名称,然后描述它(将
<pod-name>替换为实际 Pod 名称):
示例输出(节选):
-
检查资源限制:
示例输出:
自动 webhook 注册失败
症状
在应用 Repository 后,没有创建 GitLab/GitHub webhook,或者 Repository 包含:
故障排除步骤
-
检查 Repository 注解和事件:
-
检查 webhook 注册 controller 日志:
-
验证 PAC webhook URL 来源:
如果为空,请配置 PAC 公共 URL,并将其记录到
pipelines-as-code-info.data.controller-url中。请参阅 Get the PAC Webhook URL。 -
验证 token 和 webhook Secret 引用:
-
在使用共享 webhook 管理 token 时检查集中式凭证 Secret 标签:
自动 webhook 注册失败的常见原因
说明
- 会优先尝试 Repository 本地 token。如果返回
401或403,controller 会使用匹配的集中式 Secret 重试。 - 集中式凭证 Secret 从 webhook 注册 controller namespace 中读取;controller 不会在每个 Repository namespace 中搜索集中式凭证。
- 直接使用 Repository Secret 不需要标签。controller 只会监视实际生效的 Repository spec 所引用的 Secret namespace/name 对,并在这些 Secret 变化时重新协调相关 Repository。
- 保持 Repository 本地 token 的作用域仅限于正常 PAC 访问。启用自动 webhook 注册时,请将 webhook 管理权限存储在集中式凭证中。
- PAC 全局 Repository 的
git_provider设置仅适用于带有本地spec.git_provider块的 Repository。仅有spec.url的 Repository 会被自动 webhook 注册跳过。 - 注解
pac.tekton.alauda.io/webhook-managed-ref存储 provider hook ID。当 PAC webhook URL 发生变化但 provider 和 repository 身份保持不变时,controller 会根据 ID 更新已记录的 hook,而不是创建重复项。 - 更新
spec.url会为新 repository 注册 webhook,但不会删除旧 repository 上的 webhook。如果不再需要,请手动删除旧的 provider webhook。 - 删除 Repository 会尽最大努力清理已记录的受管 webhook。清理失败会被记录并作为事件发出,但不会阻止 Repository finalizer 的移除。如果凭证已被移除或 provider API 不可达,请手动检查 provider 侧的 webhook。
- 全局禁用自动注册,或者为 Repository 添加
pac.tekton.alauda.io/webhook-registration-disabled: "true",会在 controller 将 Repository 标记为 inactive 之前删除已记录的受管 webhook。如果由于缺少凭证或 provider 访问不可用而导致清理失败,controller 会保留受管注解和 finalizer,并在凭证或 provider 访问恢复后重试。 - 为 Repository 添加标签
pac.tekton.alauda.io/webhook-registration-disabled: "true",可跳过该 Repository 的自动 webhook 注册。
webhook 不接收事件
症状
GitLab webhook 事件未到达 PAC,pipeline 未触发。
故障排除步骤
-
检查 GitLab 中的 webhook 配置:
- 进入 GitLab 项目 → Settings → Webhooks
- 验证 webhook URL 是否正确
- 检查 webhook secret 是否与 Repository CR 匹配
-
检查 PAC controller 日志(将
<pac-namespace>替换为你的 PAC namespace):
示例输出(日志示例):
-
从 GitLab 测试 webhook:
- 进入 GitLab 项目 → Settings → Webhooks
- 单击 "Test" → "Push events"
- 检查 webhook 响应
-
验证 controller URL 可访问:
示例输出:
示例输出:
示例输出:
-
检查 Repository CR:
先列出所有 Repository CR 以找到名称(将
<namespace>替换为你的 Pipeline namespace):然后检查特定的 Repository CR(将
<repo-name>替换为实际的 repository 名称):
示例输出(节选):
常见原因
- controller URL 不可访问:防火墙或网络问题
- webhook secret 不匹配:GitLab 中的 Secret 与 Repository CR 不一致
- webhook URL 错误:配置了错误的 controller URL
- 未配置 Gateway/Ingress/Service:controller 未暴露
解决方案
- 验证 GitLab 服务器可以访问 controller URL
- 确保 GitLab 和 Repository CR 中的 webhook secret 一致
- 检查 Gateway/Ingress/Service 配置
- 使用
curl手动测试 webhook
验证
应用解决方案后,验证修复是否生效:
-
从 GitLab 测试 webhook:
- 进入 GitLab 项目 → Settings → Webhooks
- 单击 "Test" → "Push events"
- 检查 webhook 是否返回
200 OK响应
-
检查 PAC controller 日志,确认 webhook 事件:
你应该能看到表示正在接收 webhook 事件的日志条目。
pipeline 未触发
症状
发生 Git 事件时,没有创建 pipeline。
故障排除步骤
-
检查 Pipeline 注解:
示例输出:
-
验证分支名称是否匹配:
示例输出:
-
检查 PAC controller 日志:
示例输出(日志示例):
-
检查 Repository CR 状态:
先列出 Repository CR 以找到名称:
然后检查 Repository CR(将
<repo-name>替换为实际的 repository 名称):
示例输出(节选):
-
验证 pipeline 文件是否存在:
示例输出:
常见原因
- 注解语法错误:注解格式不正确
- 分支名称不匹配:分支模式与实际分支不一致
- 未找到 pipeline 文件:文件不在预期位置
- 路径过滤:变更的文件不符合路径过滤条件
- 未找到 Repository CR:没有与该 repository 匹配的 Repository CR
解决方案
- 验证注解语法:使用
pipelinesascode.tekton.dev/on-target-branch: "[refs/heads/main]"和pipelinesascode.tekton.dev/on-event: "[push]",不要使用已弃用的on-push注解 - 确保分支名称完全匹配(区分大小写)
- 确保 repository 中存在
.tekton/pipelinerun.yaml - 如果配置了路径过滤,请检查其设置
- 验证 Repository CR 存在且与 repository URL 匹配
验证
应用解决方案后,验证修复是否生效:
-
触发测试事件:
- 向 pipeline 注解中指定的分支推送一个 commit
- 或者在测试 MR 触发时创建一个 Merge Request
-
检查是否创建了 PipelineRun:
Git 事件之后你应该能看到一个新的 PipelineRun 被创建。
-
检查 PAC controller 日志:
查找表示事件已被处理的日志条目。
未创建 PipelineRuns
症状
收到了 webhook 事件,但没有创建 PipelineRun。
故障排除步骤
-
检查 PAC controller 日志:
示例输出(错误示例):
-
检查 Repository CR:
先列出 Repository CR 以找到名称:
然后检查 Repository CR(将
<repo-name>替换为实际的 repository 名称):
示例输出(节选):
-
验证 namespace 是否存在:
示例输出:
如果 namespace 不存在,你会看到:
-
检查 RBAC 权限:
示例输出:
-
检查 GitLab token:
先从 Repository CR 中找到 Secret 名称:
然后检查该 Secret(将
<gitlab-secret>替换为实际 Secret 名称):
示例输出(节选,token 经过 base64 编码):
常见原因
- namespace 不存在:目标 namespace 未创建
- RBAC 权限:PAC ServiceAccount 缺少权限
- GitLab token 无效:token 已过期或不正确
- pipeline 定义错误:YAML 或 Tekton 语法无效
- repository 访问问题:无法访问 Git repository
解决方案
-
如果缺少 namespace,请创建:
示例输出:
-
验证 RBAC:检查 ServiceAccount 和 RoleBindings
检查 PAC 使用哪个 ServiceAccount:
检查该 ServiceAccount 是否具有所需权限:
-
如果 GitLab token 已过期,请更新它
-
校验 pipeline YAML 语法
-
测试 GitLab token:
示例输出(如果 token 有效):
如果 token 无效:
验证
应用解决方案后,验证修复是否生效:
-
触发一个 Git 事件(push 或创建 MR),并检查是否创建了 PipelineRun:
-
检查 PipelineRun 状态:
PipelineRun 应该已创建并开始执行。
找不到 task
症状
PipelineRun 失败并报出 "task not found" 错误。
故障排除步骤
-
检查 PipelineRun 状态:
先列出 PipelineRuns 以找到名称:
然后检查该 PipelineRun(将
<name>替换为实际 PipelineRun 名称):
示例输出(节选,显示错误):
-
检查 Task 引用:
示例输出:
-
验证 Task 是否存在:
示例输出(如果 task 存在):
如果 task 不存在:
示例输出(如果 task 存在):
-
检查网络连通性:
示例输出(如果可访问):
示例输出(如果可访问):
常见原因
- Task 名称错误:task 名称拼写错误
- Task 不在当前 namespace:Task 定义在其他 namespace 中
- DevOps Hub 不可用:访问
artifacthub-shim时存在网络问题 - 远程 URL 不可访问:无法从远程 URL 获取 task
- Task resolver 错误:resolver 配置不正确
解决方案
- 验证 task 名称拼写
- 检查 task 是否存在于正确的 namespace 中
- 测试
artifacthub-shim连通性 - 验证远程 URL 可访问
- 检查 task resolver 配置
变量未解析
症状
像 {{revision}} 这样的 pipeline 变量没有被替换。
故障排除步骤
-
检查变量语法:
示例输出:
-
使用 Dry-Run 验证 YAML 语法:
使用
kubectl apply --dry-run=client验证 PipelineRun YAML 语法并尽早捕获错误:
示例输出(如果语法有效):
示例输出(如果存在语法错误):
注意:此 dry-run 检查会验证 YAML 语法和 Tekton schema,但不会验证变量解析(如 {{revision}} 这类变量在 dry-run 中仍会保持字面字符串)。对于变量解析问题,请检查 PAC controller 日志。
-
检查 PAC controller 日志:
示例输出(日志示例):
-
验证变量名称:
{{revision}}- 正确{{Revision}}或{{REVISION}}- 错误(区分大小写)- 使用双大括号:
{{variable_name}}
-
检查 PipelineRun 参数:
先获取 PipelineRun 名称:
然后检查参数(将
<name>替换为实际 PipelineRun 名称):
示例输出:
常见原因
- 语法错误:缺少大括号或格式不正确
- 大小写敏感:变量名区分大小写
- 变量不可用:当前事件类型无法使用该变量(例如,
{{pull_request_number}}只适用于pull_request事件) - PAC 版本:较旧的 PAC 版本可能不支持某些变量
解决方案
- 验证变量语法:使用
{{variable_name}}格式,例如{{revision}}或{{repo_url}} - 检查变量名称是否正确(区分大小写):
{{repo_owner}}、{{source_branch}}、{{pull_request_number}} - 确保该变量可用于对应事件类型:某些变量如
{{pull_request_number}}仅适用于pull_request事件 - 如有需要,将 PAC 更新到最新版本
有关可用变量的完整列表,请参阅 Parameterizing Commits and URLs。
验证
应用解决方案后,验证修复是否生效:
-
检查已创建的 PipelineRun 中变量是否已解析:
变量应被替换为实际值(例如,
{{revision}}应替换为 commit SHA)。 -
检查 PAC controller 日志,确认变量解析:
不应出现关于未知变量的警告。
未向 GitLab 报告状态
症状
pipeline 执行成功,但状态没有显示在 GitLab 中。
故障排除步骤
-
检查 PAC watcher 日志:
示例输出(日志示例):
-
检查 GitLab token:
先从 Repository CR 中找到 Secret 名称:
然后检查该 Secret(将
<gitlab-secret>替换为实际 Secret 名称):
示例输出(节选,token 经过 base64 编码):
-
测试 GitLab API 访问:
示例输出(如果 token 有效):
如果 token 无效或已过期:
-
检查 Repository CR:
示例输出(节选):
-
验证 PipelineRun 状态:
列出 PipelineRuns 以找到名称:
然后检查状态(将
<name>替换为实际 PipelineRun 名称):
示例输出:
常见原因
- GitLab token 无效:token 已过期或不正确
- token 权限不足:token 缺少所需 scope
- 网络问题:无法访问 GitLab API
- PAC watcher 未运行:watcher Pod 未启动
- Repository CR 配置错误:GitLab 配置不正确
解决方案
- 验证 GitLab token 有效且未过期
- 确保 token 具有
apiscope - 测试 GitLab API 连通性
- 检查 PAC watcher Pod 是否正在运行
- 验证 Repository CR 的 GitLab 配置
验证
应用解决方案后,验证修复是否生效:
-
检查 PAC watcher 日志,确认状态更新成功:
你应该能看到表示状态更新已成功发送的日志条目。
-
检查 GitLab UI:
- 进入你的 GitLab 项目
- 检查 Merge Request 或 commit
- 验证 pipeline 状态是否已显示(例如 "passed"、"failed"、"running")
-
验证 PipelineRun 已完成:
PipelineRun 应显示
Succeeded或Failed状态,并且该状态应反映在 GitLab 中。
注释命令不起作用
症状
像 /retest 这样的注释命令没有触发 pipeline。
故障排除步骤
-
检查注解配置:
示例输出:
-
验证评论格式:
- 命令必须单独占一行,或位于行首
/retest- 正确Please /retest- 错误(命令不在行首)
-
检查 PAC controller 日志:
示例输出(日志示例):
-
验证 Merge Request 是否存在:
- 注释命令仅适用于 Merge Request
- 普通 commit 不可用
-
检查 webhook 配置:
常见原因
- 缺少注解:未配置
on-comment注解 - 命令格式:命令不在行首
- 不在 Merge Request 中:注释命令仅适用于 Merge Request
- 未配置 webhook:webhook 中未启用 Comments 事件
- 命令名称不匹配:评论中的命令与注解不一致
解决方案
- 添加
on-comment注解:pipelinesascode.tekton.dev/on-comment: "retest" - 确保命令位于行首
- 仅在 Merge Request 中使用命令
- 在 GitLab webhook 配置中启用 "Comments"
- 命令名称必须完全匹配(区分大小写)
PAC 设置不生效
症状
已将某个设置添加到 TektonConfig.spec.platforms.kubernetes.pipelinesAsCode.settings 并且应用时没有报错,但 PAC 的行为仍然像该设置保持默认值一样。TektonConfig 和派生的 OpenShiftPipelinesAsCode CR 都报告为 ready,没有记录任何事件或错误,而且重新读取 TektonConfig 时显示该 key 已从 settings 中消失。
这只影响 Alauda 扩展设置:custom-console-url-namespace-vars、replace-empty-template-vars-with-empty 和 enable-pull-request-number-on-push-events。
请注意,这里的症状是“默认值正在生效”,而不是“功能缺失”。当 key 在其 ConfigMap 中不存在时,PAC 会回退到该设置的内置默认值,因此关闭一个默认开启的设置与开启一个默认关闭的设置同样会受到影响。
故障排除步骤
下面的命令使用两个占位符。请先在同一个 shell 中设置它们,这样后续命令就可以直接粘贴:
-
检查该 key 是否仍保留在
TektonConfig中:只有当你把 key 写入
settings时,这一步才有意义;如果输出为空,则说明 operator 已将其丢弃。如果你已经把 key 移到了options.configMaps,那么这里输出为空是预期结果——直接进入第 3 步。 -
检查派生的 CR。在
profile: all下——这也正说明了该症状,因为 PAC 正在运行——operator 会将TektonConfig中的settings复制到该 CR 中,因此这里该 key 也会消失——这一步只能确认复制是否同步,并不是权威检查: -
检查 PAC 实际读取的 ConfigMap。这是权威检查——
settings只描述意图:将输出与预期值进行比较。若出现其他值,则表示 PAC 没有使用你的配置。请注意,当你有意将该 key 设置为空字符串时,空输出就是正确结果,例如用于清除你不再需要的映射。
常见原因
- key 写在
settings下:operator 的默认值 webhook 会根据上游 Pipelines as Code settings 结构重新生成该 map。Alauda 扩展设置在该结构中没有字段,因此会在保存时被丢弃——静默发生,没有错误也没有事件。这发生在TektonConfig本身上,因此该 key 也永远不会进入派生的 CR。 - key 写在派生的
OpenShiftPipelinesAsCodeCR 上:在profile: all下,operator 会在下一次 reconcile 时把settings和options从TektonConfig复制回去,因此即使是它本来可能接受的 key,这次修改也会丢失。 - key 直接写入 ConfigMap:手动编辑在常规 reconcile 中会保留下来,因为 operator 会将其渲染后的 manifest 与一个 hash 注解进行比较,而你的编辑并不会改变该注解。这个比较是按资源进行的,因此不会改变渲染后 ConfigMap 的 PAC 变更——例如
spec.config或 Deployment 选项——会保留这次编辑。只有当渲染后的 ConfigMap 本身发生变化时,它才会被静默覆盖:对settings的任何编辑、对options.configMaps的任何编辑、operator 升级,或者 installer set 重建。因此,手动编辑 ConfigMap 看起来像是生效了,但会在不可预测的时刻停止工作。
解决方案
将该 key 移到 TektonConfig 中的 options.configMaps,operator 会按 key 将其合并到 ConfigMap 中,并且不会重写它:
然后重复第 3 步,确认该值已到达 ConfigMap。详细信息和完整的 key 列表请参阅 Where to Put Each Setting。
获取帮助
如果你仍然遇到问题:
- 查看日志:检查所有组件日志中的错误
- 验证配置:再次核对所有配置文件
- 检查文档:查看本指南中的 PAC 文档
- 回顾故障排除:检查本文档中的其他故障排除章节
下一步
- Manage PAC Component - 部署和管理指南
- Guides - Repository 设置指南
- Trigger PAC Pipelines - 自动事件和注释命令