2017-05-02 42 views
13

我正在使用Gitlab和Sonarqube以及Sonarqube Plugin SVG Badges
为了表示我的README.md文件上gitlab我有这样的事情的Sonarqube状态:在Gitlab README.md中使用Gitlab变量作为SonarQube徽章

[![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文件和变量自动填充到README,东西像.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) 

任何人有一些想法?

回答

4

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而单引号将只保留它的文本值。

+0

更换您的私人记号反而是'README.me'不是真的我应该看到一个?因为它并不真的改变一些内容... 所以我用了类似的东西: '[![coverage](https://sonar.domain.com/api/badges/measure?key=com.mydomain:$ {THIS }(https://sonar.domain.com/component_measures/metric/coverage/list?id=com.mydomain:$ {THIS})' 和您的脚本 – Joerg

+0

'cat README.md'正在显示正确的版本这是(当然)没有显示在Gitlab – Joerg

+0

我标记的问题是正确的,给你的赏金,因为我看到这可能是一种解决方案的方式。但仍然:'README.md'当然不会在gitlab中被替换。如果我自动提交,比原来的不存在...所以不是一个好主意。此外,对于正常的README和模板文件,开发人员仍然会对其产生困惑,应该编辑自述文件...任何Idea @Rex? – Joerg

2

重要!

你应该实现一个分支/逻辑,以避免触发.gitlab-ci.yml在一个无限循环,因为你问到更新从CI本身

0库文件

其做法是:

  1. 通过​​特殊定界符准备README.md周围的徽章
  2. 替代旧/初始徽章(你应该建立它,这里没有 显示)加载README.md
  3. 进行urlencode库替换内容
  4. 使用Gitlab API更新存储库

README.md

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

.gitlab-ci。阳明海运

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命令,替换​​与您的实际徽章(你应该建立它,这里没有显示)

  • 的解决方案是使用Update existing file in repository API
  • README.mdREADME.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

+0

这看起来相当不错...我会更深入地了解它。非常感谢! – Joerg