首页 文章

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

提问于
浏览
4

我正在尝试使用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"]

EDIT 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

    您正在以“targetfiles”名称存储jar文件 . 这很好 .

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

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

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

相关问题