Jenkins 声明式管道和自定义 Maven settings.xml
Jenkins declarative pipeline and custom maven settings.xml
我有一个 Maven 项目,它从公司网络内的私有存储库 (Nexus) 解决了它的一些依赖项。因此,它只能使用自定义 settings.xml 来构建,其中存储了私有存储库的凭据。
maven 项目由 Jenkins 使用声明式管道构建。构建作业是多分支管道。
在 Jenkins 的作业配置中,在 "Pipeline Maven Configuration" 下,我指定了一个设置文件(托管文件)和一个全局设置文件。
然而,管道本身似乎完全忽略了这个设置。
似乎要使用自定义 settings.xml,我必须将每个 mvn 调用包装到 withMaven() {...} 块或 configFileProvider () {...} 块中.
当我这样做时,它工作正常,但由于此管道中有很多 mvn 调用,这会使管道不必要地复杂。
是否有另一种方法让 maven 获取自定义 settings.xml 文件?
如果没有在管道内进行进一步配置就不会使用指定的文件,那么 "Pipeline Maven Configuration" 设置的意义何在?
目前我将采用以下方法...
将我的 maven 用户设置文件放在我的 SCM 中的 Jenkinsfile 旁边。在 jenkins 文件的“工具”部分声明要使用的 Maven:
tools {
maven 'Maven 3.6.3'
jdk 'AdoptOpenJDK_8u222'
}
然后我使用“-s”命令行选项将用户设置添加到每个 Maven 调用中:
steps {
sh 'mvn pmd:pmd -s usersettings.xml'
}
仍然不喜欢重复添加用户设置,但比 运行“withMaven()”更精简 - 更快。
更新
可以用这样的 Groovy 函数包装 Maven 调用
def mvn(String cmd) {
sh "mvn ${cmd} -s usersettings.xml"
}
整理流水线脚本:
steps {
mvn 'pmd:pmd'
}
其他方法是使用 Pipeline Maven 集成
https://github.com/jenkinsci/pipeline-maven-plugin
node {
stage ('Build') {
git url: 'https://github.com/cyrille-leclerc/multi-module-maven-project'
withMaven(
// Maven installation declared in the Jenkins "Global Tool Configuration"
maven: 'maven-3', // (1)
// Use `$WORKSPACE/.repository` for local repository folder to avoid shared repositories
mavenLocalRepo: '.repository', // (2)
// Maven settings.xml file defined with the Jenkins Config File Provider Plugin
// We recommend to define Maven settings.xml globally at the folder level using
// navigating to the folder configuration in the section "Pipeline Maven Configuration / Override global Maven configuration"
// or globally to the entire master navigating to "Manage Jenkins / Global Tools Configuration"
mavenSettingsConfig: 'my-maven-settings' // (3)
) {
// Run the maven build
sh "mvn clean verify"
} // withMaven will discover the generated Maven artifacts, JUnit Surefire & FailSafe & FindBugs & SpotBugs reports...
}
}
我有一个 Maven 项目,它从公司网络内的私有存储库 (Nexus) 解决了它的一些依赖项。因此,它只能使用自定义 settings.xml 来构建,其中存储了私有存储库的凭据。
maven 项目由 Jenkins 使用声明式管道构建。构建作业是多分支管道。
在 Jenkins 的作业配置中,在 "Pipeline Maven Configuration" 下,我指定了一个设置文件(托管文件)和一个全局设置文件。
然而,管道本身似乎完全忽略了这个设置。
似乎要使用自定义 settings.xml,我必须将每个 mvn 调用包装到 withMaven() {...} 块或 configFileProvider () {...} 块中.
当我这样做时,它工作正常,但由于此管道中有很多 mvn 调用,这会使管道不必要地复杂。
是否有另一种方法让 maven 获取自定义 settings.xml 文件?
如果没有在管道内进行进一步配置就不会使用指定的文件,那么 "Pipeline Maven Configuration" 设置的意义何在?
目前我将采用以下方法...
将我的 maven 用户设置文件放在我的 SCM 中的 Jenkinsfile 旁边。在 jenkins 文件的“工具”部分声明要使用的 Maven:
tools {
maven 'Maven 3.6.3'
jdk 'AdoptOpenJDK_8u222'
}
然后我使用“-s”命令行选项将用户设置添加到每个 Maven 调用中:
steps {
sh 'mvn pmd:pmd -s usersettings.xml'
}
仍然不喜欢重复添加用户设置,但比 运行“withMaven()”更精简 - 更快。
更新 可以用这样的 Groovy 函数包装 Maven 调用
def mvn(String cmd) {
sh "mvn ${cmd} -s usersettings.xml"
}
整理流水线脚本:
steps {
mvn 'pmd:pmd'
}
其他方法是使用 Pipeline Maven 集成
https://github.com/jenkinsci/pipeline-maven-plugin
node {
stage ('Build') {
git url: 'https://github.com/cyrille-leclerc/multi-module-maven-project'
withMaven(
// Maven installation declared in the Jenkins "Global Tool Configuration"
maven: 'maven-3', // (1)
// Use `$WORKSPACE/.repository` for local repository folder to avoid shared repositories
mavenLocalRepo: '.repository', // (2)
// Maven settings.xml file defined with the Jenkins Config File Provider Plugin
// We recommend to define Maven settings.xml globally at the folder level using
// navigating to the folder configuration in the section "Pipeline Maven Configuration / Override global Maven configuration"
// or globally to the entire master navigating to "Manage Jenkins / Global Tools Configuration"
mavenSettingsConfig: 'my-maven-settings' // (3)
) {
// Run the maven build
sh "mvn clean verify"
} // withMaven will discover the generated Maven artifacts, JUnit Surefire & FailSafe & FindBugs & SpotBugs reports...
}
}