Jenkinsのビルドで使用するgitブランチを動的に選択する方法
Jenkinsのビルドサーバー用に新しいプロジェクト設定を作成しようとしています。私がやろうとしていることを単純化するために、私は問題を説明するために2つのコンポーネントだけを使用します。
コンポーネントA
- このコンポーネントの変更をトリガーとして、CIサーバー上でこのプロジェクトのビルドが行われます。
- CIサーバーには、変更を監視してビルドするためのブランチが静的に設定されています。例えば、masterブランチやdevelopブランチなどです。
- このコンポーネントは、依存するComponentBの必要なバージョンを含む設定ファイルを含んでいます。
コンポーネントB
- このコンポーネントの変更は、CIサーバー上のこのプロジェクトのビルドをトリガーしません(ComponentBの開発をカバーする別のプロジェクトが存在します)。
- コンポーネントの個々のバージョンはタグ付けされています
- ComponentAがComponentBの必要なバージョンを設定ファイルに入れている。
- CIサーバーは、ComponentAの設定ファイルが何らかの方法で解析されるまで、どのブランチ(タグ)をチェックアウトすればよいのかわからない。
Jenkinsでこれを実現するための正しい方法は何でしょうか?設定ファイルを解析して、ComponentBの予想されるバージョンに基づいてブランチをチェックアウトするGit Pluginを作るという動的な動作を追加する方法を見つけようとしていたのですが、今のところ手がかりはありません。
次のステップでは、設定ファイルにワイルドカード(5.3.*のような)を入れて、ワイルドカードに一致する最新のComponentB'sタグを見つけるようにすることも考えています。
EDIT
今となっては、問題を単純化しすぎて、単純化したために主な制約がなくなってしまったのだと思います。
主な制限は、コンポーネントAとコンポーネントBを一緒にビルドする必要があることです。これらは1つの実行ファイル/ライブラリであり、ビルドスクリプトは両方のコンポーネントのソースファイルを必要とするため、別々にビルドすることは不可能です。
なぜこのような不思議な構成になっているのかというと、コンポーネントA、コンポーネントBについて説明します:
- ComponentA:ネイティブプラットフォーム専用コード
- ComponentB:ネイティブプラットフォーム非依存コード
特定のAをBにマージすると、単一プラットフォーム用の完全なソースコードが作成されますが、すべてのプラットフォームがBの最新バージョンに更新されるとは限らないため、ビルドに使用するBのバージョンを制御する必要があります。
26
3
あなたが望むことを実現するための一つの選択肢は、次のような設定を使用することです:
Jenkinsのジョブを2つ作成します:
ステップ#1
コンポーネントB"の
branch
ビルドパラメータを定義します:[[ここに画像の説明を入力]][1][1]。
このパラメータを "Git Plugin" ブランチ指定子として使用します:
[[ここに画像の説明を入力]][2][2][2][2][2][2][!
これで、手動で "Component B" ビルドを起動することができるようになりました。
Step #2
ワークスペースの設定ファイルからコンポーネントB"のバージョンを抽出し、コンポーネントB"のビルドパラメータを含む
b.properties
ファイルを準備します。[[ここに画像の説明を入力]][3][3][3][3][3][3][!
Jenkinsのプラグイン「Parameterized Trigger」(https://plugins.jenkins.io/parameterized-trigger)をインストールし、「コンポーネントA」のジョブに新しいビルドステップ「Trigger/Call Builds on Other Projects"」を追加します:
[[ここに画像の説明を入力]][4][4]です。
ビルドパラメータのソースとして
b.properties
ファイルを使用します。これで、"Component A"が再ビルドされるたびに、ターゲットブランチ/タグをビルドパラメータとして、新しい"Component B"のビルドがトリガされるようになりました。
ワイルドカードのサポート追加
ワイルドカードのバージョンをサポートしたい場合は、
git ls-remote
コマンドを使って、そのように最新のタグを検索することができます:Credentials Binding Plugin]1を使用すると、非常にうまくいきました(@zeppelin氏も言及しています)。
Steps
グローバル資格情報セクションにあります:
1.タイプの
Add Credentials
を追加します:"Username with password".これは、HTTPSプロトコルを使用したコンポーネントBのリポジトリgitサーバーのユーザー名とパスワードでなければなりません(SSHオプションはこの目的には適していません)。[ここに画像の説明を入力]222[!
Jenkinsのジョブ構成で:
2.コンポーネントAを通常のソースコード管理の
Git
セクションの下にすべての必須フィールド(リポジトリ、ブランチなど)を配置します。Check out to a sub-directory
を選択し、次のように記述します:Component_a` 3.ビルドトリガー** の「変更がGitHubにプッシュされたときにビルドする」にもチェックを入れてください。 4.ビルド環境]セクションで、[秘密のテキスト(複数可)またはファイル(複数可)を使用する]をチェックします。[ここに画像の説明を入力]333[! 5.これで、Execute shellのコードで
MY_CRED
を使用すると、コンポーネントBのリポジトリにアクセスできるようになります:[ここに画像の説明を入力]4です。
6.コンポーネントAのconfigをすべて解析して、目的のタグを取得します:TAG=$(cat ./component_a/config.cfg | grep ... | sed ...)
. 7.目的のTagをチェックアウトする:cd component_b; git checkout -f $TAG
.-f
フォースタグ。 8.このコードを実行し、希望通りにテストしてください...。1 - プロジェクト
B
をプロジェクトA
のサブレポとして追加することは、可能な解決策でしょうか?2- (Bのソースコード全体を含めることが本当に避けられるなら) : Bのビルドを
B_builds
レポジトリにプッシュし、このレポジトリをA
のサブレポとして追加することは、可能なソリューションでしょうか?理由 :
A
とB
の依存関係をより明示的にする一つの方法は、リポジトリの依存関係の中にそれを表現することである。この場合、
A
プロジェクトを管理する際に、余分なステップを追加する必要があります:を作成するたびに、
B
の新しいバージョンを作成します。しかし、
A
からは、B
のバージョンがいつ統合されたかを明確に把握することができ(例:"我々は、A 4.3.2
からB 2.0.1
しか使っていない)、A
にプッシュすると通常のJenkinsフローが発生します。