Et voilà, après bien des tests et des sueurs froides à essayer de comprendre comment fonctionne les Github actions (des tâches d’intégration continue) j’ai fini par obtenir ce que je voulais, à savoir que le fichier dcstore.xml soit mis à jour automatiquement sur le dépôt (peu importe la branche) dès que nécessaire, c’est-à-dire lorsque le contenu du fichier _define.php est modifié et poussé sur le dépôt Github.
Voilà l’état du fichier de configuration correspondant :
# This is a basic workflow that is triggered on every release
name: On release workflow
on:
release:
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
# This workflow contains a single job called "dcstore"
dcstore:
# The type of runner that the job will run on
runs-on: ubuntu-latest
# Steps represent a sequence of tasks that will be executed as part of the job
steps:
# Setup PHP
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.0'
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v2
# Run PHP code
- name: Run PHP code
id: getversion
shell: php {0}
run: |
<?php
$version = '';
$dcmin = '2.0';
if (file_exists('dcstore.xml')) {
$df = file_get_contents('./_define.php');
if (preg_match('/registerModule\((.*?),(.*?),(.*?),(.*?)\'(.*?)\'(.*?)(,.*)\)/s',$df,$matches)) {
if (isset($matches[5])) {
$version = $matches[5];
if (isset($matches[7])) {
$str = $matches[7];
if (preg_match('/\[(.*?)\'core\'(.*?),(.*?)\'(.*?)\'(.*?)\]/s',$str,$submatches)) {
$dcmin = $submatches[4];
}
}
}
}
if ($version !== '') {
$ds = file_get_contents('dcstore.xml');
if ($ds) {
$ds = preg_replace('/<version>(.*?)<\/version>/s',"<version>$version</version>",$ds);
$ds = preg_replace('/download\/(.*?)\//s',"download/$version/",$ds);
$ds = preg_replace('/(.*)-(.*?).zip/s',"$1-$version.zip",$ds);
$ds = preg_replace('/<da:dcmin>(.*?)<\/da:dcmin>/s',"<da:dcmin>$dcmin</da:dcmin>",$ds);
if ($ds) {
file_put_contents('dcstore.xml',$ds);
}
}
}
}
echo "::set-output name=module_version::$version\n";
echo "::set-output name=module_dcmin::$dcmin\n";
# Cope with returned version
- name: Log output of the script
run: echo "${{steps.getversion.outputs.module_version}} (Dotclear ${{steps.getversion.outputs.module_dcmin}}+)"
# Update dcstore.xml if necessary
- name: Update dcstore
id: update-dcstore
shell: bash
run: |
cat dcstore.xml
test=$(git diff --name-only -- dcstore.xml)
if [[ "$test" != "" ]]; then
echo "dcstore.xml modified, need to be commit"
git config --global user.email "me@example.com"
git config --global user.name "franck-paul"
git add dcstore.xml
git commit -m "Update dcstore.xml - version ${{steps.getversion.outputs.module_version}} - Dotclear ${{steps.getversion.outputs.module_dcmin}}+"
git push
fi
Reste à installer ça sur tous les dépôts qui possèdent un fichier dcstore.xml et ensuite ne plus s’occuper de rien \o/
Cela dit ça serait pas mal de pouvoir utiliser la même action partagée sur tous les dépôts idoines — pour ne pas avoir à toutes les modifier si besoin —, mais j’ai pas (encore) trouvé si c’était faisable…
1 De JcDenis -
Sympa! Mais ça reste un peu compliqué (pour moi) et surtout comme tu dis l’installer sur 90 dépôts c’est pas top. (Et pas trouvé non plus pour faire sur plusieurs à la fois…)
Sinon, il n’y aurait pas moyen de le lancer plutôt quand on fait une release ? Je suis mauvais en workflow et ça m’arrive de changer la version sur la branch master sans faire de release dans la foulée…
2 De Franck -
Pour les 90 dépôts j’ai bien l’intention de dupliquer ça localement sur mon Mac et pousser ensuite tout ça ; ça ira plus vite :-)
J’ai un peu regardé pour la release et visiblement c’est moins trivial parce qu’il n’y a pas d’événement généré par Github (au sens de ceux interceptés par les actions) quand on crée une nouvelle release.
Mais sinon oui, il y a de la place pour mal d’améliorations, c’est un début !
3 De Franck -
Bon j’ai switché de
push
àrelease
pour le trigger de déclenchement, ça a l’air de fonctionner.Je verrai à l’usage s’il y a plus « fin » à faire.