在Jenkins声明性流水线中使用Artifactory插件

93次阅读
没有评论

问题描述

正在使用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
            }
        }
    }
}

用户希望能够在满足条件后,根据不同情况决定是否发布构件。

解决方案

请注意以下操作可能涉及Jenkins、Artifactory等版本差异,请在操作前备份。

方案1:使用环境变量实现条件发布

在Jenkins声明性流水线中,你可以通过在阶段内使用when块来实现条件逻辑。为了实现根据条件决定是否发布构件,你可以使用”environment injector”插件来设置在流水线脚本之外的变量。此外,将需要执行的步骤放在其他步骤之下,这样如果前面的步骤失败,该步骤将不会被执行。

以下是示例代码:

stages {
    stage('Pre-Build') {
        steps {
            script {
                // 设置环境变量以控制是否发布构件
                env.pushArtifact = 'true'
            }
        }
    }

    stage('Build') {
        when {
            environment name: 'pushArtifact', value: 'true'
        }
        steps {
            // 在满足条件时执行构建步骤
            // 这里放置构建步骤的代码
        }
    }
}

在上面的示例中,我们首先在”Pre-Build”阶段内设置了一个环境变量pushArtifact,该变量的值为true。然后,在”Build”阶段的when块中,我们检查该环境变量的值,如果为true,则执行构建步骤。

方案2:使用共享库来重用Artifactory部署逻辑

为了解决不能在不同阶段重用server变量的问题,你可以将Artifactory部署代码放入一个共享库中,以便在多个流水线中重用。这将帮助你保持流水线的DRY(Don’t Repeat Yourself)原则,同时使代码更易于管理。

首先,创建一个名为gradle_artifactory.groovy的共享库文件,其中包含Artifactory部署逻辑:

// gradle_artifactory.groovy
def call(Map parameters = [:]) {
    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'
}

然后,在你的声明性流水线中使用共享库来调用部署逻辑:

@Library('my-shared-lib') _

stages {
    stage('Pre-Build') {
        steps {
            script {
                // 设置环境变量以控制是否发布构件
                env.pushArtifact = 'true'
            }
        }
    }

    stage('Build') {
        when {
            environment name: 'pushArtifact', value: 'true'
        }
        steps {
            script {
                // 调用共享库中的Artifactory部署逻辑
                gradle_artifactory()
            }
        }
    }
}

在这个示例中,我们首先使用@Library注解来导入名为my-shared-lib的共享库。然后,在”Build”阶段的steps块内,我们调用了共享库中定义的gradle_artifactory方法,这将执行Artifactory部署逻辑。

通过使用共享库,你可以在不同流水线中重用相同的Artifactory部署逻辑,从而使流水线的代码更加模块化和易于管理。

请确保根据你的实际情况进行调整和修改,并在操作前做好适当的备份。

参考链接:
Jenkins Pipeline Syntax – when
Jenkins Pipeline Shared Libraries

正文完