Подтвердить что ты не робот

Использование переменных Gitlab в Gitlab README.md для значков SonarQube

Я использую Gitlab и Sonarqube и Значки SVG для Sonarqube Plugin.
Чтобы представить состояние Sonarqube в gitlab, у меня есть что-то подобное в моем файле 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)

У кого-нибудь есть идея?

4b9b3361

Ответ 1

Переменные в 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, в то время как одиночные кавычки просто сохранили бы это буквальное значение.

Ответ 2

ВАЖНО!

Вы должны реализовать ветвь/логику, чтобы избежать запуска .gitlab-ci.yml в бесконечном цикле, потому что вы просите обновить файл репозитория из самого CI

Подход:

  • Подготовьте README.md со специальными разделителями вокруг значка
  • Заменить старый/начальный значок payload (вы должны его создать, а не показано здесь) в загруженном репозитории README.md
  • urlencode для замещенного содержимого
  • Обновление репозитория с помощью API Gitlab

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 на ваш фактический значок (вы должны его создать, не показано здесь)

  • Решение состоит в том, чтобы написать README.md с помощью Обновить существующий файл в API репозитория
  • 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