K8S插件詹金斯:始终运行的吊舱内的两个单独的容器

问题描述 投票:1回答:3

我已经创建了一个Dockerfile(为一个节点JNLP从属可与詹金斯的Kubernetes插件使用)。我从官方图片延长jenkinsci/jnlp-slave

FROM jenkinsci/jnlp-slave

USER root


MAINTAINER Aryak Sengupta <[email protected]>
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"]

我有这个图片救了我的布丁模板内(在K8S插件配置)。现在,当我试图在这个从运行构建,我发现两个容器越来越催生了吊舱内(屏幕截图,以证明相同)。

enter image description here

我波德模板看起来是这样的:

enter image description here

而我Kubernetes配置是这样的:enter image description here

现在,如果我做一个简单docker ps,我发现有其启动(为什么呢?)两个容器:

enter image description here

现在,詹金斯的詹金斯作业配置,无论我在构建步骤里面添加,的步骤在第一时间拿到容器中执行。

即使我使用官方Node容器我PodTemplate内,结果还是一样:

enter image description here

我试图打印我詹金斯作业里面的节点版本,输出“节点未找到”。此外,为了验证我的臀部,我已经做了docker exec到我的第二个容器,并试图打印Node版本。在这种情况下,它的工作原理精绝。

这是我的构建步骤是这样的:

enter image description here

因此,要熬下来,我有两个主要问题:

  1. 为什么两个独立的(一个用于JNLP和一个与所有的自定义更改)容器启动时,我火了詹金斯的工作吗?
  2. 为什么我的作业未安装节点上的第一容器上运行?如何实现使用该配置建立我的项目与Node的期望行为?

我在想什么?

附: - 请不要让我知道,如果这个问题原来是在一些地方不清楚。

编辑:据我所知,这可以通过使用Pipeline詹金斯插件,我可以明确地提及container名工作要做,但我需要从詹金斯UI做到这一点。有没有什么办法来与我已经在做这样的从属名称沿指定容器名称:

enter image description here

docker jenkins kubernetes jenkins-plugins
3个回答
5
投票

詹金斯kubernetes插件将始终创建创建执行构建的吊舱内的JNLP从容器。该podTemplate是你定义你为了执行您的构建需要的其他容器。

在这种情况下,它似乎你想一个节点容器添加到您的podTemplate。在你的构建,你将不得不命名节点容器内的建设发生。

你不应该真正关心的波德运行在那里。所有你需要做的是确保你补充的是有你需要(如Node在这种情况下)的资源的容器。只要你想一个podTemplate您可以添加尽可能多的容器。我有一些有10升以上的容器像PMD,Maven的,卷曲等工序

我使用的是Jenkinsfile与管道。

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'])
    }
  }
}

1
投票

好吧,所以我已经想通了解决方案。 mhang李的回答是线索,但他没有解释一个位。

基本上,你需要修改詹金斯从官方的图片发现here并修改它包括你的奴隶的变化也是如此。从本质上讲,你杵JNLP和从集装箱为一体,构建组合图像。

修改格式将只是看起来像这样(从Dockerfile拿起链接)

FROM jenkins/slave:3.27-1
MAINTAINER Oleg Nenashev <[email protected]>
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

现在,命名从容器jnlp(原因 - bug)。所以,现在,你将有一个容器的滋生,这将是你的JNLP +奴隶。总而言之,你的Kubernetes插件波德模板会是这个样子。注意自定义URL我已经把在泊坞窗图像。此外,请确保您不包括Command To Run,除非你需要一个。

enter image description here

完成!你现在建立这个应该容器内运行,就像你编程的Dockerfile应完全发挥作用!


0
投票

设置容器模板 - >名称为JNLP。 https://issues.jenkins-ci.org/browse/JENKINS-40847

© www.soinside.com 2019 - 2024. All rights reserved.