Utilisation des Variables Gitlab dans Gitlab README.md pour les Badges SonarQube

J'utilise Gitlab et Sonarqube et le SonarQube Plugin SVG Badges.

Pour représenter l'état de Sonarqube sur gitlab j'ai quelque chose comme ça dans mon README.md fichier:

[![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)

Cela fonctionne parfaitement. Mon badge est indiqué, le lien fonctionne, tout va bien.

Est-il possible de construire quelque chose comme:

[![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})

je veux fournir un squelette que chaque développeur peut simplement copier et coller dans leur README.md le fichier et les variables sont remplies dans le README automatiquement, avec quelque chose comme .gitlab-ci.yml

j'ai aussi essayé les Variables permanentes Gitlab mentionnés ici mais ça ne fonctionne pas trop!

 [![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)

quelqu'un a une idée?

13
demandé sur Joerg 2017-05-02 19:40:31

2 réponses

les variables dans https://gitlab.com/help/ci/variables/README.md ne sont présents que dans un environnement CI (c'est-à-dire une tâche), de sorte que vous ne pouvez pas les utiliser dans la fenêtre Markdown lors de l'affichage du fichier. - C'est une bonne idée pour une proposition. J'ai ouvert un https://gitlab.com/gitlab-org/gitlab-ce/issues/32255. N'hésitez pas à carillon.

ce que vous pouvez faire est d'ajouter un paramètre où vous voulez que ces variables aillent et puis créer un travail qui sed'eux.

update_readme:
  script:
    - echo $CI_PROJECT_NAME # Sanity check
    - sed -ie "s/{THIS}/$CI_PROJECT_NAME/g" README.md

Remarque: l'utilisation de guillemets (") et non des guillemets simples ('). L'utilisation de guillemets élargira $CI_PROJECT_NAME alors qu'un simple guillemet ne ferait que conserver sa valeur littérale.

5
répondu matteeyah 2017-05-15 09:48:39

IMPORTANT!

vous devez implémenter une branche / logique pour éviter de déclencher le .gitlab-ci.yml dans une boucle infinie parce que vous demandez de mettre à jour un fichier de dépôt à partir du CI lui-même

L'approche est la suivante:

  1. Prepare README.md avec des délimiteurs spéciaux autour du badge
  2. remplacer l'ancien insigne par payload (vous devez le construire, pas montré ici) dans le référentiel chargé README.md
  3. urlencode le contenu substitué
  4. mettre à Jour le référentiel avec Gitlab API

lis-moi.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_\npayload\n_g' README.md)")&commit_message=update%20file'

sed la commande, remplacez payload avec votre badge (vous devez le construire, non représenté ici)

  • La solution est d'écrire l' README.mdmettre à Jour le fichier existant dans le référentiel de l'API
  • README.md doit utiliser les délimiteurs de chaînes qui n'apparaissent pas rendu (ils sont comme cachées commentaires). Ces séparateurs sont toujours dans le fichier, ils ne sont pas remplacés. Seulement ce qui est entre eux, obtenir subtituted. De cette façon, vous pouvez mettre à jour automatiquement le badge à chaque fois que vous exécutez le .gitlab-ci.yml (uniquement le badge mis à jour)
  • la substitution se fait par sed commande donc vous devez ajouter le chemin à README.md
  • l'API update a besoin de content urlencoded (donc le sed le commandement est enveloppé par une bash urlencode() fonction qui doit être chargé en premier (chargement non illustré):

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
}

Notes: [//]: # (-- start --) n'affecte pas le calcul de votre README.md donc vous pouvez l'utiliser comme des commentaires cachés

remplacez votre jeton privé par un Gitlab CI Secret variable

2
répondu elingerojo 2017-05-17 11:00:40