在 GitHub 存储库上显示 Jenkins 构建的当前状态

Posted

技术标签:

【中文标题】在 GitHub 存储库上显示 Jenkins 构建的当前状态【英文标题】:Show current state of Jenkins build on GitHub repo 【发布时间】:2012-12-25 19:21:42 【问题描述】:

有没有办法在我项目的 GitHub Readme.md 上显示 Jenkins 构建状态?

我使用 Jenkins 来运行持续集成构建。每次提交后,它确保一切都编译,以及执行单元和集成测试,然后最终生成文档和发布包。

仍然存在无意中提交破坏构建的风险。访问 GitHub 项目页面的用户最好知道当前 master 处于该状态。

【问题讨论】:

为什么这被否决了?我错过了 Jenkins 用户指南中的一些明显内容吗?我事先谷歌了,找不到任何东西。 Travis 构建服务器可以做这样的事情,但我在 Osx 上使用 Jenkins。这是我追求的那种东西:github.com/CocoaPods/CocoaPods How do show my tests passing/failing in Github?的可能重复 类似问题的链接推荐Travis,目前不支持ios和OSX,所以不回答问题。 这不是重复的.. travis != jenkins 【参考方案1】:

好的,以下是设置 Jenkins 以设置 GitHub 构建状态的方法。这假设您已经拥有 Jenkins,并配置了 GitHub 插件以在每次推送时进行构建。

    前往 GitHub,登录,前往设置开发者设置个人访问令牌并点击生成新令牌

    检查 repo:status(我不确定这是否必要,但我做到了,而且对我有用)。

    生成令牌,复制它。

    确保您要使用的 GitHub 用户是存储库协作者(对于私有存储库)或者是对您要构建的存储库具有推送和拉取访问权限(对于组织存储库)的团队成员。

    转到您的 Jenkins 服务器,登录。

    管理 Jenkins配置系统

    GitHub Web Hook 下选择 让 Jenkins 自动管理挂钩 URL,然后指定您的 GitHub 用户名OAuth 令牌您已进入第 3 步。

    验证它是否可以与 Test Credential 按钮一起使用。 保存设置。

    找到 Jenkins 作业并将 Set build status on GitHub commit 添加到构建后步骤

就是这样。现在进行测试构建并转到 GitHub 存储库以查看它是否有效。单击主存储库页面中的 Branches 以查看构建状态。

您应该会看到绿色复选标记:

【讨论】:

这似乎不适用于 Jenkins > 1.609 和 Github 插件 v 1.13.3 - 我找不到“让 Jenkins 自动管理挂钩 URL”选项 我同意@pyeleven。我将 Jenkins LTS 1.625.3 与 Github 插件 1.16.0 和 Github API 插件 1.71 一起使用。此选项不显示。相反,我看到一个凭据下拉列表,但没有列出凭据(即使我设置了凭据)。这些凭据出现在高级 -> 管理其他 Github 操作 -> 将登录名和密码转换为 Github 令牌时。 这似乎已经过时了;这个答案提到的构建后操作现在被标记为已弃用,还有第二个 现在后期构建步骤参数已更改。 @Alex 有正确答案。 如果您使用最新的 Jenkins Blue Ocean 插件和 GitHub 创建多分支管道,它会自动为您执行此操作,前提是您使用此答案中描述的必要权限正确设置了令牌。 【参考方案2】:

与此同时,Jenkins 和 GitHub 的 UI 发生了一些变化,我花了一段时间才弄清楚如何正确配置 Jenkins。这里的解释是基于Jenkins 2.121.1版本的。

我还假设您已经配置了由 webhook 或轮询触发的 Jenkins 作业。 这些是我为使其工作而采取的步骤:

    配置 Github:使用 OAuth 范围创建个人访问令牌 repo:status 配置 Jenkins:Configure System 并将 OAuth Secret 添加为 GitHub 服务器 - 使用 Secret Text 作为身份验证方法将 OAuth Secret 放入其中。 配置您的 Jenkins 作业:添加 Set GitHub commit status 作为构建后操作。将状态结果设置为One of the default messages and statuses。 在 GitHub 上检查您的结果:检查您是否在 GitHub 提交上获得构建状态和构建执行持续时间。

配置 Github





配置詹金斯






配置 Jenkins 作业




结果

您现在将看到提交和分支的状态:

【讨论】:

哇终于找到解决办法了,非常感谢!那个“秘密文本”让我很困惑。 Jenkins 似乎在推送状态,但我的私人仓库并没有注意到它们。有什么建议吗? 更新:我的问题与我的仓库的隐私有关。我的凭据设置一定有问题。 更新:最终我发现这只有在实际 git push 触发时才有效。自己运行构建不会正确触发状态更新。 Manage Hooks 框在上图中高亮显示但未勾选,是否意味着保存时应取消勾选?【参考方案3】:

我做的很简单:

    安装 Hudson Post 任务插件 在此处创建个人访问令牌:https://github.com/settings/tokens

    添加一个总是成功的发布任务插件

    curl -XPOST -H "Authorization: token OAUTH TOKEN" https://api.github.com/repos/:organization/:repos/statuses/$(git rev-parse HEAD) -d "
      \"state\": \"success\",
      \"target_url\": \"$BUILD_URL\",
      \"description\": \"The build has succeeded!\"
    "
    

    添加一个发布任务插件,如果“将构建标记为失败”,则会失败

    curl -XPOST -H "Authorization: token OAUTH TOKEN" https://api.github.com/repos/:organization/:repos/statuses/$(git rev-parse HEAD) -d "
      \"state\": \"failure\",
      \"target_url\": \"$BUILD_URL\",
      \"description\": \"The build has failed!\"
    "
    

    您还可以在测试开始时添加对挂起的调用

    curl -XPOST -H "Authorization: token OAUTH TOKEN" https://api.github.com/repos/:organization/:repos/statuses/$(git rev-parse HEAD) -d "
      \"state\": \"pending\",
      \"target_url\": \"$BUILD_URL\",
      \"description\": \"The build is pending!\"
    "
    

【讨论】:

您也可以从管道中执行此操作 - 例如,您可以通过 sh 调用它,甚至可以通过 withCredentials 使用 Jenkins 凭据存储 对于 Teamcity,您可以使用:confluence.jetbrains.com/display/TCD10/Commit+Status+Publisher 这个答案没有解决 OP 关于将构建状态放在项目的 README.md 中的问题。【参考方案4】:

这个插件应该可以工作:https://wiki.jenkins-ci.org/display/JENKINS/Embeddable+Build+Status+Plugin

您应该能够将这样的徽章嵌入到您的README.md 文件中:

【讨论】:

很遗憾,似乎 GitHub 开始在某些图像托管服务上缓存这些图像,现在它们显示不正确。 如果您正确设置了访问权限,它现在可以正常工作(匿名用户应该能够看到构建状态)【参考方案5】:

Commit Status API 允许您查看“Repo Statuses API”。

自 2013 年 4 月 26 日起,您现在可以在您的 GitHub repo branch page 上看到 build status:

这意味着这是另一种方式,通过访问 GitHub 项目页面,可以查看这些状态,而不是只有 Jenkins。

从 2013 年 4 月 30 日开始,API endpoint for commit statuses 已扩展为允许分支和标签名称,以及提交 SHA

【讨论】:

我应该把要点击的网址放在哪里?是否有插件或者我必须在构建步骤中使用 curls? @IanVaughan “击中”是什么意思?看什么?要查看状态,应为 curl (developer.github.com/v3/repos/statuses/…) 对不起,是的,我知道 curl 可以使用,并且我知道 API 接口,它更多的是放置 curl 的位置,如果没有来自 curl 的更高级别的抽象可用?即我可以在构建开始之前添加一个 curl POST 来声明提交/PR 正在构建,然后再添加一个,但这一切似乎都非常低级,希望有一个更高级别的插件来为我做这些事情。 此后我发现 Janky 对我的用例来说相当繁重,但似乎可以满足我的要求。【参考方案6】:

还有这个插件会给你一个徽章网址,你可以在你的 README.md 中发布它,看起来像这样

https://wiki.jenkins-ci.org/display/JENKINS/Embeddable+Build+Status+Plugin

【讨论】:

【参考方案7】:

如果您的Jenkins 上安装了Github 插件,您可以在Post build actions 中这样做:

【讨论】:

This appears to fail silently. 这个答案缺乏细节:如何在 GitHub 上创建 OAuth 访问令牌,让 GitHub 插件使用设置构建状态所需的 API?这个令牌需要什么权限?我可以在 Jenkins 配置中的哪个位置指定用户名/令牌? 这真的没用,你怎么到这个对话窗口的?【参考方案8】:

在您的 README.md 中添加以下行,并根据您的 jenkins 项目更改这两个 URL。

[![Build Status](https://jenkins../..project/lastBuild/buildStatus)](https://jenkins../..project/lastBuild/)

【讨论】:

图形是否自动加载?好像不适合我…… 是的,它不起作用。你必须刷新你的页面。【参考方案9】:

关于设置 Jenkins 和 GitHub 的受保护分支。我正在使用 Jenkins 2.6,这些是我为使其工作而采取的步骤:

在您的存储库的 GitHub 网页上:

    导航到设置 > 分支。 在保护分支下,单击 选择一个分支下拉菜单并选择你想要的分支 设置为受保护的分支。 根据需要启用选项。

在 Jenkins 服务器上: (确保您已安装 Git 和 GitHub 插件)

    导航到管理 Jenkins > 配置系统。 在 GitHub 下,将 API URL 设置为 https://api.github.com。虽然这是默认值。 为凭据选择您生成的令牌。如果您尚未生成令牌,请点击高级...,然后点击其他操作,您可以将您的登录名和密码转换为令牌并将其用作您的凭据。

此外,请确保您的 Jenkins 使用的 GitHub 帐户是存储库的合作者。我已将其设置为写入权限级别。

希望这会有所帮助。

【讨论】:

【参考方案10】:

我按照Alex 的指示进行操作,效果很好。

但是,对于 GitHub Enterprise,您需要在将服务器添加到 Jenkins 时修改 API URL。

例如,如果您的公司是 creditcard.com,那么您的网址将是

https://github.creditcard.com/api/v3/

【讨论】:

【参考方案11】:

Jently 更新你的Github commit status(如上面@vonc 所述),不幸的是他们还没有实现Repo Status API

【讨论】:

Jently 现在支持 Github 的 Status API。【参考方案12】:

编辑:

我不再使用这种方法,请使用其他答案之一。

更新:对于我们的具体情况,我最终做了什么: (以上答案很棒 - 谢谢!)

因为我们的构建服务器不在互联网上,所以我们有一个脚本可以将构建状态发布到 github 的 gh-pages 分支。

开始构建标记失败 构建标记成功结束 项目在主项目之后运行以发布结果 -> 构建状态、API 文档、测试报告和测试覆盖率。

GitHub 缓存图像,因此我们创建了 .htaccess 文件,该文件指示构建状态图像的短暂缓存超时。

把它放在带有构建状态图像的目录中:

ExpiresByType image/png "access plus 2 minutes"

Here's 构建脚本。发布到 gh-pages 的目标是 '--publish.site.dry.run'

只有不到 400 行的配置,我们有:

编译检查 单元和集成测试 测试报告 代码覆盖率报告 API 文档 发布到 Github

。 .并且此脚本可以在 Jenkins 内部或外部运行,因此:

开发人员可以在提交之前运行此脚本,从而减少影响其他人的损坏构建的机会。 故障很容易在本地重现。

结果:

Project main page 具有每次构建后更新的构建状态,以及最新的 API 文档、测试结果和测试覆盖率。

【讨论】:

很好的反馈,比我的回答更准确。 +1 构建脚本链接失效 你的脚本有实时链接吗? 已停止使用这种方法 - 我认为其他答案会更好。【参考方案13】:

对于 管道项目,您可以像这样使用 post 部分:

void setBuildStatus(String message, String state) 
  step([
      $class: "GitHubCommitStatusSetter",
      reposSource: [$class: "ManuallyEnteredRepositorySource", url: "https://github.com/my-user/my-repo"],
      contextSource: [$class: "ManuallyEnteredCommitContextSource", context: "ci/jenkins/build-status"],
      errorHandlers: [[$class: "ChangingBuildStatusErrorHandler", result: "UNSTABLE"]],
      statusResultSource: [ $class: "ConditionalStatusResultSource", results: [[$class: "AnyBuildResult", message: message, state: state]] ]
  ]);


pipeline 
    agent any

    triggers 
        githubPush()
    

    stages 

        stage('Hello') 
            steps 
                echo 'Hello World'
            
        

    

    post 
        success 
            setBuildStatus("Build succeeded", "SUCCESS");
        
        failure 
            setBuildStatus("Build failed", "FAILURE");
        
    

只需更改“https://github.com/my-user/my-repo”即可满足您的 github 存储库。

参考:https://***.com/a/47162309/4261333

【讨论】:

【参考方案14】:

添加到 this answer 和 this one 他们已经回答了问题,但没有给我们关于问题的正确直觉

所以,这是我的直觉:

我们需要在 GitHub 提交中添加状态,此状态基于 Jenkins 构建的结果。 为此,我们需要让 Jenkins 访问 GitHub API 而不是 repo,我们通过 OAuth 执行此操作,我们可以创建指向 GH settings -> Developer settings -> Personal access tokens 的令牌,然后用于公共 GH repo检查 repo:status,对于私人 repo,检查 整个 repo 部分 创建访问令牌后,您需要将其添加到您的 Jenkins 服务器: 将访问令牌复制并粘贴到您的 Jenkins 配置下的 GitHub 插件部分设置 创建一个默认为 api.github.com 的 GH 服务器,并将访问令牌添加为秘密文本凭据。 最后一步是在创建管道时添加构建后设置。

资源:

这是YT video 的一部分,他在其中介绍了上述步骤。 阅读OAuth

【讨论】:

以上是关于在 GitHub 存储库上显示 Jenkins 构建的当前状态的主要内容,如果未能解决你的问题,请参考以下文章

Github,无需 github 用户帐户即可在存储库上创建问题

如何删除 Github 环境

在远程存储库上提交历史记录

在新存储库上推送源主错误

分叉存储库上的原始存储库问题

为 Github 私有存储库验证 Jenkins CI