CérénIT

Le blog tech de Nicolas Steinmetz (Time Series, IoT, Web, Ops, Data)

Web, Ops, IoT et Time Series - Février 2024

dnsavifjpegpostgresgitconventional commitarchitectureamnesiepwaiosrefactorgit-cliffchangelogtraefik

Code

  • The power of conventional commits : je suis assez fan de Gitmoji + Conventional Commits pour avoir des messages de comits visuels et pertinents. Si la mise en oeuvre est parfois pas très naturel, le plaisir d'avoir un changelog autogénéré et propre ou bien de pouvoir facilement retrouver un commit, son intention et le ticket gitlab associé, cela n'a pas de prix.
  • En liaison avec le billet précédent, le générateur de changelog Git-cliff est sorti en version 2.0 avec notamment une intégration plus poussée avec Github, des templates et plein d'autres choses. Git-cliff depuis la version 1.4 peut aussi générer votre prochain numéro de version sur la base de vos commits et la commande bump
  • Postgres à nouveau élu SGBD de l'année en 2023, mais je suis inquiet: le cloud et les ORM notamment ont permis de s'affranchir des DBA. Si dans un sens c'est tant mieux, à un certain stade, cela s'avère nécessaire de recourir à l'expertise d'un DBA (même si c'est parfois trop tard). Reste que le problème fondamental est plutôt que les développeurs n'ont plus les fondamentaux en SQL dans ce cas particulier et en architecure logicielle de manière plus globale et c'est peut être surtout ça le vrai problème.
  • The continuous amnesia issue : notre industrie est malade, on souffre d'une amnésie continue en ignorant les enseignements du passé. Le "jeunisme", "la hype" et le fait qu'au delà de 30 ans, il faut être passé du coté du management font qu'on ne valorise/capitalise pas assez sur ce que nos ainés ont fait.
  • The High-Risk Refactoring : l'amémioration / la réécriture de code a son lot inhérent de risques techniques et métiers. L'article permet d'appréhener et de cadrer cette décision de façon assez pragmatique pour arriver au niveau de code juste nécessaire.

DNS

  • L’ICANN propose le domaine .internal pour votre réseau local : historiquement, il y avait le .local mais dont l'usage a été revu pour du zeroconf notamment. L'usage du .internal est en cours de discussion pour une décision en avril. On va pouvoir (enfin) sortir des domaines fictifs, des domaines publics utilisés en interne (adieu macompany.org) ou encore du "DNS menteur" (macompany.com résolu différemment suivant si on est en interne ou en externe). Néanmoins, une bonne question émerge : comment gérer et garantir les certificats en .internal que tout le monde peut revendiquer ? Aucune entité de certification publique ne pourra émettre de tels certificats... Cela repose alors la question de la PKI privée et de la diffusion des certificats de la CA pour valider les domaines sur votre parc informatique...

OPS

  • Traefik Proxy v2.11 is Now Available! Here are the Latest Updates. : Cette version apporte notamment les directives keepAliveMaxRequests et keepAliveMaxTime pour éviter que trop de connections ouvertes restent entre votre reverse proxy et votre applicatif.
  • Announcing Traefik Proxy v3.0 RC1: Au programme: Wasm, OpenTelemetry, HTTP/3, SPIFFE et des choses dans le monde Kubernetes. Alors que la migration V1/V2 avait été un peu pénible, l'équipe de Traefik promet une migration en douceur entre V2/V3.

Web

Git: hook commit-msg pour adopter les conventional commits

gitcommitconventional commit

Les "conventional commits" apportent une formalisation des messages de commit git. Ils sont de la forme :

<type>[optional scope]: <description>

[optional body]

[optional footer(s)]

Pour reprendre quelques exemples :

# Commit message with no body
feat: allow provided config object to extend other configs

# Commit message with scope
feat(lang): add polish language

# Commit message with ! to draw attention to breaking change
refactor!: drop support for Node 6

# Commit message with both ! and BREAKING CHANGE footer
refactor!: drop support for Node 6

BREAKING CHANGE: refactor to use JavaScript features not available in Node 6.

En forçant ce formalisme, le développeur est un peu moins tenté d'avoir un historique de commit du style :

fix  button
typo
add some tests
add some tests
...

Au lieu de faire un commit à chaque sauvegarde du fichier ou presque, il va commencer à "raconter une histoire" :

fix: button on home page does not work on IE6
docs: typo in the README file
feat: add some tests for module XXX

Cela a le mérite aussi de générer un changelog plus agréable à lire. Si en plus, on rajoute par ex un identifiant de ticket, on peut alors facilement retracer l'historique d'un changement et sa raison d'être :

fix(123): button on home page does not work on IE6
docs(211): typo in the README file
feat(175): add some tests for module XXX

Un peu à la manière de "Properly managing your .gitignore file", on peut vouloir que le hook git s'applique à tous nos dépôts présents et à venir et ne pas avoir à contribuer le hook à chaque dépôt git.

# Create ~/.git-templates/hooks
mkdir -p ~/.git-templates/hooks
# Create commit-msg file and make it executable
touch ~/.git-templates/hooks/commit-msg
chmod +x ~/.git-templates/hooks/commit-msg

Ajoutons ensuite notre hooks dans ~/.git-templates/hooks/commit-msg :

#!/usr/bin/env python3
# Original source: https://github.com/prahladyeri/enforce-git-message/
# Extended with BREAKING CHANGE, exclamation mark support (!) and space before " : " for French people

import re, sys, os

examples = """+ 61c8ca9 fix: navbar not responsive on mobile
+ 479c48b test: prepared test cases for user authentication
+ a992020 chore: moved to semantic versioning
+ b818120 fix: button click even handler firing twice
+ c6e9a97 fix: login page css
+ dfdc715 feat(auth): added social login using twitter
+ b235677 BREAKING CHANGE: remove support for XXX
+ a234556 revert!: back to version X.Y.Z for component ZZZ
+ b123456 feat : we support space before : for French people :-)
"""

def main():
    pattern = r'(build|chore|ci|docs|feat|fix|perf|refactor|revert|style|test|BREAKING CHANGE)(\([\w\-\s]+\))?!?\s?:\s.*'
    filename = sys.argv[1]
    ss = open(filename, 'r').read()
    m = re.match(pattern, ss)
    if m == None:
        print("\nCOMMIT FAILED!")
        print("\nPlease enter commit message in the conventional format and try to commit again. Examples:")
        print("\n" + examples)
        sys.exit(1)

if __name__ == "__main__":
    main()

Il faut ensuite indiquer à git que vos templates sont dans ce dossier :

git config --global init.templatedir '~/.git-templates'

Pour les dépots git existants, il faut réinitialiser votre dépôt git :

cd /path/to/git/repo
git init
Dépôt Git existant réinitialisé dans /path/to/git/repo/.git/

Vous pouvez alors commencer à travailler dans votre repo et valider le bon fonctionnement du hook.

1 / 1