在 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 构建的当前状态的主要内容,如果未能解决你的问题,请参考以下文章