web-dev-qa-db-ja.com

Jenkins Pipeline:複数のチェックアウトを回避することは可能ですか?

Gitリポジトリ内でJenkins構成を統合できるようにするために、 パイプライン機能 を使用して、いくつかの古いJenkinsジョブを新しいジョブに移動しました。正常に動作していますが、ビルド中に発生するチェックアウトの数を減らす方法があるかどうか自分に尋ねています。

セットアップ

  • 私のgitリポジトリに関連するJenkinsマルチブランチジョブがあります
  • 私のgitリポジトリにJenkinsfileがあります

    #!groovy
    node {
    
      stage 'Checkout'
      checkout scm
    
      // build project
      stage 'Build'
      ...
    }
    

問題

リモートブランチBRANCH_1にプッシュすると、マルチブランチjenkinsジョブがトリガーされ、次のステップが発生することがわかっています。

  • マルチブランチジョブは、ブランチインデックスのgit fetchを作成し、リモートブランチに対応するジョブをトリガーします:BRANCH_1_job
  • BRANCH_1_jobgit checkoutを作成し、トリガーされたブランチのJenkinsfileを取得します
  • jenkinsfileが実行され、checkout scm自体が作成されます。それを行わないと、ソースが利用できないため、プロジェクトをビルドできません。

そのため、ブランチを構築するために、1つのgit fetchと2つのgit checkoutができます。

質問

  • プロセスを正しく理解していますか?または私は何かを逃したのですか?
  • git checkoutの数を減らす方法はありますか? 公式の例 を確認すると、すべてのユーザーが最初のステップとしてチェックアウトscmを作成しています。個人的には、jenkinsジョブがJenkinsfileを取得するためにチェックアウトを行わなければならなかったので、私はそれを行う必要がないと思います(そのため、私のソースは何とかここにある必要があります)。
  • Git repoに多数の参照が含まれるとすぐに、これらの複数のチェックアウトによってパフォーマンスが低下する可能性があると思いませんか?

みんなありがとう

15
Bastien

プレーンgitでは、Jenkinsは2つのチェックアウトを行う必要があります。1つはJenkinsfileにジョブで何を実行するかを認識させることで、もう1つはビルドのために実際のリポジトリコンテンツをチェックアウトすることです。技術的には、Jenkinsはリポジトリから単一のJenkinsfileをロードするだけで済みますが、gitでは単一のファイルのチェックアウトを許可していません。したがって、マルチブランチプラグインを使用する単純なgitでは、ダブルチェックアウトを回避できません。

BitbucketまたはGitHubでgitをホストしている場合は、マルチブランチプラグインの代わりに特定のJenkinsプラグインを使用することにより、二重チェックアウトを回避します。

Bitbucket および GitHub プラグインについては、Jenkinsプラグインサイトを参照してください。

これらのプラグインは、それぞれのGitプロバイダーのREST APIを使用して単一のJenkinsファイルをロードします。したがって、技術的にはまだダブルチェックアウトがありますが、最初のチェックアウトはシンプルですREST =リポジトリ全体の完全なネイティブgitチェックアウトを実行するのではなく、単一のファイルをダウンロードするために呼び出します。

5
fdd

私はこれに何度も遭遇しましたが、私が提供した堅牢なソリューションは、正しいソースリビジョンをチェックアウトし、実際のパイプラインをソースからロードする、ジョブ自体(scmソースなし)内に小さな「ランチャースクリプト」を定義しました。

DSLプラグインを使用してジョブを一般化する場合、パイプラインを次のように定義します。

pipelineJob("myjob") {
  ...
  definition {
    cps {
      script('''
        node {
          checkout scm
          load("path/to/script.groovy")
        }
      ''')
    }
  }
}

Jenkinsの[構成]画面を使用してジョブを手動で構成している場合、これは[SCMからのパイプラインスクリプト]ではなく[パイプラインスクリプト]を選択し、ボックス内の小さなチェックアウトおよびロードスクリプトをコピーすることと同じです。

これにより、パイプラインbootstrapを実際のSCMから切り離し、一度チェックアウトして、パイプライン定義とソースの両方を構築することができます。最も美しいアプローチではありませんが、うまく機能します。

0
Tareq Sha