198

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

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

仍然存在不经意间做出破坏构建的事情的风险。访问 GitHub 项目页面的用户最好知道当前 master 处于该状态。

4

14 回答 14

175

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

  1. 转到 GitHub,登录,转到SettingsDeveloper SettingsPersonal access tokens并单击Generate new token

    生成新令牌的屏幕截图

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

    生成新令牌的屏幕截图

  3. 生成令牌,复制它。

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

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

  6. 管理 Jenkins配置系统

  7. GitHub Web Hook下选择Let Jenkins auto-manage hook URLs,然后指定您的 GitHub用户名和您在第 3 步中获得的OAuth 令牌。

    Jenkins 全局设置截图

  8. 验证它是否与“测试凭据”按钮一起使用。 保存设置。

  9. 找到 Jenkins 作业并将Set build status on GitHub commit添加到 post-build 步骤

    Jenkins 作业配置截图

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

单击“分支”的主页截图

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

带有构建状态的 GitHub 分支的屏幕截图

于 2014-11-13T14:19:21.810 回答
75

与此同时,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 作业

在此处输入图像描述


在此处输入图像描述


在此处输入图像描述


结果

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

在此处输入图像描述

于 2018-06-23T17:03:33.757 回答
35

我所做的很简单:

  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!\"
    }"
    

Post build 任务配置截图

于 2014-01-07T17:07:47.527 回答
27

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

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

构建传递

于 2013-01-11T08:55:19.277 回答
11

提交状态 API允许您查看“回购状态 API ”。

自 2013 年 4 月 26 日起,您现在可以在GitHub 存储库分支页面上查看构建状态

在 GitHub 存储库分支上构建状态

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

从 2013 年 4 月 30 日开始,提交状态的 API 端点已扩展为允许分支和标签名称,以及提交 SHA

于 2013-04-26T23:54:28.667 回答
11

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

构建传递

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

于 2015-04-07T22:39:33.000 回答
7

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

在 github 上设置构建状态

于 2014-06-17T16:39:12.300 回答
5

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

[![Build Status](https://jenkins../..project/lastBuild/buildStatus)](https://jenkins../..project/lastBuild/)
于 2017-11-07T21:01:09.897 回答
3

关于设置 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 帐户是存储库的协作者。我已将其设置为写入权限级别。

希望这可以帮助。

于 2016-06-01T12:17:09.883 回答
2

我按照亚历克斯的指示,它奏效了。

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

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

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

于 2019-01-24T18:14:20.317 回答
1

编辑:

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

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

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

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

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

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

ExpiresByType image/png "access plus 2 minutes"

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

配置不到 400 行,我们有:

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

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

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

结果:

项目主页有构建状态,每次构建后更新,以及最新的 API 文档、测试结果和测试覆盖率。

于 2013-12-17T03:52:15.507 回答
1

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

于 2014-04-07T07:10:59.823 回答
0

对于管道项目,您可以像这样使用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

于 2021-05-27T22:00:39.643 回答
0

添加到这个答案,还有这个他们已经回答了这个问题,但没有给我们关于这个问题的正确直觉

所以,这是我的直觉:

  • 我们需要在我们的 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 视频,他在其中介绍了上述步骤。
  • 了解OAuth
于 2022-01-22T20:58:50.390 回答