-
-
Notifications
You must be signed in to change notification settings - Fork 616
Plan next release #2198
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
Anyone know what the policy has been until now? |
We've followed the semantic versioning, i.e. kept thing binary compatible between minor versions. Here's the specification for scala https://docs.scala-lang.org/overviews/core/binary-compatibility-for-library-authors.html So 4.0.0 if you want to break binary compatibility. |
I vote to keep binary compatibility. I think that a lot of bug fixes can be done without breaking binary compatibility. Maybe let's write 3 lists of pull requests that either:
|
Naturally we can do both. We can have master be the branch for the breaking changes and then cherry-pick from there to a 3.3.x branch |
I think David updated the PR not to break bincompat.
…On Mon, Apr 5, 2021, 5:11 AM Heikki Vesalainen ***@***.***> wrote:
Naturally we can do both. We can have master be the branch for the
breaking changes and then cherry-pick from there to a 3.3.x branch
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
<#2198 (comment)>, or
unsubscribe
<https://github.com/notifications/unsubscribe-auth/AAAYAUFEY5EMAVM7GNRLGALTHF5EHANCNFSM42DEN5GQ>
.
|
The Scala 3 PR breaks compatibility, right? If yes then it should be targeted to 4.0.0 but other things can get into 3.4.0. Should we branch Besides adding Scala 3 support that PR drops 2.12 support. I assume that dropping 2.12 also can't be done in 3.x.x? Or can it? |
Also, a 3.3.4 is not relevant at all? |
BTW should I convert this issue to a discussion? |
@SethTisue @hvesalai what's involved in a release? Ideally any |
https://github.com/slick/slick/milestones what are 'Future ideas,' 'Future fix release,' and 'Future feature release'? Which future? How do we get from there to knowing what should be in what branch and in what tag and release? |
re: publishing: Let's figure out publishing when the time comes. I am committed to helping as needed to make that happen. Last time, @octonato did it. I'll either figure it out or ask him to help me, and then once I know what the existing setup is, we can discuss perhaps changing it. I'm relieved to see that Bintray isn't involved, so that means we aren't forced to redo everything — but we could still choose to make changes. re: issue vs. discussion: doesn't matter to me either way. no idea about the milestones. we needn't feel bound by how it was done in the past. re: 3.3.4 vs 3.4.0 vs 4.0.0, I'm fine w/ whatever y'all decide. We don't need to bend over backwards to please users who aren't actively contributing to maintenance. And you don't need to worry about Lightbend there, either -- you can be bold (whatever that means to you) if the other maintainers agree. Our period of commercial support for Slick doesn't expire until later this year, so it's possible that if a customer reports a serious bug, we'd be forced to step in and do a release (3.3.4, presumably) from a branch. But I think that's unlikely to happen, so we don't need to plan for it or worry about it. I haven't looked at the Scala 3 PR to see what the bincompat situation and/or the 2.12 situation is there. |
@SethTisue, there is a wiki page with the release steps: https://github.com/slick/slick/wiki/Release-steps. I have simply follow it each time. Artifacts are published to stage repo and then you need to connect to sonatype and promote them. The release process can be simplified with sbt-ci-release though. If I recall correct, it's using its own solution with a few hacks here and there for signing. |
According to https://docs.scala-lang.org/overviews/core/binary-compatibility-for-library-authors.html, a binary incompatible change must go into 4.0.0, and a source incompatible change must go into 3.4.0. Does that imply that a change that is binary and source compatible should go into 3.3.4? What are other reasons to bump the minor version number? Should we also bump it for "new features"? How is "new feature" defined exactly? Also, where does forwards compatibility come in? Maybe the time to bump the minor version is when we break forward compatibility? If that is how it should work then I propose:
|
Thoughts? |
We don't need to put any changes to earlier versions, but we can. The question is, are there any users of older versions who would require some of the changes that we are merging AND can't upgrade to the newest version when it will be released. If so, and we want to cater to them, then we need to cherry-pick the changes also to the older version. If not, then we can just put everything to master and cut a new release from there. Our project is OK with the latter. |
I've worked on this a bit but it's confusing that
Also, why is it disabled for 2.13? And why only for the main slick submodule? |
But 3.3.1 is compatible with 3.3.0. Isn't binary compatibility transitive? |
If I add commits to 3.3.x from main, does it matter if I rebase in a way that loses merge commits? If I preserve merges then I have to avoid testing commits that are only part of a PR and either don't build or don't have mima set up properly |
In any case, a real |
But 3.3.3 was not the first release for 2.13. I think 3.3.1 was.
Why?
Try merging 3.3.x into main. You'll get a lot of conflicts. AFAICT the common merge base is v3.3.0. I guess stuff was haphazardly cherry-picked across branches and no one ever did a merge?
I mean rebase is basically scripting cherry picks. So that doesn't help, especially since cherry-pick can't copy commits, and there are a LOT of commits on main since 3.3.x.
Not sure why you feel that way, but merges are a core idea in git and PRs generally produce them. Anyway, because 3.3.x/v3.3.3 are not an ancestor of main, rebasing and merging produce lots of conflicts and git bisect doesn't help, both because it crashes, and because I can't find where main starts being binary compatible with 3.3.1. |
So far, none of the commits in |
Hmm, maybe it's partially because the sbt launcher doesn't work with older SBTs |
A lot are failing with sbt.InvalidComponent: Could not find required component 'xsbti' |
sounds like sbt/sbt#6447 -- if so, you should be able to work around it by adding |
Thanks, that worked! I removed the hashes that failed bincompat to focus on the rest, and it's running at https://github.com/slick/slick/runs/2377507689. |
Well those failed. Not sure why. But then again that's taking commits in context. I don't know what broke compatibility but it doesn't need to invalidate all subsequent commits. So I tried a different approach. I wrote a script to produce #2216 Basically, it uses |
Umm.... except now the same branch is failing.
I am so confused. Is this thing even supposed to be deterministic or is it just a throwing dice? |
Hmm, after throwing in a |
@nafg @hvesalai I'm curious, do either or both of you have a personal or a professional interest in maintaining 3.3.x and 3.4.x branches, or is it just that you feel the project has some kind of obligation to its users to provide them? My own primary concerns are 1) make sure the Scala 3 PR has a place to land, 2) not overtax available maintainer effort. Concern 2 implies: let's default to keeping it simple unless y'all are sure you're really motivated to do something more complicated. (But if you are motivated, then great!) |
I don't have an attachment to PVP (the version scheme you're describing) or SemVer. My goal is to make the process of maintaining Slick as simple as possible. That means
|
(To recap, it seems so far we have consensus that we should not bother with making a binary compatible release by cherry-picking binary compatible changes since 3.3.3. The question right now is what exactly that makes the next (pre-)release since it doesn't seem like it should wait for Scala 3 support to land, and given that there may be important changes coming not that far off. If we go with PVP it could be 3.4.0, but if we go with semver then it could be either 4.0.0-M1, or 4.0.0 and it might not be long before a 5.0.0. That said, with PVP, scala 3 support might need to be a 4.0.0-M1 if there are other changes planned afterward, even if they won't be ready for another few months, IIUC) |
The Scala 3 PR seems to have stalled, for now anyway. Should we go 3.4.0 or 4.0.0 anyway, and figure that if Scala 3 support ends up requiring another big bump, then so be it? As for the 3.4.0 (PVP) vs / 4.0.0 (semver) question, I don't have a strong opinion. If forced to choose I guess I'd say fooey to precedent, let's switch to semver. But @nafg, you've been the most active maintainer recently, so I'm inclined to let you make the call. I do feel like enough time has passed now that we ought to roll some kind of release before much longer. |
Yeah, I've been cleaning up the build lately to prepare for figuring out how to make releasing more automated. sbt-version-policy requires regularly updating I think my goal would be that if a PR includes breaking changes, then either it would automatically (dynamically?) compute the next version based on that, or else it give an error that forces you to update the It would help to have someone to talk it through with. |
@nafg What is the issue you are seeing with |
@nafg So I took a look at this and here is why [error] stack trace is suppressed; run last codegen / mimaPreviousClassfiles for the full output
[error] stack trace is suppressed; run last hikaricp / mimaPreviousClassfiles for the full output
[error] stack trace is suppressed; run last testkit / mimaPreviousClassfiles for the full output
[error] (codegen / mimaPreviousClassfiles) sbt.librarymanagement.ResolveException: Error downloading com.typesafe.slick:Slick-CodeGen_2.13:3.3.0
[error] Not found
[error] Not found
[error] not found: /home/dstrawn/.ivy2/local/com.typesafe.slick/Slick-CodeGen_2.13/3.3.0/ivys/ivy.xml
[error] not found: https://repo1.maven.org/maven2/com/typesafe/slick/Slick-CodeGen_2.13/3.3.0/Slick-CodeGen_2.13-3.3.0.pom
[error] not found: https://oss.sonatype.org/content/repositories/snapshots/com/typesafe/slick/Slick-CodeGen_2.13/3.3.0/Slick-CodeGen_2.13-3.3.0.pom
[error] (hikaricp / mimaPreviousClassfiles) sbt.librarymanagement.ResolveException: Error downloading com.typesafe.slick:Slick-HikariCP_2.13:3.3.0
[error] Not found
[error] Not found
[error] not found: /home/dstrawn/.ivy2/local/com.typesafe.slick/Slick-HikariCP_2.13/3.3.0/ivys/ivy.xml
[error] not found: https://repo1.maven.org/maven2/com/typesafe/slick/Slick-HikariCP_2.13/3.3.0/Slick-HikariCP_2.13-3.3.0.pom
[error] not found: https://oss.sonatype.org/content/repositories/snapshots/com/typesafe/slick/Slick-HikariCP_2.13/3.3.0/Slick-HikariCP_2.13-3.3.0.pom
[error] (testkit / mimaPreviousClassfiles) sbt.librarymanagement.ResolveException: Error downloading com.typesafe.slick:Slick-TestKit_2.13:3.3.0
[error] Not found
[error] Not found
[error] not found: /home/dstrawn/.ivy2/local/com.typesafe.slick/Slick-TestKit_2.13/3.3.0/ivys/ivy.xml
[error] not found: https://repo1.maven.org/maven2/com/typesafe/slick/Slick-TestKit_2.13/3.3.0/Slick-TestKit_2.13-3.3.0.pom
[error] not found: https://oss.sonatype.org/content/repositories/snapshots/com/typesafe/slick/Slick-TestKit_2.13/3.3.0/Slick-TestKit_2.13-3.3.0.pom
[error] Total time: 11 s, completed Jun 29, 2021, 10:25:29 AM
sbt:root> show versionSchemeEnforcerPreviousVersion
[info] slick / versionSchemeEnforcerPreviousVersion
[info] Some(3.3.0)
[info] codegen / versionSchemeEnforcerPreviousVersion
[info] Some(3.3.0)
[info] hikaricp / versionSchemeEnforcerPreviousVersion
[info] Some(3.3.0)
[info] testkit / versionSchemeEnforcerPreviousVersion
[info] Some(3.3.0)
[info] versionSchemeEnforcerPreviousVersion
[info] Some(3.3.0) Looking at Maven central, I can see don't see these artifacts there, so I'm assuming that you only using them for testing. If so, then we simply add Attempting to run it still fails. This is because If we unset that, letting [error] stack trace is suppressed; run last mimaPreviousClassfiles for the full output
[error] (mimaPreviousClassfiles) sbt.librarymanagement.ResolveException: Error downloading com.typesafe.slick:slick_2.13:3.3.0
[error] Not found
[error] not found: /home/dstrawn/.ivy2/local/com.typesafe.slick/slick_2.13/3.3.0/ivys/ivy.xml
[error] not found: https://repo1.maven.org/maven2/com/typesafe/slick/slick_2.13/3.3.0/slick_2.13-3.3.0.pom
[error] not found: https://oss.sonatype.org/content/repositories/snapshots/com/typesafe/slick/slick_2.13/3.3.0/slick_2.13-3.3.0.pom
[error] Total time: 1 s, completed Jun 29, 2021, 10:40:47 AM It appears that version 3.3.0 is not on Maven central. I see versions 3.3.2 and 3.3.3 only (for 2.13): https://search.maven.org/artifact/com.typesafe.slick/slick_2.13
> git --no-pager tag --merged @ --sort=-creatordate | head -n 1
v3.3.0 Since 3.3.3 isn't an ancestor of the That said, whether or not a branch is merged back into the main branch really has nothing to do with the notion of binary API compatibility and version numbers. I'm working on some changes to In the meantime, if in the general case you intend to merge releases back into I hope that helps! Let me know if I can be any assistance or answer any questions. If you're curious, you can see my branch were I tested all this out here: you release https://github.com/isomarcte/slick/tree/sbt-version-scheme-enforcer (here's the diff with main). sbt:root> versionSchemeEnforcerCheck
...
[error] Slick: Failed binary compatibility check against com.typesafe.slick:slick_2.13:3.3.3! Found 4 potential problems (filtered 9)
[error] * the type hierarchy of object slick.util.ConstArray is different in current version. Missing types {slick.util.ConstArrayCompat}
[error] filter with: ProblemFilters.exclude[MissingTypesProblem]("slick.util.ConstArray$")
[error] * interface slick.util.ConstArrayCompat does not have a correspondent in current version
[error] filter with: ProblemFilters.exclude[MissingClassProblem]("slick.util.ConstArrayCompat")
[error] * the type hierarchy of class slick.util.SQLBuilder is different in current version. Missing types {slick.util.SQLBuilderCompat}
[error] filter with: ProblemFilters.exclude[MissingTypesProblem]("slick.util.SQLBuilder")
[error] * interface slick.util.SQLBuilderCompat does not have a correspondent in current version
[error] filter with: ProblemFilters.exclude[MissingClassProblem]("slick.util.SQLBuilderCompat")
[error] stack trace is suppressed; run last slick / mimaReportBinaryIssues for the full output
[error] stack trace is suppressed; run last mimaReportBinaryIssues for the full output
[error] (slick / mimaReportBinaryIssues) Failed binary compatibility check against com.typesafe.slick:slick_2.13:3.3.3! Found 4 potential problems (filtered 9)
[error] (mimaReportBinaryIssues) mimaPreviousArtifacts not set, not analyzing binary compatibility
[error] Total time: 11 s, completed Jun 29, 2021, 10:54:56 AM |
I just opened #2275. If possible I would like to use sbt-dynver. Other than that I'm ready for a 3.4.0, unless we can get any more open PRs in, or there's any other part of the process that I can make more automated first. @octonato @SethTisue @hvesalai any of you know that know how to do a release want to go over it on a call? |
Open PRs and their status: #2275 pending review |
There are a few variables that normally change over the course of a project's releases. I want to minimize manual changes as much as possible.
The issue is how to get all 3. If the current version automated via There is a possible solution: If we can tell from the changes themselves how major they are, we can automate setting the version and tagging based on that. I have seen two relevant ways to do that:
I still have no idea what the actual release process is like. But if we can't automate it then I guess after every release we should set |
I think it is a bit more complicated than that. If you only using For example, If your last release is This is broken down into a version number of This isn't a problem with If we remove That said, I'm not trying to argue you should remove
For what it's worth, even without considering automatic mima calculations, I think using Let me know if I can clarify things or help in anyway here. |
let's cross that bridge once all PRs are merged and everything is actually good to go |
@isomarcte to clarify, Slick has not used sbt-dynver. I'm just trying to remove as many manual steps as possible that are required to maintain and release Slick. For however long I help with Slick, and whoever else does afterwards, the more automated it is, the quicker things can happen and the sooner changes can be released. If I can remove the need to manually set the version, that would be nice.
That doesn't solve the problem of: someone just opened a PR, what mode should CI run MiMa in? I want that the "assumed" next version could be one thing, say a patch bump, but if a PR has breaking changes it should be easy for the PR author to either find out and refactor to avoid breaking changes, or indicate that breaking changes are desired and when merged everything should follow accordingly. This could be by:
But (1) it shouldn't be more than one of the above, and (2) everything else that needs to happen should happen automatically (e.g. by inferring
I want to have the right MiMa settings on each PR. |
Up to you, but I like it better when I have more time to digest information
@SethTisue any in particular that are important to you to make 3.4.0? Also, if the author doesn't, will you be able to rebase #2145 ? |
Okay, well here's what I can see from Going forward, it would be better to be on sbt-ci-release, IMO. (Note that sbt-ci-release includes sbt-dynver.) Perhaps you or another volunteer would like to PR that in the meantime. We could merge such a PR even before we have working publishing credentials; those can be added to the GitHub Actions config later.
Nope, everything I cared about was merged already. It would have been nice if Scala 3 support had landed in time, but I feel pretty strongly that there's more value in releasing anyway than there is in waiting any longer.
Sure |
Hmm, so now I have an interesting idea which is probably overengineering but it sounds kind of nice I think: So, we're talking about how sbt should know what version is being targeted, in a way that makes opening and testing a PR seamless. And GitHub already has a way to express what version a PR is targeting: milestones. So here's the idea:
Although, I do like Release Drafter's idea of labelling PRs with their level of breakage; this way if there are several open PRs, it can easily be seen which ones can be combined into a non-breaking release and which ones could be merged afterward for a subsequent breaking release. |
Right, so basically the credentials would go into github secrets. You can do that at any time. I've used sbt-ci-release on my own OSS repos, since the bintray shutdown, but only via sbt-github-actions. That said, I based Slick's github actions code off that, so hopefully I'll be able to figure out how to configure it standalone.
It's interesting. I assume you're saying that based on Lines 3 to 15 in fcf0e91
However, at the same time, it seems to have been set up to publish based on the tag set in CI: Lines 18 to 19 in 070b33a
Anyway, I would be happy to delete all that and related code, and just do a normal sbt-ci-release setup like I do in my other projects, if that's what you think makes the most sense. |
Actually, interesting observation related to that and #2198 (comment): CI already works by overriding the sbt |
Oh, weird, I didn't notice the But I guess it doesn't matter, because "a normal sbt-ci-release setup" is exactly what I would suggest, and I'm sure Renato won't object. Almost every repo I work in uses sbt-ci-release, these days. |
Ah I see. Well I completely understand that sentiment, that was a major reason I wrote sbt-version-scheme-enforcer. ;)
Yeah, that makes perfect sense to me and I completely agree. FWIW, I've personally found that just using Anyway, let me know if I can provide any more help. |
Merged
Actually I didn't need to rebase it, closing and reopening synced it to main post-#2275. That's merged too. I hope to focus on working to Scala 3 compatibility after 3.4.0, but I don't think it should come before because it would be best to have refactoring freedom. For instance the virtual classes pattern isn't allowed so lots of renames will be needed. |
Another question is what tasks need to be done with a release besides the act of publishing to maven central. Some that come to mind are:
What else is there? |
@isomarcte can we chat somehow? |
@nafg Sure. Like an audio chat? |
@isomarcte yeah. You can DM me on discord as nafg#1263 or gitter as nafg |
@nafg I messaged you on discord. |
Uh oh!
There was an error while loading. Please reload this page.
A lot of PRs have now been merged since 3.3.3.
I was thinking we might do 3.4.0-RC1 first, then 3.4.0? That's just a suggestion; @hvesalai and @nafg, you can handle this as you see fit. I can help pull publishing levers when the time comes. (I have no opinion about timing.)
One question that came up over at #1496 is binary compatibility. I enabled MiMa in the repo with the idea that at minimum, we would probably like to be notified by CI when something isn't binary compatible.
I have no position on whether the next version should be binary compatible or not. By semantic versioning (which I do suggest we follow), a 3.4.0 version should be backwards binary compatible. But if we call it 4.0.0 instead, then we're completely free to break bincompat.
The text was updated successfully, but these errors were encountered: