Maven 带有custom settings.xml的Jenkins声明性管道

Maven 带有custom settings.xml的Jenkins声明性管道,maven,jenkins,jenkins-pipeline,Maven,Jenkins,Jenkins Pipeline,我正在尝试与maven建立Jenkins声明性管道。到目前为止,我可以让maven运行,但无法让它使用我定义的maven Settings.xml pipeline{ agent any tools{ maven 'Apache Maven 3.3' // without mavenSettingsConfig, my settings.xml is not used. With it, this blows up mavenSetting

我正在尝试与maven建立Jenkins声明性管道。到目前为止,我可以让maven运行,但无法让它使用我定义的maven Settings.xml

pipeline{
   agent any
   tools{
       maven 'Apache Maven 3.3'
       // without mavenSettingsConfig, my settings.xml is not used.  With it, this blows up
       mavenSettingsConfig: 'Global Maven Settings'
       jdk 'jdk9
   }
   stages {
       stage('Preparation'){
           steps{
              //code checkout stuff here--this works fine
           }
       }
       stage('Build'){
            steps{
               sh "mvn clean install -P foo"
            }
       }
   }
}
问题似乎是MavensetingsConfig。如果没有这个属性,我就无法确定如何设置settings.xml,我的自定义maven功能也无法工作。(例如,Profile foo)使用mavenSettingsConfig,它会爆炸:

臭虫!源单元“WorkflowScript”中的“规范化”阶段出现异常意外的NullpointerException

文档中有一个很大的TODO,它将为此提供一个示例!那我该怎么做呢


(文档TODO位于。它实际上是说“TODO使用Jenkins声明性管道提供示例”)

我遇到了这个问题,您所要做的就是在行中添加这一小段代码

def mvnSettings = 'Location of the file'
sh "mvn clean install --settings ${mvnSettings} -P foo"
因此,无论何时maven运行,它都会在您指定的路径中找到settings.xml文件

另外,它是一个maven命令,您可以使用它在命令行上运行


希望有帮助:)

我的建议是使用配置文件提供程序插件:

使用它,您可以在Jenkins的“配置文件管理”屏幕中定义一次配置文件,然后在管道中生成如下代码:

stage('Build'){
    steps{
       configFileProvider([configFile(fileId: 'my-maven-settings-dot-xml', variable: 'MAVEN_SETTINGS_XML')]) {
            sh 'mvn -U --batch-mode -s $MAVEN_SETTINGS_XML clean install -P foo'
        }
    }
}

希望对您有所帮助

您必须在jenkins中声明并安装maven
Managed Jenkins>Global Tools configuration
并添加名为like M3的maven安装

必须注册设置文件后:

manage jenkins > Managed files
并添加您的设置文件

在此之后,您可以对注册表文件使用WithMaven函数,如下所示:

steps {
    withMaven(maven: 'M3', mavenSettingsConfig: 'mvn-setting-xml') {
        sh "mvn clean install "
    }
}

也可以使用来自的机密文件凭据

在jenkins中创建一个秘密文件:

然后你可以像这样使用这个设置文件

pipeline {
    environment {
        MVN_SET = credentials('maven_settings')
    }
    agent {
        docker 'maven:3-alpine'
    }
    stages {
        stage('mvn test settings') {
            steps {
                sh 'mvn -s $MVN_SET help:effective-settings'
            }
        }
    }
}

使用Config File Provider插件的优点是,您可以轻松添加新的Jenkins从属,而无需预先配置其上的现有文件(如settings.xml文件):每个作业都可以在任何地方执行,而无需配置,因为所有内容都在Jenkins中,并在运行时提供。这很有效,但不使用您为配置文件指定的名称。我需要使用内部id(如果让管道生成器为管道生成配置,则可以获得该id)跟进我的评论:创建configFile设置时需要设置id,然后,您可以使用类似于
mvn设置人工制品的东西,而不是类似于
372201c4-12a6-4846-ab43-664815c21d4e的东西。这可以提取到def函数吗?否则,每次maven调用我都需要这些行,这是我想要避免的。@Hervian我这样认为:-但我不确定这样做是否值得,因为有时即使以几个字符为代价,也能做到明确和简单。。。my 2 Cent我选择此解决方案,但定义不在管道括号中
def mvnSettings='mvnSettings.xml'
管道{

}。仅供参考:只有安装了必要的插件,withMaven步骤才可用。