# Renku-Python Releases
## Migration Types
### Major Metadata Migrations
E.g. v9 to v10.
Not backwards or forwards compatible, require a `renku migrate`, usually for major changes and happen rarely.
Determined by `Project.version` in metadata.
### Minor Migrations
Small changes like adding a new property to a domain model with a default value. Backwards compatible.
Happen automatically when a newer version writes to an older version project.
Enforced by `Project.minimum_renku_version` in metadata. Check can be skipped with `RENKU_SKIP_MIN_VERSION_CHECK=1` env var (For dev purposes only).
## Current status
```mermaid
flowchart TD
ghrelease([Github Release])
tag[Tag 2.4.0]
ghaction([Github Action])
pypipre[Pypi 2.4.0rc2 release]
chartrel[Chart Release 2.4.0]
coresvcrel["Core Service 2.4.0 release \n(from git tag)\ncreates new projects\nwith 2.4.0 pip version"]
autopr["Main Renku Auto-PR\n(acc tests fail since\n2.4.0 not on pypi)"]
pypirel[Pypi 2.4.0 full release]
renkurel[Renku Release]
master --> ghrelease
ghrelease --> tag
tag --> ghaction
ghaction --> pypipre
ghaction --> chartrel
ghaction --> coresvcrel
chartrel & coresvcrel --> autopr
autopr --> renkurel
pypipre-. manually,later ..-> pypirel
```
# Solutions
## (1) Back to the way things were
No prereleases, just full release off of RP git.
- People might make their repos unaccessible through the UI, potentially for quite a while in some cases
- Less likely to happen now that we don't nag users anymore
- Doesn't give actors like Omnibenchmark much headsup to catch up with changes
## (2) Current way but force tests
Add an env variable/chart value to manually pass in `2.4.0rc2` for acceptance tests & core-svc project creation until `2.4.0` proper is released. Should be released before first rollout to a deployment.
- A bit hacky, but would work with the way things are now
- Allows us to full release as close to (first)rollout as possible
- Could be useful for other things, deployment can switch contained cli version independent of core-svc version
- Tests could still fail if core-service creates project with an unsupported previous version (Only when we do a major metadata migration)
## (3) Use a private pypi repo
Essentially same as (2), but we do a full release immediately to a private pypi repo which is used on dev and in acceptance tests, and we publish to pypi proper on first rollout.
- More effort to set up the repo
- A bit cleaner in terms of version consistency
- Might actually be nice to have a private pip repo in Renku?
## (4) Pre-Release all artifacts
Make RC versions of chart, core-svc and wheel.
- tests pass since everything is consistent
- Auto-PR would be pointless since we should merge a pre-release
- When making the full release later, we're back at square one with the same issues we had so far 🚫
# Easing User Pain
## (5) Make the CLI forward compatible
Older versions would carry along new, unknown properties, without knowing about them.
- Not really an option for major migrations
- potential for unforeseen bugs
- would only work for versions after when it is implemented, unles we backport
## (6) Two-Way Migrations
Allow downgrading a project (without losing work), allowing users to recover from accidentally upgrading.
- Unclear how to deal with users that used new functionality already
- More effort
- Potential for extra bugs/bad metadata due to downgrade
## (7) Finer-grained versions
E.g. a change to dataset metadata doesn't prevent workflows from working on an older version. Probably not workable.
- A lot of extra effort
- Doesn't help in all cases
- Confusing to users
# Long-Term
- remove/rip out dependency of kg on cli
- Probably can't decouple core-svc and cli version, as they both act on the same metadata -> some issues will persist, at least in some cases (major migrations)
- In these cases, maybe we can have better user feedback and options to resolve it, at least