0

ソナー分析中に maven2 、 hudson 、および sonar を使用しています - プロジェクトの Maven バージョンに Hudson build# を追加する方法が欲しいです

プロジェクトのバージョンは 2 週間ごとに変更されるため、最初の 2 週間の例を見てみましょう。

<version>abc-SNAPSHOT</version>

2 週間後、次のバージョンは次のようになります。

<version>xyz-SNAPSHOT</version>

私が望むのは、pomに既に存在するバージョンにbuild#を追加することです-これはピックアップされてソナーに渡されます

ノート:

-Dsonar.projectVersion=xyz-SNAPSHOT-${BUILD_NUMBER}

ここ-バージョンをハードコーディングし、ビルドを動的に渡します#

私が望むのは、maven からバージョンを動的に取得し (変更せずに)、build# を動的に追加するだけです。

これを達成する方法についてのアイデアはありますか? ありがとう、サティシュ

4

5 に答える 5

3

Groovy スクリプトを使用してバージョンを読み取り、環境変数に入れることができます: Jenkins で Maven バージョンを取得する

このスクリプトを時間通りに使用して、バージョンを解析しました。

def project = new XmlParser().parse("/pom.xml")
def artifactId =  project.artifactId.text().trim()
def version = project.version.text().trim()
println "ArtifactId: [" + artifactId + "]"
println "Version: [" + version + "]"

「追加プロパティ」フィールドを設定した後: -Dsonar.projectVersion=${MAVEN_VERSION}-${BUILD_NUMBER}

Jenkins が変数を取得できない場合は、 https ://wiki.jenkins-ci.org/display/JENKINS/EnvInject+Plugin をインストールしてみてください。

于 2013-02-05T12:22:40.910 に答える
0

Groovyがpomを解析することで提案されたのと同じ必要性があり、解決されました。

import jenkins.util.*;
import jenkins.model.*;

def thr = Thread.currentThread();
def currentBuild = thr?.executable;
def workspace = currentBuild.getModuleRoot().absolutize().toString();

def project = new XmlSlurper().parse(new File("$workspace/pom.xml"))

def param = new hudson.model.StringParameterValue("project.version", project.version.toString())
currentBuild.addAction(new hudson.model.ParametersAction(param));

このスクリプトを「システム Groovy スクリプトの実行」タイプのポスト ステップとして追加し (したがって、Groovy をインストールする必要はありません)、コードを「Groovy コマンド」に貼り付けます。

于 2013-04-08T12:47:55.737 に答える
0

アンドレに他のリンクを教えてくれてありがとう 試してみましたが、コメントに記載されているようにいくつかの問題が発生していました 私が行ったことは単なる回避策であり、より良い解決策があると仮定します ? (私はハドソンを使用しています)ハドソンで新しいジョブを定義しました(Maven 2/3プロジェクトをビルドします(レガシー))ここで「Groovy PostBuild」を定義しましたアンドレが私に指摘したリンクのコードをコピーしました:

import hudson.model.*;
import hudson.util.*;

def thr = Thread.currentThread();
def currentBuild = thr?.executable;
def mavenVer = currentBuild.getParent().getModules().toArray()[0].getVersion();
def newParamAction = new hudson.model.ParametersAction(new           
hudson.model.StringParameterValue("MAVEN_VERSION", mavenVer));
currentBuild.addAction(newParamAction);

次に、「他のプロジェクトでパラメーター化されたビルドをトリガーする」と、pom のメンションとして Maven バージョンが必要なジョブについて言及しました

パラメータを定義しました - ${MAVEN_VERSION}

その後、「その他」のジョブでこのパラメーターの値を取得できました

まずアンドレに感謝します - 彼は私に解決策を提供してくれました。これが良いアプローチであるかどうか知りたいです。 「Maven 2/3 レガシー プロジェクト」

私が尋ねる理由は、同じGroovyスクリプトが「フリースタイル」で失敗し、「Mavenレガシー」で機能したためです。

ありがとう、サティシュ

于 2013-02-06T20:16:52.553 に答える
0

これは実際にはソナーの問題ではありません。Maven プロジェクトのバージョン管理です。

スナップショットは動的になるように設計されています。内部では、Maven がタイムスタンプ付きのバージョンを Maven リポジトリに保存していることがわかります (これらのタイムスタンプを Sonar に渡す方法はわかりませんが、これはおそらくあなたが望むものです)。スナップショット ビルドは、CI ジョブに最適です。開発者以外が使用することのないソフトウェア。

私がお勧めするのは、スナップショットの使用をやめる (毎回「リリース」をビルドする) か、Maven には 2 種類のビルドがあるという事実を受け入れることです。私のルールは、コードが他の人によって使用されている場合、それはもはやスナップショットではなく、リリースとして扱われるべきだというものです。これにより、継続的な展開などの新しい方法論に対する課題が生じます..... すべてのビルドが本番 (または本番コピー) に移行すると、スナップショットは無関係になります。

毎回リリースをビルドすることはそれほど悪くありません。まず、命名規則として、次のことをお勧めします。

<major>.<minor>.<patch>.<hudson build num>

Mavenのリリース プラグインは、リリースの詳細 (POM の更新、SCM システムのタグ付け) を管理する際の苦労のほとんどを自動化します。最後に、Hudson GUI からリリースをトリガーできる便利なM2_Release プラグインもあります。

于 2013-02-06T01:08:06.810 に答える