github - 使用 jenkins 管道构建 github 拉取请求

标签 github jenkins-pipeline jenkins-plugins

这似乎是 GH 和 Jenkins 更重要但不太了解和记录的功能之一,这似乎完全违背了 CI 的目的......

我正在尝试在 Jenkins 中设置一个简单的“在打开拉取请求时启动构建”作业。我已经扫描了几十个帖子,有些帖子已经有好几年了,但还没有找到一个真正有效的解决方案,从头到尾。我将 GH 2.15.4 和 Jenkins 2.89.3 与 GH Pull Request Builder 插件一起使用。我尝试按照各种“操作方法”帖子和文档设置管道作业和自由式项目。没有任何事情按预期工作。差远了。我已经设法使一些功能正常工作,但并非没有大量反复试验,这不会让我在使用它时感到非常模糊。 Webhooks 在完成所需的工作方面同样毫无值(value),因为在 Jenkins 中似乎没有任何东西可以激发工作,无论它是如何配置的。

对于初学者,是否有任何引用或文档可以解释以下由 Jenkins 自动创建的状态检查:

持续集成/ Jenkins /分支

持续集成/ Jenkins /pr-head

持续集成/ Jenkins /pr-merge

显然没有办法删除或编辑这些......他们只是“出现” Jenkins 的礼貌。我看过一些讨论,但有些解释相互矛盾,所以它们可能已经过时、不准确等。我想知道“什么是什么”,所以我知道哪些应该作为 PR 状态检查的“必需” .

任何指针将不胜感激!

最佳答案

我同意,这个问题很棘手,因为多年来 Jenkins 及其插件发生了很大变化。让我告诉你我是如何完成你所要求的。我将发布我所有的版本号(大部分是最新的)。

Jenkins 版本:2.176.1(java -jar/usr/share/jenkins/jenkins.war --version)

插件

  • github 1.29.4
  • github-api 1.9
  • github-branch-source 2.5.3
  • github-pullrequest 0.2.5
  • 管道-github-lib 1.0

  • 另外,我用的是蓝海界面,这可能会影响事情(谁知道)
  • 蓝海 1.17.0
  • blueocean-git-pipeline 1.17.0
  • blueocean-github-pipeline 1.17.0

  • Github Webhooks

    首先,为您的系统设置 webhook。 This is a good guide for Github Webhooks
    转到您的 Github 存储库,然后单击“设置”选项卡。然后在左侧菜单中选择“Webhooks”:

    我的 Jenkins 设置的 URL 是 https://jenkinsci.dorian.com .因此,在“有效载荷 URL”框中,我输入了 https://jenkinsci.dorian.com/github-webhook/

    我将设置保留为“应用程序/json”和“向我发送所有内容”和“事件”

    Webhooks 区域有一个方便的“最近交付”部分,可以显示您的 webhooks 是否正在使用 Jenkins。起初,我的网址错误,所以我的网址旁边有红色的 X。现在,它们都是绿色的复选标记。

    Github 访问 token

    许多指南建议您为 Jenkins 提供个人访问 token 以与您的存储库进行通信。为此,请转到右上角的帐户头像并选择设置 -> 开发人员设置 -> 个人访问 token -> 生成 token

    把你想要的任何东西放在描述中。在“选择范围”下,如果您只想让它工作,请选中列表中的每个复选框。

    我选择了:
  • repo :状态
  • 写:repo_hook
  • 阅读:repo_hook
  • 管理员:org_hook

  • 单击保存,您将看到您的 key 。将它复制到安全的地方(我们很快就会使用它)。

    配置 Jenkins

    现在是困难的部分。尝试安装我上面列出的所有插件。

    转到 Jenkins-Manage Jenkins->Configure System

    找到 Github 部分,然后单击添加 Github 服务器
  • 名称:Github
  • 接口(interface)网址:https://api.github.com
  • 管理 Hook :true

  • 在凭据下,单击“添加”。你会被带到一个菜单。选择“密文”
  • 范围:全局
  • secret :粘贴您之前的访问 token
  • ID:(我把这个留空了)
  • 描述:DorianGithubCreds

  • 点击保存。然后,从凭据列表中选择 DorianGithubCreds。

    要进行测试,请点击“测试连接”。我的返回“已为用户 dnrahamim 验证的凭据”,速率限制:4998

    现在去 Github 拉取请求生成器
  • GitHub 服务器 API 网址:https://api.github.com
  • Jenkins URL 覆盖:(空白)
  • 共享 secret :(空白)
  • 凭证:DorianGithubCreds
  • 自动管理 webhook:true
  • 其他都是空白

  • 配置作业

    去应该建立你的 repo 的工作
    在左侧菜单中选择“配置”

    在项目-> Github 组织下
  • 凭证:DorianGithubCreds
  • 业主:Dorian
  • 行为:
  • 发现分支机构
  • 策略:排除也作为 PR 提交的分支机构
  • 发现来自源的拉取请求
  • 策略:将拉取请求与当前目标分支修订版合并
  • 发现来自 fork 的拉取请求
  • 策略:将拉取请求与当前目标分支修订版合并
  • 信任:来自具有管理员或写入权限的用户
  • 项目识别器
  • 流水线 Jenkinsfile
  • 路径:Jenkinsfile(我的Jenkinsfile在项目根目录下)
  • 构建策略:(故意留白)

  • 通知

    现在,当我执行拉取请求时,或者每当我发布拉取请求的更改时,Jenkins 都会为该分支运行一个全新的构建。

    Github 中的 Pull Request 本身也在底部列出了它的“状态检查”。当构建处于挂起状态时,状态检查为黄色。如果成功,它会得到一个绿色的复选标记。如果失败,它会得到一个红色的 X。

    我最初遇到了一个问题,因为我有一个旧的 Jenkins 盒子,它也被配置为管理 Github webhooks 和构建拉取请求。它的构建失败了,所以它的通知是通过我的拉取请求的通知。我通过阻止旧的 Jenkins 盒子构建我最新的分支来解决这个问题。一旦旧的 Jenkins 盒子停止构建,来自新 Jenkins 盒子的通知就会传到 Github。

    收尾

    就是这样!这就是我有意配置的一切。请尝试我的配置,看看它是否适合您。如果我遗漏了什么,请告诉我。

    使用 Github 配置 Jenkins 的难点在于,虽然有很多指南,但这些建议经常相互冲突,而且很多已经过时(有时甚至官方文档也已过时)。

    尽管如此,这里有一些资源:
  • This is a good guide for Github Webhooks
  • Github's Whitepaper on CI with Jenkins (It doesn't explain much in detail but it gives a good overview)
  • Github pull request builder plugin
  • Semi-official SO post for showing build status on Github repo
  • 关于github - 使用 jenkins 管道构建 github 拉取请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55264157/

    相关文章:

    github 组织、存储库和用户访问

    jenkins - 如何获取 BooleanParameterValue 的值?

    jenkins - 在 jenkins 中使用 docker-build-step 插件构建 dockerfile 时 ADD 命令失败

    groovy - 如何在Jenkins Lockable Resource插件中获取锁定资源的名称

    jenkins - jenkins 多分支管道中的分支索引会触发额外的构建,该构建已由 poll SCM 构建

    git - Jenkins 使用 Publish over SSH 插件传输 0 个文件

    github - 从 GitHub 页面中删除 html 扩展

    Git 克隆在 Linux VM 上对 HTTPS 进行故障转移(膨胀 : Data Stream Error)

    github - Okteto 忽略某些 yaml 文件

    jenkins - 将 Jenkins 管道中的交互式输入读取到变量