複数のgitリポジトリを同じJenkinsワークスペースにチェックアウトする


127

Jenkins 1.501およびJenkins Gitプラグイン1.1.26の使用

それぞれ複数のプロジェクトを持つ3つの異なるgitリポジトリがあります。

次に、すべてのプロジェクトを3つのgitリポジトリからJenkinsスレーブの同じワークスペースにチェックアウトする必要があります。各gitリポジトリを以下で定義しました:ソースコード管理:複数のSCM。ただし、リポジトリがチェックアウトされるたびに、以前のリポジトリ(およびその関連プロジェクト)は削除されます。

私はこれを読んだ:

http://jenkins.361315.n4.nabble.com/multiple-git-repos-in-one-job-td4633300.html

しかし、それは本当に助けにはなりません。すべてのリポジトリに対して、リポジトリ(オプション)のローカルサブディレクトリの下に同じフォルダを指定しようとしましたが、同じ結果が得られます。

Jenkinsを使用してこれが単に不可能な場合、プロジェクトを適切な場所に移動するために、ビルド前のステップ/スクリプトを使用できると思います。プロジェクトのビルド構成を変更するオプションはありません。

回答:


69

Jenkins + Gitプラグインでは、単一のワークスペースで一度に複数のリポジトリをチェックアウトすることはできません。

回避策として、単一のリポジトリをそれぞれチェックアウトしてから最終的なプロジェクトワークスペースにコピーする複数の上流ジョブを作成するか(いくつかのレベルで問題あり)、または必要な各リポジトリをチェックアウトするシェルスクリプトステップを設定できます。ビルド時のジョブワークスペース。

以前は、Multiple SCMプラグインがこの問題を解決することができましたが、現在は非推奨です。複数のSCMプラグインページから:「ユーザーはhttps://wiki.jenkins-ci.org/display/JENKINS/Pipeline+Pluginに移行する必要があります。パイプラインは複数のSCM をチェックアウトするためのより良い方法を提供し、Jenkinsによってサポートされていますコア開発チーム。」


最初のアプローチに問題があるのはなぜですか?ジョブを分割することは良い習慣のようです。
CurtainDog 2013

1
これは一般的には良い習慣ですが、同じ物理的な場所で複数のチェックアウトが必要な場合は、保守が大きな問題になります。たとえば、ブランチビルドを作成する場合、4つのジョブを複製してから、それぞれのパスを個別に変更する必要があります。もちろんこれを助けるプラグインがありますが、単一のジョブから相対パスにチェックアウトする方が簡単です。その後、設定を変更することなく、必要なだけクローンを作成できます。
CIGuy 2013

1
それはもう関係がないので、正解から変更する必要があります。
Dvir669

2
パイプラインでは、新しいDSLを学ぶ必要があります。これは、私たちが実行したい非常に単純な仕事(複数のリポジトリからコードをチェックアウトする)には少し多すぎます。JenkinsパイプラインDSLの周りに適切なGUIが表示されるまで、Multiple SCMプラグインを使用します。Jenkins 2.17で問題なく動作していると報告できます
Burak Arslan

2
複数のリポジトリで同じ問題が発生しました。新しいDSLについて@BurakArslanと同じくらい懐疑的でしたが、今はパイプラインプラグインを使用しています。それは実際には私が思ったほど悪くはなく、かなりまともなスニペットジェネレーターが付属しています。2時間だけ使用した後、パイプラインビルドスクリプトをコミットして残りのコードと一緒にgitを実行できるようになるので、私は実際にこのアプローチを実際に好みます。
ベン

81

複数のSCMプラグインを使用する場合:

  • チェックアウトする必要があるリポジトリごとに異なるリポジトリエントリを作成します(メインプロジェクトまたは依存関係プロジェクト)。

  • プロジェクトごとに、「詳細」メニュー(2番目の「詳細」メニュー、リポジトリごとに「詳細」というラベルの付いた2つのボタンがあります)で、「リポジトリのローカルサブディレクトリ(オプション)」テキストフィールドを見つけます。プロジェクトのコピー先となる「ワークスペース」ディレクトリのサブディレクトリを指定できます。私の開発用コンピュータのファイルシステムをマッピングできます。

「2番目の詳細メニュー」はもう存在しません。代わりに、「追加の動作」セクションの「追加」ボタンを使用して、「サブディレクトリにチェックアウト」を選択する必要があります。

  • antを使用している場合は、ビルドターゲットを含むbuild.xmlファイルがワークスペースのルートディレクトリではなくサブディレクトリにあるため、「Antの呼び出し」構成に反映する必要があります。これを行うには、「antの呼び出し」で「詳細設定」を押し、build.xmlが配置されているサブディレクトリの名前を含む「ビルドファイル」入力テキストを入力します。

お役に立てば幸いです。


3
これは古くなっているはずです。複数のSCMプラグインを記述している時点では、GITスニペットにはオプションのサブパスが含まれていません。
AlexeiOst 2014年

12
各リポジトリには、「追加」というドロップダウンリストがあります。その中に、同じことを実行するオプション「サブディレクトリへのチェックアウト」があります。
Gary Ye

1
複数のSCMプラグインとgitを使用してガイドに従いましたが、別の面白い問題があります。異なるリポジトリに対して同じブランチ(開発)を適切にチェックアウトしたくないようです。ハッシュでコミットをチェックアウトしようとします(これは最初のリポジトリでのみ有効です)。これに対処する方法について何か考えはありますか?
Lefteris

複数のSCMプラグインの最大の問題は次のとおりです。「Post-commitタイプのトリガーは現在(少なくともSubversionの場合)機能しないため、「cron」タイプのポーリングを構成する必要があります。
grayaii 2015年

1
パイプラインでは、新しいDSLを学ぶ必要があります。これは、私たちが実行したい非常に単純な仕事(複数のリポジトリからコードをチェックアウトする)には少し多すぎます。JenkinsパイプラインDSLの周りに適切なGUIが表示されるまで、Multiple SCMプラグインを使用します。Jenkins 2.17で問題なく動作していると報告できます
Burak Arslan

41

以来、複数のSCMプラグインが廃止されました。

ジェンキンスパイプラインその可能複数のgitリポジトリをチェックアウトするとのGradleを使用して構築した後、

node {   
def gradleHome

stage('Prepare/Checkout') { // for display purposes
    git branch: 'develop', url: 'https://github.com/WtfJoke/Any.git'

    dir('a-child-repo') {
       git branch: 'develop', url: 'https://github.com/WtfJoke/AnyChild.git'
    }

    env.JAVA_HOME="${tool 'JDK8'}"
    env.PATH="${env.JAVA_HOME}/bin:${env.PATH}" // set java home in jdk environment
    gradleHome = tool '3.4.1' 
}

stage('Build') {
  // Run the gradle build
  if (isUnix()) {
     sh "'${gradleHome}/bin/gradle' clean build"
  } else {
     bat(/"${gradleHome}\bin\gradle" clean build/)
  }
}
}

このようなカスタムパイプラインの代わりにgitサブモジュールを使用することを検討してください。


ありがとうございました!!!dirブロックが鍵であり、私は私は私の仕事のワークスペースの中で最も-最近クローニングレポを見ていた理由を見つけ出すことができませんでした。
bonh

複数のSCMで「変更」の概念はどのように考慮されますか?仕事を構成するすべてのリポジトリから見た変化の合計だけですか?可能であれば、それぞれから項目化するか、23 changes from repo XXX, 3 changes from repo YYYこれらのラインに沿ってよりコンパクトなものにするとよいでしょう。
jxramos 2018

20

私が使用し、複数のSCMプラグインを成功裏ジェンキンスとGitのプラグインと一緒に。


3
おかげで、リポジトリセクションに2つのbitbucketパスを配置できます。次に、repo 1チェックアウトの「develop」ブランチとrepo 2チェックアウトの「fixes」ブランチにどのように通知できますか?私はジェンキンスで部分を構築するためのブランチを参照しています、ブランチ指定子( 'any'の場合は空白)でリポジトリ名とRefsecを設定して、それぞれが対応するブランチをチェックアウトできるようにするにはどうすればよいですか?または私はそれを間違ってやっていて、「複数のSCM」と言うブール値をクリックする必要がありますか?
ペロ

@pelos解決策を見つけることができましたか?
Govind

現時点では、ymlファイルを使用せず、通常のタスクで2つの異なるワークフローを実行しました
pelos

5

リポジトリーの関係に応じて、別のアプローチは、他のリポジトリー(リポジトリー)をgitサブモジュールとしていずれかのリポジトリーに追加することです。gitサブモジュールは、他のリポジトリへの参照を作成します。「スーパープロジェクト」(公式用語)の--recursiveクローンを作成するときにフラグを指定しない限り、これらのサブモジュールリポジトリはクローンされません。

次に、現在のプロジェクトにサブモジュールを追加するコマンドを示します。

git submodule add <repository URI path to clone>

私たちはJenkins v1.645を使用しており、git SCMはすぐにスーパープロジェクトの再帰的クローンを実行します。ほら、スーパープロジェクトファイルとすべての依存(サブモジュール)リポジトリファイルは、同じJenkinsジョブワークスペースのそれぞれのディレクトリにあります。

これが正しいアプローチであることを保証するのではなく、それはアプローチです。


5

Jenkins: 複数のSCM-非推奨。GITプラグイン-複数のリポジトリでは機能しません。

コードとしてのスクリプティング/パイプライン-進むべき道です。


2

私もこの問題を抱えていました。他のプロジェクトでトリガー/コールビルドを使用して解決しました。リポジトリごとに、パラメーターを使用してダウンストリームプロジェクトを呼び出します。

主なプロジェクト:

This project is parameterized
String Parameters: PREFIX, MARKETNAME, BRANCH, TAG
Use Custom workspace: ${PREFIX}/${MARKETNAME}
Source code management: None

次に、リポジトリごとに次のようなダウンストリームプロジェクトを呼び出します。

Trigger/call builds on other projects: 
Projects to build: Linux-Tag-Checkout
Current Build Parameters
Predefined Parameters: REPOSITORY=<name>

ダウンストリームプロジェクト:Linux-Tag-Checkout:

This project is parameterized
String Parameters: PREFIX, MARKETNAME, REPOSITORY, BRANCH, TAG
Use Custom workspace:${PREFIX}/${MARKETNAME}/${REPOSITORY}-${BRANCH}
Source code management: Git
git@<host>:${REPOSITORY}
refspec: +refs/tags/${TAG}:refs/remotes/origin/tags/${TAG}
Branch Specifier: */tags/${TAG} 

1

1つのワークスペースで一度に複数のレポをチェックアウトすることはある(多分唯一の最近のバージョンでは?)ジェンキンス+ Gitのプラグインで可能。

「Source-Code-Management」セクションで、「Git」ではなく「Multiple SCM」を選択して、いくつかのgitリポジトリを追加します。

1つを除いて、必ず「追加の動作」としてアクション「サブディレクトリにチェックアウトする」を追加し、個々のサブディレクトリを指定してください。


私はこのようにして、バニラのGitプラグインではなく(非推奨の)マルチSCMプラグインを使用していると思います。
Robert

0

複数のGITリポジトリを管理するためにgit-repoを使用しています。git-repoが管理するリポジトリのすべてまたは一部を同じJenkinsジョブワークスペースにチェックアウトできるJenkins Repoプラグインもあります。


この質問で尋ねられた問題をどの程度正確に解決しますか?あなたが言及したプラグインをインストールし、リポジトリとプラグインについて読みましたが、1つのプロジェクトで実行する2つのリポジトリを複製するようにJenkinsを設定する方法がわかりません...
GreenAsJade

Repoを使用するには、マニフェストファイルのみを含む特別なリポジトリを作成する必要があります。このファイルでは、他のリポジトリに関するすべての情報を指定します。マニフェストファイルの正確な形式は、git-repoプロジェクトのdocs / manifest-format.txtファイル(gerrit.googlesource.com/git-repo/+/master/docs/…)に記載されています。ジョブのJenkins Repo部分を構成するとき-「マニフェスト」リポジトリの場所を指定し、オプションで「マニフェスト」ファイルの名前を指定します(複数ある場合があります)。マニフェストで指定されたすべてのリポジトリが複製されます。
vladisld 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.