Git: Renommer en bloc des fichiers avec expression régulière

Dans cet article, je vais expliquer comment renommer en bloc des fichiers sous Git à partir d’une expression régulière. Récemment j’ai eu besoin de changer plusieurs fichiers de la forme YYYYMMDD.pdf vers YYYY-MM-DD.pdf, donc ajouter des tirets pour séparer les éléments d’une date.

Mon premier réflexe a été d’utiliser PowerRename qui fait partie des utilitaires de Microsoft PowerToys. Pour ceux qui ne connaissent pas, c’est un des projets à code source ouvert de Microsoft qui est disponible sur GitHub.

PowerRename avec expressions régulières
PowerRename avec expressions régulières

Le renommage des fichiers a fonctionné parfaitement, malheureusement Git n’est pas capable de reconnaitre les nouveaux fichiers comme étant les anciens qui sont renommés. Cela veut donc dire que l’historique serait complètement perdu. Il fallait que je trouve une autre solution.

Ma chasse à la commande magique venait de commencer. Comme tout bon développeur, j’ai passé pas mal de temps sur Stack Overflow. Je n’ai pas réussi à trouver exactement ce que je cherchais. Par contre, j’ai trouvé assez d’informations pour créer mon propre script:

#!/bin/sh
in_regex='^([0-9]{4})([0-9]{2})([0-9]{2})\.pdf$'
out_match='\1-\2-\3.pdf'

for file in $(git ls-files | grep -E $in_regex); do
    newname=`echo "$file" | sed -E "s/$in_regex/$out_match/"`
    git mv --verbose $file $newname
done

Je me suis servi de regular expressions 101 pour tester mon expression régulière à la ligne 2. Il est a noter que je me sers de l’option -E pour grep et sed dans le but d’utiliser les expressions régulières étendues. Le renommage est effectué par la commande git mv. N’oubliez pas de soumettre vos changements une fois le renommage complété.

Relâche scolaire 2021

C’est maintenant la semaine de relâche scolaire, donc toute la famille est en congé. Malheureusement, on est encore en plein milieu de la pandémie de COVID-19. On est donc un peu limités par nos activités. Heureusement, les jeux vidéos sont là pour nous divertir.

Il y a deux jours, nous avons recommencé le jeu Scribblenauts Unlimited sur Wii U à partir du début. Nous avons facilement terminé le jeu en utilisant notre créativité. J’ai appris que l’on pouvait se servir d’un « veuf vénéneux » pour faire une potion magique.

Je termine avec cette capture d’écran effectuée avec UsendMii qui nous montre Maxwell avec sa sœur Lily à la toute fin du jeu.

Scribblenauts Unlimited : Maxwell et Lily
Scribblenauts Unlimited : Maxwell et Lily

Piskel

Piskel est un éditeur en ligne gratuit pour créer des sprites animés et du pixel art. Je trouve que c’est déjà fantastique de pouvoir créer des animations dans un navigateur web, mais en plus le code source est disponible sur GitHub. L’application peut être utilisée à partir de cet URL : https://www.piskelapp.com

Dans notre famille, on l’utilise de façon périodique pour s’amuser, souvent pendant les vacances des enfants.

Voici des créations de mon fils au début de la pandémie pendant que les écoles étaient fermées :

L’explosion
Coronavirus

Voici une autre de ses créations pendant les vacances de Noël. Ici c’est du vrai pixel art car l’image originale est de 50×50 pixels :

Cochons

Ma seule création datant de 2018 pendant mes vacances d’été :

Skateboard

GitVersion dans Jenkins sous Linux

Dans un article précédent, j’avais expliqué comment utiliser GitVersion dans Jenkins sous Windows. Celui-ci traitera du même sujet, sauf que cette fois ci c’est sur Linux que l’application fonctionnera.

Je rappelle que GitVersion est une application qui sert à la génération de version automatique à partir d’un dépôt Git. Jenkins est un outil d’intégration continue programmé en Java. Ces deux projets à code source ouvert sont tous deux hébergés sur GitHub.

Pour se simplifier la vie, nous allons utiliser un conteneur Docker Linux pour démarrer l’application GitVersion. Toutes les propriétés de GitVersion serviront à générer des variables d’environnement. Ces variables pourront par la suite être utilisées à n’importe quel endroit dans le fichier Jenkinsfile:

stage('Version') {
	agent {
		docker {
			image 'gittools/gitversion:4.0.1-linux-debian-netcoreapp2.1'
			args '--entrypoint=\'\''
		}
	}
	steps {
		// Génération du fichier gitversion.properties
		sh 'dotnet /app/GitVersion.dll /output buildserver'
		// Enregistrement des variables d'environnement du fichier gitversion.properties
		script {
			readFile('gitversion.properties').split("\n").each { line ->
				el = line.split("=")
				env."${el[0]}" = (el.size() > 1) ? "${el[1]}" : ""
			}
		}
	}
}

Maintenant que vous avez ces informations de version, vous pouvez les utiliser pour générer la version de votre logiciel automatiquement.

Démarrer Code en mode WSL

J’adore l’IDE Visual Studio Code pour plusieurs raisons. Une de celles-ci est l’utilisation du Terminal bash qui nous permet d’utiliser des lignes de commande Linux à l’aide de Windows Subsystem for Linux (WSL). Comme si ce n’était pas déjà assez, une nouvelle extension permet dorénavant de démarrer complètement l’IDE dans l’environnement WSL. Il est donc possible de démarrer des tâches et de déboguer des applications directement sous Linux dans Windows.

Pour utiliser cette fonctionnalité, il faut démarrer Code et cliquer sur le bouton vert dans le coin en bas à gauche. Par la suite, vous choisissez de redémarrer le dossier en mode WSL. Vous devriez voir que le bouton d’accès rapide indique maintenant WSL et la distribution de Linux, si vous en avez plusieurs.

Visual Studio Code en mode WSL

Ouvrir l’IDE deux fois me semble une perte de temps, étant donné que la manière dont je préfère l’ouvrir est par le menu contextuel dans le dossier de mon projet. J’ai décidé d’ajouter un item supplémentaire pour me faciliter la vie.

Menu contextuel avec l’item supplémentaire

Pour faire cela il suffit d’éditer le registre de Windows. Pour simplifier les choses, voici le contenu du fichier .reg que j’utilise.

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\Background\shell\VSCodeWSL]
@="Open with Code WSL"
"Icon"="C:\\Program Files\\Microsoft VS Code\\Code.exe"

[HKEY_CLASSES_ROOT\Directory\Background\shell\VSCodeWSL\command]
@="wsl.exe Code ."

Il suffit de créer un fichier avec l’extension .reg qui contient cette information, de le sauvegarder et de faire un double-clic dessus. Ceci devrait rendre disponible la nouvelle fonctionnalité. La commande wsl.exe et l’application Code.exe doivent être dans votre path pour que ceci fonctionne.

Lorsque l’item est sélectionné dans le menu, une fenêtre de terminal devrait apparaitre brièvement avant de démarrer Code.

Reverse proxy et Jenkins

Jenkins est un outil d’intégration continue que j’utilise sur un serveur Windows pour gérer mes projets sous git. L’application programmée en Java possède une interface web très intuitive. Pour l’utiliser à partir d’un site web commercial (.com) j’ai dû configurer IIS avec un reverse proxy. Jenkins est accessible par TLS grâce à Let’s Encrypt. Cette configuration semble parfaite, sauf que j’ai un petit problème. Lorsque j’accède à la section Manage Jenkins, un message d’erreur est affiché.

It appears that your reverse proxy set up is broken.
Avertissement à propos du reverse proxy dans Jenkins

Plusieurs guides existent en ligne pour corriger ce problème, mais aucun n’a fonctionné complètement avec mon environnement. Après avoir regardé des instructions pour Apache et Nginx j’ai compris qu’il fallait modifier les en-tête HTTP suivantes: X-Forwarded-Proto, X-Forwarded-Port et X-Forwarded-Host.

J’ai essayer de les ajouter comme Server Variables dans les règles de mon site web sur IIS, mais cela n’a pas fonctionné. En lisant la documentation de Microsoft j’ai réalisé que les variables devaient être en majuscule, que les tirets devaient être remplacés par des traits de soulignement et que le préfixe « HTTP_ » était nécessaire. Donc, voici ce que j’ai ajouté comme valeurs de remplacement:

  • HTTP_X_FORWARDED_PROTO = https
  • HTTP_X_FORWARDED_PORT = 443
  • HTTP_X_FORWARDED_HOST = {HTTP_HOST}

Résultat dans IIS:

IIS Inbound Rule for Jenkins
Capture d’écran des règles pour Jenkins dans IIS

Après avoir enregistré les changements, j’ai actualisé la page de gestion sur Jenkins et l’erreur est disparue.

Utiliser GitVersion dans Jenkins

GitVersion est une application pour Windows codée en C# qui sert à la génération de version automatique à partir d’un dépôt Git. Jenkins est un outil d’intégration continue programmé en Java. Ces deux projets à code source ouvert sont tous deux hébergés sur GitHub. Cet article expliquera comment utiliser GitVersion dans Jenkins et ça, sans l’utilisation de plugin supplémentaires.

L’utilisation de GitVersion sera faite à l’intérieur d’un fichier Jenkinsfile qui est utilisé par des projets de type Pipeline. Dans mon premier exemple, le paramètre showvariable sera donné à GitVersion pour aller chercher une variable spécifique. Ce n’est pas très efficace si l’on a besoin d’aller chercher plusieurs variables. Par contre, c’est assez simple. Voici un bout code qui sert à changer la description du build:

steps {
    script {
        def FullSemver = bat returnStdout: true, script: '@"GitVersion.exe" /showvariable FullSemver'
        currentBuild.description = "v${FullSemver}"
    }
}

Comme mentionné plus tôt, cette technique manque de flexibilité. Dans le prochain exemple, toutes les propriétés de GitVersion serviront à générer des variables d’environnement. Ces variables pourront par la suite être utilisées à n’importe quel endroit dans le fichier. L’inconvénient est que c’est un peu plus long:

steps {
    // Génération du fichier gitversion.properties
    bat '@"GitVersion.exe" /output buildserver'
    // Enregistrement des variables d'environnement du fichier gitversion.properties
    script {
        readFile('gitversion.properties').split("\r\n").each { line ->
            el = line.split("=")
            env."${el[0]}" = (el.size() > 1) ? "${el[1]}" : ""
        }
    }
    bat '''
        @echo Quelques variables d’environnement:
        @echo %GitVersion_SemVer%
        @echo %GitVersion_BranchName%
        @echo %GitVersion_AssemblySemVer%
        @echo %GitVersion_MajorMinorPatch%
        @echo %GitVersion_Sha%
    '''
}

Voici un exemple de fichier gitversion.properties généré avec la version 4.0.0-beta.14 de GitVersion:

GitVersion_Major=1
GitVersion_Minor=0
GitVersion_Patch=1
GitVersion_PreReleaseTag=
GitVersion_PreReleaseTagWithDash=
GitVersion_PreReleaseLabel=
GitVersion_PreReleaseNumber=
GitVersion_BuildMetaData=1
GitVersion_BuildMetaDataPadded=0001
GitVersion_FullBuildMetaData=1.Branch.master.Sha.3af072d1cd7e121e9723381a95bce0bf3809663b
GitVersion_MajorMinorPatch=1.0.1
GitVersion_SemVer=1.0.1
GitVersion_LegacySemVer=1.0.1
GitVersion_LegacySemVerPadded=1.0.1
GitVersion_AssemblySemVer=1.0.1.0
GitVersion_AssemblySemFileVer=1.0.1.0
GitVersion_FullSemVer=1.0.1+1
GitVersion_InformationalVersion=1.0.1+1.Branch.master.Sha.3af072d1cd7e121e9723381a95bce0bf3809663b
GitVersion_BranchName=master
GitVersion_Sha=3af072d1cd7e121e9723381a95bce0bf3809663b
GitVersion_NuGetVersionV2=1.0.1
GitVersion_NuGetVersion=1.0.1
GitVersion_NuGetPreReleaseTagV2=
GitVersion_NuGetPreReleaseTag=
GitVersion_CommitsSinceVersionSource=1
GitVersion_CommitsSinceVersionSourcePadded=0001
GitVersion_CommitDate=2018-08-29

Avec certain type de projet Jenkins, j’ai dû ajouter un comportement supplémentaire lors de l’opération clone. La version demeurait toujours à 0.1.0 et cela même si des tags existaient. Dans les configurations du projet, dans la section Behaviors il faut ajouter la propriété Advanced clone behaviours. Ensuite, on s’assure que Fetch tags est sélectionné.

Advanced clone behaviours

Cela va faire en sorte que le paramètre --tags sera utilisé lors du fetch.

Maintenant que vous avez ces informations de version, vous pouvez les utiliser pour générer la version de votre logiciel automatiquement. Je me sers de l’application envsubst pour faire des substitutions dans un fichier.

Plaisir coupable

Un de mes plaisirs coupables est de voir un logiciel planter dans un endroit public. Par exemple, un guichet automatique, un téléviseur dans un aéroport, une pompe à essence, etc. Ce samedi par un bel après-midi, voici ce qui a mis un sourire dans mon visage.

Windows problem
Oups, on dirait qu’il y a eu un problème…

Je crois que le message complet est celui-ci:

A problem has been detected and Windows has been shut down to prevent damage to your computer.

The Windows Driver Framework has detected that a violation has occurred.

Utiliser GitBucket comme un service Windows

Dans un article précédent, j’avais expliqué comment utiliser Gogs comme un service Windows. Celui-ci sera similaire, à l’exception que ce sera l’application GitBucket.

GitBucket est une solution Git auto-hébergée codée en Scala. Ce projet à code source ouvert hébergé sur GitHub a beaucoup de qualité, entre autres, sa compatibilité avec l’API GitHub et sa facilité d’installation. Maintenant, il est temps de parler de l’un de ses défauts: il ne peut pas être installé nativement comme service Windows.

Tout comme avec Gogs, c’est l’application NSSM qui sera utilisée. Il faut s’assurer qu’elle a été installée dans votre %PATH%. Par exemple, le fichier nssm.exe peut être copié dans le dossier C:\WINDOWS\system32.

Ensuite, on ouvre une fenêtre de terminal et on tape toutes ces commandes:

set warpath=C:\GitBucket
set datapath=C:\GitBucket\data
nssm install gitbucket "%PROGRAMFILES%\Java\jre1.8.0_152\bin\java.exe"
nssm set gitbucket AppDirectory "%warpath%"
nssm set gitbucket AppParameters "-jar gitbucket.war --gitbucket.home=\"%datapath%\" --port=8080"
nssm set gitbucket DisplayName "GitBucket Service"
nssm set gitbucket Description "A Git platform with easy installation, high extensibility & GitHub API compatibility."
nssm set gitbucket Start SERVICE_DELAYED_AUTO_START
nssm set gitbucket AppStdout "%datapath%\nssm.log"
nssm set gitbucket AppStderr "%datapath%\nssm.log"
nssm set gitbucket AppRotateFiles 1
nssm set gitbucket AppRotateBytes 1000000
nssm start gitbucket

Il est important de changer la ligne 1 pour y inscrire le chemin vers le fichier gitbucket.war. La ligne 2 doit pointer vers le dossier où les données seront enregistrées. GitBucket nécessite d’être démarré par Java.exe, donc la ligne 3 doit être le chemin vers ce fichier. La ligne 5 spécifie le port que vous voulez utiliser. Changez-le pour utiliser un port disponible. La dernière ligne va démarrer le service, donc ouvrez un navigateur web et testez que tout fonctionne.

Si vous désirez supprimer le service, c’est cette commande qu’il faut utiliser:

nssm remove gitbucket

Pour éditer un service déjà installé avec l’interface, on utilise cette commande:

nssm edit gitbucket

Désactivé TLS 1.0 sur Windows Server

Selon le PCI Security Standards Council il serait recommandé de migrer du protocole Transport Layer Security (TLS) version 1.0 vers une version plus récente et cela pour le 30 juin 2018. Présentement, sur mon site web qui roule sous Windows Server 2012 R2, TLS 1.0 est encore disponible.

Dans un article précédent j’avais expliqué comment augmenter la sécurité d’un site web. Celui-ci sera similaire, sauf qu’au lieu d’aller éditer le registre de Windows directement, le logiciel IIS Crypto sera utilisé. Cela va grandement simplifier la tâche.

Il suffit d’ouvrir l’application et de décocher TLS 1.0 dans la section Protocols:

IIS Crypto 2.0
IIS Crypto 2.0 avec la case à cocher TLS 1.0 vide

Par la suite il faut cliquer sur le bouton Apply et redémarrer le serveur.

Pour vérifier que tout a bien fonctionné, on peut utiliser l’outil SSL Server Test de SSL Labs:

No TLS 1.0
TLS 1.0 n’est plus disponible

Voilà, maintenant votre serveur devrait être plus sécuritaire.