【发布时间】:2021-05-04 10:24:02
【问题描述】:
背景 - 将项目从 CircleCI 迁移到 Jenkins。
项目技术 - typescript (node.js)
我使用 Jenkins 官方 helm chart 并利用动态从属服务器的优势在新出炉的 GKE 集群上部署了 Jenkins。
我面临的问题是我的一个应用程序,它是一组 4 个微服务,它们作为一个项目一起构建和部署。
由于所有应用程序一起构建和发布,因此我设置了一个 Jenkins 并行构建管道,该管道提取存储库并并行构建所有应用程序以节省构建时间(从现有的 CircleCI 设置复制相同的逻辑)。
在 CircleCI 中构建应用程序通常需要 5 到 7 分钟,而在 Jenkins 中则需要 20 多分钟。
我怀疑我有节点上的资源限制并增加到一个非常高规格的节点,然后使用kubectl top pods 命令进行监控,我注意到它在整个构建过程中从未达到超过 3 个 CPU。
为了进一步调试,我认为这可能是 IOPS 问题,因为该项目正在提取大量节点模块,并且我已将节点磁盘更改为 SSD 进行测试,但没有运气。
为了进一步调试,我开始为 Jenkins Sprawns 的每个从站配置一个动态 PV,但又没有运气了。
我不确定我错过了什么我检查了 docker stats、Kubernetes 日志,但一切看起来都很正常。
我正在像这样破坏 docker build(4 个不同的应用程序):
docker build --build-arg NODE_HEAP_SIZE=8096 --build-arg NPM_TOKEN=$NPM_TOKEN -f "test/Dockerfile" -t "test:123"
这就是我的 Dockerfile 的样子:
FROM node:10.19.0 AS node
WORKDIR /etc/xyz/test
COPY --from=gcr.io/berglas/berglas:0.5.0 /bin/berglas /usr/local/bin/berglas
COPY docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"]
#
# development stage used in conjunction with docker-compose for local development
#
FROM node AS dev
ENV NODE_ENV="development"
COPY new/package.json new/package-lock.json ../new/
RUN (cd ../new && npm install)
COPY brand/package.json brand/package-lock.json ../brand/
RUN (cd ../brand && npm install)
COPY chain/package.json chain/package-lock.json ./
RUN npm install
COPY chain ./
COPY new ../new/
COPY brand ../brand/
#
# production stage that compiles and runs production artifacts
#
FROM dev AS prod
ENV NODE_ENV="production"
ARG NODE_HEAP_SIZE="4096"
RUN NODE_OPTIONS="--max-old-space-size=${NODE_HEAP_SIZE}" npm run build:prod
为了验证节点上的网络带宽,我启动了一个 ubuntu 容器并进行了网络测试,结果达到了标准。
我什至尝试通过-cache-from 来改进构建期间的缓存,但这里也没有运气。
我什至尝试将NODE_HEAP_SIZE 更改为非常高的值,但没有得到任何改进。
我在npm install 或npm ci 或npm run build 看到了最大时间
添加进一步调查:
我尝试在 VM 上构建相同的步骤,并通过在同一 VM 上启动 docker 容器并尝试在内部运行 docker 构建,它所花费的时间比在 Jenkins 动态从属中运行要少得多。动态从站上的时间差或多或少加倍。
最大时间以npm install 和npm ci 为步长。
我不知道 CircleCi 是如何更快地构建它的。
谁能帮我调试什么?
【问题讨论】:
-
Jenkins 从属配置是什么?最大内存?
-
@ManuelPolacek 没有任何限制,slave可以占用节点上所有可用的资源。
标签: node.js docker jenkins kubernetes circleci