常见问题
1342 字约 4 分钟
问题反馈前,建议先查看对应文档,在下面常见问题和 feedback 中查看问题是否已经存在。
若未能找到答案,请于 feedback 中提交 issue
。
流水线为什么没触发
要定位流水线没触发问题,先要了解流水线从触发到执行的流程。
以 push
事件为例:
其中
skip 检测
包括ifNewBranch
、ifModify
,参考语法。
那么可以按照这个流程一层层查下去:
- 代码是否 push 到远端?
- 对应分支是否有
.cnb.yml
? .cnb.yml
是否声明了当前分支的push
事件流水线?- 是否命中了 skip 检测?
CNB 中默认分支通常为
main
,一些迁移自其他平台的仓库可能默认分支为master
,请注意区分。
在本地明明好的,为什么在 CI 上跑失败了
要定位这个问题,首先要明确本地环境和 CI 环境的区别:
本地 | CI 环境 | |
---|---|---|
网络 | 本地网络(比如一些办公内网) | CI 机器所在网络 |
文件 | 本地整个目录下所有文件 | Git仓库对应分支代码 |
环境 | 原生 | 指定的 Docker 容器环境 |
Shell | 本地指定 | sh |
了解到差异,我们可以依次排查:
- 是否有文件未提交?
- 构建依赖的文件是否命中 .gitignore?
- 是否依赖本地才有的资源(如本地接口、凭证等)?
- CI 声明的 cpus 是否满足要求?
- 本地运行相同的镜像,得到与 CI 相同的构建环境,进行调试。
云原生构建
的默认镜像为 cnbcool/default-build-env。
那么,我们可以执行下面命令,进入默认 CI 环境进行调试
docker run --rm -it -v $(pwd):$(pwd) -w $(pwd) cnbcool/default-build-env sh
如果声明了其他镜像作为流水线构建环境,请将上述命令中 cnbcool/default-build-env
替换成对应镜像地址。
如何登录到流水线容器调试
参考 登录调试
流水线执行脚本和登陆调试执行脚本结果不一样
流水线里的默认使用 sh,登陆调试的是 bash。
如果确认指定的流水线容器是支持bash的(默认的流水线容器是支持的,但如果是自定义容器,可能不支持),可以把执行脚本改成 bash xxx.sh 或者 bash -c '{原来的语句}'。
超时无输出
一个 job 如果超过 10 分钟没有 log 输出,那么就会被终止掉。可以考虑增加 log,例如针对 npm install
的情况,可以加上 verbose 参数。
注意这个跟 job 的 timeout 声明的超时不一样,不能通过配置修改。
没改代码为什么流水线就失败了
可以检查依赖的其他资源是否有变动,比如:
- 插件任务声明镜像版本为 latest,镜像是否有变动。
- CI 配置文件引用了其他仓库文件,被引用文件是否有变动。
- 有可能网络波动,Rebuild 试试。
代码合并冲突
若创建 PR 或在 PR 相关事件的构建中碰到代码冲突问题,可以通过如下命令解决:
git fetch origin # 从远端仓库获取更新
git rebase -i origin/main # 实际的目标分支名
# 本地处理冲突
git commit # 根据实际情况提交代码到本地仓库
git push -f # 推送到远端仓库
查看完整日志
CI 服务发送插件任务和脚本任务至 Runner 执行。如果任务日志过长,将会被截断并返回给 CI 服务。
阶段会汇总其下所有任务的日志。若阶段日志过长,也会被截断以便更好地展示在日志页面上。
构建完成后,您可在日志页面流水线右上角点击日志下载按钮查看完整日志。
为什么不提供固定的出口IP
CNB 不提供固定的出口 IP 地址。您在云原生构建
或云原生开发
服务里,访问外部服务用到的出口IP,可能会随时间变化。
这是因为:
- 使用动态 IP 地址可以减少遭受针对性攻击的风险,当一个出口ip被攻击拥堵时,可以立马自动切换,提升安全性和服务质量。
- 我们不建议对 CNB 的出口 IP 做任何白名单逻辑,因为 CNB 是一个公开开放的平台,可能会被恶意攻击者利用,对 CNB 出口 IP 做白名单逻辑,约等于对整个公网加白。
对于确实需要特定 IP 地址范围做白名单的(例如:用于连接内部服务),您可以考虑以下方法:
- 使用私有代理: 在工作流程中配置一个私有代理,让您的请求通过该代理路由出去,该代理可以拥有您指定的固定 IP 地址。
- 使用 VPN :在工作流程的执行环境上建立一个 VPN 连接,通过 VPN 的固定出口 IP 地址来访问外部资源。