本地是好的在持续集成中是坏的
1.说明和分析
- 持续集成公共节点的每次构建都会提供一个全新的 Linux 环境给构建使用。
- 使用的是持续集成公共节点,是否开启了缓存目录,如果开启了清理一下缓存再试试。
- 如果使用的自定义节点,构建环境是用户自己提供的机器,CODING 侧是无法控制。可以试试 自定义构建环境 将您的构建跑在 Docker 容器中,这样每次构建都是全新的容器环境与宿主机无关。
2.常见情况
下面将展示两种最常见的情况,最常见的情况不表示其他的语言工具不会出现。
2.1.本地是好的,持续集成是坏的
本地有依赖缓存导致本地可以构建成功,但是持续集成中是没有的,这种情况常见于 Java + Maven 构建。
2.2.昨天构建是好的,今天坏了
这种情况常见与前端构建,NPM 是语义化版本策略 SemVer。 而你的代码仓库中没有存储 package-lock.json
或 yarn.lock
或者是 Docker 中使用的时候 Dockerfile 没有将 package-lock.json
或 yarn.lock
COPY 进来。
而使用的包很巧有更新,且开发者又没有严格遵守规范,且引入了破坏性更新,就会导致构建失败。
2.3.如何验证
在本地执行构建命令,将构建命令运行在 Docker(Docker 提供一个全新的完整的环境) 中。
- 验证 Java + Maven
# 这里使用的 maven:3.8.6-openjdk-8-slim 是 mvn 3.8.6 + java 8 的镜像,请在 Dockerhub 上查找您需要的版本
docker run -it -v $(pwd):/root/app -w /root/app maven:3.8.6-openjdk-8-slim bash -c "mvn clean package -Dskip.test=true -DskipTests -Dmaven.test.skip=true"
- 验证 Node
# 这里使用的 node:14.21.3 bash,请在 Dockerhub 上查找您需要的版本
docker run -it -v $(pwd):/root/app -w /root/app node:14.21.3 bash -c "npm install && npm run build"
3.案例分享
3.1.@jridgewell/gen-mapping 升级前端构建报错
用户反馈:代码没有任何变更,但是构建报错。
解决方案:
- 清理构建计划缓存,然后重新构建。
- 不用使用 mirror,因为下游被代 bug 的包污染(可能需要)
相关信息:
12 月 10 日 16 时后, stackoverflow 也有用户反馈:https://stackoverflow.com/questions/79267530/why-are-alpine-versions-of-node-throwing-an-error-that-jridgewell-gen-mapping-m
12 月 10 日 16 发过版:(Github) (Github Issue)
3.2.CentOS 下线 DNS 解析异常
用户反馈: yum install 报错,无法解析域名 DNS。
如: curl#6 - “Could not resolve host: mirrorlist.centos.org; Unknown error”。
CentOS Linux 7 已经于 2024 年 6 月 30 日终止生命周期(EOL): https://www.redhat.com/zh/topics/linux/centos-linux-eol
参考
在阅读中是否遇到以下问题?*
您希望我们如何改进?*
如果您希望得到回复,请留下您的邮箱地址。