问题描述
正在使用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