Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker Jenkins的K8s插件:始终在一个吊舱内运行两个单独的容器_Docker_Jenkins_Kubernetes_Jenkins Plugins - Fatal编程技术网

Docker Jenkins的K8s插件:始终在一个吊舱内运行两个单独的容器

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

我已经创建了一个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 /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