web-dev-qa-db-ja.com

Jenkins PipelineまたはMultibranch Pipeline内でSCM URLを取得するにはどうすればよいですか?

マルチブランチパイプライン内で動作するようにビルド前のマージを取得しようとしていますが、パイプラインスクリプトでgit urlをハードコーディングする必要はありません。

ScmステップはどういうわけかURLを保存する必要があるようですが、どのようにアクセスするかわかりません。

12
Isaac Stefanek

正解です。scmオブジェクトには必要な情報があります。

Pipelineプロジェクト(またはMultibranch Pipelineプロジェクト)でソース管理としてgitを使用する場合、scmグローバル変数は GitSCM のインスタンスになります。つまり、 `scm.getUserRemoteConfigs() 'は serRemoteConfig インスタンスのリストを返します。これらのインスタンスには、gitリモートの名前、url、およびrefspecがあります。リストを繰り返して一致するリモートを見つけるか、URLが1つしかないことが確実な場合は最初のリモートを取得します。

def scmUrl = scm.getUserRemoteConfigs()[0].getUrl()

ノート

  • RejectedAccessException-getUserRemoteConfigsメソッドとgetUrlメソッドは両方ともorg.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException「Jenkinsの管理->インプロセススクリプト承認」で、手動で承認するまで。これを行うことがわかった唯一の方法は、スクリプトを実行して、アクセス例外をスローし、例外の原因となった1つのメソッドを承認し、アクセス例外がスローされなくなるまで各メソッドに対して繰り返すことです。幸いなことに、この設定はサーバー全体に適用されるため、パイプラインジョブごとではなく、jenkinsコントローラーごとに1回だけ行う必要があります。

  • GitHub-GitHub-sourced multibranch pipelineでテスト中、getUserRemoteConfigsは2つを返しましたUserRemoteConfigインスタンス。通常のブランチ用とプルリクエスト用です。これらは同じURLを持っているので大したことはありませんが、覚えておく必要があります。たとえば、HTTPSベースの接続を使用するプロジェクトでは:

    echo scm.getUserRemoteConfigs()
    
    "[
        +refs/heads/*:refs/remotes/Origin/* => https://github.com/bitwiseman/project.git (Origin),
        +refs/pull/*/head:refs/remotes/Origin/pr/* => https://github.com/bitwiseman/project.git (Origin)
    ]"
    
20
BitwiseMan

@BitwiseManによる回答のコメントに触発されて、RejectedAccessExceptionなしでURLを取得する(ハッキング)方法を見つけました:

checkout scm
def url = sh(returnStdout: true, script: 'git config remote.Origin.url').trim()

checkout scmの後に実行する必要があることに注意してください。基本的に、チェックアウトされたgitリポジトリにいる必要があります(つまり、.git/configファイルが含まれています)

17
akhy