【问题标题】:Using Gitlab Variables in Gitlab README.md for SonarQube Badges在 Gitlab README.md 中为 SonarQube 徽章使用 Gitlab 变量
【发布时间】:2017-09-30 06:53:47
【问题描述】:

我正在使用 Gitlab 和 Sonarqube 以及 Sonarqube Plugin SVG Badges。
为了在 gitlab 上表示 Sonarqube 状态,我的 README.md 文件中有这样的内容:

[![coverage](https://sonar.domain.com/api/badges/measure?key=com.domain:projectname&metric=coverage)](https://sonar.domain.com/component_measures/metric/coverage/list?id=de.domain:projectname)

这很完美。我的徽章已显示,链接正常,一切正常。

有没有办法构建类似的东西:

[![coverage](https://sonar.domain.com/api/badges/measure?key={MYDOMAIN}:{THIS}&metric=coverage)](https://sonar.domain.com/component_measures/metric/coverage/list?id={MYDOMAIN}:{THIS})

我想提供一个骨架,每个开发人员都可以复制并粘贴到他们的README.md 文件中,并且变量会自动填充到自述文件中,类似于.gitlab-ci.yml

我还尝试了永久的 Gitlab 变量 mentioned here,但这也不起作用!

 [![coverage](https://sonar.domain.com/api/badges/measure?key=com.mydomain:$CI_PROJECT_NAME&metric=coverage)](https://sonar.domain.com/component_measures/metric/coverage/list?id={MYDOMAIN}:$CI_PROJECT_NAME)

有人有什么想法吗?

【问题讨论】:

    标签: sonarqube gitlab gitlab-ci badge readme


    【解决方案1】:

    https://gitlab.com/help/ci/variables/README.md 中的变量仅存在于 CI 环境(即作业)中,因此在显示文件时不能在 Markdown 查看器中使用它们。 - 不过,这对于功能提案来说是个好主意。我打开了一个 - https://gitlab.com/gitlab-org/gitlab-ce/issues/32255。随意插话。

    你可以做的是在你希望这些变量去的地方添加一个占位符,然后创建一个 sed 的作业。

    update_readme:
      script:
        - echo $CI_PROJECT_NAME # Sanity check
        - sed -ie "s/{THIS}/$CI_PROJECT_NAME/g" README.md
    

    注意使用双引号 (") 而不是单引号 (')。使用双引号将插入 $CI_PROJECT_NAME,而单引号只会保留其字面值。

    【讨论】:

    • 但是README.me 真的是我应该看到的吗?因为它并没有真正改变一些内容......所以我使用了类似的东西:[![coverage](https://sonar.domain.com/api/badges/measure?key=com.mydomain:${THIS}&metric=coverage)](https://sonar.domain.com/component_measures/metric/coverage/list?id=com.mydomain:${THIS}) 和你的脚本
    • a cat README.md 显示正确的版本 aber 这(当然)没有显示在 Gitlab 中
    • 我将问题标记为正确并给你赏金,因为我认为这可能是解决问题的一种方法。但仍然:README.md 当然不会在 gitlab 中被替换。如果我自动提交它,那么原来的就消失了……所以不是一个好主意。同样使用普通的自述文件和模板文件,它仍然会给开发人员带来一些困惑,应该编辑哪个自述文件......任何想法@Rex?
    • @Joerg 你可以有一个README_TEMPLATE.md 文件,编辑该文件中的占位符并将结果输出到README.md。为避免重复,您还可以在脚本的开头放置一个保护子句,如果其中已经有一个 README.md,则结束它。
    【解决方案2】:

    重要!

    您应该实现一个分支/逻辑以避免在无限循环中触发.gitlab-ci.yml,因为您要求从 CI 本身更新存储库文件

    方法是:

    1. 准备README.md,并在徽章周围使用特殊分隔符
    2. 用payload 替换旧/初始徽章(您应该构建它,而不是 此处显示)在存储库中加载 README.md
    3. 对替换的内容进行urlencode
    4. 使用 Gitlab API 更新存储库

    README.md

    Hello
    [//]: # (-- start --)
    Initial non working badge
    [//]: # (-- end --)
    World
    

    .gitlab-ci.yml

    update_readme:
      script:
      - curl --request PUT --header 'PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK' 'https://gitlab.example.com/api/v4/projects/13083/repository/README%2Emd?branch=master&content=$(urlencode "$(sed 's_\[//\]: # (-- end --)_\n&_g;s_\(\[//\]: # (-- start --)\)[^\n]*\n_\1\npayload\n_g' README.md)")&commit_message=update%20file'
    

    在sed 命令中,将payload 替换为您的实际徽章(您应该构建它,此处未显示)

    • 解决方案是使用Update existing file in repository API 编写README.md
    • README.md 应使用未呈现的特殊字符串分隔符(它们就像隐藏的 cmets)。这些定界符始终在文件中,不会被替换。只有它们之间的东西才会被替换。这样您就可以在每次运行 .gitlab-ci.yml 时自动更新徽章(仅更新徽章)
    • 替换是通过sed命令完成的,所以你需要将路径添加到README.md
    • 更新 API 需要对 content 进行 urlencoded(因此 sed 命令由 bash urlencode() 函数包装,应该首先加载(加载未显示):

    urlencode()

    urlencode() {
        # urlencode <string>
        old_lc_collate=$LC_COLLATE
        LC_COLLATE=C
    
        local length="${#1}"
        for (( i = 0; i < length; i++ )); do
            local c="${1:i:1}"
            case $c in
                [a-zA-Z0-9.~_-]) printf "$c" ;;
                *) printf '%%%02X' "'$c" ;;
            esac
        done
    
        LC_COLLATE=$old_lc_collate
    }
    

    注意事项: [//]: # (-- start --) 不会影响 README.md 的渲染,因此您可以像隐藏 cmets 一样使用它

    将您的私有令牌替换为 Gitlab CI Secret variable

    【讨论】:

    • 这看起来很不错...我会更深入地研究它。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2022-01-20
    • 1970-01-01
    相关资源
    最近更新 更多