在Gitlab中使用Gitlab变量README.md用于SonarQube徽章

时间:2017-05-02 16:40:32

标签: sonarqube gitlab gitlab-ci badge readme

我正在使用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)

任何人都有一些想法?

2 个答案:

答案 0 :(得分:6)

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,而单引号只会保留它的字面值。

答案 1 :(得分:2)

重要!

  

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

方法是:

  1. 使用徽章周围的特殊分隔符准备README.md
  2. payload代替旧的/初始徽章(你应该建造它,而不是 此处显示)已加载存储库README.md
  3. urlencode替换内容
  4. 使用Gitlab API更新存储库
  5. 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应使用未显示呈现的特殊字符串分隔符(它们就像隐藏的注释)。这些分隔符始终在文件中,它们不会被替换。只有它们之间的内容才会被取代。这样,每次运行.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的呈现,因此您可以像隐藏的评论一样使用它

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