web-dev-qa-db-ja.com

JenkinsパイプラインでPOMからバージョンIDを抽出します

埋め込みgroovyパイプラインスクリプト定義を使用してパイプラインを作成しましたが、POMからプロジェクトのバージョンIDを取得できないようです。私はこれを試してみましたが、これはgroovyコンソールで動作しますが、Jenkinsビルドパイプラインスクリプトで動作します:

def project = new XmlSlurper().parse(new File("pom.xml"))
def pomv = project.version.toString()

ドキュメントによると、ジェンキンスには$POM_VERSIONが、変数に代入してエコーアウトすると、値には何も含まれません。

def pomv = "$POM_VERSION"

OR

def pomv = '$POM_VERSION"
27
user301693

readMavenPom を次のように使用します。

pom = readMavenPom file: 'pom.xml'
pom.version

Model プロパティのリファレンス(上記のバージョンなど)を参照してください。

これが機能するためには、 Pipeline Utility Steps plugin をインストールする必要があります

68

Jenkins 2.138.3には、2種類のパイプラインがあります。

宣言的およびスクリプト化されたパイプライン。

「宣言的パイプラインは、パイプラインDSLの新しい拡張です(基本的に、1つのステップ、引数(パイプラインと呼ばれる)を含むパイプラインステップのみのパイプラインスクリプトです。これらのディレクティブは特定の構文に従う必要があります。この新しい形式のポイントは、より厳密であるため、パイプラインを初めて使用する場合は簡単になり、グラフィカルな編集などが可能になります。スクリプト化されたパイプラインは、高度な要件のフォールバックです。」

ジェンキンスパイプライン:エージェントvsノード?

次に、宣言パイプラインの例を示します。

pipeline {

    agent any


    environment {
    //Use Pipeline Utility Steps plugin to read information from pom.xml into env variables
    IMAGE = readMavenPom().getArtifactId()
    VERSION = readMavenPom().getVersion()
    }


    stages {

        stage('Test') {
            steps {
                echo "${VERSION}"
            }

        }

    }

}

スクリプト化されたパイプラインの例

node('master') {

  stage('Test') {
    IMAGE = readMavenPom().getArtifactId()
    VERSION = readMavenPom().getVersion()
    echo "IMAGE: ${IMAGE}"
    echo "VERSION: ${VERSION}"
  }

}

良いリンクをいくつか紹介します

宣言 https://github.com/jenkinsci/pipeline-examples/blob/master/declarative-examples/jenkinsfile-examples/mavenDocker.groovy

スクリプト https://bulldogjob.com/articles/726-exploring-jenkins-pipelines-a-simple-delivery-flow

10
pitchblack408

Getting Started with Pipeline ページには、さらに別のオプションがありました。追加のプラグインなしで動作します。

少し堅牢なバージョンが共有ライブラリ ces-build-lib にあります(基本的な ユニットテスト もあります):

def version() {
    def matcher = readFile('pom.xml') =~ '<version>(.+?)</version>'
    matcher ? matcher[0][1] : null
}

これは、常に<version>にある最初のpom.xmlタグと一致します。このshouldは、ほとんどの場合、Mavenモジュールまたはその親のバージョンです。

6
schnatterer

使用可能なreadMavenPom関数を試すことができます。

詳細情報はこちら: https://jenkins.io/doc/pipeline/steps/pipeline-utility-steps/#readmavenpom-read-a-maven-project-file

3

readMavenPomが最も簡単な答えのようですが、追加のパイプラインプラグインのインストールが必要なため、ここではxmlをロードする代わりにネイティブmavenアプローチを使用する別の方法があります( この答え

def mvn_project_version(pom_file) {
    return sh(
        script: """mvn -N -f $pom_file org.Apache.maven.plugins:maven-help-plugin:evaluate -Dexpression=project.version |
                   grep -Ev '(^\\s*\\[|Download\\w+:)'""",
        returnStdout: true).trim()
}

grepコマンドを使用しているため、posix互換ではないプラットフォームでは動作しない場合がありますが、grepをパイプ処理する代わりに、Groovyで出力をいつでも処理できます。

0
haridsv

Grepを使用せずに@haridsvソリューションを強化しました。

#!/usr/bin/env
def call(String mvnBin = 'mvn',String pom_file = 'pom.xml') {

return sh(
        script: mvnBin+''' -N -f '''+pom_file+''' org.Apache.maven.plugins:maven-help-plugin:evaluate -Dexpression=project.version -q -DforceStdout''',
        returnStdout: true).trim()
}

非推奨になるため、readMavenPomは使用しないことをお勧めします(PR https://github.com/jenkinsci/pipeline-utility-steps-plugin/pull/47/commits/eeebaa891a006c083ce10f883b7c1264533bb692 を参照)。これをevaluateMavenPomVersion.groovyなどのファイルにコピーして貼り付けることができます:-)

0