Skip to content

Commit 0184d22

Browse files
authored
chore: add /next subpath + (beta) release please for next components (#4251)
* WIP add /next subpath + separate rollup config * WIP release please config for beta release * Automate beta releases * Add EDS 2.0 Storybook documentation * Add valid ES module index * Add placeholder to stisfy build * docs: add more documentation * Update publish workflow to check beta vs stable releases * Update links to docs * Add simple release type * Actually move the next changelog * fix: consistent cache keys and README clarification * docs: simplify git push example * docs: remove duplicate install command in README * feat: add Placeholder story with beta labeling * refactor: share rollup config, remove use client from index, cleanup README
1 parent 8056fc2 commit 0184d22

20 files changed

Lines changed: 885 additions & 71 deletions

.github/release-please-config.json

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,14 @@
66
"packages/eds-core-react": {
77
"release-type": "node",
88
"package-name": "@equinor/eds-core-react",
9-
"component": "eds-core-react"
9+
"component": "eds-core-react",
10+
"exclude-paths": ["src/components/next"]
11+
},
12+
"packages/eds-core-react/src/components/next": {
13+
"release-type": "simple",
14+
"component": "eds-core-react-next",
15+
"prerelease-type": "beta",
16+
"include-component-in-tag": false
1017
},
1118
"packages/eds-data-grid-react": {
1219
"release-type": "node",

.github/release-please-config.md

Lines changed: 96 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,55 @@ Each package in the monorepo must be explicitly configured:
4949

5050
We currently track these packages for releases:
5151

52-
1. `@equinor/eds-core-react` - Core React component library
53-
2. `@equinor/eds-data-grid-react` - Data grid component
54-
3. `@equinor/eds-icons` - Icon library
55-
4. `@equinor/eds-lab-react` - Experimental components
56-
5. `@equinor/eds-tokens` - Design tokens and variables
57-
6. `@equinor/eds-utils` - Shared utilities
52+
1. `@equinor/eds-core-react` - Core React component library (stable)
53+
2. `@equinor/eds-core-react` (`/next` entry) - Beta components (published with `@beta` tag)
54+
3. `@equinor/eds-data-grid-react` - Data grid component
55+
4. `@equinor/eds-icons` - Icon library
56+
5. `@equinor/eds-lab-react` - Experimental components
57+
6. `@equinor/eds-tokens` - Design tokens and variables
58+
7. `@equinor/eds-utils` - Shared utilities
59+
60+
### Dual Release Strategy for `@equinor/eds-core-react`
61+
62+
The `eds-core-react` package uses a **dual release strategy** to support both stable and beta releases:
63+
64+
**Stable Release** (`latest` tag):
65+
66+
```json
67+
"packages/eds-core-react": {
68+
"release-type": "node",
69+
"package-name": "@equinor/eds-core-react",
70+
"component": "eds-core-react",
71+
"exclude-paths": ["src/components/next"]
72+
}
73+
```
74+
75+
- Excludes `/next` folder from stable releases
76+
- Published to `@equinor/eds-core-react@latest`
77+
- Uses `CHANGELOG.md`
78+
79+
**Beta Release** (`beta` tag):
80+
81+
```json
82+
"packages/eds-core-react/src/components/next": {
83+
"release-type": "simple",
84+
"component": "eds-core-react-next",
85+
"prerelease-type": "beta",
86+
"include-component-in-tag": false
87+
}
88+
```
89+
90+
- Only includes files in `src/components/next/`
91+
- Published to `@equinor/eds-core-react@beta`
92+
- Uses `src/components/next/CHANGELOG.md`
93+
- Version format: `2.0.1-beta.0`, `2.0.1-beta.1`, etc.
94+
95+
**Key Configuration Options:**
96+
97+
- `exclude-paths`: Prevents `/next` components from affecting stable releases
98+
- `prerelease-type: "beta"`: Adds `-beta.X` suffix to versions
99+
- `changelog-path`: Uses separate changelog for beta releases
100+
- `include-component-in-tag: false`: Prevents duplicate tags
58101

59102
## Pull Request Configuration
60103

@@ -186,6 +229,8 @@ The releases include all commit types from the changelog (features, fixes, docs,
186229

187230
## Multi-Package Example
188231

232+
### Stable + Multiple Packages
233+
189234
If you make these commits:
190235

191236
```bash
@@ -203,27 +248,69 @@ Release-please will create ONE PR that:
203248

204249
When merged, three separate GitHub releases will be created automatically.
205250

251+
### Beta Release Example
252+
253+
If you make these commits:
254+
255+
```bash
256+
feat(next): add Input component
257+
fix(next): fix Placeholder styling
258+
```
259+
260+
Release-please will include beta changes in the release PR:
261+
262+
- Title includes "next": `chore: release eds-core-react-next 2.0.1-beta.1`
263+
- Bumps beta version: `2.0.1-beta.0``2.0.1-beta.1`
264+
- Updates `src/components/next/CHANGELOG.md`
265+
- When merged, publishes to `@equinor/eds-core-react@beta`
266+
267+
**Note:** With `"separate-pull-requests": false`, both stable and beta changes can appear in the **same PR** if you have commits for both. The PR will contain updates to both `CHANGELOG.md` and `src/components/next/CHANGELOG.md`.
268+
206269
## Commit Scope Matching
207270

208271
The `component` field must match commit scopes for release-please to detect which packages are affected:
209272

210273
```bash
211-
# These commits affect the corresponding packages:
212-
feat(eds-core-react): ... → packages/eds-core-react
274+
# Stable releases:
275+
feat(eds-core-react): ... → packages/eds-core-react (stable)
276+
fix(Button): ... → packages/eds-core-react (stable)
213277
fix(eds-icons): ... → packages/eds-icons
214278
docs(eds-tokens): ... → packages/eds-tokens
215279

280+
# Beta releases (use "next" scope):
281+
feat(next): ... → packages/eds-core-react@beta
282+
fix(next): ... → packages/eds-core-react@beta
283+
216284
# Multiple packages in one commit:
217285
feat(eds-icons, eds-core-react): ... → both packages
218286
```
219287

288+
### Beta Release Commits
289+
290+
For components in the `/next` entry point, always use the `(next)` scope:
291+
292+
```bash
293+
# Features
294+
feat(next): add Input 2.0 component
295+
296+
# Bug fixes
297+
fix(next): correct Input 2.0 styling
298+
299+
# Breaking changes - DO NOT use ! for beta
300+
feat(next): redesign Input 2.0 API (breaking)
301+
# NOT: feat(next)!: redesign Button API
302+
```
303+
304+
**Important:** Avoid using `!` (breaking change marker) for beta releases. Beta components are experimental and breaking changes are expected. Using `!` would trigger a major version bump (e.g., `2.0.1-beta.0``3.0.0-beta.0`), which is unnecessary for components under development.
305+
220306
## Related Files
221307

222308
- **Config**: `.github/release-please-config.json` (this documentation)
223309
- **Manifest**: `.github/release-please-manifest.json` (tracks current versions)
224310
- **Workflow**: `.github/workflows/release-please.yml` (triggers release-please)
225-
- **Publish**: `.github/workflows/trigger-publish.yml` (publishes after release)
311+
- **Publish**: `.github/workflows/trigger-publish.yml` (publishes after release, handles beta detection)
226312
- **Automated release documentation**: `../documentation/how-to/AUTOMATED_RELEASE.md`
313+
- **Beta release guide**: `documentation/how-to/BETA_RELEASE_GUIDE.md` (detailed beta workflow)
227314

228315
## Useful Links
229316

.github/release-please-manifest.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
{
22
"packages/eds-core-react": "2.1.0",
3+
"packages/eds-core-react/src/components/next": "2.1.0-beta.0",
34
"packages/eds-data-grid-react": "1.1.0",
45
"packages/eds-icons": "1.0.1",
56
"packages/eds-lab-react": "0.9.0",

.github/workflows/publish_core_react.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,8 @@ jobs:
170170
steps: ${{ toJson(steps) }}
171171
if: failure()
172172
purge-cdn:
173-
if: github.event.inputs.environment == 'production'
173+
# Only purge CDN for production releases (latest tag)
174+
if: github.event.inputs.npm-tag == 'latest'
174175
needs: [publish-storybook]
175176
name: Purge cdn
176177
uses: ./.github/workflows/_purge_cdn.yaml

.github/workflows/trigger_publish.yml

Lines changed: 100 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,48 @@ jobs:
5252
# All validation checks passed
5353
echo "should-publish=true" >> $GITHUB_OUTPUT
5454
55-
# Job 1: Determine which packages need to be published
55+
# Job 1: Detect which release channels (stable/beta) were affected
56+
# Looks for changelog edits in the merge commit
57+
detect-release:
58+
needs: validate-release
59+
if: needs.validate-release.outputs.should-publish == 'true'
60+
runs-on: ubuntu-latest
61+
outputs:
62+
has-stable-release: ${{ steps.detect.outputs.has-stable-release }}
63+
has-beta-release: ${{ steps.detect.outputs.has-beta-release }}
64+
steps:
65+
- name: Checkout
66+
uses: actions/checkout@v4
67+
with:
68+
fetch-depth: 2
69+
70+
- name: Detect release type
71+
id: detect
72+
run: |
73+
CHANGED_FILES=$(git diff HEAD^ HEAD --name-only)
74+
75+
echo "Changed files:" >> $GITHUB_STEP_SUMMARY
76+
echo '```' >> $GITHUB_STEP_SUMMARY
77+
echo "$CHANGED_FILES" >> $GITHUB_STEP_SUMMARY
78+
echo '```' >> $GITHUB_STEP_SUMMARY
79+
80+
if echo "$CHANGED_FILES" | grep -q '^packages/eds-core-react/CHANGELOG\.md$'; then
81+
echo "has-stable-release=true" >> $GITHUB_OUTPUT
82+
echo "- ✅ Stable changelog updated" >> $GITHUB_STEP_SUMMARY
83+
else
84+
echo "has-stable-release=false" >> $GITHUB_OUTPUT
85+
echo "- ⏭️ Stable changelog unchanged" >> $GITHUB_STEP_SUMMARY
86+
fi
87+
88+
if echo "$CHANGED_FILES" | grep -q '^packages/eds-core-react/src/components/next/CHANGELOG\.md$'; then
89+
echo "has-beta-release=true" >> $GITHUB_OUTPUT
90+
echo "- ✅ Beta changelog updated" >> $GITHUB_STEP_SUMMARY
91+
else
92+
echo "has-beta-release=false" >> $GITHUB_OUTPUT
93+
echo "- ⏭️ Beta changelog unchanged" >> $GITHUB_STEP_SUMMARY
94+
fi
95+
96+
# Job 2: Determine which packages need publishing
5697
# Checks the release-please-manifest.json to see which packages had version changes
5798
check-releases:
5899
needs: validate-release
@@ -152,35 +193,56 @@ jobs:
152193
echo "" >> $GITHUB_STEP_SUMMARY
153194
echo "📝 **Note:** eds-utils is published as part of eds-core-react" >> $GITHUB_STEP_SUMMARY
154195
155-
# Job 2: Trigger core-react publish workflow
156-
# Only runs if core-react package.json was changed
157-
trigger-core-react:
158-
needs: check-releases
159-
if: needs.check-releases.outputs.core-react == 'true'
196+
# Job 3: Trigger core-react stable publish workflow
197+
trigger-core-react-stable:
198+
needs: [validate-release, detect-release, check-releases]
199+
if: needs.validate-release.outputs.should-publish == 'true' && needs.detect-release.outputs.has-stable-release == 'true' && needs.check-releases.outputs.core-react == 'true'
160200
runs-on: ubuntu-latest
161201
steps:
162-
- name: Trigger core-react publish
202+
- name: Trigger core-react stable publish
163203
id: trigger
164204
env:
165-
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} # GitHub token for gh CLI authentication
205+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
166206
run: |
167-
# Use GitHub CLI to trigger the publish workflow
168207
gh workflow run publish_core_react.yaml \
169208
--repo ${{ github.repository }} \
170209
--ref main \
171210
-f npm-tag=latest \
172211
-f environment=production
173-
# Allow other packages to continue even if this one fails
174212
continue-on-error: true
175213

176214
- name: Report failure
177215
if: steps.trigger.outcome == 'failure'
178216
run: |
179-
echo "::error title=Core React Publish Failed::Failed to trigger publish workflow for @equinor/eds-core-react"
180-
echo "❌ Failed to trigger core-react publish workflow" >> $GITHUB_STEP_SUMMARY
217+
echo "::error title=Core React Stable Publish Failed::Failed to trigger stable publish workflow for @equinor/eds-core-react"
218+
echo "❌ Failed to trigger stable publish workflow" >> $GITHUB_STEP_SUMMARY
181219
182-
# Job 3: Trigger lab-react publish workflow
183-
# Only runs if lab-react package.json was changed
220+
# Job 4: Trigger core-react beta publish workflow
221+
trigger-core-react-beta:
222+
needs: [validate-release, detect-release, check-releases]
223+
if: needs.validate-release.outputs.should-publish == 'true' && needs.detect-release.outputs.has-beta-release == 'true' && needs.check-releases.outputs.core-react == 'true'
224+
runs-on: ubuntu-latest
225+
steps:
226+
- name: Trigger core-react beta publish
227+
id: trigger
228+
env:
229+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
230+
run: |
231+
gh workflow run publish_core_react.yaml \
232+
--repo ${{ github.repository }} \
233+
--ref main \
234+
-f npm-tag=beta \
235+
-f environment=production
236+
continue-on-error: true
237+
238+
- name: Report failure
239+
if: steps.trigger.outcome == 'failure'
240+
run: |
241+
echo "::error title=Core React Beta Publish Failed::Failed to trigger beta publish workflow for @equinor/eds-core-react"
242+
echo "❌ Failed to trigger beta publish workflow" >> $GITHUB_STEP_SUMMARY
243+
244+
# Job 5: Trigger lab-react publish workflow
245+
# Only runs if the Release Please manifest bumped lab-react
184246
trigger-lab-react:
185247
needs: check-releases
186248
if: needs.check-releases.outputs.lab-react == 'true'
@@ -204,8 +266,8 @@ jobs:
204266
echo "::error title=Lab React Publish Failed::Failed to trigger publish workflow for @equinor/eds-lab-react"
205267
echo "❌ Failed to trigger lab-react publish workflow" >> $GITHUB_STEP_SUMMARY
206268
207-
# Job 4: Trigger data-grid-react publish workflow
208-
# Only runs if data-grid-react package.json was changed
269+
# Job 6: Trigger data-grid-react publish workflow
270+
# Only runs if the Release Please manifest bumped data-grid-react
209271
trigger-data-grid-react:
210272
needs: check-releases
211273
if: needs.check-releases.outputs.data-grid-react == 'true'
@@ -229,8 +291,8 @@ jobs:
229291
echo "::error title=Data Grid React Publish Failed::Failed to trigger publish workflow for @equinor/eds-data-grid-react"
230292
echo "❌ Failed to trigger data-grid-react publish workflow" >> $GITHUB_STEP_SUMMARY
231293
232-
# Job 5: Trigger icons publish workflow
233-
# Only runs if icons package.json was changed
294+
# Job 7: Trigger icons publish workflow
295+
# Only runs if the Release Please manifest bumped icons
234296
trigger-icons:
235297
needs: check-releases
236298
if: needs.check-releases.outputs.icons == 'true'
@@ -253,8 +315,8 @@ jobs:
253315
echo "::error title=Icons Publish Failed::Failed to trigger publish workflow for @equinor/eds-icons"
254316
echo "❌ Failed to trigger icons publish workflow" >> $GITHUB_STEP_SUMMARY
255317
256-
# Job 6: Trigger tokens publish workflow
257-
# Only runs if tokens package.json was changed
318+
# Job 8: Trigger tokens publish workflow
319+
# Only runs if the Release Please manifest bumped tokens
258320
trigger-tokens:
259321
needs: check-releases
260322
if: needs.check-releases.outputs.tokens == 'true'
@@ -277,12 +339,13 @@ jobs:
277339
echo "::error title=Tokens Publish Failed::Failed to trigger publish workflow for @equinor/eds-tokens"
278340
echo "❌ Failed to trigger tokens publish workflow" >> $GITHUB_STEP_SUMMARY
279341
280-
# Job 7: Summary report of all publish triggers
342+
# Job 9: Summary report of all publish triggers
281343
# Runs independently after check-releases completes
282344
# Provides a clear overview of which packages were triggered for publishing
283345
publish-summary:
284346
needs:
285347
- validate-release
348+
- detect-release
286349
- check-releases
287350
# Always run this job, even if some trigger jobs failed or were skipped
288351
if: always()
@@ -312,6 +375,22 @@ jobs:
312375
echo "## 📦 Package Publish Trigger Summary" >> $GITHUB_STEP_SUMMARY
313376
echo "" >> $GITHUB_STEP_SUMMARY
314377
echo "This workflow triggered publish workflows for packages that had version changes." >> $GITHUB_STEP_SUMMARY
378+
echo "" >> $GITHUB_STEP_SUMMARY
379+
echo "### Release types detected" >> $GITHUB_STEP_SUMMARY
380+
echo "" >> $GITHUB_STEP_SUMMARY
381+
382+
if [ "${{ needs.detect-release.outputs.has-stable-release }}" == "true" ]; then
383+
echo "- ✅ Stable changelog updated" >> $GITHUB_STEP_SUMMARY
384+
else
385+
echo "- ⏭️ Stable changelog unchanged" >> $GITHUB_STEP_SUMMARY
386+
fi
387+
388+
if [ "${{ needs.detect-release.outputs.has-beta-release }}" == "true" ]; then
389+
echo "- ✅ Beta changelog updated" >> $GITHUB_STEP_SUMMARY
390+
else
391+
echo "- ⏭️ Beta changelog unchanged" >> $GITHUB_STEP_SUMMARY
392+
fi
393+
315394
echo "" >> $GITHUB_STEP_SUMMARY
316395
echo "### Results:" >> $GITHUB_STEP_SUMMARY
317396
echo "" >> $GITHUB_STEP_SUMMARY

0 commit comments

Comments
 (0)