Aller au contenu
FerrFlow

Configuration / Configuration

Configuration

FerrFlow supporte six formats de fichier de configuration, recherch\u00e9s dans cet ordre :

  1. ferrflow.json
  2. ferrflow.json5
  3. ferrflow.toml
  4. ferrflow.ts (n\u00e9cessite tsx)
  5. ferrflow.js (n\u00e9cessite node)
  6. .ferrflow (JSON)

Si aucun fichier de configuration n’est trouv\u00e9, FerrFlow d\u00e9tecte automatiquement les fichiers de version courants dans le r\u00e9pertoire actuel.

ferrflow.ts
export default {
workspace: {
tagTemplate: "v{version}",
},
package: [
{
name: "my-app",
path: ".",
changelog: "CHANGELOG.md",
versionedFiles: [
{ path: "Cargo.toml", format: "toml" },
],
},
],
};

Les fichiers de config TypeScript (.ts) et JavaScript (.js) utilisent un export ESM par d\u00e9faut. L’export peut \u00eatre un objet ou une fonction asynchrone.

L’avantage principal des configs TS/JS : les hooks sous forme de fonctions. Au lieu de commandes shell, vous pouvez \u00e9crire des hooks natifs avec acc\u00e8s complet au contexte :

ferrflow.ts
export default {
workspace: {
tagTemplate: "v{version}",
hooks: {
postPublish: async (ctx) => {
await fetch("https://hooks.slack.com/services/...", {
method: "POST",
body: JSON.stringify({
text: `Released ${ctx.package}@${ctx.newVersion}`,
}),
});
},
},
},
package: [
{
name: "my-app",
path: ".",
versionedFiles: [{ path: "package.json", format: "json" }],
},
],
};

Les hooks en fonction re\u00e7oivent un objet de contexte avec ces champs :

ChampTypeDescription
packagestringNom du package
oldVersionstringVersion avant le bump (vide pour la premi\u00e8re release)
newVersionstringVersion apr\u00e8s le bump
bumpTypestringmajor, minor, patch, ou none
tagstringNom complet du tag git
dryRunbooleanVrai si --dry-run est actif
packagePathstringChemin absolu vers la racine du package
channelstring ou nullNom du channel de pr\u00e9-release
isPrereleasebooleanVrai si c’est une pr\u00e9-release

Les hooks sous forme de commandes shell et de fonctions peuvent \u00eatre m\u00e9lang\u00e9s dans la m\u00eame config.

Paramètres globaux qui s’appliquent à tous les packages.

ChampTypeDéfautDescription
remotestring"origin"Remote git vers lequel pousser
branchstringauto-détectéBranche vers laquelle pousser (détectée depuis le HEAD du remote)
tagTemplatestring"v{version}" ou "{name}@v{version}"Modèle de nommage des tags. Utilise les placeholders {version} et {name}. Par défaut v{version} pour les repos mono-package et {name}@v{version} pour les monorepos.
versioningstring"semver"Stratégie de versionnage par défaut pour tous les packages
releaseCommitModestring"commit"Gestion du commit de release : "commit", "pr" ou "none"
skipCibooleandépend du modeAjouter [skip ci] aux commits de release. Par défaut true en mode "commit", false sinon.
autoMergeReleasesbooleantrueActiver l’auto-merge sur les PR de release (uniquement en mode "pr")
recoverMissedReleasesbooleanfalseLorsqu’activé, si FerrFlow trouve des commits non publiés couvrant plusieurs incréments de version, il crée toutes les releases intermédiaires au lieu de sauter directement à la dernière version
telemetrybooleantrueEnvoyer des données de télémétrie anonymes

Le champ tagTemplate contrôle le nommage des tags git. Placeholders disponibles :

PlaceholderDescription
{version}Le numéro de version (ex. 1.2.3)
{name}Le nom du package
ferrflow.json
{
"workspace": {
"tagTemplate": "v{version}"
}
}

Pour les monorepos, utilisez {name} pour namespacer les tags par package :

ferrflow.json
{
"workspace": {
"tagTemplate": "{name}@v{version}"
}
}

Contrôle la façon dont FerrFlow gère le commit qui met à jour les fichiers de version et les changelogs.

ModeComportement
"commit"Commit directement sur la branche courante et pousse (par défaut)
"pr"Crée une branche release/ et ouvre une pull request
"none"Crée uniquement les tags et les releases, ne commit pas les changements de fichiers
ferrflow.json
{
"workspace": {
"releaseCommitMode": "pr",
"autoMergeReleases": true
}
}

FerrFlow supporte plusieurs stratégies de versionnage, configurables au niveau du workspace ou du package.

StratégieFormatProgression exemple
semverMAJOR.MINOR.PATCH1.2.31.3.02.0.0
calverYYYY.MM.PATCH2026.03.02026.03.12026.04.0
calver-shortYY.MM.PATCH26.03.026.03.1
calver-seqYYYY.MM.SEQ2026.03.12026.03.2
sequentialN123
zerover0.MINOR.PATCH0.1.00.2.0 (n’atteint jamais 1.0)
ferrflow.json
{
"workspace": {
"versioning": "calver"
}
}

Définit un package à versionner. Vous pouvez en avoir un ou plusieurs.

ChampRequisDéfautDescription
nameouiIdentifiant du package, utilisé dans le préfixe du tag git
pathouiChemin relatif vers le répertoire du package
changelognon{path}/CHANGELOG.mdChemin vers le fichier changelog
sharedPathsnon[]Chemins qui déclenchent ce package lorsqu’ils sont modifiés
versioningnonhérité du workspaceSurcharger la stratégie de versionnage pour ce package
tagTemplatenonhérité du workspaceSurcharger le modèle de tag pour ce package

Fichiers dans lesquels le numéro de version doit être mis à jour.

ferrflow.json
{
"package": [
{
"name": "my-app",
"path": ".",
"versionedFiles": [
{ "path": "Cargo.toml", "format": "toml" },
{ "path": "npm/package.json", "format": "json" }
]
}
]
}
formatFichierChamp mis à jour
tomlCargo.toml, pyproject.toml[package].version ou [project].version
jsonpackage.jsonversion
xmlpom.xmlPremier élément <version>
gradlebuild.gradle, build.gradle.ktsversion = "..."
helmChart.yamlversion et appVersion (si présent)
gomodgo.modPas de mise à jour de fichier — la version vient uniquement des tags git
txtVERSION, VERSION.txtContenu entier du fichier remplacé

Exécutez des commandes shell à des points clés du cycle de release. Les hooks peuvent être définis au niveau du workspace (par défaut pour tous les packages) ou par package (surcharge les hooks du workspace pour ce package).

calcul du bump
pre_bump ← valider l'état, vérifier les prérequis
écriture des fichiers de version
post_bump ← modifier des fichiers supplémentaires avec la nouvelle version
génération du changelog
pre_commit ← vérifier les changements stagés, lancer les linters
git commit + tag
pre_publish ← lancer les tests sur le commit taggé, builder les artefacts
git push + création de la release
post_publish ← pousser les images Docker, notifier Slack, publier les packages
{
"workspace": {
"hooks": {
"preBump": "cargo test",
"postBump": "node scripts/sync-deps.js",
"preCommit": "cargo fmt --check",
"prePublish": "cargo build --release",
"postPublish": "make docker-push && ./scripts/notify.sh",
"onFailure": "abort"
}
}
}
ChampTypeDéfautDescription
preBumpstringExécuté après le calcul du bump, avant l’écriture des fichiers de version
postBumpstringExécuté après l’écriture des fichiers de version
preCommitstringExécuté après le changelog, avant le commit git
prePublishstringExécuté après le commit+tag, avant le push
postPublishstringExécuté après le push et la création de la release
onFailurestring"abort""abort" annule la release en cas d’échec, "continue" affiche un avertissement

Chaque hook reçoit ces variables :

VariableDescriptionExemple
FERRFLOW_PACKAGENom du packageapi
FERRFLOW_OLD_VERSIONVersion avant le bump (vide pour la première release)1.2.3
FERRFLOW_NEW_VERSIONVersion après le bump1.3.0
FERRFLOW_BUMP_TYPEmajor, minor, patch ou noneminor
FERRFLOW_TAGNom complet du tag gitapi@v1.3.0
FERRFLOW_DRY_RUNtrue si --dry-run est activéfalse
FERRFLOW_PACKAGE_PATHChemin absolu vers la racine du package/home/user/repo/packages/api

Les hooks au niveau du package remplacent les hooks du workspace pour ce package (ils ne sont pas fusionnés).

{
"workspace": {
"hooks": {
"preBump": "echo releasing $FERRFLOW_PACKAGE",
"postPublish": "make notify"
}
},
"package": [
{
"name": "api",
"path": "packages/api",
"hooks": {
"preBump": "cargo test"
}
}
]
}

Dans cet exemple, le package api exécute cargo test pour preBump (surchargeant l’echo du workspace) mais hérite du hook postPublish du workspace.

  • --dry-run : les hooks sont affichés mais non exécutés.
  • --verbose : la sortie stdout/stderr des hooks est diffusée en direct. Sinon, la sortie n’est affichée qu’en cas d’échec.
  • Les fichiers modifiés par les hooks postBump ou preCommit sont automatiquement inclus dans le commit de release.
ferrflow.json
{
"$schema": "https://ferrflow.com/schema/ferrflow.json",
"workspace": {
"tagTemplate": "v{version}"
},
"package": [
{
"name": "ferrflow",
"path": ".",
"changelog": "CHANGELOG.md",
"versionedFiles": [
{ "path": "Cargo.toml", "format": "toml" },
{ "path": "npm/package.json", "format": "json" }
]
}
]
}
ferrflow.json
{
"$schema": "https://ferrflow.com/schema/ferrflow.json",
"workspace": {
"tagTemplate": "{name}@v{version}"
},
"package": [
{
"name": "api",
"path": "packages/api",
"changelog": "packages/api/CHANGELOG.md",
"sharedPaths": ["packages/shared/"],
"versionedFiles": [
{ "path": "packages/api/Cargo.toml", "format": "toml" }
]
},
{
"name": "site",
"path": "packages/site",
"changelog": "packages/site/CHANGELOG.md",
"sharedPaths": ["packages/shared/"],
"versionedFiles": [
{ "path": "packages/site/package.json", "format": "json" }
]
}
]
}