如何在另一个Jenkins声明性管道阶段使用由mvn包生成的Jar?

时间:2017-11-15 08:31:59

标签: java maven docker jenkins devops

我正在尝试使用Jenkins为Maven项目构建CI / CD管道。我似乎无法找到关于如何在另一个Jenkins声明性管道阶段使用mvn包生成的.jar文件的任何体面的例子。我需要jar文件在将其上传到docker-registry之前制作一个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 ------------------------------------------ ----------------------------:

拉斯洛斯回答了这个伎俩,因为我注意到我的.jar文件名称与dockerfile假定的名称不同。 这是我工作的最终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{
                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"]

2 个答案:

答案 0 :(得分:5)

您正在使用名称' targetfiles'存储jar文件。这很好。

我认为缺少的是从藏匿处弹出,尝试添加如下所示的unstash行。这些文件将与您隐藏文件时的位置完全相同。在"目标/"在你的情况下。

for (;;)
do 
ssh remoteserver
done

答案 1 :(得分:0)

您可以为所有阶段使用相同的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

运行设置Jenkins文件如下:

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