Gitリポジトリ内でJenkins構成を統合できるようにするために、 パイプライン機能 を使用して、いくつかの古いJenkinsジョブを新しいジョブに移動しました。正常に動作していますが、ビルド中に発生するチェックアウトの数を減らす方法があるかどうか自分に尋ねています。
セットアップ
私のgitリポジトリにJenkinsfileがあります
#!groovy
node {
stage 'Checkout'
checkout scm
// build project
stage 'Build'
...
}
問題
リモートブランチBRANCH_1にプッシュすると、マルチブランチjenkinsジョブがトリガーされ、次のステップが発生することがわかっています。
git fetch
を作成し、リモートブランチに対応するジョブをトリガーします:BRANCH_1_jobgit checkout
を作成し、トリガーされたブランチのJenkinsfileを取得しますcheckout scm
自体が作成されます。それを行わないと、ソースが利用できないため、プロジェクトをビルドできません。そのため、ブランチを構築するために、1つのgit fetch
と2つのgit checkout
ができます。
質問
git checkout
の数を減らす方法はありますか? 公式の例 を確認すると、すべてのユーザーが最初のステップとしてチェックアウトscmを作成しています。個人的には、jenkinsジョブがJenkinsfileを取得するためにチェックアウトを行わなければならなかったので、私はそれを行う必要がないと思います(そのため、私のソースは何とかここにある必要があります)。みんなありがとう
プレーンgitでは、Jenkinsは2つのチェックアウトを行う必要があります。1つはJenkinsfileにジョブで何を実行するかを認識させることで、もう1つはビルドのために実際のリポジトリコンテンツをチェックアウトすることです。技術的には、Jenkinsはリポジトリから単一のJenkinsfileをロードするだけで済みますが、gitでは単一のファイルのチェックアウトを許可していません。したがって、マルチブランチプラグインを使用する単純なgitでは、ダブルチェックアウトを回避できません。
BitbucketまたはGitHubでgitをホストしている場合は、マルチブランチプラグインの代わりに特定のJenkinsプラグインを使用することにより、二重チェックアウトを回避します。
Bitbucket および GitHub プラグインについては、Jenkinsプラグインサイトを参照してください。
これらのプラグインは、それぞれのGitプロバイダーのREST APIを使用して単一のJenkinsファイルをロードします。したがって、技術的にはまだダブルチェックアウトがありますが、最初のチェックアウトはシンプルですREST =リポジトリ全体の完全なネイティブgitチェックアウトを実行するのではなく、単一のファイルをダウンロードするために呼び出します。
私はこれに何度も遭遇しましたが、私が提供した堅牢なソリューションは、正しいソースリビジョンをチェックアウトし、実際のパイプラインをソースからロードする、ジョブ自体(scmソースなし)内に小さな「ランチャースクリプト」を定義しました。
DSLプラグインを使用してジョブを一般化する場合、パイプラインを次のように定義します。
pipelineJob("myjob") {
...
definition {
cps {
script('''
node {
checkout scm
load("path/to/script.groovy")
}
''')
}
}
}
Jenkinsの[構成]画面を使用してジョブを手動で構成している場合、これは[SCMからのパイプラインスクリプト]ではなく[パイプラインスクリプト]を選択し、ボックス内の小さなチェックアウトおよびロードスクリプトをコピーすることと同じです。
これにより、パイプラインbootstrapを実際のSCMから切り離し、一度チェックアウトして、パイプライン定義とソースの両方を構築することができます。最も美しいアプローチではありませんが、うまく機能します。