Mise en place de CI (continuous integration)

Bonjour,

Je commence à tester et mettre en place des CI,

  • d’abord sur le groupe spip-league,
  • puis viendra le groupe spip.

Explications

Ces CI restent simples dans un premier temps et concernent le code PHP.
On les applique sur la branche principale & les PR (ça se règle dans un fichier .gitlab-ci.yml tout ça). Elles vérifient

  • que le code PHP est valide (lint),
  • que le dépot peut se construire (composer install),
  • qu’il n’a pas de faille de sécu connu sur les libs composer déployées (composer audit)
  • que le code est bien formaté (coding standard)
  • que les tests unitaires s’exécutent sans erreur (phpunit)
  • que le code source est bien testé partout (code coverage avec phpunit)
  • qu’il n’y a pas d’erreur d’analyse statique (avec phpstan)

Et c’est déjà pas mal pour un début.

Et pour ce début, donc on essaie de viser assez haut pour ce qui est déplacé ou créé dans spip-league

  • level max de phpstan si possible,
  • code coverage proche de 100% pour les tests

Mais on ne pourra pas faire tout cela pour ce qui est dans spip/* parce que legacy, tout ça, tout ça…

Toujours est-il que du coup, lorsqu’une PR arrive, il y aura un «pipeline» qui s’exécute, avec différentes taches à effectuer, et cela va afficher des petites pastilles vertes ou rouges : et quand c’est rouge, devinez quoi : c’est que quelque chose est à corriger !

Exemple:

Détail du pipeline:

Là on voit que PHPStan retourne une erreur sur le code (qui n’est pas dans son fichier de baseline : c’est à dire que c’est une nouvelle erreur donc), soit il faut la corriger (le mieux si possible), soit l’ajouter à sa baseline.

Il y a des rapports générés (au format json) que comprends Gitlab, et qui peuvent aussi être téléchargés.

Test unitaires

Et justement pour les «test unitaires», il faudra pour spip/ecrire/tests qui contient différents jeux de tests de l’application SPIP et pour certains plugins-dist adapter cela : actuellement une partie voire la plupart sont plus des «tests fonctionnels» que des tests unitaires : ils ont besoin que l’application SPIP soit fonctionnelle (base de données déployée avec du contenu, config/ présente), et ce ne sont donc pas a proprement parler des tests unitaires (qui ne nécessitent que le dépôt git et le vendor/ associé pour fonctionner). Certains tests pourront certainement être transformés, mais pas tous…

Tout cela pour dire que la CI sur spip/ecrire n’exécutera pas ses tests phpunit dans un premier temps.

Optimisations

Les CI peuvent être optimisés de différentes manières : la plus simple étant de ne pas faire exécuter certains jobs si le job précédent a échoué.

Dans .gitlab-ci.yml · main · spip-league / cache · GitLab par exemple il y a plusieurs termes pour cela :

job:test:php-8.2:
  stage: test
  needs:
    - job:test:php-latest
  when: on_success
  • when: on_success : le job n’est pas exécuté si le « stage » (l’étape) précédent a échoué (les stage étant déclaré tout en haut du fichier)
  • needs: ... : le job n’est pas exécuté si le job indiqué a échoué

L’idée c’est d’éviter de lancer des jobs si certaines étapes échouent.

On pourra aller plus loin également (c’est ce que voulais faire James et il avait commencé comme cela) en fournissant une image docker toute prête, avec les outils qu’il faut pour analyser dedans, et donc au lieu de mettre image: php:lastest et de compléter l’image dans before-script: avec ce qui nous manque, il y aurait une image existante directement à télécharger, ce qui serait un peu plus rapide et efficace pour les CI, mais nécessite donc de maintenir une image docker spécifique à côté aussi. Bref, on n’en est pas là non plus.

Recherche de Runners

C’est bien joli tout ça, mais il faut des machines derrière !

Les CI nécessitent des « Runners », déclarés à notre Gitlab : en gros des ordinateurs ou serveurs qui ont installé et configuré un « Gitlab Runner » (de type docker), et exécutent des taches (job) à la demande, lorsque ces machines sont allumées.

Actuellement on a déclaré 2 machines locales (pas des serveurs), donc qui ne sont pas tout le temps allumés. La machine contenant le Gitlab (git.spip.net) ne peut pas être utilisée à cela (c’est fortement déconseillé de mettre les runners dessus).

Donc : si qqn·e de la communauté veut proposer un serveur, ou une machine locale même, ça sera certainement bienvenu car la charge des CI peut vite devenir importante.

Voilou pour ce petit résumé.

4 « J'aime »

Ciao

Je ne suis pas sur d’avoir tout compris mais juste pour dire c’est bien si ce point avance.

Merci. C’est chouette tout cela.

Pour la machine runner, moi je veux bien si on me fournit un tuto simple à appliquer. Mon ordi est pas allumé tout le temps, mais enfin je passe pas mal de temos dessus quand meme.

Merci beaucoup !

Je laisse la machinerie se rôder, mais avoir l’équivalent pour le JS à moyen terme serait pas mal .
(Notamment pour déléguer tous les commits de build, … et puis ça motivera à écrire davantage de tests…)

1 « J'aime »

paye tes package.json :wink:

Claro ! Merci pour tout ça :slight_smile:

Je ne sais pas si ça te semble assez simple, mais la doc « de base » est par ici Install GitLab Runner | GitLab :slight_smile:

1 « J'aime »

Encore une fois, merci d’avoir pris le temps d’expliquer tout ça pour qu’on puisse suivre les évolutions :grinning:

J’ai survolé la doc pour ces histoires de runners mais j’ai pas tout saisi, notamment comment on récupère les infos de config du runner (token, job tags… ?) et si c’est un truc qui se fait automatiquement ou si on doit les lancer manuellement. Aussi, pas besoin de Docker ?

1 « J'aime »

Bonsoir,

Je peux mettre cela en place via l’image docker https://registry.hub.docker.com/r/gitlab/gitlab-runner

Dispo si besoin

Merci @marcimat pour ces explications et ces avancées.

La machinerie semble de plus en plus complexe, espérons qu’il y aura toujours des gens pour maintenir tout ça…
Et est ce qu’il est prévu de documenter ces aspects là ?

Je vais essayer de voir si je peux mettre en place un runner sur mon serveur dédié chez AD (sans docker, et sur lequel je ne suis pas root). Il y a de la ressource dispo (Cpu / Ram).
Si c’est une machine locale, est ce qu’elle a besoin d’être 100% du temps online ?

J’ai installé un gitlab-runner en local, mais il me demande un registration token de https://git.spip.net

Où est ce que je le trouve / le génère ?

[Edit] Ok, vu. J’ai créé un runner depuis l’admin Gitlab, ça a généré un token, j’ai donc configuré le mien localement avec un executor « shell », et je l’ai lancé, il apparaît bien dans la liste et il semble online.

Je m’étonne juste de ne rien avoir eu à configurer au niveau réseau (j’ai une livebox Orange Pro). Mais c’est donc très simple à faire.

Reste à s’assurer que le runner se relance bien au reboot.

[Edit 2] Pour l’executor, il y a plusieurs choix mais il faut utiliser docker, et pas shell, qui est moins sécurisé et ne peut pas fonctionner de toute façon.
Précision : docker en mode non privilégié (non root)

Il faut éviter l’exécuteur shell de préférence pour des questions de sécu : il vaut mieux préférer l’exécuteur docker de ce que j’ai compris (Security for self-managed runners | GitLab)

Je n’ai rien eu à faire de spécifique non plus à part installer le gitlab-runner donc et suivre la configuration, avec un executor docker (sous macos).

@pierretux on pourra le faire à l’occasion si tu veux (c’est une configuration des deux côtés, donc il te faut un admin du gitlab en même temps)

C’est une excellente remarque et question.

Sur la machinerie

La machinerie semble de plus en plus complexe

Notamment James (et moi-même) aurions préféré aller sur Github (Mini CR d’une rencontre en juillet 2023) pour se décharger d’une grande part de la gestion de cette machinerie justement.

Le choix d’une instance Gitlab a été assumée, ou imposée dirons certain·es, qui améliore pas mal de points, mais ça oblige tout de même à maintenir des outils tierces, et donc prendre du temps pour ça, au détriment d’autres sujets aussi.

Alors oui, il y a la mise en place de

  • spip/composer (un dépot Composer avec Satis — sur la machine spip.net)
  • SPIP Flex recipes (en dev, un dépot de recettes Symfony Flex — sur la machine spip.net)
  • https://hub.docker.com/r/spip/tools (en dev, une image docker pour les CI, qui pourrait peut être être mise dans le Gitlab qui peut aussi gérer des images docker* avec une configuration spécifique…)
  • ou ou des Runners pour les CI… ce n’est pas très sorcier en fait (juste on n’en aurait pas eu besoin sur Github non plus)
  • peut être d’autres choses auxquelles qui ne me reviennent pas là ?

*) mais je suppose que James préfèrerait également que ça reste sur le Docker hub… c’est comme pour Packagist en fait : gérer un Satis en plus comme on fait, c’est toujours de la gestion / maintenance en plus (en plus de compliquer le composer.json pour déclarer ce dépôt)

Alors la documentation de tout ça…

On essaie d’avoir une doc à jour dans les dépots Git avec les Readme, mais oui tout n’est pas documenté certainement.

Peut être que tu parles là d’une doc pour le fichier gitlab-ci.yml ? peut être qu’il y aura cela… mais du copier / coller / test c’est pas si mal non plus… et le fichier n’est pas si compliqué que ça à comprendre pour le moment en tout cas.

Sur les humain·es

espérons qu’il y aura toujours des gens pour maintenir tout ça…

Gérer ces outils & documenter ces sujets, ça repose un peu sur les mêmes petites personnes effectivement, qui aimeraient d’ailleurs aussi s’amuser à faire d’autres choses que de la maintenance, de la doc, et garder un peu de bonne humeur :partying_face:, bah c’est pas si simple !

Clairement

  • peu de personnes ont du temps (libre) à consacrer au logiciel, déjà de base,
  • et encore moins au cœur de SPIP
  • peu soutiennent l’évolution de son code et préfèreraient une forme de statut-quo
  • des questions d’architecture du code plus qualitatif (clean, solid, tdd, ddd, cqrs, hexagonal, tous ces trucs barbares quoi…) ne sont pas abordées, et perçues comme techniciennes / prises de tête / de dev / d’ingénieur·e ,
  • => la simplicité d’usage de SPIP pour des non technicien·nes (amha on peut déjà questionner un peu ce point) cache un code sous le capot, qui a 20 ans d’ajouts successifs (c’est assez gros & intriqué), qui n’est lui pas du tout simple à appréhender, et quasi incompréhensible par toute personne extérieure car rien n’est dans les standards de «patterns» et terminologies utilisées actuellement en programmation (ce qui n’aide pas les IDE non plus),
  • les gens qui connaissent bien le cœur de SPIP et son fonctionnement global, s’en vont, ou sont bien moins actifs, au fur et à mesure des années,
  • ou ne sont pas trop intéressés par un refactoring ambitieux : et je comprends aussi, le «tant que ça marche».

Et oui ça me questionne aussi. J’ai aussi des hauts et surtout pas mal de bas sur ma motivation. Là c’est l’hiver, en général, je suis plus à l’intérieur avec un peu plus de temps pour faire des trucs d’ordi… mais se motiver à passer du temps libre là dessus, alors que beaucoup de chose porte à faire baisser les bras (que ce soit l’intrication du code qui rend les transformations difficiles, la résistance au changement dans la communauté, l’état du monde extérieur politique, social, environnemental), c’est pas si évident…

Imaginer que c’était plus simple avant, je n’en suis pas très sûr non plus. Ce n’était pas la même dynamique et contexte avant non plus.


Bref… après la mini-joie de mise en place de CI, il faudrait que je mette à jour les outils de release que je procrastine depuis plus d’un mois pour gérer les quelques changements introduits en 4.4 et 5.0… Et ça me fatigue d’avance… Tu vois, je préfère même encore faire un long mail ici, qui n’apporte pas grand chose de neuf au final, et peu de réponses !

Bref, des :purple_heart: à toustes quand même :slight_smile:

9 « J'aime »

ok quand tu veux ou quand il faut, je peux en faire plusieurs si besoin qui tourne h24 ou à définir

1 « J'aime »

Merci pour ce retour détaillé.

Et oui, ce long mail apporte beaucoup, parce que il y a une machinerie et de la technique, mais derrière (ou devant ?) tout ça il y a surtout de l’humain.

Du temps, j’en ai, un peu, et j’essaie de contribuer sur des sujets à mon niveau, mais je suis clairement dépassé par toute cette refonte et les outils qui tournent autour.
J’arrive tout juste à comprendre (et souvent juste dans les grandes lignes), grâce à tes explications régulières.
Je ne suis plus très utile donc, en tout cas pas sur ce travail là.

La résistance au changement, je plaide coupable. Mais depuis quelques temps je comprends mieux les avancées concrètes grâce à tes explications ici, je me rends mieux compte du travail énorme entrepris, et je le soutiens.
Et oui, communiquer c’est important, ça prend du temps mais c’est indispensable pour accompagner le changement justement. Sinon, c’est la porte ouverte à toutes les interprétations et suppositions.

Des :purple_heart: à toustes aussi, et 2025, ça rime avec SPIP 5 :wink:

5 « J'aime »

@marcimat , je viens d’ajouter un runner sur un serveur de test

Merci pour tout !!

Hello,

Avec l’aide de Marcimat (désolé pour les nombreux tests) j’ai un serveur qui tourne H24 pour un runner et possibilité d’en rajouter si besoin.

Donc actuellement, nous avons 3 serveur + 3 local qui tourne.