【问题标题】:How to "Scan Repository Now" from a Jenkinsfile如何从 Jenkinsfile 中“立即扫描存储库”
【发布时间】:2019-01-04 21:17:06
【问题描述】:

我可以使用 build 命令调用另一个 jenkins 作业。有没有办法让另一个工作进行分支扫描?

多分支管道作业有一个 UI 按钮“立即扫描存储库”。当您按下此按钮时,它将检查已配置的 SCM 存储库并检测所有分支并为每个分支创建子作业。

我有一个多分支管道作业,为此我选择了“禁止自动 SCM 触发”选项,因为我只希望它在我从另一个作业中调用它时运行。由于选择了此选项,多分支管道不会自动检测何时将新分支添加到存储库。 (如果我在 UI 中单击“立即扫描存储库”,它将检测到它们。)

基本上我有一个多分支管道作业,我想从另一个使用相同 git 存储库的多分支管道作业中调用它。

node {
  if(env.BRANCH_NAME == "the-branch-I-want" && other_criteria) {
    //scanScm "../my-other-multibranch-job" <--- scanScm is a fake command I made up
    build "../my-other-multibranch-job/${env.BRANCH_NAME}"

我在build 行上收到错误,因为目标多分支管道作业还不知道BRANCH_NAME 存在。我需要一种方法来从当前作业触发目标作业中的 SCM 重新扫描。

【问题讨论】:

    标签: jenkins


    【解决方案1】:

    与您自己想出的类似,我可以贡献我的优化,它实际上一直等到扫描完成(但受脚本安全性约束):

    // Helper functions to trigger branch indexing for a certain multibranch project.
    // The permissions that this needs are pretty evil.. but there's currently no other choice
    //
    // Required permissions:
    // - method jenkins.model.Jenkins getItemByFullName java.lang.String
    // - staticMethod jenkins.model.Jenkins getInstance
    //
    // See:
    // https://github.com/jenkinsci/pipeline-build-step-plugin/blob/3ff14391fe27c8ee9ccea9ba1977131fe3b26dbe/src/main/java/org/jenkinsci/plugins/workflow/support/steps/build/BuildTriggerStepExecution.java#L66
    // https://stackoverflow.com/questions/41579229/triggering-branch-indexing-on-multibranch-pipelines-jenkins-git
    void scanMultiBranchAndWaitForJob(String multibranchProject, String branch) {
        String job = "${multibranchProject}/${branch}"
        // the `build` step does not support waiting for branch indexing (ComputedFolder job type),
        // so we need some black magic to poll and wait until the expected job appears
        build job: multibranchProject, wait: false
        echo "Waiting for job '${job}' to appear..."
    
        while (Jenkins.instance.getItemByFullName(job) == null || Jenkins.instance.getItemByFullName(job).isDisabled()) {
            sleep 3
        }
    }
    

    【讨论】:

    • 必须是 String job = "${multibranchProject}/${URLEncoder.encode(branch, 'UTF-8')}"
    【解决方案2】:

    在发布问题后不久就解决了这个问题。针对基本多分支管道作业而不是分支调用 build 会导致它重新扫描。我上面的 sn-p 的解决方案最终看起来像......

    node {
      if(env.BRANCH_NAME == "the-branch-I-want" && other_criteria) {
        build job: "../my-other-multibranch-job", wait: false, propagate: false // scan for branches
        sleep 2 // scanning takes time
        build "../my-other-multibranch-job/${env.BRANCH_NAME}"
    

    wait: false 很重要,否则您会收到“错误:不支持等待非作业项目”。多分支“父”作业比作业更接近文件夹,但它是支持build 命令的文件夹,它通过扫描 SCM 来实现。

    但是解决这个问题只是导致了另一个问题,那就是wait: false 我们无法知道 SCM 扫描何时完成。如果您有一个大型存储库(或者您缺少 jenkins 代理),则直到第二个 build 命令由于分支不存在而失败之后才会被发现。您可以将睡眠时间延长得更高,但这无法扩展。

    幸运的是,如果您为 jenkins 设置了 github webhooks,甚至不需要手动启动 SCM 扫描。该分支将或多或少立即被发现,因此出于我的目的,这是通过另一种方式解决的。我遇到它的原因是我们没有在我们的 dev jenkins 中设置 webhook,但是一旦我将此代码移动到 prod 它将正常工作。

    如果您尝试使用 JobDSL 来设置调用 multibranches 的多分支,并且您没有 webhook 或类似的东西,更好的方法可能是为您的第二层作业放弃多分支并使用 JobDSL 创建文件夹和管理分支机构自己工作。

    【讨论】:

      猜你喜欢
      • 2011-07-10
      • 1970-01-01
      • 2018-11-03
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 2019-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多