【问题标题】:How can I use Jar produced by mvn package in another Jenkins declarative pipeline stage?如何在另一个 Jenkins 声明性管道阶段使用 mvn 包生成的 Jar?
【发布时间】:2018-04-28 09:32:44
【问题描述】:

我正在尝试使用 Jenkins 为 Maven 项目构建 CI/CD 管道。我似乎找不到任何关于如何在另一个 Jenkins 声明性管道阶段使用 mvn 包生成的 .jar 文件的体面示例。在将其上传到 docker-registry 之前,我需要 jar 文件来制作 docker-image。这是我的 jenkinsfile 的相关部分:

pipeline {
  agent none
  stages{
    stage('Build Jar'){
        agent {
          docker {
            image 'maven:3-alpine'
            args '-v /root/.m2:/root/.m2'
          }
        }
        steps {
            sh 'mvn package'
            stash includes: 'target/*.jar', name: 'targetfiles'
        }
    }
    stage('Deploy') {
        agent {
            node {
                label 'DockerDefault'
            }
         }

      steps {
            script{
                def image = docker.build("image-name:test", ' .')
            }
      }
    }
  }
}

Dockerfile:

#install OS
FROM centos
#install java
RUN yum install -y java
#make directory structure to store temporary files
RUN mkdir -p /store
#put jar into container
ADD target/AdWordsProducer-1.0-SNAPSHOT-shaded.jar adwordsproducer.jar
#run jar
ENTRYPOINT ["java", "-jar", "/adwordsproducer.jar"]

编辑 1------------------------------------------ ----------------------------------------:

Laszlos 的回答成功了,因为我注意到我的 .jar 文件的名称与 dockerfile 假设的名称不同。 这是我工作的最终詹金斯文件:

pipeline {
  agent none
  stages{
    stage('Build Jar'){
        agent {
          docker {
            image 'maven:3-alpine'
            args '-v /root/.m2:/root/.m2'
          }
        }
        steps {
            sh 'mvn package'
            stash includes: 'target/*.jar', name: 'targetfiles'
        }
    }
    stage('Deploy') {
        agent {
            node {
                label 'DockerDefault'
            }
         }

      steps {
            script{
                unstash 'targetfiles'
                sh 'ls -l -R'
                def image = docker.build("image-name:test", ' .')
            }
      }
    }
  }
}

并修改dockerfile:

#install OS
FROM centos
#install java
RUN yum install -y java
#make directory structure to store temporary files
RUN mkdir -p /store
#put jar into container
#ADD target/AdWordsProducer-1.0-SNAPSHOT-shaded.jar adwordsproducer.jar
ADD target/AdWordsProducer-1.0-SNAPSHOT.jar adwordsproducer.jar
#run jar
ENTRYPOINT ["java", "-jar", "/adwordsproducer.jar"]

【问题讨论】:

  • 您可以在所有阶段使用相同的 dockerfile,只需在其上安装 docker cmd 并将 docker.sock 挂载到它。
  • 使用声明性语法如何安装 docker cmd 并安装 docker.sock?
  • 我会把它作为答案

标签: java maven docker jenkins devops


【解决方案1】:

您可以在所有阶段使用相同的 dockerfile,只需在其上安装 docker cmd 并将 docker.sock 挂载到它。

将此添加到 Dockerfile:

RUN apt-get update && \
    apt-get install -y apt-transport-https ca-certificates curl software-properties-common && \
    curl -fsSL https://download.docker.com/linux/centos/gpg | apt-key add - && \
    add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/centos trusty stable" && \
    apt-get update && \
    apt-get install -y docker-ce

然后像这样运行设置 Jenkinsfile:

pipeline {
    agent {
       docker {
         image 'maven:3-alpine'
         args '-u root -v /root/.m2:/root/.m2 -v /var/run/docker.sock:/var/run/docker.sock'
       }
    }
    stage('Build Jar'){
        steps {
            sh 'mvn package'
            stash includes: 'target/*.jar', name: 'targetfiles'
        }
    }
    stage('Deploy') {

      steps {
            script{
                sh 'docker build image-name:test'
            }
      }
    }
}

【讨论】:

  • 尝试使用 docker.build 时出错:/var/lib/jenkins/workspace/sproducer_jenkinsdeploytest-A4VADMAFYEI7LNUGCAU3GTD55H6LWVGI5YZ6J2LWDRRHUQ5CVIAA@tmp/durable-b0a881a2/script.sh:第 1 行:docker:未找到脚本退出代码 127
  • 对,你应该用 sh 'docker build image-name:test' 命令替换它。我已经编辑了答案。
  • 尝试编辑后的答案时仍然出现相同的错误
  • 在定义代理时可能会使用基本映像“twalter/maven-docker:latest”,其中包括 docker 二进制文件,但是当尝试使用 sh docker.build 构建时,我得到“在尝试在 unix:///var/run/docker.sock 连接到 Docker 守护进程套接字:发布 http://%2Fvar%2Frun%2Fdocker.sock/v1.29/build?”
  • 将 '-u root' 添加到 docker run 参数(我也编辑了我的示例),因此它将以 root 身份运行。
【解决方案2】:

您将 jar 文件存储在名称“targetfiles”下。这很好。

我认为缺少的是从存储中弹出,尝试添加 unstash 行,如下所示。这些文件将位于与您存储它们时完全相同的位置。在您的情况下,在“目标/”下。

stage('Deploy') {
  steps {
        script{
            unstash 'targetfiles'
            sh 'docker build image-name:test'
        }
  }
}

【讨论】:

  • 我在脚本部分添加了 unstash,但它仍然失败并显示“添加失败:stat /var/lib/docker/tmp/docker-builder297706921/target/AdWordsProducer-1.0-SNAPSHOT-shaded. jar: 没有这样的文件或目录脚本返回退出代码 1"
  • 嗯,也许在 docker build 命令之前添加一个sh 'ls -l' 可以提供一些线索,那里有哪些文件。
  • 做了 sh 'ls -l -R' 并发现有一个目标文件夹,其中有一个名为“AdWordsProducer-1.0-SNAPSHOT.jar”的文件,其中 dockerfile 需要相同的文件 -名称末尾的阴影
  • 太棒了。我想如果你让文件名匹配,你就是金子 :)
  • 成功了!将修改我的问题以包含结果。不幸的是,当“通知提交构建结果”到 Bitbucket“java.nio.file.NoSuchFileException:/var/lib/jenkins/workspace/adwordsproducer_soLaszlo-H7SU2BEXPNCY3Z7GB2K3S4VCB6HPRJC2IWRXRA5CMYCOBZNLLQAQ/Dockerfile”时,我遇到了另一个错误,但我想这超出了这个问题的范围跨度>
猜你喜欢
  • 2017-12-05
  • 1970-01-01
  • 1970-01-01
  • 2017-10-21
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多