@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,150 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Formats supportés
|
|
3
|
+
description: Formats de fichiers de version que FerrFlow peut lire et mettre à jour.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## TOML
|
|
7
|
+
|
|
8
|
+
Utilisé par Rust (`Cargo.toml`) et Python (`pyproject.toml`).
|
|
9
|
+
|
|
10
|
+
FerrFlow met à jour le champ `version` sous `[package]`, `[project]` ou `[tool.poetry]`.
|
|
11
|
+
|
|
12
|
+
```toml
|
|
13
|
+
[package]
|
|
14
|
+
name = "my-crate"
|
|
15
|
+
version = "1.2.3" # ← mis à jour
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## JSON
|
|
19
|
+
|
|
20
|
+
Utilisé par Node.js (`package.json`).
|
|
21
|
+
|
|
22
|
+
FerrFlow met à jour le champ `version` de premier niveau.
|
|
23
|
+
|
|
24
|
+
```json
|
|
25
|
+
{
|
|
26
|
+
"name": "my-package",
|
|
27
|
+
"version": "1.2.3"
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## XML
|
|
32
|
+
|
|
33
|
+
Utilisé par Java/Maven (`pom.xml`).
|
|
34
|
+
|
|
35
|
+
FerrFlow met à jour le premier élément `<version>` rencontré.
|
|
36
|
+
|
|
37
|
+
```xml
|
|
38
|
+
<project>
|
|
39
|
+
<groupId>com.example</groupId>
|
|
40
|
+
<artifactId>my-app</artifactId>
|
|
41
|
+
<version>1.2.3</version> <!-- mis à jour -->
|
|
42
|
+
</project>
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Gradle
|
|
46
|
+
|
|
47
|
+
Utilisé par les projets Java/Kotlin Gradle (`build.gradle`, `build.gradle.kts`).
|
|
48
|
+
|
|
49
|
+
FerrFlow met à jour l'assignation `version = "..."`.
|
|
50
|
+
|
|
51
|
+
```groovy
|
|
52
|
+
version = "1.2.3" // mis à jour
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Texte brut
|
|
56
|
+
|
|
57
|
+
Utilisé pour les fichiers de version simples (`VERSION`, `VERSION.txt`).
|
|
58
|
+
|
|
59
|
+
FerrFlow remplace l'intégralité du contenu du fichier par le numéro de version.
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
1.2.3
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Go modules
|
|
66
|
+
|
|
67
|
+
Utilisé par les projets Go (`go.mod`).
|
|
68
|
+
|
|
69
|
+
Les modules Go utilisent directement les tags git — FerrFlow ne modifie **pas** `go.mod`. La version est dérivée entièrement du tag git (`v1.2.3` ou `{name}@v1.2.3`).
|
|
70
|
+
|
|
71
|
+
## Helm
|
|
72
|
+
|
|
73
|
+
Utilisé par les charts Helm Kubernetes (`Chart.yaml`).
|
|
74
|
+
|
|
75
|
+
FerrFlow met à jour le champ `version` et, lorsqu'il est présent, maintient `appVersion` synchronisé.
|
|
76
|
+
|
|
77
|
+
```yaml
|
|
78
|
+
apiVersion: v2
|
|
79
|
+
name: my-app
|
|
80
|
+
version: 1.2.3 # ← mis à jour
|
|
81
|
+
appVersion: '1.2.3' # ← mis à jour si présent
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Cabal
|
|
85
|
+
|
|
86
|
+
Utilisé par les packages Haskell (`*.cabal`).
|
|
87
|
+
|
|
88
|
+
FerrFlow met à jour le champ `version` de premier niveau. Le champ `cabal-version`, qui déclare le format du fichier et non la version du package, n'est jamais modifié — pas plus qu'un `version:` indenté à l'intérieur d'une stanza.
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
cabal-version: 2.4 # ← laissé tel quel
|
|
92
|
+
name: my-package
|
|
93
|
+
version: 1.2.3 # ← mis à jour
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## CMake
|
|
97
|
+
|
|
98
|
+
Utilisé par les projets C / C++ (`CMakeLists.txt`).
|
|
99
|
+
|
|
100
|
+
FerrFlow met à jour l'argument `VERSION` de l'appel `project()`, y compris lorsqu'il est réparti sur plusieurs lignes. `cmake_minimum_required(VERSION …)` — la version minimale de l'outil CMake — n'est pas touché.
|
|
101
|
+
|
|
102
|
+
```cmake
|
|
103
|
+
cmake_minimum_required(VERSION 3.20) # ← laissé tel quel
|
|
104
|
+
|
|
105
|
+
project(MyProject
|
|
106
|
+
VERSION 1.2.3 # ← mis à jour
|
|
107
|
+
LANGUAGES CXX)
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Plusieurs fichiers par package
|
|
111
|
+
|
|
112
|
+
Un package peut avoir autant d'entrées de fichiers versionnés que nécessaire :
|
|
113
|
+
|
|
114
|
+
<div class="ferr-tabs">
|
|
115
|
+
<div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
|
|
116
|
+
"package": [
|
|
117
|
+
{
|
|
118
|
+
"versionedFiles": [
|
|
119
|
+
{ "path": "Cargo.toml", "format": "toml" },
|
|
120
|
+
{ "path": "npm/package.json", "format": "json" }
|
|
121
|
+
]
|
|
122
|
+
}
|
|
123
|
+
]
|
|
124
|
+
}
|
|
125
|
+
</code></pre>
|
|
126
|
+
</div></div>
|
|
127
|
+
<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.versioned_files]]
|
|
128
|
+
path = "Cargo.toml"
|
|
129
|
+
format = "toml"
|
|
130
|
+
|
|
131
|
+
[[package.versioned_files]]
|
|
132
|
+
path = "npm/package.json"
|
|
133
|
+
format = "json"
|
|
134
|
+
</code></pre>
|
|
135
|
+
</div></div>
|
|
136
|
+
<div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
|
|
137
|
+
package: [
|
|
138
|
+
{
|
|
139
|
+
versionedFiles: [
|
|
140
|
+
{ path: "Cargo.toml", format: "toml" },
|
|
141
|
+
{ path: "npm/package.json", format: "json" },
|
|
142
|
+
],
|
|
143
|
+
},
|
|
144
|
+
],
|
|
145
|
+
}
|
|
146
|
+
</code></pre>
|
|
147
|
+
</div></div>
|
|
148
|
+
</div>
|
|
149
|
+
|
|
150
|
+
Les deux fichiers seront mis à jour avec la même version avant le commit git.
|
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Monorepo
|
|
3
|
+
description: Versionner plusieurs packages indépendamment dans un seul repository.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
FerrFlow considère un repository comme un monorepo lorsque la configuration définit plus d'un package. Chaque package est versionné indépendamment en fonction de son propre historique git.
|
|
7
|
+
|
|
8
|
+
## Isolation des packages
|
|
9
|
+
|
|
10
|
+
FerrFlow utilise les préfixes de chemin pour déterminer quels commits appartiennent à quel package. Seuls les commits qui touchent des fichiers sous `path` (ou `sharedPaths`) déclenchent une release pour ce package.
|
|
11
|
+
|
|
12
|
+
<div class="ferr-tabs">
|
|
13
|
+
<div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
|
|
14
|
+
"package": [
|
|
15
|
+
{
|
|
16
|
+
"name": "api",
|
|
17
|
+
"path": "packages/api"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"name": "site",
|
|
21
|
+
"path": "packages/site"
|
|
22
|
+
}
|
|
23
|
+
]
|
|
24
|
+
}
|
|
25
|
+
</code></pre>
|
|
26
|
+
</div></div>
|
|
27
|
+
<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]]
|
|
28
|
+
name = "api"
|
|
29
|
+
path = "packages/api"
|
|
30
|
+
|
|
31
|
+
[[package]]
|
|
32
|
+
name = "site"
|
|
33
|
+
path = "packages/site"
|
|
34
|
+
</code></pre>
|
|
35
|
+
|
|
36
|
+
</div></div>
|
|
37
|
+
<div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
|
|
38
|
+
package: [
|
|
39
|
+
{
|
|
40
|
+
name: "api",
|
|
41
|
+
path: "packages/api",
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
name: "site",
|
|
45
|
+
path: "packages/site",
|
|
46
|
+
},
|
|
47
|
+
],
|
|
48
|
+
}
|
|
49
|
+
</code></pre>
|
|
50
|
+
</div></div>
|
|
51
|
+
<div class="ferr-tab" data-label="YAML"><p class="ferr-tab__label">YAML</p><div class="ferr-tab__body"><pre><code class="language-yaml">package:
|
|
52
|
+
- name: api
|
|
53
|
+
path: packages/api
|
|
54
|
+
- name: site
|
|
55
|
+
path: packages/site
|
|
56
|
+
</code></pre>
|
|
57
|
+
</div></div>
|
|
58
|
+
</div>
|
|
59
|
+
|
|
60
|
+
## Dépendances partagées
|
|
61
|
+
|
|
62
|
+
Si vous avez du code partagé entre packages (ex. une bibliothèque `packages/shared/`), déclarez-le comme entrée `sharedPaths`. Un changement dans un chemin partagé déclenche une release pour chaque package qui le référence :
|
|
63
|
+
|
|
64
|
+
<div class="ferr-tabs">
|
|
65
|
+
<div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
|
|
66
|
+
"package": [
|
|
67
|
+
{
|
|
68
|
+
"name": "api",
|
|
69
|
+
"path": "packages/api",
|
|
70
|
+
"sharedPaths": ["packages/shared/"]
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"name": "site",
|
|
74
|
+
"path": "packages/site",
|
|
75
|
+
"sharedPaths": ["packages/shared/"]
|
|
76
|
+
}
|
|
77
|
+
]
|
|
78
|
+
}
|
|
79
|
+
</code></pre>
|
|
80
|
+
</div></div>
|
|
81
|
+
<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]]
|
|
82
|
+
name = "api"
|
|
83
|
+
path = "packages/api"
|
|
84
|
+
shared_paths = ["packages/shared/"]
|
|
85
|
+
|
|
86
|
+
[[package]]
|
|
87
|
+
name = "site"
|
|
88
|
+
path = "packages/site"
|
|
89
|
+
shared_paths = ["packages/shared/"]
|
|
90
|
+
</code></pre>
|
|
91
|
+
|
|
92
|
+
</div></div>
|
|
93
|
+
<div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
|
|
94
|
+
package: [
|
|
95
|
+
{
|
|
96
|
+
name: "api",
|
|
97
|
+
path: "packages/api",
|
|
98
|
+
sharedPaths: ["packages/shared/"],
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
name: "site",
|
|
102
|
+
path: "packages/site",
|
|
103
|
+
sharedPaths: ["packages/shared/"],
|
|
104
|
+
},
|
|
105
|
+
],
|
|
106
|
+
}
|
|
107
|
+
</code></pre>
|
|
108
|
+
</div></div>
|
|
109
|
+
<div class="ferr-tab" data-label="YAML"><p class="ferr-tab__label">YAML</p><div class="ferr-tab__body"><pre><code class="language-yaml">package:
|
|
110
|
+
- name: api
|
|
111
|
+
path: packages/api
|
|
112
|
+
sharedPaths:
|
|
113
|
+
- packages/shared/
|
|
114
|
+
- name: site
|
|
115
|
+
path: packages/site
|
|
116
|
+
sharedPaths:
|
|
117
|
+
- packages/shared/
|
|
118
|
+
</code></pre>
|
|
119
|
+
</div></div>
|
|
120
|
+
</div>
|
|
121
|
+
|
|
122
|
+
## Dependances entre packages
|
|
123
|
+
|
|
124
|
+
Utilisez `dependsOn` pour declarer qu'un package depend d'un autre. Quand une dependance est publiee, le package dependant recoit automatiquement un bump patch — meme si aucun de ses propres fichiers n'a change. La cascade est transitive : si `app` depend de `cli` et `cli` depend de `core`, publier `core` bumpe aussi `cli` et `app`.
|
|
125
|
+
|
|
126
|
+
<div class="ferr-tabs">
|
|
127
|
+
<div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
|
|
128
|
+
"package": [
|
|
129
|
+
{
|
|
130
|
+
"name": "core",
|
|
131
|
+
"path": "packages/core"
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
"name": "cli",
|
|
135
|
+
"path": "packages/cli",
|
|
136
|
+
"dependsOn": ["core"]
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
"name": "app",
|
|
140
|
+
"path": "packages/app",
|
|
141
|
+
"dependsOn": ["cli"]
|
|
142
|
+
}
|
|
143
|
+
]
|
|
144
|
+
}
|
|
145
|
+
</code></pre>
|
|
146
|
+
</div></div>
|
|
147
|
+
<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]]
|
|
148
|
+
name = "core"
|
|
149
|
+
path = "packages/core"
|
|
150
|
+
|
|
151
|
+
[[package]]
|
|
152
|
+
name = "cli"
|
|
153
|
+
path = "packages/cli"
|
|
154
|
+
depends_on = ["core"]
|
|
155
|
+
|
|
156
|
+
[[package]]
|
|
157
|
+
name = "app"
|
|
158
|
+
path = "packages/app"
|
|
159
|
+
depends_on = ["cli"]
|
|
160
|
+
</code></pre>
|
|
161
|
+
|
|
162
|
+
</div></div>
|
|
163
|
+
<div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
|
|
164
|
+
package: [
|
|
165
|
+
{
|
|
166
|
+
name: "core",
|
|
167
|
+
path: "packages/core",
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
name: "cli",
|
|
171
|
+
path: "packages/cli",
|
|
172
|
+
dependsOn: ["core"],
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
name: "app",
|
|
176
|
+
path: "packages/app",
|
|
177
|
+
dependsOn: ["cli"],
|
|
178
|
+
},
|
|
179
|
+
],
|
|
180
|
+
}
|
|
181
|
+
</code></pre>
|
|
182
|
+
</div></div>
|
|
183
|
+
<div class="ferr-tab" data-label="YAML"><p class="ferr-tab__label">YAML</p><div class="ferr-tab__body"><pre><code class="language-yaml">package:
|
|
184
|
+
- name: core
|
|
185
|
+
path: packages/core
|
|
186
|
+
- name: cli
|
|
187
|
+
path: packages/cli
|
|
188
|
+
dependsOn:
|
|
189
|
+
- core
|
|
190
|
+
- name: app
|
|
191
|
+
path: packages/app
|
|
192
|
+
dependsOn:
|
|
193
|
+
- cli
|
|
194
|
+
</code></pre>
|
|
195
|
+
</div></div>
|
|
196
|
+
</div>
|
|
197
|
+
|
|
198
|
+
<aside class="ferr-aside ferr-aside--note"><div class="ferr-aside__body"><p><code>dependsOn</code> est different de <code>sharedPaths</code>. Les chemins partages declenchent un bump quand des fichiers dans le repertoire partage changent. <code>dependsOn</code> declenche un bump quand un autre <strong>package</strong> est publie, independamment des fichiers modifies.</p>
|
|
199
|
+
</div></aside>
|
|
200
|
+
|
|
201
|
+
### Cycles de dépendances
|
|
202
|
+
|
|
203
|
+
`dependsOn` doit décrire un graphe orienté acyclique. Si deux packages dépendent l'un de l'autre — directement ou transitivement — il n'existe aucun ordre de release possible : FerrFlow s'arrête alors avec l'erreur `E8003` en nommant la boucle :
|
|
204
|
+
|
|
205
|
+
```
|
|
206
|
+
cycle detected: api → web → api
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
La vérification s'exécute avant toute écriture de version : une configuration cyclique ne produit jamais de release partielle. Cassez la boucle en supprimant l'une des arêtes `dependsOn`. Sinon, le graphe est publié dépendances d'abord : un package est toujours publié après les packages dont il dépend.
|
|
210
|
+
|
|
211
|
+
## Groupes de versions liées et fixes
|
|
212
|
+
|
|
213
|
+
Parfois, plusieurs packages doivent partager le même numéro de version, pas seulement propager un bump. `linked` et `fixed` listent des groupes de packages qui évoluent ensemble :
|
|
214
|
+
|
|
215
|
+
```toml
|
|
216
|
+
[workspace]
|
|
217
|
+
linked = [["react", "react-dom"]]
|
|
218
|
+
fixed = [["@scope/a", "@scope/b", "@scope/c"]]
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
Dès qu'**un** membre d'un groupe a un commit publiable, tous les membres sont bumpés à la même version — la plus haute que le groupe atteindrait. Un `feat` sur un membre et un `fix` sur un autre publient tout le groupe sur le minor. Les noms de packages restent distincts ; seule la version est partagée, et les membres sans commit propre sont intégrés à la release à la version partagée.
|
|
222
|
+
|
|
223
|
+
- **`linked`** — les packages partagent une ligne de version lorsqu'ils sont publiés ensemble (par exemple `react` et `react-dom` passent tous deux de `1.2.3` à `1.2.4`).
|
|
224
|
+
- **`fixed`** — les packages sont verrouillés sur une version identique en permanence. Le comportement est celui de `linked`, et `ferrflow validate` avertit en plus lorsque les versions d'un groupe `fixed` ont déjà divergé, pour repérer une édition manuelle avant que la prochaine release ne les réaligne.
|
|
225
|
+
|
|
226
|
+
Chaque groupe doit lister au moins deux packages, et un package ne peut appartenir qu'à un seul groupe `linked` ou `fixed`. Nommer un package absent de `package[]`, ou en lister un dans deux groupes, arrête la release avec une erreur claire avant toute écriture — la même garantie amont que les [cycles de dépendances](#cycles-de-dépendances).
|
|
227
|
+
|
|
228
|
+
`linked`/`fixed` et `dependsOn` se combinent : un package qui dépend d'un package groupé reçoit toujours son bump en cascade après l'alignement du groupe.
|
|
229
|
+
|
|
230
|
+
## Format des tags git
|
|
231
|
+
|
|
232
|
+
Par défaut, les tags en monorepo utilisent le format `{name}@v{version}` :
|
|
233
|
+
|
|
234
|
+
```
|
|
235
|
+
api@v1.2.0
|
|
236
|
+
site@v0.4.1
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
Configurez cela avec le champ `tagTemplate` :
|
|
240
|
+
|
|
241
|
+
<div class="ferr-tabs">
|
|
242
|
+
<div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
|
|
243
|
+
"workspace": {
|
|
244
|
+
"tagTemplate": "{name}@v{version}"
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
</code></pre>
|
|
248
|
+
</div></div>
|
|
249
|
+
<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]
|
|
250
|
+
tag_template = "{name}@v{version}"
|
|
251
|
+
</code></pre>
|
|
252
|
+
</div></div>
|
|
253
|
+
<div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
|
|
254
|
+
workspace: {
|
|
255
|
+
tagTemplate: "{name}@v{version}",
|
|
256
|
+
},
|
|
257
|
+
}
|
|
258
|
+
</code></pre>
|
|
259
|
+
</div></div>
|
|
260
|
+
<div class="ferr-tab" data-label="YAML"><p class="ferr-tab__label">YAML</p><div class="ferr-tab__body"><pre><code class="language-yaml">workspace:
|
|
261
|
+
tagTemplate: "{name}@v{version}"
|
|
262
|
+
</code></pre>
|
|
263
|
+
</div></div>
|
|
264
|
+
</div>
|
|
265
|
+
|
|
266
|
+
Pour un repo mono-package, le défaut est `v{version}` (sans préfixe de nom).
|
|
267
|
+
|
|
268
|
+
FerrFlow recherche le tag le plus récent correspondant au modèle pour déterminer quels commits sont nouveaux.
|
|
269
|
+
|
|
270
|
+
## Cadences indépendantes
|
|
271
|
+
|
|
272
|
+
Les packages sont publiés indépendamment. Dans une seule exécution de `ferrflow release` :
|
|
273
|
+
|
|
274
|
+
- `api` peut passer de `1.2.0` → `1.3.0` (nouveau commit `feat:`)
|
|
275
|
+
- `site` peut passer de `0.4.0` → `0.4.1` (uniquement des commits `fix:`)
|
|
276
|
+
- `shared` peut ne pas être publié (uniquement des commits `chore:`)
|
|
277
|
+
|
|
278
|
+
## Surcharges par package
|
|
279
|
+
|
|
280
|
+
Chaque package peut surcharger la stratégie de `versioning` et le `tagTemplate` du workspace :
|
|
281
|
+
|
|
282
|
+
<div class="ferr-tabs">
|
|
283
|
+
<div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
|
|
284
|
+
"workspace": {
|
|
285
|
+
"versioning": "semver",
|
|
286
|
+
"tagTemplate": "{name}@v{version}"
|
|
287
|
+
},
|
|
288
|
+
"package": [
|
|
289
|
+
{
|
|
290
|
+
"name": "api",
|
|
291
|
+
"path": "packages/api",
|
|
292
|
+
"versioning": "calver"
|
|
293
|
+
},
|
|
294
|
+
{
|
|
295
|
+
"name": "site",
|
|
296
|
+
"path": "packages/site",
|
|
297
|
+
"tagTemplate": "site-v{version}"
|
|
298
|
+
}
|
|
299
|
+
]
|
|
300
|
+
}
|
|
301
|
+
</code></pre>
|
|
302
|
+
</div></div>
|
|
303
|
+
<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]
|
|
304
|
+
versioning = "semver"
|
|
305
|
+
tag_template = "{name}@v{version}"
|
|
306
|
+
|
|
307
|
+
[[package]]
|
|
308
|
+
name = "api"
|
|
309
|
+
path = "packages/api"
|
|
310
|
+
versioning = "calver"
|
|
311
|
+
|
|
312
|
+
[[package]]
|
|
313
|
+
name = "site"
|
|
314
|
+
path = "packages/site"
|
|
315
|
+
tag_template = "site-v{version}"
|
|
316
|
+
</code></pre>
|
|
317
|
+
|
|
318
|
+
</div></div>
|
|
319
|
+
<div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
|
|
320
|
+
workspace: {
|
|
321
|
+
versioning: "semver",
|
|
322
|
+
tagTemplate: "{name}@v{version}",
|
|
323
|
+
},
|
|
324
|
+
package: [
|
|
325
|
+
{
|
|
326
|
+
name: "api",
|
|
327
|
+
path: "packages/api",
|
|
328
|
+
versioning: "calver",
|
|
329
|
+
},
|
|
330
|
+
{
|
|
331
|
+
name: "site",
|
|
332
|
+
path: "packages/site",
|
|
333
|
+
tagTemplate: "site-v{version}",
|
|
334
|
+
},
|
|
335
|
+
],
|
|
336
|
+
}
|
|
337
|
+
</code></pre>
|
|
338
|
+
</div></div>
|
|
339
|
+
<div class="ferr-tab" data-label="YAML"><p class="ferr-tab__label">YAML</p><div class="ferr-tab__body"><pre><code class="language-yaml">workspace:
|
|
340
|
+
versioning: semver
|
|
341
|
+
tagTemplate: "{name}@v{version}"
|
|
342
|
+
|
|
343
|
+
package:
|
|
344
|
+
|
|
345
|
+
- name: api
|
|
346
|
+
path: packages/api
|
|
347
|
+
versioning: calver
|
|
348
|
+
- name: site
|
|
349
|
+
path: packages/site
|
|
350
|
+
tagTemplate: "site-v{version}"
|
|
351
|
+
</code></pre>
|
|
352
|
+
|
|
353
|
+
</div></div>
|
|
354
|
+
</div>
|
|
355
|
+
|
|
356
|
+
<aside class="ferr-aside ferr-aside--tip"><div class="ferr-aside__body"><p>Utilisez <code>ferrflow check</code> pour prévisualiser exactement quels packages seraient publiés et à quelle version avant de lancer une release.</p>
|
|
357
|
+
</div></aside>
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Installation
|
|
3
|
+
description: Comment installer FerrFlow en local ou en CI.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## Installation locale
|
|
7
|
+
|
|
8
|
+
<div class="ferr-tabs">
|
|
9
|
+
<div class="ferr-tab" data-label="Cargo"><p class="ferr-tab__label">Cargo</p><div class="ferr-tab__body"><pre><code class="language-bash">cargo install ferrflow
|
|
10
|
+
</code></pre>
|
|
11
|
+
</div></div>
|
|
12
|
+
<div class="ferr-tab" data-label="npm"><p class="ferr-tab__label">npm</p><div class="ferr-tab__body"><pre><code class="language-bash">npm install -g @ferrlabs/ferrflow
|
|
13
|
+
# ou en dépendance de développement
|
|
14
|
+
npm install -D @ferrlabs/ferrflow
|
|
15
|
+
</code></pre>
|
|
16
|
+
</div></div>
|
|
17
|
+
<div class="ferr-tab" data-label="WASM (navigateur)"><p class="ferr-tab__label">WASM (navigateur)</p><div class="ferr-tab__body"><pre><code class="language-bash">npm install @ferrflow/wasm
|
|
18
|
+
</code></pre>
|
|
19
|
+
<p>Utilisez FerrFlow directement dans le navigateur — parsez les commits, calculez les incréments de version et générez des changelogs côté client sans backend.</p>
|
|
20
|
+
</div></div>
|
|
21
|
+
<div class="ferr-tab" data-label="Binaire"><p class="ferr-tab__label">Binaire</p><div class="ferr-tab__body"><p>Téléchargez un binaire pré-compilé depuis les <a href="https://github.com/FerrLabs/FerrFlow/releases/latest">Releases</a> :</p>
|
|
22
|
+
<pre><code class="language-bash"># Linux x86_64
|
|
23
|
+
curl -L https://github.com/FerrLabs/FerrFlow/releases/latest/download/ferrflow-linux-x64.tar.gz | tar xz
|
|
24
|
+
sudo mv ferrflow /usr/local/bin/
|
|
25
|
+
</code></pre>
|
|
26
|
+
</div></div>
|
|
27
|
+
<div class="ferr-tab" data-label="Docker"><p class="ferr-tab__label">Docker</p><div class="ferr-tab__body"><pre><code class="language-bash">docker run --rm -v $(pwd):/repo ghcr.io/ferrlabs/ferrflow:latest check
|
|
28
|
+
</code></pre>
|
|
29
|
+
</div></div>
|
|
30
|
+
</div>
|
|
31
|
+
|
|
32
|
+
## Installation CI
|
|
33
|
+
|
|
34
|
+
La méthode recommandée pour utiliser FerrFlow en CI est la GitHub Action — aucune étape d'installation nécessaire :
|
|
35
|
+
|
|
36
|
+
```yaml
|
|
37
|
+
- uses: FerrLabs/ferrflow@v5
|
|
38
|
+
env:
|
|
39
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Consultez [GitHub Actions](/fr/docs/ci/github-actions) et [GitLab CI](/fr/docs/ci/gitlab-ci) pour des exemples complets.
|
|
43
|
+
|
|
44
|
+
## Vérification
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
ferrflow --version
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Migration depuis la v4
|
|
51
|
+
|
|
52
|
+
Si vous suivez la configuration documentée pour GitHub Actions / GitLab CI (`GITHUB_TOKEN` / `CI_JOB_TOKEN` en variable d'environnement), aucun changement n'est nécessaire — il suffit de bumper le pin de l'action à `FerrLabs/ferrflow@v5` et le binaire à la v5.x.
|
|
53
|
+
|
|
54
|
+
Le seul changement cassant de la v5.0 est interne : FerrFlow n'injecte plus les tokens dans l'URL distante lors des push. Il utilise désormais le protocole standard de credential helper de git (`GIT_ASKPASS`). C'est invisible pour quiconque suit la configuration recommandée, mais si vous aviez un workflow custom qui s'appuyait sur des tokens injectés dans l'URL — par exemple, un runner self-hosted avec un remote pré-amorcé `https://x-access-token:$TOKEN@github.com/...` — passez à `GITHUB_TOKEN` (ou `FERRFLOW_TOKEN`) en variable d'environnement et FerrFlow se charge du reste.
|
|
55
|
+
|
|
56
|
+
Depuis la v5.2, les releases sont signées via Sigstore et embarquent un SBOM CycloneDX — voir [Vérifier les releases](/fr/docs/verifying-releases).
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Introduction
|
|
3
|
+
description: Ce qu'est FerrFlow et pourquoi il existe.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
FerrFlow est un binaire unique qui automatise le versionnage sémantique pour n'importe quel repository — monorepo ou classique, quel que soit le langage.
|
|
7
|
+
|
|
8
|
+
Il analyse votre historique de commits, détermine le bon incrément de version, met à jour vos fichiers de version, rédige un changelog, crée un tag git et publie une release. Zéro dépendance runtime.
|
|
9
|
+
|
|
10
|
+
<div class="ferr-card-group" data-cols="2">
|
|
11
|
+
<div class="ferr-card"><p class="ferr-card__title">CLI d'abord</p><div class="ferr-card__body"><p>Tout se passe depuis votre terminal ou votre CI. Aucune UI à cliquer, aucun serveur de configuration à surveiller.</p>
|
|
12
|
+
</div></div>
|
|
13
|
+
<div class="ferr-card"><p class="ferr-card__title">Multi-forge</p><div class="ferr-card__body"><p>GitHub, GitLab, auto-hébergé — FerrFlow s'adapte à votre forge. Un seul outil, toutes les plateformes.</p>
|
|
14
|
+
</div></div>
|
|
15
|
+
<div class="ferr-card"><p class="ferr-card__title">Commits conventionnels</p><div class="ferr-card__body"><p>Analyse l'historique des commits pour déterminer les incréments de version automatiquement. Aucune maintenance manuelle du changelog.</p>
|
|
16
|
+
</div></div>
|
|
17
|
+
<div class="ferr-card"><p class="ferr-card__title">Zéro infra</p><div class="ferr-card__body"><p>Un seul binaire, sans daemon, sans serveur, sans base de données. Tourne là où votre CI tourne.</p>
|
|
18
|
+
</div></div>
|
|
19
|
+
</div>
|
|
20
|
+
|
|
21
|
+
## Pourquoi pas semantic-release ou changesets ?
|
|
22
|
+
|
|
23
|
+
La plupart des outils de versionnage sont liés à un écosystème spécifique ou nécessitent Node.js dans votre CI.
|
|
24
|
+
|
|
25
|
+
| Outil | Monorepo | Multi-langage | Runtime |
|
|
26
|
+
| ---------------- | ----------- | ------------------ | --------- |
|
|
27
|
+
| semantic-release | via plugins | JS/Node uniquement | Node.js |
|
|
28
|
+
| changesets | bump manuel | JS uniquement | Node.js |
|
|
29
|
+
| release-please | limité | partiel | Node.js |
|
|
30
|
+
| cargo-release | non | Rust uniquement | Rust |
|
|
31
|
+
| **FerrFlow** | **natif** | **tous** | **aucun** |
|
|
32
|
+
|
|
33
|
+
FerrFlow est distribué sous forme de binaire compilé. Déposez-le dans n'importe quel environnement CI sans installer de runtime. Un build WASM (`@ferrflow/wasm`) est également disponible pour une utilisation côté navigateur. Pour la comparaison côte-à-côte (latence, RSS, taille) avec les outils de release JS, voir [Performance](/fr/performance) — chiffres rafraîchis à chaque release.
|
|
34
|
+
|
|
35
|
+
<aside class="ferr-aside ferr-aside--note"><p class="ferr-aside__title">À noter</p><div class="ferr-aside__body"><p>FerrFlow ne fait que du versionnage. Le suivi des issues, les secrets et les agents IA vivent dans d'autres produits FerrLabs.</p>
|
|
36
|
+
</div></aside>
|
|
37
|
+
|
|
38
|
+
## Comment ça marche
|
|
39
|
+
|
|
40
|
+
1. **Lit les commits** depuis le dernier tag git pour chaque package
|
|
41
|
+
2. **Détermine l'incrément** à partir des [Conventional Commits](/fr/docs/reference/conventional-commits) (`feat` → minor, `fix` → patch, breaking → major)
|
|
42
|
+
3. **Met à jour les fichiers de version** — `Cargo.toml`, `package.json`, `pom.xml`, etc.
|
|
43
|
+
4. **Rédige le changelog** au format Keep a Changelog
|
|
44
|
+
5. **Crée un tag git** (`api@v1.2.0`) et pousse
|
|
45
|
+
6. **Publie une release GitHub/GitLab** avec le changelog comme notes de version
|
|
46
|
+
|
|
47
|
+
Dans un monorepo, FerrFlow ne publie que les packages modifiés et comprend les chemins de dépendances partagées.
|
|
48
|
+
|
|
49
|
+
## Fonctionnalités clés
|
|
50
|
+
|
|
51
|
+
- **Hooks pre/post-release** — exécutez des scripts à chaque étape du cycle de vie (bump, commit, publish, failure)
|
|
52
|
+
- **Commandes de requête** — `ferrflow version`, `ferrflow tag` et `ferrflow status` pour le scripting CI
|
|
53
|
+
- **Tout fichier de version** — Cargo.toml, package.json, pom.xml, build.gradle, Chart.yaml, texte brut, et plus
|
|
54
|
+
- **Support navigateur** — `@ferrflow/wasm` apporte le parsing de commits, le calcul de bump et la génération de changelog dans le navigateur
|