Search code examples
gitlabbadge

Gitlab - How to add badge based on jobs pipeline


My goal is to show badges (ex : enter image description here) based on pipeline results.

I have a private gitlab ce omnibus instance with the following .gitlab-ci.yml :

image: python:3.6

stages:
  - lint
  - test

before_script:
  - python -V
  - pip install pipenv
  - pipenv install --dev

lint:
  stage: lint
  script:
  - pipenv run pylint --output-format=text --load-plugins pylint_django project/ | tee pylint.txt
  - score=$(sed -n 's/^Your code has been rated at \([-0-9.]*\)\/.*/\1/p' pylint.txt)
  - echo "Pylint score was $score"
  - ls
  - pwd
  - pipenv run anybadge --value=$score --file=pylint.svg pylint
  artifacts:
    paths:
      - pylint.svg

test:
  stage: test
  script:
  - pipenv run python manage.py test

So I thought that I would store the image in the artifacts of the lint job and display it via the badge feature.

But I encounter the following issue : when I browse https://example.com/[group]/[project]/-/jobs/[ID]/artifacts/file/pylint.svg, instead of seeing the badge I have the following message :

The image could not be displayed because it is stored as a job artifact. You can download it instead.

And anyways, I feel like this is the wrong way, because even if I could get the image, there don't seems to be a way to get the image from the last job since gitlab URL for badges images only supports %{project_path}, %{project_id}, %{default_branch}, %{commit_sha}

So how one would add badge to a gitlab project based on a svg generated from results in a gitlab pipeline ?

My guess is that I could push to a .badge folder but that doesn't sound like a clean solution.


Solution

  • You can indeed get the artifact(s) for the latest job (see documentation here), but the trick is that you need to use a slightly different URL:

    https://example.com/[group]/[project]/-/jobs/artifacts/[ref]/raw/pylint.svg?job=lint

    where [ref] is the reference to your branch/commit/tag.

    Speaking of badge placeholders available in Gitlab, you can potentially put %{default_branch} or %{commit_sha} into [ref]. This won't allow you to get the correct badge for every branch, but at least your default branch will get one.

    Please also note that ?job=lint query parameter is required, without it the URL won't work.