@ferrflow/doc 7.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/docs-en/ci/github-actions.md +120 -0
- package/docs-en/ci/gitlab-ci.md +90 -0
- package/docs-en/ci/hosted-bot.md +82 -0
- package/docs-en/ci/pipeline-triggers.md +287 -0
- package/docs-en/configuration/config-file.md +1259 -0
- package/docs-en/configuration/formats.md +220 -0
- package/docs-en/configuration/monorepo.md +390 -0
- package/docs-en/installation.md +56 -0
- package/docs-en/introduction.md +56 -0
- package/docs-en/quickstart.md +66 -0
- package/docs-en/reference/api.md +106 -0
- package/docs-en/reference/cli.md +483 -0
- package/docs-en/reference/conventional-commits.md +103 -0
- package/docs-en/reference/errors.md +508 -0
- package/docs-en/verifying-releases.md +97 -0
- package/docs-fr/ci/github-actions.md +109 -0
- package/docs-fr/ci/gitlab-ci.md +77 -0
- package/docs-fr/ci/hosted-bot.md +82 -0
- package/docs-fr/ci/pipeline-triggers.md +238 -0
- package/docs-fr/configuration/config-file.md +839 -0
- package/docs-fr/configuration/formats.md +163 -0
- package/docs-fr/configuration/monorepo.md +357 -0
- package/docs-fr/installation.md +56 -0
- package/docs-fr/introduction.md +54 -0
- package/docs-fr/quickstart.md +63 -0
- package/docs-fr/reference/api.md +106 -0
- package/docs-fr/reference/cli.md +407 -0
- package/docs-fr/reference/conventional-commits.md +103 -0
- package/docs-fr/reference/errors.md +378 -0
- package/docs-fr/verifying-releases.md +97 -0
- package/docs-fr-v4/ci/github-actions.md +106 -0
- package/docs-fr-v4/ci/gitlab-ci.md +77 -0
- package/docs-fr-v4/ci/pipeline-triggers.md +214 -0
- package/docs-fr-v4/configuration/config-file.md +769 -0
- package/docs-fr-v4/configuration/formats.md +128 -0
- package/docs-fr-v4/configuration/monorepo.md +324 -0
- package/docs-fr-v4/installation.md +48 -0
- package/docs-fr-v4/introduction.md +54 -0
- package/docs-fr-v4/legal/telemetry.md +65 -0
- package/docs-fr-v4/quickstart.md +63 -0
- package/docs-fr-v4/reference/cli.md +130 -0
- package/docs-fr-v4/reference/conventional-commits.md +67 -0
- package/docs-fr-v4/reference/errors.md +372 -0
- package/docs-fr-v5/ci/github-actions.md +109 -0
- package/docs-fr-v5/ci/gitlab-ci.md +77 -0
- package/docs-fr-v5/ci/hosted-bot.md +82 -0
- package/docs-fr-v5/ci/pipeline-triggers.md +238 -0
- package/docs-fr-v5/configuration/config-file.md +812 -0
- package/docs-fr-v5/configuration/formats.md +150 -0
- package/docs-fr-v5/configuration/monorepo.md +357 -0
- package/docs-fr-v5/installation.md +56 -0
- package/docs-fr-v5/introduction.md +54 -0
- package/docs-fr-v5/legal/telemetry.md +26 -0
- package/docs-fr-v5/quickstart.md +63 -0
- package/docs-fr-v5/reference/api.md +106 -0
- package/docs-fr-v5/reference/cli.md +356 -0
- package/docs-fr-v5/reference/conventional-commits.md +88 -0
- package/docs-fr-v5/reference/errors.md +378 -0
- package/docs-fr-v5/verifying-releases.md +97 -0
- package/docs-fr-v6/ci/github-actions.md +109 -0
- package/docs-fr-v6/ci/gitlab-ci.md +77 -0
- package/docs-fr-v6/ci/hosted-bot.md +82 -0
- package/docs-fr-v6/ci/pipeline-triggers.md +238 -0
- package/docs-fr-v6/configuration/config-file.md +813 -0
- package/docs-fr-v6/configuration/formats.md +150 -0
- package/docs-fr-v6/configuration/monorepo.md +357 -0
- package/docs-fr-v6/installation.md +56 -0
- package/docs-fr-v6/introduction.md +54 -0
- package/docs-fr-v6/quickstart.md +63 -0
- package/docs-fr-v6/reference/api.md +106 -0
- package/docs-fr-v6/reference/cli.md +356 -0
- package/docs-fr-v6/reference/conventional-commits.md +88 -0
- package/docs-fr-v6/reference/errors.md +378 -0
- package/docs-fr-v6/verifying-releases.md +97 -0
- package/docs-v0/ci/github-actions.md +77 -0
- package/docs-v0/ci/gitlab-ci.md +59 -0
- package/docs-v0/configuration/config-file.md +97 -0
- package/docs-v0/configuration/formats.md +86 -0
- package/docs-v0/configuration/monorepo.md +59 -0
- package/docs-v0/installation.md +48 -0
- package/docs-v0/introduction.md +34 -0
- package/docs-v0/legal/telemetry.md +63 -0
- package/docs-v0/quickstart.md +58 -0
- package/docs-v0/reference/cli.md +95 -0
- package/docs-v0/reference/conventional-commits.md +68 -0
- package/docs-v1/ci/github-actions.md +76 -0
- package/docs-v1/ci/gitlab-ci.md +58 -0
- package/docs-v1/configuration/config-file.md +515 -0
- package/docs-v1/configuration/formats.md +115 -0
- package/docs-v1/configuration/monorepo.md +246 -0
- package/docs-v1/installation.md +48 -0
- package/docs-v1/introduction.md +39 -0
- package/docs-v1/legal/telemetry.md +63 -0
- package/docs-v1/quickstart.md +62 -0
- package/docs-v1/reference/cli.md +128 -0
- package/docs-v1/reference/conventional-commits.md +67 -0
- package/docs-v2/ci/github-actions.md +117 -0
- package/docs-v2/ci/gitlab-ci.md +90 -0
- package/docs-v2/ci/pipeline-triggers.md +263 -0
- package/docs-v2/configuration/config-file.md +806 -0
- package/docs-v2/configuration/formats.md +98 -0
- package/docs-v2/configuration/monorepo.md +324 -0
- package/docs-v2/installation.md +48 -0
- package/docs-v2/introduction.md +40 -0
- package/docs-v2/legal/telemetry.md +66 -0
- package/docs-v2/quickstart.md +63 -0
- package/docs-v2/reference/cli.md +130 -0
- package/docs-v2/reference/conventional-commits.md +67 -0
- package/docs-v2/reference/errors.md +500 -0
- package/docs-v2/self-hosting.md +101 -0
- package/docs-v3/ci/github-actions.md +117 -0
- package/docs-v3/ci/gitlab-ci.md +90 -0
- package/docs-v3/ci/pipeline-triggers.md +263 -0
- package/docs-v3/configuration/config-file.md +806 -0
- package/docs-v3/configuration/formats.md +99 -0
- package/docs-v3/configuration/monorepo.md +324 -0
- package/docs-v3/installation.md +48 -0
- package/docs-v3/introduction.md +40 -0
- package/docs-v3/legal/telemetry.md +66 -0
- package/docs-v3/quickstart.md +66 -0
- package/docs-v3/reference/cli.md +161 -0
- package/docs-v3/reference/conventional-commits.md +67 -0
- package/docs-v3/reference/errors.md +502 -0
- package/docs-v3/self-hosting.md +137 -0
- package/docs-v4/ci/github-actions.md +117 -0
- package/docs-v4/ci/gitlab-ci.md +90 -0
- package/docs-v4/ci/pipeline-triggers.md +263 -0
- package/docs-v4/configuration/config-file.md +850 -0
- package/docs-v4/configuration/formats.md +182 -0
- package/docs-v4/configuration/monorepo.md +324 -0
- package/docs-v4/installation.md +48 -0
- package/docs-v4/introduction.md +56 -0
- package/docs-v4/legal/telemetry.md +65 -0
- package/docs-v4/quickstart.md +66 -0
- package/docs-v4/reference/cli.md +161 -0
- package/docs-v4/reference/conventional-commits.md +67 -0
- package/docs-v4/reference/errors.md +502 -0
- package/docs-v4/self-hosting.md +137 -0
- package/docs-v5/ci/github-actions.md +120 -0
- package/docs-v5/ci/gitlab-ci.md +90 -0
- package/docs-v5/ci/hosted-bot.md +82 -0
- package/docs-v5/ci/pipeline-triggers.md +287 -0
- package/docs-v5/configuration/config-file.md +1133 -0
- package/docs-v5/configuration/formats.md +206 -0
- package/docs-v5/configuration/monorepo.md +390 -0
- package/docs-v5/installation.md +56 -0
- package/docs-v5/introduction.md +56 -0
- package/docs-v5/legal/telemetry.md +26 -0
- package/docs-v5/quickstart.md +66 -0
- package/docs-v5/reference/api.md +106 -0
- package/docs-v5/reference/cli.md +431 -0
- package/docs-v5/reference/conventional-commits.md +88 -0
- package/docs-v5/reference/errors.md +508 -0
- package/docs-v5/verifying-releases.md +97 -0
- package/docs-v6/ci/github-actions.md +120 -0
- package/docs-v6/ci/gitlab-ci.md +90 -0
- package/docs-v6/ci/hosted-bot.md +82 -0
- package/docs-v6/ci/pipeline-triggers.md +287 -0
- package/docs-v6/configuration/config-file.md +1134 -0
- package/docs-v6/configuration/formats.md +206 -0
- package/docs-v6/configuration/monorepo.md +390 -0
- package/docs-v6/installation.md +56 -0
- package/docs-v6/introduction.md +56 -0
- package/docs-v6/quickstart.md +66 -0
- package/docs-v6/reference/api.md +106 -0
- package/docs-v6/reference/cli.md +431 -0
- package/docs-v6/reference/conventional-commits.md +88 -0
- package/docs-v6/reference/errors.md +508 -0
- package/docs-v6/verifying-releases.md +97 -0
- package/package.json +17 -0
|
@@ -0,0 +1,839 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Configuration
|
|
3
|
+
description: Référence complète du fichier de configuration FerrFlow.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
FerrFlow supporte six formats de fichier de configuration, recherch\u00e9s dans cet ordre :
|
|
7
|
+
|
|
8
|
+
1. `ferrflow.json`
|
|
9
|
+
2. `ferrflow.json5`
|
|
10
|
+
3. `ferrflow.toml`
|
|
11
|
+
4. `ferrflow.ts` (n\u00e9cessite `tsx`)
|
|
12
|
+
5. `ferrflow.js` (n\u00e9cessite `node`)
|
|
13
|
+
6. `.ferrflow` (JSON)
|
|
14
|
+
|
|
15
|
+
Si aucun fichier de configuration n'est trouv\u00e9, FerrFlow d\u00e9tecte automatiquement les fichiers de version courants dans le r\u00e9pertoire actuel.
|
|
16
|
+
|
|
17
|
+
<aside class="ferr-aside ferr-aside--tip"><div class="ferr-aside__body"><p>Ajoutez <code>"$schema": "https://ferrflow.com/schema/ferrflow.json"</code> à votre configuration JSON pour l'autocomplétion et la validation dans votre éditeur.</p>
|
|
18
|
+
</div></aside>
|
|
19
|
+
|
|
20
|
+
## Formats de configuration
|
|
21
|
+
|
|
22
|
+
<div class="ferr-tabs">
|
|
23
|
+
<div class="ferr-tab" data-label="TypeScript"><p class="ferr-tab__label">TypeScript</p><div class="ferr-tab__body"><pre><code class="language-ts">export default {
|
|
24
|
+
workspace: {
|
|
25
|
+
tagTemplate: "v{version}",
|
|
26
|
+
},
|
|
27
|
+
package: [
|
|
28
|
+
{
|
|
29
|
+
name: "my-app",
|
|
30
|
+
path: ".",
|
|
31
|
+
changelog: "CHANGELOG.md",
|
|
32
|
+
versionedFiles: [
|
|
33
|
+
{ path: "Cargo.toml", format: "toml" },
|
|
34
|
+
],
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
};
|
|
38
|
+
</code></pre>
|
|
39
|
+
</div></div>
|
|
40
|
+
<div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
|
|
41
|
+
"$schema": "https://ferrflow.com/schema/ferrflow.json",
|
|
42
|
+
"workspace": {
|
|
43
|
+
"tagTemplate": "v{version}"
|
|
44
|
+
},
|
|
45
|
+
"package": [
|
|
46
|
+
{
|
|
47
|
+
"name": "my-app",
|
|
48
|
+
"path": ".",
|
|
49
|
+
"changelog": "CHANGELOG.md",
|
|
50
|
+
"versionedFiles": [
|
|
51
|
+
{ "path": "Cargo.toml", "format": "toml" }
|
|
52
|
+
]
|
|
53
|
+
}
|
|
54
|
+
]
|
|
55
|
+
}
|
|
56
|
+
</code></pre>
|
|
57
|
+
</div></div>
|
|
58
|
+
<div class="ferr-tab" data-label="TOML"><p class="ferr-tab__label">TOML</p><div class="ferr-tab__body"><pre><code class="language-toml">[workspace]
|
|
59
|
+
tag_template = "v{version}"
|
|
60
|
+
|
|
61
|
+
[[package]]
|
|
62
|
+
name = "my-app"
|
|
63
|
+
path = "."
|
|
64
|
+
changelog = "CHANGELOG.md"
|
|
65
|
+
|
|
66
|
+
[[package.versioned_files]]
|
|
67
|
+
path = "Cargo.toml"
|
|
68
|
+
format = "toml"
|
|
69
|
+
</code></pre>
|
|
70
|
+
</div></div>
|
|
71
|
+
<div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
|
|
72
|
+
$schema: "https://ferrflow.com/schema/ferrflow.json",
|
|
73
|
+
workspace: {
|
|
74
|
+
tagTemplate: "v{version}",
|
|
75
|
+
},
|
|
76
|
+
package: [
|
|
77
|
+
{
|
|
78
|
+
name: "my-app",
|
|
79
|
+
path: ".",
|
|
80
|
+
changelog: "CHANGELOG.md",
|
|
81
|
+
versionedFiles: [
|
|
82
|
+
{ path: "Cargo.toml", format: "toml" },
|
|
83
|
+
],
|
|
84
|
+
},
|
|
85
|
+
],
|
|
86
|
+
}
|
|
87
|
+
</code></pre>
|
|
88
|
+
</div></div>
|
|
89
|
+
</div>
|
|
90
|
+
|
|
91
|
+
<aside class="ferr-aside ferr-aside--note"><div class="ferr-aside__body"><p>Les configurations JSON, JSON5, et TypeScript/JavaScript utilisent des cl\u00e9s en <strong>camelCase</strong> (<code>tagTemplate</code>, <code>versionedFiles</code>).
|
|
92
|
+
La configuration TOML utilise des cl\u00e9s en <strong>snake_case</strong> (<code>tag_template</code>, <code>versioned_files</code>).
|
|
93
|
+
Toutes les formes sont \u00e9quivalentes.</p>
|
|
94
|
+
</div></aside>
|
|
95
|
+
|
|
96
|
+
### Configurations TypeScript et JavaScript
|
|
97
|
+
|
|
98
|
+
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.
|
|
99
|
+
|
|
100
|
+
<aside class="ferr-aside ferr-aside--warning"><div class="ferr-aside__body"><p>Les configs TypeScript n\u00e9cessitent <code>tsx</code> (<code>npm install -g tsx</code>). Les configs JavaScript n\u00e9cessitent <code>node</code> (v18+).</p>
|
|
101
|
+
</div></aside>
|
|
102
|
+
|
|
103
|
+
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 :
|
|
104
|
+
|
|
105
|
+
```ts title="ferrflow.ts"
|
|
106
|
+
export default {
|
|
107
|
+
workspace: {
|
|
108
|
+
tagTemplate: 'v{version}',
|
|
109
|
+
hooks: {
|
|
110
|
+
postPublish: async (ctx) => {
|
|
111
|
+
await fetch('https://hooks.slack.com/services/...', {
|
|
112
|
+
method: 'POST',
|
|
113
|
+
body: JSON.stringify({
|
|
114
|
+
text: `Released ${ctx.package}@${ctx.newVersion}`,
|
|
115
|
+
}),
|
|
116
|
+
});
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
package: [
|
|
121
|
+
{
|
|
122
|
+
name: 'my-app',
|
|
123
|
+
path: '.',
|
|
124
|
+
versionedFiles: [{ path: 'package.json', format: 'json' }],
|
|
125
|
+
},
|
|
126
|
+
],
|
|
127
|
+
};
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
#### Objet de contexte des hooks
|
|
131
|
+
|
|
132
|
+
Les hooks en fonction re\u00e7oivent un objet de contexte avec ces champs :
|
|
133
|
+
|
|
134
|
+
| Champ | Type | Description |
|
|
135
|
+
| -------------- | -------------- | ---------------------------------------------------------------------------- |
|
|
136
|
+
| `package` | string | Nom du package |
|
|
137
|
+
| `oldVersion` | string | Version avant le bump (vide pour la premi\u00e8re release) |
|
|
138
|
+
| `newVersion` | string | Version apr\u00e8s le bump |
|
|
139
|
+
| `bumpType` | string | `major`, `minor`, `patch`, ou `none` |
|
|
140
|
+
| `tag` | string | Nom complet du tag git |
|
|
141
|
+
| `dryRun` | boolean | Vrai si `--dry-run` est actif |
|
|
142
|
+
| `packagePath` | string | Chemin absolu vers la racine du package |
|
|
143
|
+
| `channel` | string ou null | Nom du channel de pr\u00e9-release |
|
|
144
|
+
| `isPrerelease` | boolean | Vrai si c'est une pr\u00e9-release |
|
|
145
|
+
| `monorepo` | boolean | Vrai si c'est une release monorepo |
|
|
146
|
+
| `changelog` | string | Section de changelog rendue pour ce bump (markdown) |
|
|
147
|
+
| `commits` | array | `{ hash, message, type?, scope?, breaking }` par commit du bump |
|
|
148
|
+
| `bumpedFiles` | array | `{ path, format }` pour chaque fichier modifié par la release |
|
|
149
|
+
| `allPackages` | array | `{ name, version, bump }` pour chaque package publié dans ce batch |
|
|
150
|
+
| `releaseUrl` | string ou null | URL de la release forge créée — hooks `postPublish` uniquement, `null` sinon |
|
|
151
|
+
|
|
152
|
+
`commits`, `bumpedFiles` et `allPackages` arrivent comme de vrais tableaux (parsés depuis du JSON), vous pouvez donc les itérer directement :
|
|
153
|
+
|
|
154
|
+
```js
|
|
155
|
+
export default {
|
|
156
|
+
workspace: {
|
|
157
|
+
hooks: {
|
|
158
|
+
postBump(ctx) {
|
|
159
|
+
for (const c of ctx.commits) {
|
|
160
|
+
if (c.breaking) console.log(`breaking: ${c.message}`);
|
|
161
|
+
}
|
|
162
|
+
},
|
|
163
|
+
},
|
|
164
|
+
},
|
|
165
|
+
};
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
Les hooks sous forme de commandes shell et de fonctions peuvent \u00eatre m\u00e9lang\u00e9s dans la m\u00eame config.
|
|
169
|
+
|
|
170
|
+
## `workspace`
|
|
171
|
+
|
|
172
|
+
Paramètres globaux qui s'appliquent à tous les packages.
|
|
173
|
+
|
|
174
|
+
| Champ | Type | Défaut | Description |
|
|
175
|
+
| ----------------------- | ------- | --------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
176
|
+
| `remote` | string | `"origin"` | Remote git vers lequel pousser |
|
|
177
|
+
| `branch` | string | auto-détecté | Branche vers laquelle pousser (détectée depuis le HEAD du remote) |
|
|
178
|
+
| `tagTemplate` | string | `"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. |
|
|
179
|
+
| `latestTag` | string | aucun | Modèle d'un tag alias flottant qui pointe toujours vers la dernière version non-préversion du package, par exemple `"latest"` ou `"{name}@latest"`. Absent par défaut. Volontairement **non** dérivé de `tagTemplate` : l'alias est un nom, pas une version, donc un `tagTemplate` en `v{version}` donne `latest`, jamais `vlatest`. En monorepo le modèle doit contenir `{name}`, sinon chaque package écrase le même ref et le dernier publié gagne. Les préversions ne le déplacent jamais, et il échappe au garde-fou anti-recul qui s'applique aux tags flottants `major`/`minor`. |
|
|
180
|
+
| `versioning` | string | `"semver"` | Stratégie de versionnage par défaut pour tous les packages |
|
|
181
|
+
| `releaseCommitMode` | string | `"commit"` | Gestion du commit de release : `"commit"`, `"pr"` ou `"none"` |
|
|
182
|
+
| `releaseCommitScope` | string | `"grouped"` | Dans un monorepo où plusieurs packages sont bumpés en même temps, créer un seul commit `"grouped"` ou un commit `"per-package"`. N'a d'effet que quand plusieurs packages bumpent. |
|
|
183
|
+
| `releaseCommitBody` | string | `"none"` | Ce que contient le corps du commit de release, sous la ligne de sujet. `"none"` conserve le sujet sur une seule ligne. `"summary"` liste une ligne par package publié avec son nombre de commits. `"full"` intègre la section de changelog écrite pour chaque package — en scope `"grouped"`, chaque section est titrée `## <package> <version>`. |
|
|
184
|
+
| `forge` | string | `"auto"` | Forçage du forge git : `"auto"` détecte depuis l'URL du remote, et pour un hôte non reconnu il sonde l'API en HTTPS pour auto-détecter une instance auto-hébergée de **GitLab**, **GitHub Enterprise** ou **Gitea / Forgejo** (mis en cache, ~2s, best-effort). Renseignez `"github"`, `"gitlab"`, `"gitea"` (Gitea / Forgejo / Codeberg) ou `"bitbucket"` (Bitbucket Cloud) pour forcer un forge — nécessaire uniquement si l'hôte n'est pas joignable en HTTPS ou pour éviter le sondage. L'auth Gitea utilise `GITEA_TOKEN` / `FORGEJO_TOKEN` ; Bitbucket utilise `BITBUCKET_TOKEN`. Tous couvrent la création de release — sur Bitbucket, qui n'a pas d'objet release, la release est le tag annoté que FerrFlow pousse. Le mode PR reste GitHub/GitLab. |
|
|
185
|
+
| `skipCi` | boolean | dépend du mode | Ajouter `[skip ci]` aux commits de release. Par défaut `true` en mode `"commit"`, `false` sinon. |
|
|
186
|
+
| `commitSkipMarkers` | array | `["[skip ci]", "[ci skip]", "[no ci]", "[skip actions]", "[actions skip]"]` | Marqueurs qui font ignorer un commit par FerrFlow lors du calcul de la prochaine version. Comparaison insensible à la casse, sur la ligne de sujet uniquement. |
|
|
187
|
+
| `commitFormats` | object | conventionnel permissif | Quels sujets de commit correspondent à quel niveau de bump. Chacun de `major` / `minor` / `patch` accepte un motif, une liste de motifs, ou `"all"` comme fourre-tout ; `*` correspond à n'importe quelle suite de caractères (y compris `/`) et `?` à exactement un. Résolution : major → minor → patch, premier motif gagnant. `caseSensitive` (défaut `true`) met les deux côtés en minuscules quand il vaut `false`. Les défauts acceptent aussi les variantes capitalisées et séparées par une barre oblique (`Feat:`, `feat/`, `feature:`, `Fix/`, `Perf:`, `Refactor/`, etc.), listées en entier dans [défauts permissifs](/fr/docs/reference/conventional-commits). Les marqueurs de rupture (`feat!:`, `fix(api)!:`, un pied de page `BREAKING CHANGE:`) sont toujours détectés quelle que soit la configuration. |
|
|
188
|
+
| `autoMergeReleases` | boolean | `true` | Activer l'auto-merge sur les PR de release (uniquement en mode `"pr"`) |
|
|
189
|
+
| `recoverMissedReleases` | boolean | `false` | Comparer les fichiers versionnés au dernier tag plutôt qu'au seul dernier commit, pour rattraper des releases manquées plus tôt dans un monorepo. |
|
|
190
|
+
| `versionSource` | string | `"highest"` | Quelle source l'emporte quand un package a à la fois un tag git et une version dans un fichier versionné. `"highest"` prend la plus haute, donc une erreur dans l'une ou l'autre fait monter la version sans jamais redescendre. `"tag"` traite les tags comme le registre de ce qui a été publié et ignore le fichier. `"file"` traite le fichier comme la source et ignore le tag, ce dont a besoin un package migré d'un dépôt à un autre. Sans effet si une seule source est présente. |
|
|
191
|
+
| `branches` | array | `[]` | Associe des branches à des canaux de pré-release (voir [Canaux de pré-release](#canaux-de-pré-release)). |
|
|
192
|
+
| `linked` | array | `[]` | Groupes de packages qui partagent une ligne de version lorsqu'ils sont publiés ensemble. Dès qu'un membre a un commit publiable, tous passent à la même version (la plus haute) (voir [Groupes de versions liées et fixes](/fr/docs/configuration/monorepo#groupes-de-versions-liées-et-fixes)). |
|
|
193
|
+
| `fixed` | array | `[]` | Groupes de packages verrouillés sur une version identique en permanence. Comportement de `linked` ; `ferrflow validate` avertit lorsque les versions d'un groupe `fixed` ont divergé. |
|
|
194
|
+
| `anonymous_telemetry` | boolean | `true` | Dépréciée et ignorée — la télémétrie a été retirée en v5.33 ([détails](/fr/v5/docs/legal/telemetry)). La clé (et son alias `telemetry`) reste acceptée pour que les configurations existantes restent valides. |
|
|
195
|
+
|
|
196
|
+
### Modèle de tag
|
|
197
|
+
|
|
198
|
+
Le champ `tagTemplate` contrôle le nommage des tags git. Placeholders disponibles :
|
|
199
|
+
|
|
200
|
+
| Placeholder | Description |
|
|
201
|
+
| ----------- | ---------------------------------- |
|
|
202
|
+
| `{version}` | Le numéro de version (ex. `1.2.3`) |
|
|
203
|
+
| `{name}` | Le nom du package |
|
|
204
|
+
|
|
205
|
+
<div class="ferr-tabs">
|
|
206
|
+
<div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
|
|
207
|
+
"workspace": {
|
|
208
|
+
"tagTemplate": "v{version}"
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
</code></pre>
|
|
212
|
+
</div></div>
|
|
213
|
+
<div class="ferr-tab" data-label="TOML"><p class="ferr-tab__label">TOML</p><div class="ferr-tab__body"><pre><code class="language-toml">[workspace]
|
|
214
|
+
tag_template = "v{version}"
|
|
215
|
+
</code></pre>
|
|
216
|
+
</div></div>
|
|
217
|
+
<div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
|
|
218
|
+
workspace: {
|
|
219
|
+
tagTemplate: "v{version}",
|
|
220
|
+
},
|
|
221
|
+
}
|
|
222
|
+
</code></pre>
|
|
223
|
+
</div></div>
|
|
224
|
+
</div>
|
|
225
|
+
|
|
226
|
+
Pour les monorepos, utilisez `{name}` pour namespacer les tags par package :
|
|
227
|
+
|
|
228
|
+
<div class="ferr-tabs">
|
|
229
|
+
<div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
|
|
230
|
+
"workspace": {
|
|
231
|
+
"tagTemplate": "{name}@v{version}"
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
</code></pre>
|
|
235
|
+
</div></div>
|
|
236
|
+
<div class="ferr-tab" data-label="TOML"><p class="ferr-tab__label">TOML</p><div class="ferr-tab__body"><pre><code class="language-toml">[workspace]
|
|
237
|
+
tag_template = "{name}@v{version}"
|
|
238
|
+
</code></pre>
|
|
239
|
+
</div></div>
|
|
240
|
+
<div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
|
|
241
|
+
workspace: {
|
|
242
|
+
tagTemplate: "{name}@v{version}",
|
|
243
|
+
},
|
|
244
|
+
}
|
|
245
|
+
</code></pre>
|
|
246
|
+
</div></div>
|
|
247
|
+
</div>
|
|
248
|
+
|
|
249
|
+
### Mode de commit de release
|
|
250
|
+
|
|
251
|
+
Contrôle la façon dont FerrFlow gère le commit qui met à jour les fichiers de version et les changelogs.
|
|
252
|
+
|
|
253
|
+
| Mode | Comportement |
|
|
254
|
+
| ---------- | -------------------------------------------------------------------------------------- |
|
|
255
|
+
| `"commit"` | Commit directement sur la branche courante et pousse (par défaut) |
|
|
256
|
+
| `"pr"` | Ouvre une pull request de release persistante et la met à jour à chaque nouveau commit |
|
|
257
|
+
| `"none"` | Crée uniquement les tags et les releases, ne commit pas les changements de fichiers |
|
|
258
|
+
|
|
259
|
+
<div class="ferr-tabs">
|
|
260
|
+
<div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
|
|
261
|
+
"workspace": {
|
|
262
|
+
"releaseCommitMode": "pr",
|
|
263
|
+
"autoMergeReleases": true
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
</code></pre>
|
|
267
|
+
</div></div>
|
|
268
|
+
<div class="ferr-tab" data-label="TOML"><p class="ferr-tab__label">TOML</p><div class="ferr-tab__body"><pre><code class="language-toml">[workspace]
|
|
269
|
+
release_commit_mode = "pr"
|
|
270
|
+
auto_merge_releases = true
|
|
271
|
+
</code></pre>
|
|
272
|
+
</div></div>
|
|
273
|
+
<div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
|
|
274
|
+
workspace: {
|
|
275
|
+
releaseCommitMode: "pr",
|
|
276
|
+
autoMergeReleases: true,
|
|
277
|
+
},
|
|
278
|
+
}
|
|
279
|
+
</code></pre>
|
|
280
|
+
</div></div>
|
|
281
|
+
</div>
|
|
282
|
+
|
|
283
|
+
En mode `"pr"`, FerrFlow maintient **une seule PR de release au long cours par branche cible**. Il conserve une branche de release unique — `ferrflow/release-<branche-cible>` — et à chaque nouveau commit il recalcule la version et le changelog puis force-push cette même branche : la PR ouverte est mise à jour sur place au lieu d'en ouvrir une nouvelle par version.
|
|
284
|
+
|
|
285
|
+
`autoMergeReleases` (par défaut `true`) active l'auto-merge sur cette PR ; il est réappliqué à chaque mise à jour et sans effet quand il est désactivé (la PR attend simplement un humain). Le mode PR est supporté sur GitHub et GitLab.
|
|
286
|
+
|
|
287
|
+
FerrFlow n'écrase pas le travail que vous poussez sur la branche de release : si la branche porte un commit qu'il n'a pas créé — tout ce qui n'est pas un commit `chore(release):`, comme un correctif de revue que vous avez poussé — il avertit et laisse la branche et la PR intactes pour ce run.
|
|
288
|
+
|
|
289
|
+
### Stratégies de versionnage
|
|
290
|
+
|
|
291
|
+
FerrFlow supporte plusieurs stratégies de versionnage, configurables au niveau du workspace ou du package.
|
|
292
|
+
|
|
293
|
+
| Stratégie | Format | Progression exemple |
|
|
294
|
+
| -------------- | ------------------- | ---------------------------------------- |
|
|
295
|
+
| `semver` | `MAJOR.MINOR.PATCH` | `1.2.3` → `1.3.0` → `2.0.0` |
|
|
296
|
+
| `calver` | `YYYY.MM.PATCH` | `2026.03.0` → `2026.03.1` → `2026.04.0` |
|
|
297
|
+
| `calver-short` | `YY.MM.PATCH` | `26.03.0` → `26.03.1` |
|
|
298
|
+
| `calver-seq` | `YYYY.MM.SEQ` | `2026.03.1` → `2026.03.2` |
|
|
299
|
+
| `sequential` | `N` | `1` → `2` → `3` |
|
|
300
|
+
| `zerover` | `0.MINOR.PATCH` | `0.1.0` → `0.2.0` (n'atteint jamais 1.0) |
|
|
301
|
+
|
|
302
|
+
<div class="ferr-tabs">
|
|
303
|
+
<div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
|
|
304
|
+
"workspace": {
|
|
305
|
+
"versioning": "calver"
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
</code></pre>
|
|
309
|
+
</div></div>
|
|
310
|
+
<div class="ferr-tab" data-label="TOML"><p class="ferr-tab__label">TOML</p><div class="ferr-tab__body"><pre><code class="language-toml">[workspace]
|
|
311
|
+
versioning = "calver"
|
|
312
|
+
</code></pre>
|
|
313
|
+
</div></div>
|
|
314
|
+
<div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
|
|
315
|
+
workspace: {
|
|
316
|
+
versioning: "calver",
|
|
317
|
+
},
|
|
318
|
+
}
|
|
319
|
+
</code></pre>
|
|
320
|
+
</div></div>
|
|
321
|
+
</div>
|
|
322
|
+
|
|
323
|
+
### Canaux de pré-release
|
|
324
|
+
|
|
325
|
+
Le tableau `branches` associe des noms de branches (ou des motifs glob) à des canaux de pré-release. Quand FerrFlow s'exécute sur une branche correspondant à une entrée, il release sur ce canal — par exemple `1.4.0-beta.1` au lieu de `1.4.0`. C'est cette même association que l'option `--channel` de `ferrflow check` et `ferrflow release` surcharge ponctuellement.
|
|
326
|
+
|
|
327
|
+
Chaque entrée comporte :
|
|
328
|
+
|
|
329
|
+
| Champ | Type | Description |
|
|
330
|
+
| ---------------------- | ----------------- | ---------------------------------------------------------------------- |
|
|
331
|
+
| `name` | string | Nom de branche ou motif glob (ex. `"main"`, `"release/*"`) |
|
|
332
|
+
| `channel` | string ou `false` | Nom de canal (`"beta"`, `"rc"`, …), ou `false` pour une release stable |
|
|
333
|
+
| `prereleaseIdentifier` | string | Stratégie de l'identifiant ajouté après le nom du canal |
|
|
334
|
+
|
|
335
|
+
<div class="ferr-tabs">
|
|
336
|
+
<div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
|
|
337
|
+
"workspace": {
|
|
338
|
+
"branches": [
|
|
339
|
+
{ "name": "main", "channel": false },
|
|
340
|
+
{ "name": "next", "channel": "beta" }
|
|
341
|
+
]
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
</code></pre>
|
|
345
|
+
</div></div>
|
|
346
|
+
<div class="ferr-tab" data-label="TOML"><p class="ferr-tab__label">TOML</p><div class="ferr-tab__body"><pre><code class="language-toml">[[workspace.branches]]
|
|
347
|
+
name = "main"
|
|
348
|
+
channel = false
|
|
349
|
+
|
|
350
|
+
[[workspace.branches]]
|
|
351
|
+
name = "next"
|
|
352
|
+
channel = "beta"
|
|
353
|
+
</code></pre>
|
|
354
|
+
</div></div>
|
|
355
|
+
<div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
|
|
356
|
+
workspace: {
|
|
357
|
+
branches: [
|
|
358
|
+
{ name: "main", channel: false },
|
|
359
|
+
{ name: "next", channel: "beta" },
|
|
360
|
+
],
|
|
361
|
+
},
|
|
362
|
+
}
|
|
363
|
+
</code></pre>
|
|
364
|
+
</div></div>
|
|
365
|
+
</div>
|
|
366
|
+
|
|
367
|
+
## `package`
|
|
368
|
+
|
|
369
|
+
Définit un package à versionner. Vous pouvez en avoir un ou plusieurs.
|
|
370
|
+
|
|
371
|
+
| Champ | Requis | Défaut | Description |
|
|
372
|
+
| --------------- | ------ | --------------------- | ----------------------------------------------------------- |
|
|
373
|
+
| `name` | oui | — | Identifiant du package, utilisé dans le préfixe du tag git |
|
|
374
|
+
| `path` | oui | — | Chemin relatif vers le répertoire du package |
|
|
375
|
+
| `changelog` | non | `{path}/CHANGELOG.md` | Chemin vers le fichier changelog |
|
|
376
|
+
| `sharedPaths` | non | `[]` | Chemins qui déclenchent ce package lorsqu'ils sont modifiés |
|
|
377
|
+
| `versioning` | non | hérité du workspace | Surcharger la stratégie de versionnage pour ce package |
|
|
378
|
+
| `tagTemplate` | non | hérité du workspace | Surcharger le modèle de tag pour ce package |
|
|
379
|
+
| `latestTag` | non | hérité du workspace | Surcharger le tag alias flottant pour ce package |
|
|
380
|
+
| `versionSource` | non | hérité du workspace | Surcharger la résolution tag / fichier pour ce package |
|
|
381
|
+
|
|
382
|
+
### `versionedFiles`
|
|
383
|
+
|
|
384
|
+
Fichiers dans lesquels le numéro de version doit être mis à jour.
|
|
385
|
+
|
|
386
|
+
<div class="ferr-tabs">
|
|
387
|
+
<div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
|
|
388
|
+
"package": [
|
|
389
|
+
{
|
|
390
|
+
"name": "my-app",
|
|
391
|
+
"path": ".",
|
|
392
|
+
"versionedFiles": [
|
|
393
|
+
{ "path": "Cargo.toml", "format": "toml" },
|
|
394
|
+
{ "path": "npm/package.json", "format": "json" }
|
|
395
|
+
]
|
|
396
|
+
}
|
|
397
|
+
]
|
|
398
|
+
}
|
|
399
|
+
</code></pre>
|
|
400
|
+
</div></div>
|
|
401
|
+
<div class="ferr-tab" data-label="TOML"><p class="ferr-tab__label">TOML</p><div class="ferr-tab__body"><pre><code class="language-toml">[[package]]
|
|
402
|
+
name = "my-app"
|
|
403
|
+
path = "."
|
|
404
|
+
|
|
405
|
+
[[package.versioned_files]]
|
|
406
|
+
path = "Cargo.toml"
|
|
407
|
+
format = "toml"
|
|
408
|
+
|
|
409
|
+
[[package.versioned_files]]
|
|
410
|
+
path = "npm/package.json"
|
|
411
|
+
format = "json"
|
|
412
|
+
</code></pre>
|
|
413
|
+
</div></div>
|
|
414
|
+
<div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
|
|
415
|
+
package: [
|
|
416
|
+
{
|
|
417
|
+
name: "my-app",
|
|
418
|
+
path: ".",
|
|
419
|
+
versionedFiles: [
|
|
420
|
+
{ path: "Cargo.toml", format: "toml" },
|
|
421
|
+
{ path: "npm/package.json", format: "json" },
|
|
422
|
+
],
|
|
423
|
+
},
|
|
424
|
+
],
|
|
425
|
+
}
|
|
426
|
+
</code></pre>
|
|
427
|
+
</div></div>
|
|
428
|
+
</div>
|
|
429
|
+
|
|
430
|
+
| `format` | Fichier | Champ mis à jour |
|
|
431
|
+
| -------- | ---------------------------------- | ------------------------------------------------------------------------ |
|
|
432
|
+
| `toml` | `Cargo.toml`, `pyproject.toml` | `[package].version` ou `[project].version` |
|
|
433
|
+
| `json` | `package.json` | `version` |
|
|
434
|
+
| `xml` | `pom.xml` | Premier élément `<version>` |
|
|
435
|
+
| `gradle` | `build.gradle`, `build.gradle.kts` | `version = "..."` |
|
|
436
|
+
| `helm` | `Chart.yaml` | `version` et `appVersion` (si présent) |
|
|
437
|
+
| `gomod` | `go.mod` | Pas de mise à jour de fichier — la version vient uniquement des tags git |
|
|
438
|
+
| `txt` | `VERSION`, `VERSION.txt` | Contenu entier du fichier remplacé |
|
|
439
|
+
|
|
440
|
+
### Packages versionnés par tag uniquement
|
|
441
|
+
|
|
442
|
+
`versionedFiles` est optionnel. Omettez-le (ou mettez-le à `[]`) pour les packages dont la version est communiquée entièrement via les tags git et les GitHub Releases — modules Go, images Docker, GitHub Actions, dépôts d'infrastructure.
|
|
443
|
+
|
|
444
|
+
<div class="ferr-tabs">
|
|
445
|
+
<div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
|
|
446
|
+
"package": [
|
|
447
|
+
{
|
|
448
|
+
"name": "my-action",
|
|
449
|
+
"path": ".",
|
|
450
|
+
"versionedFiles": []
|
|
451
|
+
}
|
|
452
|
+
]
|
|
453
|
+
}
|
|
454
|
+
</code></pre>
|
|
455
|
+
</div></div>
|
|
456
|
+
<div class="ferr-tab" data-label="TOML"><p class="ferr-tab__label">TOML</p><div class="ferr-tab__body"><pre><code class="language-toml">[[package]]
|
|
457
|
+
name = "my-action"
|
|
458
|
+
path = "."
|
|
459
|
+
versioned_files = []
|
|
460
|
+
</code></pre>
|
|
461
|
+
</div></div>
|
|
462
|
+
<div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
|
|
463
|
+
package: [
|
|
464
|
+
{
|
|
465
|
+
name: "my-action",
|
|
466
|
+
path: ".",
|
|
467
|
+
versionedFiles: [],
|
|
468
|
+
},
|
|
469
|
+
],
|
|
470
|
+
}
|
|
471
|
+
</code></pre>
|
|
472
|
+
</div></div>
|
|
473
|
+
</div>
|
|
474
|
+
|
|
475
|
+
FerrFlow lit la version courante depuis le dernier tag git correspondant, calcule le prochain bump à partir des conventional commits, puis crée le tag, la GitHub Release, le changelog et les floating tags éventuels — sans toucher au moindre fichier source. Les hooks s'exécutent normalement, vous pouvez donc lancer `docker build`, `docker push` ou `gh release upload` depuis `postPublish` en utilisant `FERRFLOW_NEW_VERSION`.
|
|
476
|
+
|
|
477
|
+
<aside class="ferr-aside ferr-aside--note"><div class="ferr-aside__body"><p>Avant la v5.1, les packages sans <code>versionedFiles</code> étaient silencieusement ignorés. Si vous vous appuyiez sur ce comportement pour exclure un package d'une release, retirez-le plutôt de la config.</p>
|
|
478
|
+
</div></aside>
|
|
479
|
+
|
|
480
|
+
## `hooks`
|
|
481
|
+
|
|
482
|
+
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).
|
|
483
|
+
|
|
484
|
+
### Cycle de vie
|
|
485
|
+
|
|
486
|
+
```
|
|
487
|
+
calcul du bump
|
|
488
|
+
↓
|
|
489
|
+
pre_bump ← valider l'état, vérifier les prérequis
|
|
490
|
+
↓
|
|
491
|
+
écriture des fichiers de version
|
|
492
|
+
↓
|
|
493
|
+
génération du changelog
|
|
494
|
+
↓
|
|
495
|
+
post_bump ← modifier d'autres fichiers, ou réécrire le changelog qui vient d'être généré
|
|
496
|
+
↓
|
|
497
|
+
pre_commit ← vérifier les changements stagés, lancer les linters
|
|
498
|
+
↓
|
|
499
|
+
git commit
|
|
500
|
+
↓
|
|
501
|
+
post_commit ← réagir au commit de release
|
|
502
|
+
↓
|
|
503
|
+
pre_tag ← smoke-test de l'arbre bumpé avant la pose du tag
|
|
504
|
+
↓
|
|
505
|
+
git tag
|
|
506
|
+
↓
|
|
507
|
+
post_tag ← cargo publish avant le push (récupérable en cas d'échec)
|
|
508
|
+
↓
|
|
509
|
+
pre_publish ← lancer les tests sur le commit taggé, builder les artefacts
|
|
510
|
+
↓
|
|
511
|
+
git push + création de la release
|
|
512
|
+
↓
|
|
513
|
+
post_publish ← pousser les images Docker, notifier Slack, publier les packages
|
|
514
|
+
|
|
515
|
+
pre_release ← (mode PR) après l'ouverture de la PR de release, avant le merge
|
|
516
|
+
on_success ← une fois, après une release entièrement réussie
|
|
517
|
+
on_error ← une fois, quand la release échoue ($FERRFLOW_ERROR_CODE)
|
|
518
|
+
```
|
|
519
|
+
|
|
520
|
+
### Réécrire le changelog depuis un hook
|
|
521
|
+
|
|
522
|
+
`post_bump` s'exécute après la génération et l'écriture de la section de changelog, et la reçoit dans `FERRFLOW_CHANGELOG`. Un hook peut réécrire `CHANGELOG.md` et FerrFlow reprend la modification : le fichier réécrit est commité, et c'est aussi lui qui alimente le tag git, le corps de la release sur la forge et le commit de release.
|
|
523
|
+
|
|
524
|
+
Cela suffit à transformer des sujets de commit en prose sans que FerrFlow ait à savoir comment vous vous y prenez :
|
|
525
|
+
|
|
526
|
+
```bash
|
|
527
|
+
#!/bin/sh
|
|
528
|
+
# Lit la section générée depuis $FERRFLOW_CHANGELOG, réécrit la prose dans
|
|
529
|
+
# CHANGELOG.md. N'importe quel outil convient, y compris aucun.
|
|
530
|
+
votre-reecrivain --input "$FERRFLOW_CHANGELOG" --write CHANGELOG.md
|
|
531
|
+
```
|
|
532
|
+
|
|
533
|
+
```json
|
|
534
|
+
{ "workspace": { "hooks": { "postBump": "sh ./scripts/prose.sh" } } }
|
|
535
|
+
```
|
|
536
|
+
|
|
537
|
+
Deux points à connaître. Si la réécriture perd le titre `## [version]`, FerrFlow retombe sur le texte généré plutôt que de publier des notes de release vides. Et rien de tout cela ne s'exécute sous `--dry-run`, où aucun changelog n'est écrit : prévisualisez donc le résultat par une vraie release sur une branche plutôt que d'attendre que `--dry-run` vous le montre.
|
|
538
|
+
|
|
539
|
+
La reproductibilité est à votre charge. Le changelog est commité et tagué, donc ce que produit le hook est définitif. Un réécrivain qui donne une réponse différente à chaque exécution rend les releases non reproductibles.
|
|
540
|
+
|
|
541
|
+
### Configuration
|
|
542
|
+
|
|
543
|
+
<div class="ferr-tabs">
|
|
544
|
+
<div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
|
|
545
|
+
"workspace": {
|
|
546
|
+
"hooks": {
|
|
547
|
+
"preBump": "cargo test",
|
|
548
|
+
"postBump": "node scripts/sync-deps.js",
|
|
549
|
+
"preCommit": "cargo fmt --check",
|
|
550
|
+
"prePublish": "cargo build --release",
|
|
551
|
+
"postPublish": "make docker-push && ./scripts/notify.sh",
|
|
552
|
+
"onFailure": "abort"
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
</code></pre>
|
|
557
|
+
</div></div>
|
|
558
|
+
<div class="ferr-tab" data-label="TOML"><p class="ferr-tab__label">TOML</p><div class="ferr-tab__body"><pre><code class="language-toml">[hooks]
|
|
559
|
+
pre_bump = "cargo test"
|
|
560
|
+
post_bump = "node scripts/sync-deps.js"
|
|
561
|
+
pre_commit = "cargo fmt --check"
|
|
562
|
+
pre_publish = "cargo build --release"
|
|
563
|
+
post_publish = "make docker-push && ./scripts/notify.sh"
|
|
564
|
+
on_failure = "abort"
|
|
565
|
+
</code></pre>
|
|
566
|
+
</div></div>
|
|
567
|
+
<div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
|
|
568
|
+
workspace: {
|
|
569
|
+
hooks: {
|
|
570
|
+
preBump: "cargo test",
|
|
571
|
+
postBump: "node scripts/sync-deps.js",
|
|
572
|
+
preCommit: "cargo fmt --check",
|
|
573
|
+
prePublish: "cargo build --release",
|
|
574
|
+
postPublish: "make docker-push && ./scripts/notify.sh",
|
|
575
|
+
onFailure: "abort",
|
|
576
|
+
},
|
|
577
|
+
},
|
|
578
|
+
}
|
|
579
|
+
</code></pre>
|
|
580
|
+
</div></div>
|
|
581
|
+
</div>
|
|
582
|
+
|
|
583
|
+
| Champ | Type | Défaut | Description |
|
|
584
|
+
| ------------- | ------ | --------- | ----------------------------------------------------------------------------------------------------- |
|
|
585
|
+
| `preBump` | string | — | Exécuté après le calcul du bump, avant l'écriture des fichiers de version |
|
|
586
|
+
| `postBump` | string | — | Exécuté après l'écriture des fichiers de version |
|
|
587
|
+
| `preCommit` | string | — | Exécuté après le changelog, avant le commit git |
|
|
588
|
+
| `postCommit` | string | — | Exécuté après le commit de release, avant le tag |
|
|
589
|
+
| `preTag` | string | — | Exécuté après le commit, juste avant `git tag` |
|
|
590
|
+
| `postTag` | string | — | Exécuté après la création des tags, avant le push |
|
|
591
|
+
| `prePublish` | string | — | Exécuté après le commit+tag, avant le push |
|
|
592
|
+
| `postPublish` | string | — | Exécuté après le push et la création de la release |
|
|
593
|
+
| `preRelease` | string | — | Mode PR uniquement : après l'ouverture de la PR de release, avant le merge (une fois) |
|
|
594
|
+
| `onSuccess` | string | — | Exécuté une fois après une release entièrement réussie |
|
|
595
|
+
| `onError` | string | — | Exécuté une fois quand la release échoue ; définit `FERRFLOW_ERROR_CODE` (une fois) |
|
|
596
|
+
| `onFailure` | string | `"abort"` | Stratégie — `"abort"` annule la release en cas d'échec de hook, `"continue"` affiche un avertissement |
|
|
597
|
+
|
|
598
|
+
### Variables d'environnement
|
|
599
|
+
|
|
600
|
+
Chaque hook reçoit ces variables :
|
|
601
|
+
|
|
602
|
+
| Variable | Description | Exemple |
|
|
603
|
+
| ---------------------------- | --------------------------------------------------------------- | ---------------------------------------------------------------------- |
|
|
604
|
+
| `FERRFLOW_PACKAGE` | Nom du package | `api` |
|
|
605
|
+
| `FERRFLOW_OLD_VERSION` | Version avant le bump (vide pour la première release) | `1.2.3` |
|
|
606
|
+
| `FERRFLOW_NEW_VERSION` | Version après le bump | `1.3.0` |
|
|
607
|
+
| `FERRFLOW_BUMP_TYPE` | `major`, `minor`, `patch` ou `none` | `minor` |
|
|
608
|
+
| `FERRFLOW_TAG` | Nom complet du tag git | `api@v1.3.0` |
|
|
609
|
+
| `FERRFLOW_DRY_RUN` | `true` si `--dry-run` est activé | `false` |
|
|
610
|
+
| `FERRFLOW_PACKAGE_PATH` | Chemin absolu vers la racine du package | `/home/user/repo/packages/api` |
|
|
611
|
+
| `FERRFLOW_IS_PRERELEASE` | `true` sur un canal de pré-release | `false` |
|
|
612
|
+
| `FERRFLOW_MONOREPO` | `true` sur une release monorepo | `false` |
|
|
613
|
+
| `FERRFLOW_CHANGELOG` | Section de changelog rendue pour ce bump | `### Features\n- ...` |
|
|
614
|
+
| `FERRFLOW_COMMITS_JSON` | Tableau JSON de `{ hash, message, type?, scope?, breaking }` | `[{"hash":"a1b2","message":"feat: x","type":"feat","breaking":false}]` |
|
|
615
|
+
| `FERRFLOW_BUMPED_FILES_JSON` | Tableau JSON de `{ path, format }` modifiés par la release | `[{"path":"package.json","format":"json"}]` |
|
|
616
|
+
| `FERRFLOW_ALL_PACKAGES_JSON` | Tableau JSON de `{ name, version, bump }` publiés dans ce batch | `[{"name":"api","version":"1.3.0","bump":"minor"}]` |
|
|
617
|
+
| `FERRFLOW_RELEASE_URL` | URL de la release forge créée (`postPublish` uniquement) | `https://github.com/acme/api/releases/tag/v1.3.0` |
|
|
618
|
+
| `FERRFLOW_ERROR_CODE` | Code d'erreur, défini uniquement pour `onError` | `E2005` |
|
|
619
|
+
|
|
620
|
+
`FERRFLOW_COMMITS_JSON`, `FERRFLOW_BUMPED_FILES_JSON` et `FERRFLOW_ALL_PACKAGES_JSON` sont des chaînes JSON — passez-les dans `jq` depuis vos hooks shell.
|
|
621
|
+
|
|
622
|
+
Pour les hooks exécutés une seule fois par run (`preRelease`, `onSuccess`, `onError`), les variables par package sont vides et `FERRFLOW_TAG` contient tous les tags publiés séparés par des virgules.
|
|
623
|
+
|
|
624
|
+
`onFailure` est la **stratégie** d'échec (`abort` / `continue`), pas une commande. La commande exécutée _quand_ une release échoue est `onError`, qui reçoit le `FERRFLOW_ERROR_CODE` fautif.
|
|
625
|
+
|
|
626
|
+
### Hooks par package
|
|
627
|
+
|
|
628
|
+
Les hooks au niveau du package **remplacent** les hooks du workspace pour ce package (ils ne sont pas fusionnés).
|
|
629
|
+
|
|
630
|
+
<div class="ferr-tabs">
|
|
631
|
+
<div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
|
|
632
|
+
"workspace": {
|
|
633
|
+
"hooks": {
|
|
634
|
+
"preBump": "echo releasing $FERRFLOW_PACKAGE",
|
|
635
|
+
"postPublish": "make notify"
|
|
636
|
+
}
|
|
637
|
+
},
|
|
638
|
+
"package": [
|
|
639
|
+
{
|
|
640
|
+
"name": "api",
|
|
641
|
+
"path": "packages/api",
|
|
642
|
+
"hooks": {
|
|
643
|
+
"preBump": "cargo test"
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
]
|
|
647
|
+
}
|
|
648
|
+
</code></pre>
|
|
649
|
+
</div></div>
|
|
650
|
+
<div class="ferr-tab" data-label="TOML"><p class="ferr-tab__label">TOML</p><div class="ferr-tab__body"><pre><code class="language-toml">[hooks]
|
|
651
|
+
pre_bump = "echo releasing $FERRFLOW_PACKAGE"
|
|
652
|
+
post_publish = "make notify"
|
|
653
|
+
|
|
654
|
+
[[package]]
|
|
655
|
+
name = "api"
|
|
656
|
+
path = "packages/api"
|
|
657
|
+
|
|
658
|
+
[package.hooks]
|
|
659
|
+
pre_bump = "cargo test"
|
|
660
|
+
</code></pre>
|
|
661
|
+
</div></div>
|
|
662
|
+
<div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
|
|
663
|
+
workspace: {
|
|
664
|
+
hooks: {
|
|
665
|
+
preBump: "echo releasing $FERRFLOW_PACKAGE",
|
|
666
|
+
postPublish: "make notify",
|
|
667
|
+
},
|
|
668
|
+
},
|
|
669
|
+
package: [
|
|
670
|
+
{
|
|
671
|
+
name: "api",
|
|
672
|
+
path: "packages/api",
|
|
673
|
+
hooks: {
|
|
674
|
+
preBump: "cargo test",
|
|
675
|
+
},
|
|
676
|
+
},
|
|
677
|
+
],
|
|
678
|
+
}
|
|
679
|
+
</code></pre>
|
|
680
|
+
</div></div>
|
|
681
|
+
</div>
|
|
682
|
+
|
|
683
|
+
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.
|
|
684
|
+
|
|
685
|
+
### Comportement
|
|
686
|
+
|
|
687
|
+
- **`--dry-run`** : les hooks sont affichés mais non exécutés.
|
|
688
|
+
- **`--verbose`** : la sortie stdout/stderr des hooks est diffusée en direct. Sinon, la sortie n'est affichée qu'en cas d'échec.
|
|
689
|
+
- Les fichiers modifiés par les hooks `postBump` ou `preCommit` sont automatiquement inclus dans le commit de release.
|
|
690
|
+
|
|
691
|
+
## Exemples complets
|
|
692
|
+
|
|
693
|
+
### Repo unique
|
|
694
|
+
|
|
695
|
+
<div class="ferr-tabs">
|
|
696
|
+
<div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
|
|
697
|
+
"$schema": "https://ferrflow.com/schema/ferrflow.json",
|
|
698
|
+
"workspace": {
|
|
699
|
+
"tagTemplate": "v{version}"
|
|
700
|
+
},
|
|
701
|
+
"package": [
|
|
702
|
+
{
|
|
703
|
+
"name": "ferrflow",
|
|
704
|
+
"path": ".",
|
|
705
|
+
"changelog": "CHANGELOG.md",
|
|
706
|
+
"versionedFiles": [
|
|
707
|
+
{ "path": "Cargo.toml", "format": "toml" },
|
|
708
|
+
{ "path": "npm/package.json", "format": "json" }
|
|
709
|
+
]
|
|
710
|
+
}
|
|
711
|
+
]
|
|
712
|
+
}
|
|
713
|
+
</code></pre>
|
|
714
|
+
</div></div>
|
|
715
|
+
<div class="ferr-tab" data-label="TOML"><p class="ferr-tab__label">TOML</p><div class="ferr-tab__body"><pre><code class="language-toml">[workspace]
|
|
716
|
+
tag_template = "v{version}"
|
|
717
|
+
|
|
718
|
+
[[package]]
|
|
719
|
+
name = "ferrflow"
|
|
720
|
+
path = "."
|
|
721
|
+
changelog = "CHANGELOG.md"
|
|
722
|
+
|
|
723
|
+
[[package.versioned_files]]
|
|
724
|
+
path = "Cargo.toml"
|
|
725
|
+
format = "toml"
|
|
726
|
+
|
|
727
|
+
[[package.versioned_files]]
|
|
728
|
+
path = "npm/package.json"
|
|
729
|
+
format = "json"
|
|
730
|
+
</code></pre>
|
|
731
|
+
</div></div>
|
|
732
|
+
<div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
|
|
733
|
+
$schema: "https://ferrflow.com/schema/ferrflow.json",
|
|
734
|
+
workspace: {
|
|
735
|
+
tagTemplate: "v{version}",
|
|
736
|
+
},
|
|
737
|
+
package: [
|
|
738
|
+
{
|
|
739
|
+
name: "ferrflow",
|
|
740
|
+
path: ".",
|
|
741
|
+
changelog: "CHANGELOG.md",
|
|
742
|
+
versionedFiles: [
|
|
743
|
+
{ path: "Cargo.toml", format: "toml" },
|
|
744
|
+
{ path: "npm/package.json", format: "json" },
|
|
745
|
+
],
|
|
746
|
+
},
|
|
747
|
+
],
|
|
748
|
+
}
|
|
749
|
+
</code></pre>
|
|
750
|
+
</div></div>
|
|
751
|
+
</div>
|
|
752
|
+
|
|
753
|
+
### Monorepo
|
|
754
|
+
|
|
755
|
+
<div class="ferr-tabs">
|
|
756
|
+
<div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
|
|
757
|
+
"$schema": "https://ferrflow.com/schema/ferrflow.json",
|
|
758
|
+
"workspace": {
|
|
759
|
+
"tagTemplate": "{name}@v{version}"
|
|
760
|
+
},
|
|
761
|
+
"package": [
|
|
762
|
+
{
|
|
763
|
+
"name": "api",
|
|
764
|
+
"path": "packages/api",
|
|
765
|
+
"changelog": "packages/api/CHANGELOG.md",
|
|
766
|
+
"sharedPaths": ["packages/shared/"],
|
|
767
|
+
"versionedFiles": [
|
|
768
|
+
{ "path": "packages/api/Cargo.toml", "format": "toml" }
|
|
769
|
+
]
|
|
770
|
+
},
|
|
771
|
+
{
|
|
772
|
+
"name": "site",
|
|
773
|
+
"path": "packages/site",
|
|
774
|
+
"changelog": "packages/site/CHANGELOG.md",
|
|
775
|
+
"sharedPaths": ["packages/shared/"],
|
|
776
|
+
"versionedFiles": [
|
|
777
|
+
{ "path": "packages/site/package.json", "format": "json" }
|
|
778
|
+
]
|
|
779
|
+
}
|
|
780
|
+
]
|
|
781
|
+
}
|
|
782
|
+
</code></pre>
|
|
783
|
+
</div></div>
|
|
784
|
+
<div class="ferr-tab" data-label="TOML"><p class="ferr-tab__label">TOML</p><div class="ferr-tab__body"><pre><code class="language-toml">[workspace]
|
|
785
|
+
tag_template = "{name}@v{version}"
|
|
786
|
+
|
|
787
|
+
[[package]]
|
|
788
|
+
name = "api"
|
|
789
|
+
path = "packages/api"
|
|
790
|
+
changelog = "packages/api/CHANGELOG.md"
|
|
791
|
+
shared_paths = ["packages/shared/"]
|
|
792
|
+
|
|
793
|
+
[[package.versioned_files]]
|
|
794
|
+
path = "packages/api/Cargo.toml"
|
|
795
|
+
format = "toml"
|
|
796
|
+
|
|
797
|
+
[[package]]
|
|
798
|
+
name = "site"
|
|
799
|
+
path = "packages/site"
|
|
800
|
+
changelog = "packages/site/CHANGELOG.md"
|
|
801
|
+
shared_paths = ["packages/shared/"]
|
|
802
|
+
|
|
803
|
+
[[package.versioned_files]]
|
|
804
|
+
path = "packages/site/package.json"
|
|
805
|
+
format = "json"
|
|
806
|
+
</code></pre>
|
|
807
|
+
</div></div>
|
|
808
|
+
<div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
|
|
809
|
+
$schema: "https://ferrflow.com/schema/ferrflow.json",
|
|
810
|
+
workspace: {
|
|
811
|
+
tagTemplate: "{name}@v{version}",
|
|
812
|
+
},
|
|
813
|
+
package: [
|
|
814
|
+
{
|
|
815
|
+
name: "api",
|
|
816
|
+
path: "packages/api",
|
|
817
|
+
changelog: "packages/api/CHANGELOG.md",
|
|
818
|
+
sharedPaths: ["packages/shared/"],
|
|
819
|
+
versionedFiles: [
|
|
820
|
+
{ path: "packages/api/Cargo.toml", format: "toml" },
|
|
821
|
+
],
|
|
822
|
+
},
|
|
823
|
+
{
|
|
824
|
+
name: "site",
|
|
825
|
+
path: "packages/site",
|
|
826
|
+
changelog: "packages/site/CHANGELOG.md",
|
|
827
|
+
sharedPaths: ["packages/shared/"],
|
|
828
|
+
versionedFiles: [
|
|
829
|
+
{ path: "packages/site/package.json", format: "json" },
|
|
830
|
+
],
|
|
831
|
+
},
|
|
832
|
+
],
|
|
833
|
+
}
|
|
834
|
+
</code></pre>
|
|
835
|
+
</div></div>
|
|
836
|
+
</div>
|
|
837
|
+
|
|
838
|
+
<aside class="ferr-aside ferr-aside--tip"><div class="ferr-aside__body"><p>Exécutez <code>ferrflow init</code> pour générer automatiquement un fichier de configuration basé sur ce que FerrFlow détecte dans votre repo.</p>
|
|
839
|
+
</div></aside>
|