【问题标题】:Jenkins Declarative Pipeline with custom settings.xml具有自定义 settings.xml 的 Jenkins 声明式管道
【发布时间】:2018-06-06 18:22:27
【问题描述】:

我正在尝试使用 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"
            }
       }
   }
}

问题似乎是mavenSettingsConfig。如果没有该属性,我无法弄清楚如何设置 settings.xml,并且我的自定义 maven 东西不起作用。 (例如,配置文件 foo。)使用 mavenSettingsConfig,它会爆炸:

错误!源单元“WorkflowScript”中“规范化”阶段的异常意外 NullpointerException....

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

https://wiki.jenkins.io/display/JENKINS/Pipeline+Maven+Plugin 的 TODO 文档。它实际上说“TODO 提供了一个带有 Jenkins 声明式管道的示例”)

【问题讨论】:

    标签: maven jenkins jenkins-pipeline


    【解决方案1】:

    我的建议是使用 Config File Provider 插件:https://wiki.jenkins.io/display/JENKINS/Config+File+Provider+Plugin

    使用它,您可以在 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'
            }
        }
    }
    

    希望对你有帮助

    【讨论】:

    • 使用 Config File Provider 插件的好处是,您可以轻松添加新的 Jenkins slave,而无需预先配置它们上的现有文件(例如您的 settings.xml 文件):每个作业都可以无需配置即可在任何地方执行,因为一切都在 Jenkins 中并在运行时提供。
    • 这可行,但不使用您为配置文件指定的名称。我需要使用内部 id(如果你让管道生成器为管道生成配置,你可以得到它)
    • 跟进我的评论:您需要在创建 configFile 设置时设置 id,然后您可以使用类似 mvn-settings-artifactory 的东西而不是像 372201c4-12a6-4846-ab43-664815c21d4e 这样的东西。
    • 这个可以提取到def函数吗?否则我需要为每个 maven 调用使用这些行,我想避免这些行。
    • @Hervian 我认为这样的事情是这样的:stackoverflow.com/a/51081177/259988 - 但我不确定这是否值得痛苦,因为有时即使以几个字符为代价,明确和简单也是好的...我的 2 美分
    【解决方案2】:

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

    declare a maven installation

    在你必须注册你的设置文件之后:

    manage jenkins > Managed files
    

    并添加您的设置文件

    在此之后,您可以将 WithMaven 函数与您的注册表文件一起使用,如下所示:

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

    【讨论】:

    • 仅供参考:withMaven 步骤仅在您安装了必要的插件后才可用。
    【解决方案3】:

    也可以使用来自Credentials Binding Plugin 的秘密文件凭据

    在 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'
                }
            }
        }
    }
    

    【讨论】:

      【解决方案4】:

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

      def mvnSettings = 'Location of the file'
      sh "mvn clean install --settings ${mvnSettings} -P foo"
      

      所以现在无论何时运行 maven,它都会在您指定的 PATH 中找到 settings.xml 文件

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

      希望对你有帮助:)

      【讨论】:

      • 我选择这个解决方案,只是定义在管道括号外 def mvnSettings = 'mvnSettings.xml' pipeline { .... br> }
      【解决方案5】:

      结合@Francois Marot 接受的答案和 OP 提供的链接,我们得到:

      pipeline {
          stages {
              stage ('Build') {
                  steps {
                      withMaven() {
                          bat 'mvn clean install'
                      }
                  }
              }
          }
      }
      

      这同时使用“托管文件”插件和“全局工具配置”插件(Maven 配置、Maven 安装、JDK 安装)来隐式指定 settings.xml 文件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-02
        • 2021-08-02
        • 1970-01-01
        • 2017-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多