7

この質問は、ジェンキンスのダウンストリーム ジョブで統合テストを破った git コミッターにメールを送信し、ダウンストリーム ジョブの変更のリストを表示する方法に関するものです。

ここに書いたすべてを試したわけではないので、間違っている可能性があります。これらは、私が遭遇したコードからの印象です。

この質問に答えるために多くの試みがあるようですが、満足のいくものはないようですので、詳しく説明します. 詳細は次のとおりです。

以前はsvnで作業していました。私たちのジョブ階層は、1 つのジョブがチェックアウトしてコンパイルし、コンパイル アーティファクトを取得してその他の統合テストを実行する他のジョブをトリガーするものでした。

ビルドを中断した上流の svn コミッターにメールを送信する必要があります。

email-ext プラグイン (https://wiki.jenkins-ci.org/display/JENKINS/Email-ext+plugin) を介してメールを送信するのが好きです。これは非常にカスタマイズ可能であり、この機能を頻繁に使用しています。

email ext プラグインは、現在のジョブの changelog.xml を使用して、誰がビルドを壊したかを発見します。changelog.xml はチェックアウト操作によって作成されるため、上流のジョブに存在します。したがって、email-ext は誰にメールを送信すべきかを認識していないようです。

犯人を含めることにした場合は、ジェンキンを -Dhudson.upstreamCulprits=true で開始できます。これにより、email-ext の動作が変更されますが、犯人を含めたくない場合は役に立ちません。さらに、変更セットはダウンストリーム ジョブで使用できないようです。

Blame-upstream committers プラグインもありますが、email-ext ではうまく機能しないようです。

大量のファイルと大量のジョブがあるため、upstreamCulprits と Blame-upstream はどちらもフィンガープリンティングが必要なようです...これには重大なパフォーマンスの問題がありました。

BlameSubversion プラグイン (https://wiki.jenkins-ci.org/display/JENKINS/BlameSubversion) で問題を解決しました。このジョブをトリガーしたアップストリーム プロジェクトから changelog.xml を明らかにコピーするため、このジョブが失敗し、変更ログでビルドを壊したユーザーを探すと、それらを見つけることができ、変更ログにも表示されます。

ですから、svn についてはとてもうれしく思いました。今、私たちは git に移行しました。Blame Git プラグインはありません。書いてもかまいません。理解しなければならないかどうかを理解する必要があります。人々はかなり長い間、git と jenkins を一緒に使用してきました。この困難に最初に遭遇することはできません...

ありがとう、ネイサン。

4

1 に答える 1

7

これは私が Clearcase で行う方法です。svn でもかなり似ているはずです。電子メールを受信するアドレスのリストを入力する領域に、次を追加します。

, ${SCRIPT, script="committers.groovy"}

次のような新しいスクリプト committers.groovy を $JENKINS_HOME/email-templates に作成します。

// the goal is to find the top level job which should contain the changelist
def upstreamBuild = null
def cause = build.causes.find {
    if(it instanceof hudson.model.Cause.UpstreamCause) {
        return true 
    }
    return false
}

try {
    while(cause != null) {
        upstreamBuild = hudson.model.Hudson.instance.getItem(cause.upstreamProject).getBuildByNumber(cause.upstreamBuild)
        if(upstreamBuild == null) {
            break;
        }
        cause = upstreamBuild.causes.find {
            if(it instanceof hudson.model.Cause.UpstreamCause) {
                return true 
            }
            return false
        }
    }   
} catch(e) {
    // do nothing
}

// now we loop through the changeset and add all the users to a list
committers = []

if(upstreamBuild != null && upstreamBuild.changeSet != null) {
    upstreamBuild.changeSet.each() { cs ->
        if(cs.user != null) {
            committers.add(cs.user)
        }
    }
}

committers.unique().join(',')

これにより、${SCRIPT} コンテンツ トークンをアップストリーム ジョブのコミッターのリストに置き換える文字列が生成されます。

于 2013-03-21T00:01:03.127 に答える