【问题标题】:Jenkins dynamic slaves on kubernetes - Very high build timekubernetes 上的 Jenkins 动态从站 - 构建时间非常长
【发布时间】: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 installnpm cinpm run build 看到了最大时间

添加进一步调查:

我尝试在 VM 上构建相同的步骤,并通过在同一 VM 上启动 docker 容器并尝试在内部运行 docker 构建,它所花费的时间比在 Jenkins 动态从属中运行要少得多。动态从站上的时间差或多或少加倍。

最大时间以npm installnpm ci 为步长。

我不知道 CircleCi 是如何更快地构建它的。

谁能帮我调试什么?

【问题讨论】:

  • Jenkins 从属配置是什么?最大内存?
  • @ManuelPolacek 没有任何限制,slave可以占用节点上所有可用的资源。

标签: node.js docker jenkins kubernetes circleci


【解决方案1】:

如果不检查日志,就很难说出 Jenkins 中发生了什么。请查看this有关全局 jenkins 日志和配置额外日志记录器的文章。

我在 AWS 中使用动态 jenkins slaves 时遇到了类似的问题,因为“Amazon EC2”插件的开发人员更改了安全设置,并且检查 ssh 密钥需要大约 15 分钟。

【讨论】:

  • 谢谢,我在日志中进行了进一步调查,发现并行阶段(并行构建所有四个应用程序)导致构建缓慢。通过将并行构建更改为顺序构建,我得到了与在本地构建相同的结果。似乎 Jenkins 并行构建在这里效率不高。这里有任何线索,我可以优化或进一步调查什么?因为需要并行构建来优化构建时间。
  • 詹金斯主节点处理作业快吗?奴隶起步快吗?在最长的管道步骤中检查容器/pod 日志。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-26
  • 2021-08-27
  • 2019-08-10
  • 2017-04-17
  • 1970-01-01
  • 2023-03-17
  • 2020-08-01
相关资源
最近更新 更多