web-dev-qa-db-ja.com

SonarQubeバッジのGitlab README.mdでのGitlab変数の使用

私はGitlabとSonarqubeと SonarqubeプラグインSVGバッジ を使用しています。
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ファイルにコピーして貼り付けることができるスケルトンを提供したいと思います。変数はREADMEに.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)

誰かが何か考えを持っていますか?

17
Joerg

https://gitlab.com/help/ci/variables/README.md の変数はCI環境(つまりジョブ)にのみ存在するため、Markdownで使用できませんファイルを表示するときのビューア。 -しかし、それは機能提案のための素晴らしいアイデアです。私は1つを開いた- 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一方、単一引用符はリテラル値を保持するだけです。

8
matteeyah

重要!

CI自体からリポジトリファイルを更新するように要求しているため、無限ループで_.gitlab-ci.yml_をトリガーしないようにブランチ/ロジックを実装する必要があります

アプローチは次のとおりです。

  1. バッジの周りに特別な区切り文字を付けて_README.md_を準備します
  2. _README.md_をロードしたリポジトリで、古い/初期のバッジをpayloadで置き換えます(ここには表示されていませんが、ビルドする必要があります)。
  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を実際のバッジに置き換えます(ここには表示されていませんが、作成する必要があります)

  • 解決策は、 リポジトリAPIで既存のファイルを更新して、_README.md_を書き込むことです
  • _README.md_は、レンダリングされて表示されない特殊な文字列区切り文字を使用する必要があります(これらは非表示のコメントのようなものです)。これらの区切り文字は常にファイル内にあり、置換されません。それらの間にあるものだけが置換されます。このように、_.gitlab-ci.yml_を実行するたびにバッジを自動的に更新できます(バッジのみが更新されます)
  • 置換はsedコマンドによって行われるため、_README.md_へのパスを追加する必要があります
  • 更新APIではcontentをURLエンコードする必要があります(したがって、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_

2
elingerojo