首页 文章

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

提问于
浏览
1

我创建了一个 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内部产生了两个容器(截图来证明相同) .

enter image description here

我的Pod模板如下所示:

enter image description here

我的Kubernetes配置如下所示:
enter image description here

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

enter image description here

现在,在Jenkins的Jenkins Job配置中,无论我在构建步骤中添加什么,步骤都会在第一个容器中执行 .

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

enter image description here

我试图在我的Jenkins Job中打印Node版本,输出是 "Node not found" . 另外,为了验证我的骚扰,我已经在我的第二个容器中完成了 docker exec 并尝试打印 Node 版本 . 在这种情况下,它的工作绝对正常 .

这就是我的构建步骤:

enter image description here

所以,归结起来,我有两个主要问题:

  • 为什么 two 分开(一个用于JNLP,一个用于所有自定义更改)容器在我启动Jenkins工作时启动?

  • 为什么我的作业在没有安装Node的第一个容器上运行?如何使用此配置实现使用 Node 构建项目所需的行为?

我错过了什么?

附: - 如果某些部分的问题不明确,请告诉我 .

编辑:我明白这可以使用 Pipeline Jenkins插件完成,我可以明确提到 container 名称,但我需要从Jenkins UI中执行此操作 . 有没有办法指定容器名称以及我已经在做的奴隶名称:

enter image description here

3 回答

  • 0

    好吧,所以我已经找到了解决方案 . mhang li 's answer was the clue but he didn'解释一下 .

    基本上,您需要修改找到的官方Jenkins Slave图像here并修改它以包含您的奴隶的更改 . 从本质上讲,您将JNLP和Slave容器合二为一,并构建组合图像 .

    修改格式将如下所示(从Dockerfile链接获取)

    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
    

    现在,将从属容器命名为 jnlp (Reason - bug) . 所以现在,你将拥有一个容器,它将成为你的JNLP Slave . 总而言之,您的Kubernetes Plugin Pod模板看起来就像这样 . 请注意我放入的docker镜像的自定义URL . 另外,除非您需要,否则请确保不包含 Command To Run .

    enter image description here

    完成!你的构建现在应该在这个容器中运行,并且应该像你编写Dockerfile一样运行!

  • 3

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

  • 1

    Jenkins kubernetes插件将始终在pod中创建一个JNLP从属容器,用于执行构建 . podTemplate是您定义执行构建所需的其他容器的位置 .

    在这种情况下,您似乎希望将一个Node容器添加到podTemplate . 在您的构建中,您将在命名的Node容器内进行构建 .

    你不应该真正关心Pod运行的位置 . 您需要做的就是确保添加一个具有所需资源的容器(在本例中为Node) . 您可以根据需要向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'])
        }
      }
    }
    

相关问题