Jenkins Pipeline - 在阶段之间传递工件URL

时间:2018-02-12 19:52:07

标签: jenkins groovy jenkins-pipeline

我的用例是构建一个Java作业,将tar.gz.zip部署到nexus并将此工件URL传递给更多阶段。

我在执行其他验证的脚本中使用以下命令:

mvn -B clean deploy -U package deploy:deploy -DskipNexusStagingDeployMojo=true -DaltDeploymentRepository=dev-snapshots::default::https://<myrepo.com>

以下是我的阶段:

stage('publish'){    
  //push to Nexus  
 }
stage('processing'){    
 // get the artifact url from above step
}

我不想使用“archiveartifacts”,因为我已经存储了工件,我不想存档它。我只需要网址。

到目前为止,我所能管理的只是将部署的整个输出转换为文本文件。

sh "deploy.sh > deploy.txt"

但是,新的File(deploy.txt)不能与Pipelines一起使用,因为groovy在master上执行,而文件在slave上创建。 readfile('deploy.txt')不接受任何正则表达式。所以我无法解析文件以获取工件URL。

有没有更好的方法可以将工件url从发布版发送到管道中的处理阶段?

2 个答案:

答案 0 :(得分:2)

如果在publish阶段将值存储在变量中并在processing阶段读取此变量怎么样?考虑遵循Jenkins管道示例:

def artifactUrl = ''

pipeline {
    agent any

    stages {
        stage('Build') { 
            steps {
                script {
                   artifactUrl = 'test'
                }
            }
        }

        stage('Publish') {
            steps {
                echo "Current artifactUrl is '${artifactUrl}'"
            }
        }
    }
}

当我运行它时,我得到以下输出:

[Pipeline] node
Running on Jenkins in /var/jenkins_home/workspace/test-pipeline
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Build)
[Pipeline] script
[Pipeline] {
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Publish)
[Pipeline] echo
Current artifactUrl is 'test'
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

当然有一个未解决的问题是如何获取工件URL,但如果你只能从你的发布命令中获取它,那么在阶段之间传递它应该不是问题。

答案 1 :(得分:1)

基于@Szymon Stepniak评论通过以下方式实现:

 def out = sh(script: "/myscript.sh" , returnStdout: true )
 Pattern p = Pattern.compile("INFO] Uploaded: .*bin.tar.gz")
 Matcher m = p.matcher(out);