我正在使用Jenkins声明性管道自动化我的构建过程。仅在某些条件(Sonar,Checkmarx)通过的情况下,我们才希望将工件发布到远程JFrog存储库。

经过一些研究,我发现Artifactory插件对此很有用。但是我找不到有关如何集成到声明式管道中的任何文档。以下是Jenkinsfile的代码片段

stages{

    stage('Pre-Build'){
        steps{

             script{
                def server = Artifactory.server 'LocalJfrog'
                def rtGradle = Artifactory.newGradleBuild()
                rtGradle.resolver server: server, repo: 'gradle-dev-local'
                rtGradle.deployer server: server, repo: 'gradle-release-local'
                rtGradle.useWrapper = true
            }

        }   
    }
}


上面的代码无法进行条件发布,因为即使禁用了自动发布,我也无法重用服务器变量。 >

#1 楼

通过在阶段内使用when块,可以在声明式管道中使用条件。有一个名为“环境注入器”的插件,它允许您在管道脚本之外设置变量,这很好。另外,如果将该步骤放在其他步骤的下面,那么如果它们失败,它将不会执行。

 when {
    environment name: 'pushArtifact', value: 'true'
  }
  steps{
     //push artifact  
  }


评论


感谢您的提示。如果我理解正确,则必须在满足条件后设置变量,然后在“预构建”步骤中检查该变量

– Dharanidhar
17年7月6日在8:02

#2 楼

我认为您的问题根源在于服务器变量无法在预构建阶段块之外重用。这些变量是其他阶段无法访问的。

根据先前的建议,我建议这样做:
gradle_artifactory.groovy

    def call (Map parameters = [:]) {  //optional parameters mapping

        def server = Artifactory.server 'LocalJfrog'
        def rtGradle = Artifactory.newGradleBuild()
        rtGradle.resolver server: server, repo: 'gradle-dev-local'
        rtGradle.deployer server: server, repo: 'gradle-release-local'
        rtGradle.useWrapper = true
        def buildInfo = rtGradle.run rootDir: "projectDir/", buildFile: 
            'build.gradle', tasks: 'clean artifactoryPublish'

    }


然后保留声明性管道script { ... }

@Library('my-shared-lib') 
...
stage('Artifactory Upload') {
    when { <some expression with sonarqube/checkmarx> }
    steps {
        script {
            gradle_artifactory()
        }
    }
}


引用:

https:/ /jenkins.io/doc/book/pipeline/syntax/#when

https://jenkins.io/doc/book/pipeline/shared-libraries/

#3 楼

如果要在Jenkinsfile中嵌入逻辑,则声明性语法可能不是最好的方法,因为它并不总是很容易在代码中反映出来。就能更轻松地定义和使用条件。

评论


谢谢回复。我知道脚本化的管道,但是既然如此,对于任何认为它将被包含在声明式管道中的项目来说,这都是基本的必要条件。然后将切换回脚本或外部Groovy脚本

– Dharanidhar
17年5月11日在12:38