【问题标题】:Gitlab CI using Badges for each jobGitlab CI 为每个工作使用徽章
【发布时间】:2018-01-27 02:58:20
【问题描述】:

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

build_win32:
  script: ...

build_ios:
  script: ...

unit_tests:
  script: ...

server_tests:
  script: ...

client_tests:
  script: ...

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

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

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

【问题讨论】:

    标签: gitlab-ci badge


    【解决方案1】:

    您可以通过在管道步骤中创建徽章、将徽章文件注册为管道工件并将它们发布到 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 发布步骤,其中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。

    【讨论】:

      【解决方案2】:

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

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

      核心思想是(假设您现在处于一个正在运行的 CI 作业中):

      • 将徽章从 Web 提取到文件中。
      • 将徽章文件上传到一些可以链接的实时存储(例如 Dropbox)。

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

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

      这种方法的优点是您不必弄乱 GitLab Pages。 而不是在 Pages 上发布,而是将其放到 Dropbox。 这是一个由 HTTP 请求调用的简单文件传输。 不多说了。

      【讨论】:

      • 我发现你的解决方案很有趣,虽然我不使用保管箱。也学到了一些技巧,非常感谢!!
      【解决方案3】:

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

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

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

      【讨论】:

      • 这对于公开的项目非常有效。如果您将此方法用于启用了安全性的项目,则自述文件的查看者可能无法在未经身份验证的情况下访问工件。
      • 这对我不起作用,pylint.svg 来自哪里?有更好的文档链接吗?
      • 看JGC回答的第1步。
      • 不幸的是,这不适用于失败的管道。乳清作业工件由 ref 名称引用,工件由最后一个 成功 管道的结果挑选。 IE。您将无法创建失败的徽章。
      【解决方案4】:

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

      您可以在此处找到详细的项目示例,该示例显示了如何使用带有 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-30
        • 1970-01-01
        • 1970-01-01
        • 2018-11-27
        • 1970-01-01
        • 2021-05-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多