由于 Azure git repo 拉取请求而触发 Jenkins 作业

时间:2021-02-02 06:48:30

标签: git jenkins tfs azure-devops

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

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

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

另一个问题:我可以在“构建触发器”部分看到这些复选框:

  • 在将更改推送到 TFS 拉取请求时构建
  • 在将更改推送到 TFS/团队服务时构建

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

编辑

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

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

问题是如何在流水线作业中实现这一点。

2 个答案:

答案 0 :(得分:0)

检查 Jenkins 流水线作业中的拉取请求提交。您可以在结帐步骤中添加 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-->凭据,您可以在其中为 azure devops 存储库添加凭据。见here

enter image description here

见下面的示例结果:

enter image description here

对于 Poll SCM 部分中的 Build Triggers。如果您启用了 Poll SCM,jenkin 服务器将按固定时间间隔轮询 SCM,以检查是否进行了更改,并在新提交被推送时构建项目。

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

<块引用>

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

答案 1 :(得分:0)

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

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

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

管道配置

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

Jenkinsfile

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

现在,创建一个新的拉取请求,观察到的行为是:
使用通用构建:默认检出将检出 feature 分支。在声明 checkout

之后,multiple candidate revisions 步骤可能(并且经常会)检出旧的拉取请求提交

使用触发 Git 构建:默认检出失败,因为它不知道提交对象,因为没有在配置页面中配置 refspec。配置好之后,默认的 checkout 会检查最新的 pull-request 提交。

结论

所以基本上我们得到以下结论:
为了使其正常工作,请执行以下步骤:

Azure DevOps 服务挂钩
配置一个“拉取请求合并尝试”类型的Jenkins服务钩子,并设置为“触发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>']]]))

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