The Issue is open to collect ideas about PowerShell Core Servicing model.
By Servicing model we mean releasing new versions, feature and security patches.
We'd rather not discuss small details here, but collect common scenarios with pros and cons to help PG team make a weighted decision.
From #5458 @SteveL-MSFT:
PSCore6.0.0 will be what we call modern lifecycle which effectively means fix forward only. Barring any critical security issue, customers are expected to install the latest release version (currently planned at 6 month intervals).
I have concerns about several cmdlets being tied to the rest of the project. 6 months is a pretty rapid cycle, however, for some cmdlets there is a need to possibly be even more rapid. Specifically the web cmdlets, but there may be others. These cmdlets are susceptible to the same security issues as web browsers which are on a more rapid release cycle to address the ever changing security landscape of the internet. Even curl is in a very rapid release cycle.
I don't want to rush the project for these kinds of fixes, and I don't want the rest of the project to slow them down.
If anything, if there is some decent way to decouple the release cycle of the individual modules so they could be updated independently (provided those updates don't break functionality in other modules), that would be great. Most users may not take advantage of that, but some may find it critical.
I realize that users always have the option to build from source to get new features and such out of band with the release cycle. But that's not ideal, especially for windows admins who are not used to that method (where as *nix admins are probably more familiar with building from source). I also realize that they could always grab the nightly build and install, but, sometimes that means broader changes than warranted from the issue the update is being done to address.
VS Code - publish new stable release every month.
VS Code has a manager for extentions.
VS Code has insiders releases which contains new, experimental and unstable features.
Exchange Server team releases new version every 3 months (quarter) and the build expires 6 months later. Also security patches can be released for previous non-expired builds. Release is full (cumulative) discributive. Exchange Server team provides insider builds for TAPs to test before public release.
Servicing model:
Distributives:
Based On SymVer 2.0 and modern life cycle we could give up on "beta" and "preview" and use 6.1.x on a daily basis.
I'd expect the scheme:
Interesting question is about working on long time features which is breaking changes - in theory we should make its in 7.0.0 branch but if we follow modern servicing model we are limited to one branch 6.1.x.
@iSazonov I had the same question. If we can't put breaking changes into 6.x.x per semver, then we would only be able to accept breaking changes to a 7.0.0 branch. I have one breaking change in the pipe with regards to legacy -Credential usage on the web cmdlets which couldn't get approved before RC. I have no clue how to manage that change now. Do I have to sit on in until we get close to a 7.0.0? can e into breaking changes into 6.x?
@markekraus at some future time, it may make sense to pull the webcmdlets out of the Utility module into a separate module that is not tied to a specific PSCore6 release. At that time, it would have it's own versioning and can be v8.1 while PSCore6 is only at v6.3, for example.
@iSazonov I have a non-binding, very WIP document in PR at https://github.com/PowerShell/PowerShell-Docs/pull/1994
Would love some feedback there if you (or anyone else) has some.
@joeyaiello Thanks! I thought about it in the last month and share my thoughts tomorrow here.
Looking at the .Net Core and the .Net Framework, we see a convergence based on .Net Standard 2.0. Already 70% of nuget packages support this standard. However, many APIs are still not ported. This year we expect significant further progress.
Here we see three main things that we should consider when considering the service model:
The main criterion is minimization of efforts. This means minimizing the number of branches. By limiting the service model we reduce the number of branches.
Below I am trying to show that the modern service model should be limited in the next year or two, because it creates significant difficulties, the overcoming of which requires unreasonable expenses.
An interesting question arises with the .Net Core service updates. These updates can be critical and security updates. So we have to support them. But this is a serious problem - they can break something, we need to make a new distro, we do not have traditional tools (Windows Update) to force users to update. The release of the new service version will require considerable effort from us - .Net Core can release service updates every month. Microsoft may have sufficient internal resources to release a new service version of PowerShell Core, but taking into account the intensive development of .Net Core and PowerShell Core, these efforts will not be in demand today - new versions will be much more functional and attractive for consumers. We should limit the service model in this area to a year or two as described above until there are commercial projects based on PowerShell Core with a long life time. This should also be reflected in the documentation - support or not support.
If we support, the new release model every 6 months loses its meaning - we will have to just release the new version every month (6.0.1-Jun, 6.0.2-Feb,...). Support for previous versions also loses its meaning - we are forced to reject all previous versions in support. We can return to longer-term support if commercial projects request it. Only most likely they will also use the modern model.
The question is how we will develop on the versions of .Net Core that have not yet been released. This implies that we need two branches - release and Dev.
All this convinces me that it is better to postpone for a year or two.
Almost all PowerShell Core subsystems can be improved and enhanced. PowerShell Core also implements only a subset of the capabilities of Windows PowerShell (40-60%). This means that the PowerShell Core code base will be changed intensively, including breaking changes. We have them already done a lot. Most likely there will be more. Implies making such changes to the master branch. Banning this makes no sense while we are at the beginning of the way. We could ignore this and indicate in the documentation that the service model in the next year or two admits that minor versions will contain breaking changes as inevitability.
Convergence brings other thoughts, but they're less related to servicing model.
With regards to the security updates of .Net Core: I suggest to keep all the branches of releases that are supported (6.0, 6.1, etc) and monitor for .Net Core patches. Should a patch arrive, then we update the .Net Core version in the release branch, recompile and ship it e.g. 6.0.1. By definition, patches are not breaking so I do not see a problem here and should there be a breaking change then we can always ping back to corefx and request another patch or a custom build of the patch that suits our needs. We only have to make sure that when someone runs sudo apt-get update that it fetches only patches but not minor versions (unless the current version has become unsupported). For Windows, we could add a patch-checker into the product or as a separate tool.
With regards to the question of .Net Core updates: In the first phase when we do not have an LTS version yet, I do not see the need of having to use an officially released/supported version of .Net Core. As long as the version of .Net Core to be shipped with PowerShell has been used for more than one month and had RC testing then the risk is negligible IMHO. There will always known and unknown bugs in new versions of software anyway and the modern lifecycle means to me that the customer should roll back the PowerShell upgrade if it causes a blocking problem, report it and wait for the next release with the fix. Therefore I think we should support the current and previous version.
What would be nice for the user if one could upgrade/change the version of .Net Core when using it directly via the [Namespace]::Method() syntax. I use this feature of calling .Net directly in PowerShell a lot when developing/testing .Net code like e.g. regular expressions because it is so much faster compared to having to run a unit test or dummy project.
On Windows, is it feasible to only submit security patches to _Microsoft Update_ much like Office, .NET, and SQL Server do today? That fits into the existing workflow for most companies making it the best option for us.
Major and Minor updates can follow their own distribution methods.
For what it's worth, I think it would be very useful to pull the web cmdlets out -- if only because they should work on older versions of PowerShell. I've actually been thinking about doing that even if you don't...
If you extract a Microsoft.PowerShell.Commands.Web and distribute it via the gallery, what would happen to the built-in ones? What about security fixes?
Assume you've got an incompatible new version of the web cmdlets, and you find a security problem. You need to patch it in the external module, but do you also need to patch the old version and release a new PowerShell release to ship that fix?
You're going to have to keep all of that in mind when you're talking about servicing models...
Given that we have a servicing model now at https://aka.ms/pslifecycle, I'm closing this one out