19

我正在使用 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 变量,但这也不起作用!

 [![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)

有人有什么想法吗?

4

2 回答 2

11

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,而单引号将仅保留其文字值。

于 2017-05-15T09:34:59.547 回答
2

重要的!

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

方法是:

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

自述文件.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用您的实际徽章替换(您应该构建它,此处未显示)

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

urlcode()

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因此您可以像隐藏评论一样使用它

用 Gitlab CI 替换你的私有令牌Secret variable

于 2017-05-17T10:44:03.330 回答