Gitlab CI 为每项工作使用徽章

Gitlab CI using Badges for each job

假设我为一个项目配置了多个作业,如下所示:

build_win32:
  script: ...

build_ios:
  script: ...

unit_tests:
  script: ...

server_tests:
  script: ...

client_tests:
  script: ...

我想要实现的是在 README.md 下为每个作业配置徽章,这样我就可以立即得到反馈,具体是哪一部分出错了。

有一个关于设置徽章的 Gitlab Documentation 但这有一个限制,它只显示如何为 buildcoverage status 配置徽章。

我想知道 Gitlab 中是否有这样的内置功能 CI。我也可以使用第 3 方插件。任何帮助将不胜感激。

您可以通过在管道步骤中创建徽章、将徽章文件注册为管道工件并将它们发布到 GitLab Pages 来实现所需的功能。从那里您可以参考 README.md

中的徽章

如何按照你的要求去做

1。生成徽章

在每个 CI 步骤中,您需要生成徽章文件,并将它们存储在 public/<badge-file>.svg

您可以使用 http://shields.io. I have written my own Python badge generator, which can be found here: https://github.com/jongracecox/anybadge

生成徽章文件

2。将徽章注册为管道工件

将每个生成的徽章文件注册为 CI 作业中的工件,方法是将其包含在 .gitlab-ci.yml 的每个作业中:

build_win32:
  script: ...
    - <generate public/build_win32.svg>
  artifacts:
    paths:
      - public/build_win32.svg

build_ios:
  script: ...
    - <generate public/build_ios.svg>
  artifacts:
    paths:
      - public/build_ios.svg

unit_tests:
  script: ...
    - <generate public/unit_tests.svg>
  artifacts:
    paths:
      - public/unit_tests.svg

server_tests:
  script: ...
    - <generate public/server_tests.svg>
  artifacts:
    paths:
      - public/server_tests.svg

client_tests:
  script: ...
    - <generate public/client_tests.svg>
  artifacts:
    paths:
      - public/client_tests.svg

3。将徽章发布到 GitLab Pages

包括一个新的 pages 发布步骤,deploys everything in the public directory to GitLab pages:

pages:
  stage: deploy
  artifacts:
    paths:
    - public
  only:
  - master

您应该不需要修改以上内容。一旦这个作业 运行s,public 中的所有文件都将通过 GitLab 页面 Web 服务器可用。这通常是 http://NAMESPACE.GITLABPAGESSERVER/project

在此处阅读有关 GitLab 页面的更多信息:https://docs.gitlab.com/ce/user/project/pages/index.html

4。在 README.md

中包含徽章

当项目的主管道 运行s 时,徽章文件被发布到 GitLab Pages,然后可以从项目 README.md.

中引用

为什么这个可能没有意义

我明白你为什么会问这个问题,但我想解释一下为什么你可能不想那样做。

GitLab 管道 运行 每次推送到项目 - 在每个分支上。通常,您只想从 master 分支(或发布)分支为您的 README 文件生成徽章,因此您会 restrict the pages step to only run on master@group/project.

还要考虑管道通常会配置为在作业出错时停止。这意味着如果主管道作业失败,则不会生成该管道的徽章,因此无助于确定哪个作业失败。

获得即时反馈的最佳位置是在管道视图中,您可以将管道成功标志添加到自述文件中,并在管道中添加 link,通常类似于 https://gitlabserver/namespace/project/badges/branch/build.svg

如果您仍想使用您描述的方法,那么我的建议是将每个管道阶段设置为 allow failure。这将允许完整的管道 运行,尽管任何工作都失败了,并且徽章仍应生成并发布到 Pages。

我开发了一个针对实时每个作业徽章的变通解决方案。 它可以很容易地修改成任何其他东西。

示例回购:ci-test/badges。还有一个完整的演练,所以我不会在这里复制粘贴它。

核心思想是(假设你现在在 运行 CI 工作中):

  • 从网络中获取徽章到文件中。
  • 将徽章文件上传到可以link编辑的实时存储(例如 Dropbox)。

Dropbox 支持通过 HTTP 请求调用其 API(参见 this)。 因此,以上所有内容都可以使用例如curl 或 Python 请求 - 基本工具。 您只需将 Dropbox 访问令牌作为 secret variable 传递并以相同名称保存文件以覆盖旧标记。

然后,您可以在任何需要的地方直接 link Dropbox 徽章。 它有一些技巧,所以如果你想使用它,一定要检查我的示例 repo。 对我来说它工作得很好而且似乎很快。

这种方法的好处是不用乱用GitLab Pages。 您没有在 Pages 上发布,而是将其发布到 Dropbox。 那是通过 HTTP 请求调用的简单文件传输。 不多说了。

您可以按照 JGC 的步骤进行操作,但是您可以直接 link 到最新的构建工件,而不是将徽章部署在 Gitlab 页面的 public 目录中。

例如,以下 URL link 使用 anybadge 创建并作为工件上传的 pylint 徽章。

https://gitlabserver/namespace/project/-/jobs/artifacts/master/raw/public/pylint.svg?job=test

我更喜欢使用临时分支来存储不同 ci-作业之间的徽章。

您可以在此处找到详细的项目示例,其中显示了如何使用 GitLab 的临时分支为每个作业使用徽章: https://gitlab.version.fz-juelich.de/vis/jusense-cicd

及其文档在这里: https://gitlab.version.fz-juelich.de/vis/jusense-cicd/wikis/Continuous-Integration-and-Delivery

但是,无论您喜欢哪种策略,自定义徽章直到现在都没有在 GitLab 中得到正确支持。检查此问题以获取更多详细信息: 为此在 GitLab 创建了一个问题:https://gitlab.com/gitlab-org/gitlab-ce/issues/50603