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

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

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

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

【问题讨论】:

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

标签: github jenkins


【解决方案1】:

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

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

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

  3. 生成令牌,复制它。

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

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

  6. 管理 Jenkins配置系统

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

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

  9. 找到 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 作业。 这些是我为使其工作而采取的步骤:

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

配置 Github





配置詹金斯






配置 Jenkins 作业




结果

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

【讨论】:

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

我做的很简单:

  1. 安装 Hudson Post 任务插件
  2. 在此处创建个人访问令牌:https://github.com/settings/tokens
  3. 添加一个总是成功的发布任务插件

    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!\"
    }"
    
  4. 添加一个发布任务插件,如果“将构建标记为失败”,则会失败

    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!\"
    }"
    
  5. 您还可以在测试开始时添加对挂起的调用

    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 凭据存储
  • 这个答案没有解决 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 中这样做:

    【讨论】:

    • 这个答案缺乏细节:如何在 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 网页上:

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

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

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

    此外,请确保您的 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://stackoverflow.com/a/47162309/4261333

        【讨论】:

          【解决方案14】:

          添加到 this answerthis 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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-08-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-11-22
            • 1970-01-01
            相关资源
            最近更新 更多