我创建了一个 Dockerfile (对于一个可以与_515826一起使用的Node JNLP slave) . 我正在从官方形象延伸 jenkinsci/jnlp-slave
FROM jenkinsci/jnlp-slave
USER root
MAINTAINER Aryak Sengupta <aryak.sengupta@hyland.com>
LABEL Description="Image for NodeJS slave"
COPY perceptive.crt /usr/local/share/ca-certificates
RUN update-ca-certificates
RUN curl -sL https://deb.nodesource.com/setup_8.x | bash \
&& apt-get install -y nodejs
ENTRYPOINT ["jenkins-slave"]
我将此图像保存在我的Pod模板中(在K8s插件配置中) . 现在,当我试图在这个 slave 上运行构建时,我发现在Pod内部产生了两个容器(截图来证明相同) .
我的Pod模板如下所示:
我的Kubernetes配置如下所示:
现在如果我做一个简单的 docker ps
,我发现有两个容器启动了(为什么?):
现在,在Jenkins的Jenkins Job配置中,无论我在构建步骤中添加什么,步骤都会在第一个容器中执行 .
即使我在 PodTemplate
中使用官方的 Node
容器,结果仍然是相同的:
我试图在我的Jenkins Job中打印Node版本,输出是 "Node not found" . 另外,为了验证我的骚扰,我已经在我的第二个容器中完成了 docker exec
并尝试打印 Node
版本 . 在这种情况下,它的工作绝对正常 .
这就是我的构建步骤:
所以,归结起来,我有两个主要问题:
-
为什么 two 分开(一个用于JNLP,一个用于所有自定义更改)容器在我启动Jenkins工作时启动?
-
为什么我的作业在没有安装Node的第一个容器上运行?如何使用此配置实现使用
Node
构建项目所需的行为?
我错过了什么?
附: - 如果某些部分的问题不明确,请告诉我 .
编辑:我明白这可以使用 Pipeline
Jenkins插件完成,我可以明确提到 container
名称,但我需要从Jenkins UI中执行此操作 . 有没有办法指定容器名称以及我已经在做的奴隶名称:
3 回答
好吧,所以我已经找到了解决方案 . mhang li 's answer was the clue but he didn'解释一下 .
基本上,您需要修改找到的官方Jenkins Slave图像here并修改它以包含您的奴隶的更改 . 从本质上讲,您将JNLP和Slave容器合二为一,并构建组合图像 .
修改格式将如下所示(从Dockerfile链接获取)
现在,将从属容器命名为
jnlp
(Reason - bug) . 所以现在,你将拥有一个容器,它将成为你的JNLP Slave . 总而言之,您的Kubernetes Plugin Pod模板看起来就像这样 . 请注意我放入的docker镜像的自定义URL . 另外,除非您需要,否则请确保不包含Command To Run
.完成!你的构建现在应该在这个容器中运行,并且应该像你编写Dockerfile一样运行!
将容器模板 - >名称设置为jnlp . https://issues.jenkins-ci.org/browse/JENKINS-40847
Jenkins kubernetes插件将始终在pod中创建一个JNLP从属容器,用于执行构建 . podTemplate是您定义执行构建所需的其他容器的位置 .
在这种情况下,您似乎希望将一个Node容器添加到podTemplate . 在您的构建中,您将在命名的Node容器内进行构建 .
你不应该真正关心Pod运行的位置 . 您需要做的就是确保添加一个具有所需资源的容器(在本例中为Node) . 您可以根据需要向podTemplate添加任意数量的容器 . 我有一些10个或更多的容器用于PMD,Maven,curl等步骤 .
我使用带有管道的Jenkins文件 .