Replies: 3 comments
-
|
Hello, I am not against automated release this is why for example I created the EasyBuild ecosystem.
The manual action needed is not too big thanks to the existing automation we have in place. Here is what I am currently doing:
Note These steps consider that you already have the Env variables configured, logged into NPM on your machine and authenticated in the
If I understand correctly we would get 1 PRs per project? I think I would prefer to have a single PR to release all at once like done today. This would require less work and also make sure we keep the packages in sync. Plus, we also want to create a Github release (to trigger Pypy) only for
We can based this work on https://github.com/easybuild-org/EasyBuild.CommitParser#commit-format (need to remove the special
I think I would hold on doing that, so we can release features in batch when needed. If we just need to
I am fine with using auto generated changelogs, to be honest right now most of our changelog is a copy/paste of the merge commit message already.
Based on my experience, this is the hardest part. It can be enforced to a certain limit using git hooks (via EasyBuild.CommitLinter but when doing the merge via Github UI we can't run hooks verification). Hopefully, thanks to release-please creating PR, we can catch on issues regarding merged/squashed commits.
We should automate everything
I think for a starter we should probably keep me as the guy who press the red button. As if something is breaking, I can fix it. But once, the workflow has been tested and we are comfortable with it we can extends the responsibility to others if they feel like it. To move forward, what I propose is that I look into setting up release-phase. This is because, I would like to make sure to understand how it works. And this way, we would have at least two person (@dbrattli and me) in the team comfortable with it. |
Beta Was this translation helpful? Give feedback.
-
|
Looks like release-please will make a single PR for all packages that needs to be released. This can be controlled using the |
Beta Was this translation helpful? Give feedback.
-
This can be enforced with a GH action: https://github.com/fable-compiler/Fable.Python/blob/main/.github/workflows/conventional-pr-title.yml |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
Proposal: Automated Releases for Fable using Release-Please
Motivation
Fable has several maintainers, with one primarily handles the release process. This works, but the release process is manual and time-consuming — requiring making sure CHANGELOGs are updated, coordinating version numbers across multiple files, and executing the publish steps locally.
This proposal explores how we could automate the release process to:
Proposed Solution
Adopt release-please to automate the release workflow. Release-please is a Google-maintained tool that:
How It Works
The release process simplifies from "execute all the steps" to "review and merge a PR" — a much lighter task that any of the maintainers could handle.
Existing Automation: PyPI Publishing
Fable already has automated publishing for fable-library to PyPI via
.github/workflows/publish-pypi.yml. This workflow:release: types: [published](GitHub Release creation)This is already release-please compatible! Here's why:
release: types: [published]eventThis means adopting release-please for NuGet would also unify the release trigger for PyPI — one Release PR merge could trigger both NuGet and PyPI publishing (if the fable-library is part of that release).
This proposal extends that existing pattern to NuGet publishing, bringing the same automation to the .NET packages.
Fable-Specific Considerations
Independent Versioning of Packages
Fable releases
Fable.Cli,Fable.Core, andFable.Compilerindependently with different version numbers. Release-please handles this through manifest mode withseparate-pull-requests: true.Controlled Major Versions
Fable maintains strict version discipline:
Release-please accommodates this:
feat!:orBREAKING CHANGE:commits — simply don't use theseRelease-As: 5.0.0-alpha.1in a commit trailerPrerelease Workflow
Note on
Release-Asin monorepos: Release-please determines which component a commit affects based on which files the commit touches. To force a version forFable.Cli, the commit must modify files undersrc/Fable.Cli/. For a coordinated bump across all components, touch files in each component's directory. The exact behavior ofRelease-Asacross multiple components should be verified during the testing phase.Alternative for major transitions: You can also directly edit
.release-please-manifest.jsonto set new base versions (e.g., change"4.24.0"to"5.0.0-alpha.0"), then the nextfeat:orfix:commit would increment from there.Configuration Files
.github/workflows/release-please.ymlThis workflow only creates/updates Release PRs and creates GitHub Releases when merged. The actual publishing is triggered separately (see below).
.github/workflows/publish-nuget.ymlThis follows the same pattern as the existing
publish-pypi.yml:This mirrors the PyPI workflow's approach:
release-please-config.json{ "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", "packages": { "src/Fable.Cli": { "release-type": "simple", "component": "Fable.Cli", "changelog-path": "CHANGELOG.md", "bump-minor-pre-major": true, "bump-patch-for-minor-pre-major": true, "extra-files": [ { "type": "xml", "path": "Fable.Cli.fsproj", "xpath": "//Project/PropertyGroup/Version" } ] }, "src/Fable.Core": { "release-type": "simple", "component": "Fable.Core", "changelog-path": "CHANGELOG.md", "bump-minor-pre-major": true, "bump-patch-for-minor-pre-major": true, "extra-files": [ { "type": "xml", "path": "Fable.Core.fsproj", "xpath": "//Project/PropertyGroup/Version" } ] }, "src/Fable.Compiler": { "release-type": "simple", "component": "Fable.Compiler", "changelog-path": "CHANGELOG.md", "bump-minor-pre-major": true, "bump-patch-for-minor-pre-major": true, "extra-files": [ { "type": "xml", "path": "Fable.Compiler.fsproj", "xpath": "//Project/PropertyGroup/Version" } ] } }, "separate-pull-requests": true, "sequential-calls": false, "changelog-sections": [ {"type": "feat", "section": "Features"}, {"type": "fix", "section": "Bug Fixes"}, {"type": "perf", "section": "Performance Improvements"}, {"type": "deps", "section": "Dependencies"}, {"type": "docs", "section": "Documentation", "hidden": true}, {"type": "chore", "section": "Miscellaneous", "hidden": true}, {"type": "refactor", "section": "Code Refactoring", "hidden": true}, {"type": "test", "section": "Tests", "hidden": true} ] }.release-please-manifest.jsonThis file tracks current versions. Initial setup (adjust to current actual versions):
{ "src/Fable.Cli": "4.24.0", "src/Fable.Core": "4.5.0", "src/Fable.Compiler": "4.24.0" }Version Annotation in
Compiler.fsThe
VERSIONliteral insrc/Fable.Transforms/Global/Compiler.fsneeds to stay in sync with Fable.Cli. Add the annotation comment:And add to the Fable.Cli extra-files config:
Conventional Commits
Contributors would need to use conventional commits:
Scopes (optional but helpful):
cli- Fable.Cli changescore- Fable.Core changescompiler- Fable.Compiler/Transforms changesjs,ts,py,rs,dart- Language-specific changeslib- fable-library changesVersion bump rules:
fix:→ patch (4.24.0 → 4.24.1)feat:→ minor (4.24.0 → 4.25.0)feat!:orBREAKING CHANGE:→ major (but we avoid these between major releases)Migration Plan
Phase 1: Setup (non-breaking)
release-please-config.jsonand.release-please-manifest.jsonCompiler.fsPhase 2: Parallel Testing
Phase 3: Gradual Adoption
Release-As:when neededPhase 4: Full Automation (optional)
Trade-offs
What We Gain
What We Lose / Change
Mitigation
Release-As:provides escape hatch for any version overrideOpen Questions for Discussion
Changelog style: Are auto-generated changelogs acceptable, or do we value hand-crafted release notes enough to keep the current process?
Commit discipline: Is requiring conventional commits too much friction for occasional contributors? We can enforce this with e.g
amannn/action-semantic-pull-requestGH action.Package scope: Should we include other packages like
fable-metadata,fable-standalone, etc.?Release responsibility: With automation in place, should all maintainers be comfortable merging Release PRs, or keep it with the current release maintainer?
References
Beta Was this translation helpful? Give feedback.
All reactions