Why can the PP-BT AzDevOps task not be pinned to a particular version? #145
Replies: 1 comment 2 replies
-
A very nice write-up of the conundrum you are in. There are a few things I'd like to share on this. Hopefully it helps in the discussion en steps going forward. - Per task version & Tool installer - Custom dependencies on the PS tools - Why Side by side! Another reason is that you can have two version, one stable and one new/beta. Users can gradually move over. When bugs are found they can be addressed while reverting to v0 resolves the imminent impact. The time it takes will be longer for users to move over. But at least they can do it in a controlled manner. Especially because, as you mentioned, there are so many different cases in which the tools are used. This give that control that we are all looking for. Also, I can image you want to introduce breaking changed. I'm impressed that the tools are as backward compatible as they are! I wonder though, to what extend you some tasks be better it they were not backwards compatible. Maybe consistent naming of parameters between PAC parameters and the Tools as just an example. Would that not make the Tools as a whole better to understand? maybe not backward compatible between v0 and v1. But better when using v1 from scratch. - Communication |
Beta Was this translation helpful? Give feedback.
-
This is a justified question that we've read several times in the reported issues. Some background is in order.
For broader context, we are switching from the legacy PowerShell-based task implementation to using the same pac CLI based architecture we've successfully use for our Github Actions.
Unifying this architecture will make it easier for us to ship new features faster and in better quality (since we no longer have to port between different code bases and technology stacks).
- Why not just use the per-task version?
The PP-BT tasks have interdependencies between tasks: all our tasks do depend on an initial
ToolInstaller
task. In the old implementation, that task will download several PS modules and nuget packages and make them available for successive tasks.In the new pac CLI implementation, the ToolInstaller simply unzips the enclosed pac CLI nupkgs (one for Windows, one for Linux), thus obliviating the need for external network access, but also dramatically speeding up that task to < 1 sec.
It would have been relatively easy to introduce the new pac CLI based tasks all as task version "1", but that not only requires updates to existing pipelines (i.e. to explicitly opt-in), but also opens new error paths due to human mistakes: mix and match between e.g. a
Tool Installer@0
and e.g. aImport Solution@1
: the latter would expect a local pac CLI, but the former only initialized the PS runtime modules.- The Azure DevOps task deployment model assumes backwards compatibility
Within the major version of a task, e.g.
Import Solution@1
, any update we deploy, e.g. going from 1.0.83 to 1.0.84, will automagically picked up when the next build/release job is queued after an update was deployed to VS Marketplace.That auto-update is great to push fixes with no interaction required for pipeline authors. But it obviously also creates a challenge on our team to not mess up backwards compatibility.
In that AzDO deployment model, there simply is no way for a pipeline author to pin to a particular in-version variant, e.g. there is no way to prefer at large e.g. 1.0.41 over 1.0.81 for the whole task library. This is different to how e.g. our Github Actions work: there each action can be referenced as either
microsoft/powerplatform-actions/import-solution@v0
or by a specific release, e.g.microsoft/powerplatform-actions/import-solution@v0.7.1
. That would give our users a quick remediation path; but this is not available for Azure DevOps tasks- Why not backwards compatibility testing?
We do take backwards compatibility very serious and do follow SDP (Safe Deployment Protocol) where each new release/build we do first is tested in our automation and our set of sample pipelines. We then make the release candidate available to the CI/CD systems of our internal, 1st party D365 application/solutions authors. Any discovered issues either result in a hotfix or rollback.
Only if a rel candidate "survives" in that first deployment station do we proceed to make it publicly available.
For this particular migration from the PS-stack to the pac CLI based implementation, we've had multiple release candidates deployed with our 1st party partner teams within MSFT, over a time of almost 8 weeks.
The challenge with backwards compatibility is the sheer amount of scenario permutations, both in the set of different input parameter permutations, but also the wide range of complexities of e.g. Dataverse solution and AppSource packages.
- Why not side by side?
We had considered a variation of the "version 0" vs "version 1" where we could have created a brand new set of tasks, each with a different identifier/name. But that would have meant a lot of migration work for existing users to update and validate their pipelines.
Beta Was this translation helpful? Give feedback.
All reactions