Извлеките идентификатор значка из JSON в .gitlab-ci.yml - PullRequest
1 голос
/ 20 мая 2019

У меня есть пример проекта в gitlab, где я хотел бы получить идентификатор последнего значка в .gitlab-ci.yml через скрипт. Я получаю обзор всех значков как json . Есть ли способ получить «идентификатор» последнего элемента?

В данный момент я устанавливаю пользовательскую переменную CI PYLINT_BADGE_ID вручную из json для каждого проекта. В данном случае это 37777. Как автоматизировать это с помощью командной строки?

Подробности:

Я пытаюсь решить этот вопрос: Значок Pylint в gitlab . Но они используют страницы gitlab, anybadge, артефакты и readme для отображения значков (чего нет в стандартной области значков). Следующий способ чувствует себя более стройным:

Это .gitlab-ci.yml, который я использую

lint:
  script:
  - python -m pip install setuptools
  - python -m pip install pylint pylint-exit
  - pylint src/*.py | tee pylint.txt || pylint-exit $?
  - score=$(sed -n 's/^Your code has been rated at \([-0-9.]*\)\/.*/\1/p' pylint.txt)
  - echo "Pylint score was $score"
  # To check your badge ID go to https://gitlab.com/api/v4/projects/43126475/badges
  # and insert your $CI_PROJECT_ID. Must be a quite high number!
  # Would be great to automate this!
  - badge_url=https://img.shields.io/badge/lint%20score-$score-blue.svg
  - >-
        curl https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/badges/$PYLINT_BADGE_ID
        -X PUT
        -H "PRIVATE-TOKEN: $API_TOKEN"
        -H "Content-Type: application/json"
        -d '{"image_url": "'"$badge_url"'"}'

  artifacts:
    paths:
      - pylint.txt

1 Ответ

0 голосов
/ 20 мая 2019

После нескольких часов выхода из регулярных выражений я добавил это к своему .gitlab-ci.yml:

  - json_badge_info=$(curl -H "PRIVATE-TOKEN:$API_TOKEN" -X GET https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/badges)
  - pylint_badge_id=$(expr match "$json_badge_info" '.*https[^"]*-blue\.svg\",\"id\":\([0-9]\+\),')

Таким образом, весь этап выглядит так:

lint:
  stage: unittest-lint

  script:
  - python -m pip install setuptools pylint pylint-exit
  - pylint src/*.py | tee pylint.txt || pylint-exit $?
  - score=$(sed -n 's/^Your code has been rated at \([-0-9.]*\)\/.*/\1/p' pylint.txt)
  - echo "Pylint score was $score"

  # get the json with all badge urls via API and regex the id of the badge with 'blue.svg' in it
  - json_badge_info=$(curl -H "PRIVATE-TOKEN:$API_TOKEN" -X GET https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/badges)
  - pylint_badge_id=$(expr match "$json_badge_info" '.*https[^"]*-blue\.svg\",\"id\":\([0-9]\+\),')
  - echo $pylint_badge_id

  - badge_url=https://img.shields.io/badge/lint%20score-$score-blue.svg
  - >-
        curl https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/badges/$pylint_badge_id
        -X PUT
        -H "PRIVATE-TOKEN: $API_TOKEN"
        -H "Content-Type: application/json"
        -d '{"image_url": "'"$badge_url"'"}'

  artifacts:
    paths:
      - pylint.txt

Это решение зависит от порядкаэлементов в регулярном выражении ищет -blue.svg в JSON, который должен быть перед идентификатором значка.

...