mirror of
https://github.com/nix-community/home-manager.git
synced 2025-12-04 08:01:02 +01:00
maintaining.md: add maintaining document
Outline the places we need to update for releases and how we handle certain things. Signed-off-by: Austin Horstman <khaneliman12@gmail.com>
This commit is contained in:
parent
ceb884e4f3
commit
e3f8406683
1 changed files with 208 additions and 0 deletions
208
MAINTAINING.md
Normal file
208
MAINTAINING.md
Normal file
|
|
@ -0,0 +1,208 @@
|
|||
# Maintaining Home Manager
|
||||
|
||||
This file is intended as a reference for Home Manager's core maintainers,
|
||||
although it may be interesting for anyone curious how we do certain things.
|
||||
|
||||
## Releasing
|
||||
|
||||
Home Manager releases stable versions in sync with NixOS/nixpkgs. A _`YY.05`_
|
||||
version is released in May and a _`YY.11`_ version is released in November.
|
||||
|
||||
We do not need to wait for the release to come out of _"beta"_ before creating a
|
||||
branch, however we _should_ wait before updating links and references on the
|
||||
`master` branch.
|
||||
|
||||
Creating a stable branch may require temporarily disabling branch protection.
|
||||
This can only be done by an "admin" or "owner".
|
||||
|
||||
Once a stable branch is created, its flake inputs should be updated to point to
|
||||
the corresponding stable versions. The branch can be created before these exist,
|
||||
in which case they should be updated when the corresponding stable inputs become
|
||||
available.
|
||||
|
||||
Once a stable version is considered "out of beta", references to Home Manager's
|
||||
stable branch should be updated on the `master` branch to reference the new
|
||||
version.
|
||||
|
||||
### Release Workflow
|
||||
|
||||
The release process involves four phases in a specific order:
|
||||
|
||||
1. **On master - Mark current as stable**: Update all documentation and examples
|
||||
to reflect the current release (e.g., 25.11) as stable, removing "(unstable)"
|
||||
tags
|
||||
2. **Cut the release branch**: Create the new release branch from master (e.g.,
|
||||
`release-25.11`)
|
||||
3. **On release branch - Mark as release branch**: Set `isReleaseBranch: true`
|
||||
in `release.json`
|
||||
4. **On master - Prepare for next**: Bump version to next release (e.g., 26.05)
|
||||
and add "(unstable)" tag back
|
||||
|
||||
**Important**: The `isReleaseBranch` field in `release.json` is managed
|
||||
differently on each branch:
|
||||
|
||||
- On **master**: Always remains `false`
|
||||
- On **release branches**: Set to `true` in a separate commit after cutting the
|
||||
branch from master
|
||||
|
||||
This workflow ensures that the release branch captures a stable snapshot of
|
||||
master, which then moves forward to the next development cycle.
|
||||
|
||||
### Release Preparation Checklist
|
||||
|
||||
#### Step 1: On master - Mark Current as Stable
|
||||
|
||||
**When**: When ready to cut a new release branch (e.g., when preparing to
|
||||
release 25.11)
|
||||
|
||||
Reference commits:
|
||||
|
||||
- `e08e6e2389234000b0447e57abf61d8ccd59a68e` (home-manager: set 25.05 as stable)
|
||||
|
||||
1. **README.md**
|
||||
- Update example release branch references (e.g., `release-24.11` →
|
||||
`release-25.05`)
|
||||
- Update current stable version references (e.g., `24.11` → `25.05`)
|
||||
|
||||
2. **docs/manual/installation/nix-darwin.md**
|
||||
- Update channel version in example commands
|
||||
- Update `home.stateVersion` in examples
|
||||
|
||||
3. **docs/manual/installation/nixos.md**
|
||||
- Update channel version in example commands
|
||||
- Update tarball URLs
|
||||
- Update `home.stateVersion` in examples
|
||||
|
||||
4. **docs/manual/installation/standalone.md**
|
||||
- Update channel version in example commands
|
||||
|
||||
5. **docs/manual/manual.md**
|
||||
- Remove `(unstable)` suffix from version
|
||||
|
||||
6. **docs/manual/nix-flakes/standalone.md**
|
||||
- Update flake references (e.g., `home-manager/release-24.11` →
|
||||
`home-manager/release-25.05`)
|
||||
- Update `$branch` examples
|
||||
|
||||
7. **docs/manual/usage/configuration.md**
|
||||
- Update `home.stateVersion` in example configurations
|
||||
|
||||
8. **docs/release-notes/rl-YYMM.md**
|
||||
- Replace "This is the current unstable branch and the information in this
|
||||
section is therefore not final."
|
||||
- With: "The YY.MM release branch became stable in <Month>, YYYY."
|
||||
|
||||
9. **home-manager/home-manager** script
|
||||
- Update default `home.stateVersion` in generated configurations
|
||||
- Update `home.stateVersion` in uninstall function
|
||||
|
||||
10. **modules/misc/uninstall.nix**
|
||||
- Update `home.stateVersion` in uninstall config
|
||||
|
||||
**Note**: Do NOT change `isReleaseBranch` in `release.json` - keep it as `false`
|
||||
|
||||
#### Step 2: Cut the release branch
|
||||
|
||||
**When**: After Step 1 is merged to master
|
||||
|
||||
1. Create the new release branch from master
|
||||
- Example: `git checkout -b release-25.11 master`
|
||||
2. Push the branch to the repository
|
||||
|
||||
#### Step 3: On the release branch - Mark as Release Branch
|
||||
|
||||
**When**: Immediately after creating the release branch
|
||||
|
||||
Reference commits:
|
||||
|
||||
- `70a787cc5` (release: set release branch)
|
||||
|
||||
1. **release.json**
|
||||
- Change `isReleaseBranch` from `false` to `true`
|
||||
- Do NOT change the `release` field (it's already correct from Step 1)
|
||||
|
||||
#### Step 3.5: On master - Update CI for the New Release Branch
|
||||
|
||||
**When**: After marking the release branch as a release branch (Step 3)
|
||||
|
||||
**Where**: On the **master** branch (CI workflows run from master)
|
||||
|
||||
**What**: Update GitHub Actions workflows to include the new stable branch
|
||||
|
||||
1. **.github/workflows/update-flake.yml** (on master)
|
||||
- Replace the old stable branch with the new release branch in the matrix
|
||||
- Example: When creating `release-25.11`, update the matrix from:
|
||||
|
||||
```yaml
|
||||
strategy:
|
||||
matrix:
|
||||
branch: [master, release-25.05]
|
||||
```
|
||||
|
||||
to:
|
||||
|
||||
```yaml
|
||||
strategy:
|
||||
matrix:
|
||||
branch: [master, release-25.11]
|
||||
```
|
||||
|
||||
- This ensures automated flake.lock updates run on the current stable branch
|
||||
- Note: We only maintain CI for the latest stable release, not older releases
|
||||
|
||||
**Important**: CI workflows are executed from master, so this change must be
|
||||
committed to the master branch.
|
||||
|
||||
#### Step 4: On master - Prepare for Next Release
|
||||
|
||||
**When**: After cutting the release branch, prepare master for the next
|
||||
development cycle
|
||||
|
||||
Reference commits:
|
||||
|
||||
- `9a4a9f1d6e43fe4044f6715ae7cc85ccb1d2fe09` (home-manager: prepare 25.11)
|
||||
|
||||
1. **docs/release-notes/rl-YYMM.md** (CREATE NEW)
|
||||
- Create new release notes file for next version with unstable warning
|
||||
- Example: Create `rl-2605.md` when preparing for 26.05
|
||||
|
||||
2. **docs/manual/manual.md**
|
||||
- Update version to next release with `(unstable)` tag
|
||||
- Example: `25.11` → `26.05 (unstable)`
|
||||
|
||||
3. **docs/release-notes/release-notes.md**
|
||||
- Add new release notes file `rl-YYMM.md` at the top of the chapters list
|
||||
|
||||
4. **home-manager/home-manager** script
|
||||
- Update `--version` output to next version
|
||||
- Example: `echo 25.11-pre` → `echo 26.05-pre`
|
||||
|
||||
5. **modules/misc/version.nix**
|
||||
- Add new version string to `stateVersion` enum list
|
||||
- Example: Add `"26.05"` after `"25.11"`
|
||||
|
||||
6. **release.json**
|
||||
- Update `release` field to next version (e.g., `"25.11"` → `"26.05"`)
|
||||
- **IMPORTANT**: Keep `isReleaseBranch` as `false` on master
|
||||
|
||||
### Version State Changes
|
||||
|
||||
Each release may introduce state version changes that affect the default
|
||||
behavior of Home Manager for users who set `home.stateVersion` to that version.
|
||||
|
||||
State version changes should be documented in the release notes under a "State
|
||||
Version Changes" section, explaining what behavior changes for users who set
|
||||
their state version to the new release.
|
||||
|
||||
### Backporting
|
||||
|
||||
Stable branches get bug fixes and security updates, but usually not new modules
|
||||
or features. When backporting:
|
||||
|
||||
1. Use `git cherry-pick -x <commit>` to preserve the original commit reference
|
||||
2. Test that the backport builds successfully
|
||||
3. Consider whether the change might affect existing stable users
|
||||
4. Update the PR/commit message to indicate it's a backport
|
||||
|
||||
If a user needs a module backported, they should open an issue explaining the
|
||||
use case.
|
||||
Loading…
Add table
Add a link
Reference in a new issue