【问题标题】:Trigger Jenkins job due to a Azure git repo pull request由于 Azure git repo 拉取请求而触发 Jenkins 作业
【发布时间】:2021-05-06 08:19:13
【问题描述】:

我已经阅读了this page 中的文档,我可以看到有一个选项可以“在创建拉取请求时触发构建”。我做了以下事情:

在 Azure DevOps 中
  1. 服务挂钩 -> Jenkins 订阅 -> 拉取请求合并尝试
  2. 触发通用构建 -> 指定凭据和特定构建。
在詹金斯工作
  1. 创建管道作业并选中“轮询 SCM”复选框

现在,每当我发出拉取请求时,确实会触发构建,但我的问题是:如何克隆拉取请求提交以便构建检查拉取请求是否应该完成?

如果您愿意,还有一个问题:我可以在“构建触发器”部分看到这些复选框:

  • 将更改推送到 TFS 拉取请求时构建
  • 将更改推送到 TFS/Team Services 时构建

这些有什么用?因为据我所知,只要在 Git 存储库中创建新的提交/拉取请求,只有“轮询 SCM”复选框才会导致构建运行。

编辑

使用 Freestyle 工作,我可以通过以下方式完成这项工作:

  1. 在 SCM 配置中设置 refspecs,如下所示:
+refs/heads/*:refs/remotes/origin/* +refs/pull/*:refs/remotes/origin-pull/*
  1. 将“要跟踪的分支”设置为**,以便跟踪和构建pull/* 分支。

问题是如何在流水线作业中进行这项工作。

【问题讨论】:

标签: git jenkins tfs azure-devops


【解决方案1】:

查看 Jenkins Pipeline 作业中的拉取请求提交。您可以在结帐步骤中添加 refspec,如下所示:

 steps {
             
              checkout([$class: 'GitSCM', 
              extensions: [[$class: 'LocalBranch']],
              userRemoteConfigs: [[refspec:"+refs/heads/*:refs/remotes/origin/* +refs/pull/*:refs/remotes/origin-pull/*",credentialsId: '<credentialsId>', url: "<git repo url>"]]])
              //
         }

注意:credentialsId 来自 Jenkins-->Credentials,您可以在其中为 azure devops 存储库添加凭据。见here

见下例结果:

对于Poll SCMBuild Triggers 部分。如果你启用了Poll SCM,jenkin 服务器会以固定的时间间隔轮询 SCM 以检查是否进行了更改,如果推送了新的提交,则构建项目。

不推荐轮询 SCM 选项。因为这对 CVS 来说是一项昂贵的操作。它通常在“推送”触发器不起作用时使用(例如,repo 在本地源代码控制服务器中)

请注意,这对于 CVS 来说将是一项昂贵的操作,因为每次轮询都需要 Jenkins 扫描整个工作区并与服务器进行验证。考虑设置“推送”触发器以避免这种开销

【讨论】:

  • 谢谢。请参考问题的编辑
  • @YoavKlein 您可以参考上面更新的示例来设置checkout 步骤
  • @YoavKlein 嗨,您有机会查看上述更新吗?如果它帮助您解决此问题,请告诉我
  • 嗨@Levi Lu-MSFT,很抱歉我还没有机会检查这个。承诺我会回复的。
【解决方案2】:

好吧,在搞砸了很多时间之后,我发现了以下结论,这对我来说并不完全有意义:

触发通用构建与触发 Git 构建

首先,在使用这些选项时会检查不同的行为。假设Jenkins的配置如下:

管道配置

  • 来自 SCM 的管道脚本 -> Git
  • 将某些 repo 和 feature 分支配置为“要构建的分支”
  • 轮询 SCM(用于使用“触发 Git 构建”)

Jenkins 文件

  • 不包含skipDefaultCheckout()
  • checkout(... branches: [[ name: '**' ]], userRemoteConfigs: [[refspec:"+refs/heads/*:refs/remotes/origin/* +refs/pull/*:refs/remotes/origin-pull/*" ]])(忽略不相关的配置)

现在,创建一个新的拉取请求,观察到的行为是:
使用通用构建:默认签出将签出feature 分支。 checkout 步骤可能(并且经常这样做)在声明 multiple candidate revisions 之后签出旧的拉取请求提交

使用Trigger Git Build:默认签出失败,因为它不知道提交对象,因为配置页面中没有配置refspec。配置完成后,默认的 checkout 会检查最新的 pull-request 提交。

结论

所以基本上我们得到以下结论:
为此,请执行以下步骤:

Azure DevOps 服务挂钩
配置“Pull request merge attempt”类型的Jenkins服务钩子,设置为“Trigger Git Build”

管道配置页面

  • 设置Poll SCM 选项
  • 配置 Git 存储库
  • 如果要使用默认签出,请在 advanced 下配置 refspec,如下所示:+refs/heads/*:refs/remotes/origin/* +refs/pull/*:refs/remotes/origin-pull/*branches: [[name: '**']]

Jenkinsfile

  • 如果您使用默认结帐,则基本设置完毕。
  • 如果没有,请设置skipDefaultCheckout 选项,并使用checkout 步骤和refspec,如上所述:
checkout([$class: 'GitSCM', branches: [[name: '**']], , userRemoteConfigs: [[name: 'origin', refspec: '+refs/heads/*:refs/remotes/origin/* +refs/pull/*:refs/remotes/origin-pull/*', url: '<git_url>']]]))

如果有人对这些事情有进一步的解释,那么欢迎你!

【讨论】:

    猜你喜欢
    • 2020-04-26
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    • 2022-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多