Docker Jenkins的K8s插件:始终在一个吊舱内运行两个单独的容器
我已经创建了一个Dockerfile(用于一个节点JNLP从节点,可以与Jenkins的Kubernetes插件一起使用)。我从官方图像扩展而来Docker Jenkins的K8s插件:始终在一个吊舱内运行两个单独的容器,docker,jenkins,kubernetes,jenkins-plugins,Docker,Jenkins,Kubernetes,Jenkins Plugins,我已经创建了一个Dockerfile(用于一个节点JNLP从节点,可以与Jenkins的Kubernetes插件一起使用)。我从官方图像扩展而来jenkinsci/jnlp slave FROM jenkinsci/jnlp-slave USER root MAINTAINER Aryak Sengupta <aryak.sengupta@hyland.com> LABEL Description="Image for NodeJS slave" COPY cert.crt
jenkinsci/jnlp slave
FROM jenkinsci/jnlp-slave
USER root
MAINTAINER Aryak Sengupta <aryak.sengupta@hyland.com>
LABEL Description="Image for NodeJS slave"
COPY cert.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"]
来自jenkinsci/jnlp从机的
用户根
维护者Aryak Sengupta
我的Pod模板如下所示:
我的Kubernetes配置如下所示:
现在,如果我做一个简单的docker ps
,我发现有两个容器启动了(为什么?)
现在,在Jenkins的Jenkins作业配置中,无论我在构建步骤中添加什么,这些步骤都会在第一个容器中执行
即使我在我的PodTemplate
中使用官方的节点
容器,结果仍然是一样的:
我尝试在Jenkins作业中打印节点版本,输出为“未找到节点”。另外,为了验证我的臀部,我在第二个容器中执行了docker exec
,并尝试打印节点的版本。在这种情况下,它工作得非常好
这就是我的构建步骤:
总之,我有两个主要问题:
为什么每当我启动Jenkins作业时,两个独立的容器(一个用于JNLP,另一个用于所有自定义更改)都会启动李>
为什么我的作业在第一个未安装节点的容器上运行?如何使用此配置实现使用节点构建项目所需的行为
我错过了什么
附言-如果问题的某些部分不清楚,请务必告诉我
编辑:我知道这可以通过使用管道
Jenkins插件来完成,在这里我可以明确提到容器
名称,但我需要从Jenkins UI来完成。有没有办法指定容器名称和从属名称,我已经这样做了:
Jenkins kubernetes插件将始终在pod内创建一个JNLP从属容器,该容器是为执行构建而创建的。podTemplate用于定义执行构建所需的其他容器
在本例中,您似乎希望将节点容器添加到您的podTemplate中。在您的构建中,您将使构建发生在命名节点容器中
你不应该真的在乎吊舱在哪里运行。您所需要做的就是确保添加一个具有所需资源的容器(如本例中的节点)。您可以向一个podTemplate添加任意数量的容器。我有一些包含10个或更多容器的步骤,如PMD、Maven、curl等
我使用带有管道的Jenkins文件
podTemplate(cloud: 'k8s-houston', label: 'api-hire-build',
containers: [
containerTemplate(name: 'maven', image: 'maven:3-jdk-8-alpine', ttyEnabled: true, command: 'cat'),
containerTemplate(name: 'pmd', image: 'stash.company.com:8443/pmd:pmd-bin-5.5.4', alwaysPullImage: false, ttyEnabled: true, command: 'cat')
],
volumes: [
persistentVolumeClaim(claimName: 'jenkins-pv-claim', mountPath: '/mvn/.m2nrepo')
]
)
{
node('api-hire-build') {
stage('Maven compile') {
container('maven') {
sh "mvn -Dmaven.repo.local=/mvn/.m2nrepo/repository clean compile"
}
}
stage('PMD SCA (docker)') {
container('pmd') {
sh 'run.sh pmd -d "$PWD"/src -f xml -reportfile "$PWD"/target/pmd.xml -failOnViolation false -rulesets java-basic,java-design,java-unusedcode -language java'
sh 'run.sh pmd -d "$PWD"/src -f html -reportfile "$PWD"/target/pmdreport.html -failOnViolation false -rulesets java-basic,java-design,java-unusedcode -language java'
sh 'run.sh cpd --files "$PWD"/src --minimum-tokens 100 --failOnViolation false --language java --format xml > "$PWD"/target/duplicate-code.xml'
}
archive 'target/duplicate-code.xml'
step([$class: 'PmdPublisher', pattern: 'target/pmd.xml'])
}
}
}
将容器模板->名称设置为jnlp。
好的,我已经找到了解决办法。李明的回答是线索,但他一点也没有解释
基本上,您需要修改找到的Jenkins Slave官方图像,并对其进行修改,以包括对您的Slave所做的更改。本质上,您是将JNLP和从属容器组合成一个容器,并构建一个组合映像
修改格式如下所示(从链接的Dockerfile中选取)
来自jenkins/slave的:3.27-1
维修员奥列格·内纳舍夫
LABEL Description=“这是一个基本映像,允许通过JNLP协议连接Jenkins代理”Vendor=“Jenkins project”Version=“3.27”
复制jenkins slave/usr/local/bin/jenkins slave
**包括你的奴隶的代码。例如安装节点、java等等**
ENTRYPOINT[“jenkins slave”]#确保也包含此文件
现在,命名从属容器jnlp
(原因-)。现在,您将有一个生成的容器,它将是您的JNLP+从容器。总之,你的Kubernetes插件Pod模板看起来像这样。请注意我放入的docker图像的自定义url。另外,除非需要,否则请确保不要包含要运行的命令
完成了!您的构建现在应该在这个容器中运行,并且应该像您编程Dockerfile一样工作 你的Pod模板是什么?@Danielwatrus我已经用Pod模板更新了这个问题。ThanksI还更新了Jenkins作业输出的问题。我想,我应该让你知道。丹尼尔,我有完全相同的配置。唯一的区别是我没有使用Jenkins文件。我将为该作业进行手动配置。在那里,我提到了我为Pod模板提到的同一个标签。现在我在Pod模板中使用官方的节点
容器,仍然得到了相同的结果,即Node:Not found error。我的直觉是,要使用节点容器,您的Execute shell命令必须看起来不同。我认为shell命令是在默认的JNLP容器上运行的。我只是尝试创建一个手动作业,但在ExecuteShell中找不到任何方法来标识运行命令所需的容器。有什么理由不使用管道脚本吗?我的天啊,我的天啊。。。我花了一天的时间看教程,这是我发现的第一个真正的配置。。。谢谢。。。
FROM jenkins/slave:3.27-1
MAINTAINER Oleg Nenashev <o.v.nenashev@gmail.com>
LABEL Description="This is a base image, which allows connecting Jenkins agents via JNLP protocols" Vendor="Jenkins project" Version="3.27"
COPY jenkins-slave /usr/local/bin/jenkins-slave
**INCLUDE CODE FOR YOUR SLAVE. Eg install node, java, whatever**
ENTRYPOINT ["jenkins-slave"] # Make sure you include this file as well