Jenkins的K8s插件:始终在容器中运行两个单独的容器

Ary*_*pta 2 jenkins jenkins-plugins docker kubernetes

我已经创建了一个Dockerfile(用于可以与JenkinsKubernetes插件一起使用的Node JNLP从站)。我从官方形象延伸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"]
Run Code Online (Sandbox Code Playgroud)

我将此图像保存在我的Pod模板中(在K8s插件配置中)。现在,当我尝试在此从属服务器上运行构建时,我发现在Pod内生成了两个容器(屏幕快照证明相同)。

在此处输入图片说明

我的Pod模板如下所示:

在此处输入图片说明

我的Kubernetes配置看起来像这样: 在此处输入图片说明

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

在此处输入图片说明

现在,在Jenkins的Jenkins Job配置内部,无论我在构建步骤中添加什么,这些步骤都将在第一个容器中执行。

即使我Node在自己的容器中使用了官方容器PodTemplate,结果仍然相同:

在此处输入图片说明

我尝试在我的Jenkins Job中打印Node版本,并且输出为“ Node not found”。另外,为了验证我的腰臀,我在docker exec第二个容器中做了一个步骤,然后尝试打印Node版本。在这种情况下,它绝对可以正常工作。

这是我的构建步骤如下所示:

在此处输入图片说明

因此,归根结底,我有两个主要问题:

  1. 每当启动Jenkins Job时,为什么会启动两个单独的容器(一个用于JNLP,一个用于所有自定义更改)?
  2. 为什么我的作业在未安装Node的第一个容器上运行?如何Node使用此配置实现构建项目的预期行为?

我想念什么?

PS-请让我知道问题是否在某些地方不清楚。

编辑:我知道可以使用PipelineJenkins插件来完成,我可以在其中明确提及该container名称,但是我需要从Jenkins UI进行操作。有什么办法可以指定容器名称以及我已经在做的从属名称:

在此处输入图片说明

Dan*_*ous 5

Jenkins kubernetes插件将始终在为执行构建而创建的pod内创建一个JNLP从属容器。在podTemplate中,您可以定义执行构建所需的其他容器。

在这种情况下,您似乎想将Node容器添加到podTemplate中。然后,在您的构建中,将使构建发生在命名的Node容器内。

您不必在意Pod在哪里运行。您需要做的就是确保添加具有所需资源的容器(在本例中为Node)。您可以向PodTemplate添加任意数量的容器。我有一些带有10个或更多容器的容器,用于执行PMD,Maven,curl等步骤。

我将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'])
    }
  }
}
Run Code Online (Sandbox Code Playgroud)