2017-05-02 82 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