Gitlab CI为每项工作使用徽章

时间:2017-08-18 12:12:02

标签: gitlab-ci badge

我们说我为一个项目配置了多个工作,如下所示:

build_win32:
  script: ...

build_ios:
  script: ...

unit_tests:
  script: ...

server_tests:
  script: ...

client_tests:
  script: ...

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

设置徽章时有Gitlab Documentation,但这有一个限制,即它显示了如何仅为buildcoverage status配置徽章。

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

4 个答案:

答案 0 :(得分:12)

您可以通过在管道步骤中创建徽章,将徽章文件注册为管道工件并将其发布到GitLab页面来实现所需。从那里,您可以参考README.md

中的徽章

如何做你要求的

1。生成徽章

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

您可以使用http://shields.io生成徽章文件。我已经编写了自己的Python徽章生成器,可以在这里找到: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

您不需要修改上述内容。运行此作业后,public中的所有文件都将通过GitLab页面Web服务器提供。这通常是http://NAMESPACE.GITLABPAGESSERVER/project

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

4。在README.md

中包含徽章

当为项目运行主管道时,徽章文件将发布到GitLab页面,然后可以从项目README.md中引用。

为什么可能没有意义

我理解为什么你会问这个问题,但我想解释你为什么不想这样做。

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

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

获取即时反馈的最佳位置是在管道视图中,您可以通过指向管道的链接将管道成功徽章添加到自述文件中,通常类似于https://gitlabserver/namespace/project/badges/branch/build.svg

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

答案 1 :(得分:6)

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

例如,以下网址链接到使用anybadge创建并作为工件上传的pylint徽章。

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

答案 2 :(得分:3)

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

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

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

  • 从网站上取得徽章到文件中。
  • 将徽章文件上传到可以链接的实时存储(例如Dropbox)。

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

然后,您可以直接将Dropbox徽章链接到您需要的任何位置。 有一些技巧,所以一定要检查我的示例回购,如果你想使用它。 对我而言,它运作良好,似乎很快。

这种方法的优点是你不必乱用GitLab Pages。 您可以将它放在Dropbox上,而不是在Pages上发布。 这是HTTP请求调用的简单文件传输。 不多了。

答案 3 :(得分:3)

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

您可以找到一个详细的项目示例,该示例显示如何使用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