mirror of
https://github.com/NixOS/rfcs.git
synced 2025-11-08 19:46:12 +01:00
[RFC 0088] Nixpkgs Breaking Change Policy (#88)
* Create RFC for nixpkgs Breaking Change Policy This specifies the expected workflow as a base for workflows and future automation. * Update rfcs/0088-nixpkgs-breaking-change-policy.md Co-authored-by: asymmetric <lorenzo@mailbox.org> * Reformat metadata * Update and clarify. - Highlight the high-level goal. - Highlight the low-level goal of this specific RFC. - Wording fixes. * Implement suggestions from shepherds meeting. * Set shepherd leader Co-authored-by: Jörg Thalheim <Mic92@users.noreply.github.com> * Typo fix Co-authored-by: Théo Zimmermann <theo.zimmi@gmail.com> Co-authored-by: asymmetric <lorenzo@mailbox.org> Co-authored-by: Linus Heckemann <git@sphalerite.org> Co-authored-by: Eelco Dolstra <edolstra@gmail.com> Co-authored-by: Jörg Thalheim <Mic92@users.noreply.github.com> Co-authored-by: Théo Zimmermann <theo.zimmi@gmail.com>
This commit is contained in:
parent
fe4b5325ac
commit
a36c8e90c3
1 changed files with 156 additions and 0 deletions
156
rfcs/0088-nixpkgs-breaking-change-policy.md
Normal file
156
rfcs/0088-nixpkgs-breaking-change-policy.md
Normal file
|
|
@ -0,0 +1,156 @@
|
|||
---
|
||||
feature: nixpkgs-breaking-change-policy
|
||||
start-date: 2020-09-24
|
||||
author: Kevin Cox
|
||||
co-authors: (TBD)
|
||||
shepherd-team: @blaggacao, @jonringer, @nrdxp
|
||||
shepherd-leader: @blaggacao
|
||||
related-issues: (TBD)
|
||||
---
|
||||
|
||||
# Summary
|
||||
|
||||
This defines a policy for how to manage nixpkgs changes that break dependent
|
||||
derivations or tests. It specifies timeframes and procedures so that
|
||||
maintainers of dependencies and dependents can know what to expect from each
|
||||
other when making breaking changes.
|
||||
|
||||
While this policy should be followed as much as possible once accepted it is
|
||||
primarily focused on getting agreement such that tools can be built that make
|
||||
implementing this policy very easy. See the [Future Work section](#future-work)
|
||||
for examples of the tools that will be built.
|
||||
|
||||
The direct intended result of this RFC is:
|
||||
|
||||
- Maintainers of dependencies have a clear framework for handling changes that
|
||||
break dependants.
|
||||
- Maintainers of dependants have a clear framework for how dependency breacking
|
||||
changes will be handled.
|
||||
- NixOS channels will very rarely (ideally never) stall due to build or test
|
||||
failures.
|
||||
|
||||
This document is only focused on changes to derivation builds and tests it
|
||||
**does not** aim to make any opinion on changes that can break user machines or
|
||||
configurations. (While this is an interesting topic it is harder to put
|
||||
concrete rules on due to the difficulty of identifying these breakages. In
|
||||
order to be covered by this policy please put tests on your packages.)
|
||||
|
||||
# Motivation
|
||||
|
||||
Right now the procedure for making breaking changes varies widely by maintainer
|
||||
and is largely tribal knowledge. There are a wide variety of approaches ranging
|
||||
from:
|
||||
|
||||
- After testing to confirm that a change is correct, merge and notify
|
||||
dependents that they need to update their packages.
|
||||
- Merge to `staging`, notify dependents then eventually merge to `master`.
|
||||
- Gather a large number of fixes in the PR branch then merge to `staging` or
|
||||
`master` once most or all dependencies are fixed.
|
||||
|
||||
This adhoc nature has a number of downsides:
|
||||
|
||||
- Change authors need to put effort into deciding how to handle each particular
|
||||
change.
|
||||
- Maintainers of dependant packages don't know what to expect and have a hard
|
||||
time keeping up with upstream breakages.
|
||||
- Merges to `master` or `staging` can result in broken channels which block all
|
||||
updates including security updates.
|
||||
|
||||
This aims to provide a uniform approach so that everyone involved knows what to
|
||||
expect and to allow further workflows including automation to be build on top
|
||||
of these procedures.
|
||||
|
||||
## Past Discussions
|
||||
|
||||
https://discourse.nixos.org/t/please-fix-all-packages-which-were-broken-by-the-qt-wrapping-changes/6444
|
||||
|
||||
# Detailed design
|
||||
|
||||
## Goals
|
||||
|
||||
The following procedure will be used for making breaking changes. It has a few
|
||||
primary goals:
|
||||
|
||||
- Avoid putting more burden than necessary on the dependency maintainer. If the
|
||||
maintainers of core derivations face toil proportionally to the number of
|
||||
transitive dependencies they will quickly become overloaded. These
|
||||
maintainers are arguably the most critical to Nixpkgs and their load needs
|
||||
to be kept manageable.
|
||||
- Avoid unnecessarily breaking packages for any period of time. There are a
|
||||
number of users on the `*-unstable` channels and it is annoying if packages
|
||||
in their configuration get broken.
|
||||
- Avoid breaking the `master` branch as much as possible. The `master` branch
|
||||
is used by the `*-unstable` channels and breaking this branch means that no
|
||||
updates can be pushed. This includes critical security updates as well as
|
||||
regular feature updates.
|
||||
|
||||
## Procedure
|
||||
|
||||
The target branch for a merge is not affected by this policy. It will be
|
||||
picked, as it is today, according to
|
||||
https://nixos.org/manual/nixpkgs/stable/#submitting-changes-commit-policy.
|
||||
|
||||
1. The maintainer will prepare a PR with their intended changes.
|
||||
2. The maintainer should test a sample of dependent derivations to ensure that
|
||||
their change is not unnecessarily or unintentionally breaking. (Example: Ensure
|
||||
that a critical output file was not forgotten) Note that sometimes it **is**
|
||||
necessary to break all dependent packages, and the maintainer is not required
|
||||
to avoid this.
|
||||
1. A sample of at least 100 packages or 3h of build time is recommend as a guideline.
|
||||
2. The sample should include as many `passthru.tests` tests as is feasible.
|
||||
3. The maintainer will get the PR reviewed and approved.
|
||||
1. It is **recommended but not required** to have some maintainers of
|
||||
dependent packages involved in the review to review if the breakage is
|
||||
justified.
|
||||
4. The maintainer will contact the maintainers of all dependent, broken
|
||||
packages (herein called sub-maintainers).
|
||||
1. The sub-maintainers will be provided a link to the PR with the breaking
|
||||
changes as well as any context that will help them resolve the breakages.
|
||||
2. The sub-maintainers are expected to update the derivations that they
|
||||
maintain within 7 days.
|
||||
1. These changes should be merged to the target branch following the regular
|
||||
nixpkgs PR process if they are backwards compatible. Otherwise they
|
||||
will be merged into the branch of the breaking PR.
|
||||
5. The maintainer must provide a grace period of at least 7 days from when the
|
||||
sub-maintainers were notified.
|
||||
6. The maintainer must merge the target branch into their PR branch.
|
||||
7. The maintainer must mark all still-broken packages as
|
||||
[broken](https://nixos.org/manual/nixpkgs/stable/#sec-standard-meta-attributes).
|
||||
8. The maintainer can now merge to the target branch.
|
||||
|
||||
This procedure should not result in a failing channel build in the target
|
||||
branch at any point. In particular NixOS channel constituents are considered
|
||||
blocking and are an exception to the 7 day breakage rule.
|
||||
|
||||
# Drawbacks
|
||||
|
||||
This delays the merge of "core" derivations as the author needs to wait for
|
||||
sub-packages to be tested and possibly fixed up to the 7 day threshold.
|
||||
|
||||
# Alternatives
|
||||
|
||||
## Shorter grace period
|
||||
|
||||
A shorter grace period allows maintainers to move more quickly but requires
|
||||
maintainers of defendant derivations to jump to action quickly which is not
|
||||
always possible for volunteer driven work. For example if a maintainer is on
|
||||
vacation they can't be expected to respond in a couple of days.
|
||||
|
||||
## Longer grace period
|
||||
|
||||
A longer grace period would give derivation maintainers more time to react to
|
||||
changes in dependencies and provide more time to search for replacement
|
||||
maintainers if the original maintainer has abandoned the derivation. The 7 day
|
||||
number was mostly arbitrary and can easily be changed in the future. A longer
|
||||
grace period would also result in more packages being fixed before the breaking
|
||||
change is shipped, which results in less breakage for end-users.
|
||||
|
||||
# Unresolved questions
|
||||
|
||||
None.
|
||||
|
||||
# Future work
|
||||
- Create a tool for automatically notifying maintainers of broken dependents
|
||||
- Create a tool for automatically marking broken packages as broken.
|
||||
- [This is a milestone on the way to implemented a queue-based merge process
|
||||
for nixpkgs.](https://paper.dropbox.com/doc/MTSY8xKH6y1xDEwavyDNW)
|
||||
Loading…
Add table
Add a link
Reference in a new issue