Jenkinsビルドサーバーの新しいプロジェクト構成を作成しようとしています。私がやろうとしていることを単純化するために、2つのコンポーネントのみを使用して問題を説明します。
コンポーネントA
コンポーネントB
ジェンキンスでこれを達成する正しい方法は何ですか?構成ファイルを解析し、Gitプラグインを作成してComponentBの期待されるバージョンに基づいてブランチをチェックアウトするというこの動的な動作を追加する方法を見つけようとしていましたが、今のところ手がかりがありません。
次のステップでは、構成ファイルにワイルドカード(5.3。*など)を含めることもできます。そのため、ワイルドカードに一致する最新のComponentBのタグを見つける必要があります。
編集
今、私は問題をあまりにも単純化しすぎていることがわかり、単純化のために、主な制限はもはや存在しません。
主な制限は、コンポーネントAとBを一緒にビルドする必要があることです。 1つの実行可能ファイル/ライブラリを形成し、ビルドスクリプトには両方のコンポーネントのソースファイルが必要なので、個別にビルドすることはできません。
なぜこのような奇妙な構成なのかと尋ねたら、コンポーネントAとBに説明を加えましょう。
コンポーネントAsは多数ある場合があります-各プラットフォームに1つですが、コンポーネントBは1つだけです。特定のAをBにマージすると、単一プラットフォームの完全なソースコードが生成されますが、すべてのプラットフォームがBの最新バージョンに更新されるわけではないため、制御が必要ですビルドに使用するBのバージョン。
目的を達成するための1つのオプションは、次のセットアップを使用することです。
2つのJenkinsジョブを作成します。
「コンポーネントB」のbranch
build parameter を定義します。
このパラメーターを「Git Plugin」ブランチ指定子として使用します。
これで、適切なブランチ(タグ)パラメーターを指定することにより、手動で「コンポーネントB」ビルドをトリガーできるようになります。 tags/5.3.0
。
新しい「実行シェル」ビルドステップを「コンポーネントA」ビルドに追加します。これにより、ワークスペースの構成ファイルから「コンポーネントB」バージョンが抽出され、「コンポーネントB」ビルドパラメータでb.properties
ファイルが準備されます。 。
Parameterized Trigger Jenkinsプラグインをインストールし、新しい「Trigger/call builds on other projects」ビルドステップを「Component A」ジョブに追加します。
b.properties
ファイルをビルドパラメーターのソースとして使用します。
これで、「コンポーネントA」が再ビルドされるたびに、ターゲットのブランチ/タグをビルドパラメーターとして、新しい「コンポーネントB」ビルドがトリガーされます。
ワイルドカードバージョンをサポートする場合は、git ls-remote
コマンドを使用して、次のような最新のタグを見つけることができます。
#B=$(obtain B version from the config file in a usual way)
LATEST=$(\
git ls-remote --tags YOUR_REPOSITORY_URL "$B"\
|cut -d / -f3|sort -r --version-sort|head -1\
)
cat <<EOF > b.properties
branch=tags/$LATEST
EOF
これにより、リモートの「コンポーネントB」リポジトリにある「B」バージョンパターンに一致するすべてのタグがリストされ、LATEST
変数に最新のバージョン番号が保存されます。
これを「コンポーネントA」ジョブの「シェルを実行」ステップに追加すると、次のようなバージョン番号パターンを処理できるはずです:5.3.*
問題は、シェルスクリプトがJenkinsデーモンユーザーとして実行されるため、リモートGitリポジトリにアクセスするために適切な資格情報を設定する必要があることです(たとえば、ssh pubkey経由)。
または、 Credentials Binding Plugin を調べて、Jenkins自体に保存されているGit資格情報を再利用することもできます。
また、Jenkins 2.0スタイル Pipeline を使用して、手元のタスクを解決することもできます。これにより、コンポーネントAとBのコードを単一のワークスペースにチェックアウトし、一般的なビルドステップを適用できます。彼らへ。
パイプラインは次のようになります。
node {
//Settings
def credentialsId = '8fd28e34-b04e-4bc5-874a-87f4c0e05a03'
def repositoryA = 'ssh://[email protected]/projects/a.git'
def repositoryB = 'ssh://[email protected]/projects/b.git'
stage('Checkout component A') {
git credentialsId: credentialsId ,
url: repositoryA , branch : "master"
}
stage("Resolve and checkout component B") {
def deps = readProperties file: 'meta.properties'
echo "Resolved B version = ${deps['b']}"
dir("module/b") {
//Clone/Fetch Component B
checkout scm:[
$class: 'GitSCM',
userRemoteConfigs: [[url: repositoryB, credentialsId: credentialsId]],
branches: [[name: 'refs/tags/*']]
],
changelog: false, poll: false
//Checkout the tag, matching deps['b'] pattern
sshagent([credentialsId]) {
sh "git checkout \$(git tag -l \"${deps['b']}\" |sort -r --version-sort|head -1)"
}
}
}
stage("Build A+B") {
//Apply a common build step
}
}
ここでは、 Pipeline Utility Steps Plugin の一部である "readProperties"コマンドを使用して、meta.properties
から "Component B"バージョンパターンを抽出します。 readYaml、readJSONコマンドも利用できます。
次に、changelog: false, poll: false
フラグを使用して "コンポーネントB"をフェッチ/クローンし、SCMポーリングに登録されないようにして、現在のワークスペースの "module/b"フォルダーに入れます。
次に、シェルコマンドを呼び出して、上記で取得したバージョンパターンに基づいてタグを選択し、チェックアウトします(5.3。*スタイルのワイルドカードも機能するはずです)。
sh
呼び出しは sshagent でラップされ、Jenkins資格情報ストアからの適切な資格情報を再利用します。
Credentials Binding Plugin の使用は非常にうまく機能しました(@zeppelinも言及)
Add Credentials
: "パスワード付きのユーザー名"。これは、HTTPSプロトコルを使用するコンポーネントBリポジトリgitサーバーのユーザー名とパスワードである必要があります(SSHオプションはこの目的には適していません)Git
セクションのすべての必須フィールド(Repositories)ブランチなど)。Check out to a sub-directory
を選択してcomponent_a
を選択しますBuild when a change is pushed to GitHub
をチェックインしてください。ビルド環境セクションで、Use secret text(s) or file(s)
にチェックマークを付けます
Variable
に何らかの名前を付けます:MY_CREDCredentials
で、ステップ1で作成した特定の資格情報を選択します。Execute ShellコードでMY_CRED
を使用すると、コンポーネントBリポジトリにアクセスできます。
DIR="component_b"
if [ "$(ls -A $DIR/.git)" ]; then
cd $DIR
git fetch
else
git clone https://[email protected]/proj/component_b.git $DIR
cd $DIR
fi
git show
git clone 'https://****@github.com/proj/component_b.git' component_b
コンポーネントAからの構成のすべての解析を実行して、目的のタグを取得します:TAG=$(cat ./component_a/config.cfg | grep ... | sed ...)
cd component_b; git checkout -f $TAG
-f
forceタグ。1-プロジェクトB
をプロジェクトA
のサブリポジトリとして追加すると、解決策になりますか?
2-(Bの完全なソースコードを含める場合は、実際に回避する必要があります):BのビルドをいくつかのB_builds
リポジトリにプッシュし、このリポジトリをA
のサブリポジトリとして追加することが解決策となります?
理由:A
とB
の間の依存関係をより明確にする1つの方法は、リポジトリの依存関係内でそれを表現することです。
これには、A
プロジェクトを管理するときに追加のステップを追加する必要があります。
update `B` sub repo in `A` project, and Push this to `A`
B
の新しいバージョンを作成するたびに。
ただし、A
のバージョンが統合された時期について、B
から明確なビューが得られます(例:「B 2.0.1
から始まるA 4.3.2
のみを使用しました」)、 A
にプッシュすると、通常のJenkinsフローがトリガーされます。