Gitlab CI używanie odznak dla każdego zadania

Załóżmy, że skonfigurowałem wiele zadań dla projektu, jak poniżej:

build_win32:
  script: ...

build_ios:
  script: ...

unit_tests:
  script: ...

server_tests:
  script: ...

client_tests:
  script: ...

To co chcę osiągnąć to skonfigurować odznaki dla każdego zadania pod README.md żebym mógł mieć natychmiastową informację zwrotną o tym, która część poszła źle.

Istnieje dokumentacja Gitlab na ustawianie odznak, ale ma to ograniczenie, że pokazuje jak skonfigurować odznaki tylko dla build i coverage status.

Zastanawiam się, czy istnieje taka wbudowana funkcja w Gitlab CI. Mogę również użyć wtyczek innych firm. Każda pomoc będzie mile widziana.

Author: Matt, 2017-08-18

4 answers

Możesz osiągnąć to, czego potrzebujesz, tworząc Znaczki w swoich krokach potoku, rejestrując pliki znaczków jako artefakty potoku i publikując je na stronach GitLab. Stamtąd możesz odwołać się do odznak w swoim README.md

Jak zrobić to, o co prosiłeś

1. Wygeneruj odznakę

W każdym kroku CI należy wygenerować pliki znaczków i zapisać je pod public/<badge-file>.svg

Możesz wygenerować pliki znaczków za pomocą http://shields.io . napisałem mój własny generator znaczków Pythona, który można znaleźć tutaj: https://github.com/jongracecox/anybadge

2. Zarejestruj odznakę jako artefakt rurociągu

Zarejestruj każdy z wygenerowanych plików badge jako artefakty w zadaniu CI, włączając to do każdego zadania w .gitlab-ci.yml:

build_win32:
  script: ...
    - <generate public/build_win32.svg>
  artifacts:
    paths:
      - public/build_win32.svg

build_ios:
  script: ...
    - <generate public/build_ios.svg>
  artifacts:
    paths:
      - public/build_ios.svg

unit_tests:
  script: ...
    - <generate public/unit_tests.svg>
  artifacts:
    paths:
      - public/unit_tests.svg

server_tests:
  script: ...
    - <generate public/server_tests.svg>
  artifacts:
    paths:
      - public/server_tests.svg

client_tests:
  script: ...
    - <generate public/client_tests.svg>
  artifacts:
    paths:
      - public/client_tests.svg

3. Opublikuj plakietkę na GitLab Pages

Dołącz nowy pages krok publikowania, który wdraża wszystko w katalogu publicznym do stron GitLab :

pages:
  stage: deploy
  artifacts:
    paths:
    - public
  only:
  - master

Nie powinieneś trzeba zmodyfikować powyższe. Po uruchomieniu zadania, wszystkie pliki w public będą dostępne przez serwer WWW GitLab pages. Jest to często http://NAMESPACE.GITLABPAGESSERVER/project

Więcej o GitLab tutaj: https://docs.gitlab.com/ce/user/project/pages/index.html

4. Dołącz odznaki w README.md

Gdy rurociąg główny jest uruchomiony dla projektu, pliki znaczków są publikowane na stronach GitLab, a następnie mogą być odwołane z projektu README.md.

Dlaczego to może nie ma sensu

Rozumiem, dlaczego zadajesz to pytanie, ale chciałbym wyjaśnić, dlaczego nie chcesz tego robić.

Rurociągi GitLab uruchamiają się na każdym popchnięciu do projektu - na każdej gałęzi. Zazwyczaj będziesz chciał wygenerować znaczniki dla pliku README tylko z gałęzi master (lub gałęzi release) , więc ograniczysz krok pages tylko do działania master@group/project.

Należy również wziąć pod uwagę, że rurociąg zwykle będzie skonfigurowany tak, aby zatrzymaj się, gdy błąd pracy. Oznaczałoby to, że jeśli zadanie głównego potoku nie powiedzie się, znaczniki dla tego potoku nie zostaną wygenerowane, a zatem nie będą pomocne w określeniu, które zadanie się nie powiedzie.

Najlepszym miejscem do uzyskania natychmiastowej informacji zwrotnej jest widok potoku i możesz dodać odznakę sukcesu potoku do readme z linkiem do potoku, zwykle coś w rodzaju https://gitlabserver/namespace/project/badges/branch/build.svg

Jeśli nadal chcesz skorzystać z podejścia, które opisałeś, to moja sugestia należy ustawić każdy etap rurociągu na Zezwalaj na awarię. Umożliwiłoby to uruchomienie całego potoku, pomimo niepowodzeń w każdym zadaniu, a odznaki nadal powinny być generowane i publikowane na stronach.

 21
Author: JGC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-17 03:52:58

Możesz postępować zgodnie z instrukcjami JGC, ale zamiast umieszczać plakietkę w publicznym katalogu strony Gitlab, możesz bezpośrednio połączyć się z najnowszym artefaktem kompilacji.

Na przykład poniższy adres URL łączy się z plakietką pylint utworzoną za pomocą anybadge i przesłaną jako artefakt.

Https://gitlabserver/namespace/project/-/jobs/artifacts/master/raw/public/pylint.svg?job=test

 13
Author: jcgiret,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-11 17:20:42

Opracowałem rozwiązanie obejścia problemu w czasie rzeczywistym. Można go łatwo zmienić w cokolwiek innego.

Przykład repo: ci-test / badges. Jest też kompletny przegląd, więc nie będę go kopiować i wklejać tutaj.

Podstawową ideą jest (zakładając, że jesteś teraz w pracy CI):

  • Pobierz odznakę z sieci do pliku.
  • Prześlij plik badge do jakiegoś magazynu w czasie rzeczywistym, z którego można go połączyć (np. Dropbox).

Dropbox obsługuje wywołanie jego API za pomocą żądań HTTP(zobacz this ). Wszystko to można więc zrobić np. za pomocą curl lub Python requests-podstawowych narzędzi. Wystarczy przekazać token dostępu Dropbox jako tajną zmienną i zapisać plik pod tą samą nazwą, aby zastąpić starą plakietkę.

Następnie możesz bezpośrednio połączyć plakietkę Dropbox w dowolnym miejscu. Jest kilka sztuczek, więc sprawdź mój przykład repo, jeśli chcesz go użyć. Dla mnie działa całkiem dobrze i wydaje się Bądź szybki.

Zaletą tej metody jest to, że nie musisz zadzierać ze stronami GitLab. Zamiast publikowania na stronach umieszczasz go w Dropbox. Jest to prosty transfer plików wywoływany przez żądanie HTTP. Koniec z tym.

 4
Author: kubouch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-19 11:03:14

Wolę używać tymczasowej gałęzi do przechowywania odznak między różnymi Ci-jobami.

Możesz znaleźć szczegółowy przykład projektu, który pokazuje, jak używać odznak dla każdego zadania przy użyciu tymczasowej gałęzi z GitLab tutaj: https://gitlab.version.fz-juelich.de/vis/jusense-cicd

I jego dokumentacja tutaj: https://gitlab.version.fz-juelich.de/vis/jusense-cicd/wikis/Continuous-Integration-and-Delivery

Ale, niezależnie od strategii wolisz, niestandardowe odznaki są do teraz nie jest poprawnie obsługiwane w GitLab. Sprawdź ten problem, Aby uzyskać więcej informacji: stworzyliśmy problem w GitLab z tego powodu: https://gitlab.com/gitlab-org/gitlab-ce/issues/50603

 3
Author: j.goebbert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-04 07:53:11