<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Power Platform & Principles]]></title><description><![CDATA[Discussions and guides from experiences in Power Platform & software development. Personal and collaborative perspectives with specialists looking for constant improvement.]]></description><link>https://www.hollandhart.uk</link><image><url>https://www.hollandhart.uk/img/substack.png</url><title>Power Platform &amp; Principles</title><link>https://www.hollandhart.uk</link></image><generator>Substack</generator><lastBuildDate>Wed, 20 May 2026 18:17:52 GMT</lastBuildDate><atom:link href="https://www.hollandhart.uk/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[James Holland-Hart]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[brynhh@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[brynhh@substack.com]]></itunes:email><itunes:name><![CDATA[James Holland-Hart]]></itunes:name></itunes:owner><itunes:author><![CDATA[James Holland-Hart]]></itunes:author><googleplay:owner><![CDATA[brynhh@substack.com]]></googleplay:owner><googleplay:email><![CDATA[brynhh@substack.com]]></googleplay:email><googleplay:author><![CDATA[James Holland-Hart]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Microsoft Innovation Podcast]]></title><description><![CDATA[Audio!]]></description><link>https://www.hollandhart.uk/p/microsoft-innovation-podcast</link><guid isPermaLink="false">https://www.hollandhart.uk/p/microsoft-innovation-podcast</guid><dc:creator><![CDATA[James Holland-Hart]]></dc:creator><pubDate>Wed, 20 May 2026 11:03:39 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/ac11e3b2-b11a-4eca-9d2c-a08579682c2d_800x411.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="pullquote"><p>I recently had the pleasure of being invited to the Microsoft Innovation Podcast with Mark Smith, a prominent member of the Power Platform community.</p></div><p>We discussed a practical rethink of how teams use Power Platform and Dynamics 365 to reduce technical debt, improve governance, and build sustainable solutions. The discussion centres on shifting from tech-first thinking to business outcomes, balancing low-code and pro-code principles, and preparing for AI and Copilot. The key insight is that long-term success comes from disciplined governance, reuse, and choosing when to adopt versus adapt.</p><p>Please have a listen here https://www.microsoftinnovationpodcast.com/adopt-vs-adapt-cut-power-platform</p><div><hr></div><p><em>Mark Smith (nz365guy) has been a Microsoft Business Applications MVP for over 14 years. He am passionate about helping people reach their full potential, through training, coaching and mentorship.</em></p><p><em>Please pay him a visit on <a href="http://linkedin.com/in/nz365guy">Linkedin</a></em> </p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.hollandhart.uk/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Power Platform &amp; Tech Thoughts! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Certification Paths]]></title><description><![CDATA[Are certifications going to earn me 80k? No. But they are helpful, in other ways.]]></description><link>https://www.hollandhart.uk/p/certification-paths</link><guid isPermaLink="false">https://www.hollandhart.uk/p/certification-paths</guid><dc:creator><![CDATA[James Holland-Hart]]></dc:creator><pubDate>Wed, 26 Mar 2025 00:24:10 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/f074a8d8-fb98-4ae2-9f27-f1f3d02e03d3_1200x600.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Many questions appear on Reddit and Discord, primarily if certifications will get certain jobs, or give all the skills required to be a developer. Here are some recommendations.</p><div><hr></div><h2>The Purpose</h2><p>To dispel a myth &#8211; getting certifications will not walk you into a job, at any level. They are simply Microsoft&#8217;s way of measuring your understanding of the topics their material on MS Learn is based around &#8211; nothing more, nothing less. They are not a measure of real-world experience, or that you know how to apply the material.</p><p>Secondly, how some of the questions are worded is very obtuse. Sure, you shouldn&#8217;t be spoon fed the answers, but there could actually be multiple correct answers for some questions. Some are even out of date, referencing places to install solutions from that don&#8217;t even exist anymore, long replaced by App Source. This is primarily why I am going through the process of preparing for an MVP nomination and offering any views I can to help people &#8211; to try and improve this from the inside.</p><p>Finally, you can cheat. I&#8217;m not going to say where, but many people know that question dumps exist of the answers. Someone could memorise these, never having done the material and be &#8220;certified&#8221;. They would have no idea how to be a Power Platform developer.</p><h2>How are they used?</h2><p>Most organisations will not take certs as an absolute measure of experience. What they may do is use it as a way to engage in conversations about other topics. When we recruit Power Platform developers, we treat them like coders, or any other developer &#8211; your experience counts. We also have no desire to push staff to doing the exams, as it may not be for them. However, we do want them to complete the MS Learn material and we have open, varied interviews to gain an undertanding of the applicant and them us.</p><p>The platform is constantly evolving and the certs, or the desire to complete the material for them, shows enthusiams to grow with the tools and provide the best possible value to our staff and members, as a non-private organisation.</p><h2>What should you do?</h2><p>There are 2 main courses you should do as a bare minimum: <a href="https://learn.microsoft.com/en-us/certifications/power-platform-fundamentals/">PL-900</a> and <a href="https://learn.microsoft.com/en-us/certifications/power-platform-functional-consultant-associate/">200</a>. You should then work on your experience and discover what part of the platform you want to get deep into.</p><p>Then</p><p>Work on <a href="https://learn.microsoft.com/en-gb/certifications/power-bi-data-analyst-associate/">PL-300</a> if you wish to become a data analyst and pursue the world of Fabric.</p><p>Work on <a href="https://learn.microsoft.com/en-gb/certifications/power-platform-developer-associate/">PL-400</a> if you wish to continue as a pro-developer, into the world of Azure, plugins, PowerFx, etc.</p><p>Work on <a href="https://learn.microsoft.com/en-us/certifications/power-platform-solution-architect-expert/">PL-600</a> when you are a few years in and wish to pursue an architectural role, overseeing design, governance, etc.</p><p>But remember, these are complimentary to your experience. Practice matters most.</p><div><hr></div><h2>Summary/Next&#8230;</h2><p>Do not be drawn into the current trend of Power Platform being treated as a quick money earner, like so many development platforms are. Think about what you want from it as a career and work up to that.</p><p>The next few posts will continue talking about the industry and buy vs build, if users are always right and agile frameworks. The first video podcast will come soon, regarding data modelling.</p>]]></content:encoded></item><item><title><![CDATA[Copilot – Useful or fad?]]></title><description><![CDATA[As a software developer, there&#8217;s rarely a day I don&#8217;t hear how Copilot is going to change our lives, in work, in Linkedin, or on presentations.]]></description><link>https://www.hollandhart.uk/p/copilot-useful-or-fad</link><guid isPermaLink="false">https://www.hollandhart.uk/p/copilot-useful-or-fad</guid><dc:creator><![CDATA[James Holland-Hart]]></dc:creator><pubDate>Tue, 28 Jan 2025 00:44:13 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/06bd1689-13d5-46fb-bbb0-e0f2207c76d5_260x130.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>As a software developer, there&#8217;s rarely a day I don&#8217;t hear how Copilot is going to change our lives, in work, in Linkedin, or on presentations. For the 2 people who read my articles, I feel it&#8217;s worth talking about real experiences.</p><div><hr></div><h2>The Microsoft and media machine</h2><p>Where do I start with this? Well, if there&#8217;s anything that will turn me off generative AI just out of spite, it&#8217;s this. How much MS, Google, Apple and others pump AI like it&#8217;s a 1980&#8217;s capitalists wet dream of the 2000s, is becoming really detrimental to I.T. Recently, I saw an advert for Norton on TV saying &#8220;create fake wifi network&#8221; like that&#8217;s something you could type in and it would work. Don&#8217;t worry about routers and SSIDs and packet sniffing, you&#8217;re at risk! Buy our resource hogging software that adds nothing over Windows Defender!</p><p>Point being, the companies and their cheerleaders (employees and community members) need to tone it down. Show us the actual benefits and drawbacks, be honest and people will be far more keen to adopt in a way that makes sense. I want to shout out <a href="https://www.linkedin.com/in/nz365guy/">Mark Smith</a> and <a href="https://www.linkedin.com/in/luisefreese/">Luise Freese</a> as they&#8217;ve posted quite a few things online with really good critical thinking, considering both sides.</p><h2>Is it good &#8211; Generally?</h2><p>tl;dr <a href="https://hardwareunboxed.com/products/hub-8-bit-it-depends-t-shirt">it depends</a>. A colleague and I have been drafting an introduction to Power Platform and Dynamics for non-technical audiences at work, so using it to get better quality wording was quite useful. That&#8217;s not something you could use voice assistants or a search engine to do.</p><p>Somewhere in the middle was looking for general information like stats, or event information, or weather, etc. It&#8217;s good at doing this, but ultimately, it&#8217;s just a text version of Siri/Google Assistant/Alexa.</p><p>Then comes the more &#8220;creative&#8221; stuff. Dear god. I moderate the <a href="https://www.reddit.com/r/PowerPlatform/">Reddit community</a> and I&#8217;ve tried to use Copilot to generate a banner, with the Snoo being in front of a computer doing some Power Platform work. The results were laughable &#8211; stood on the desk, mangled text on the screen, all sorts.</p><h2>Is it good &#8211; Power Platform?</h2><p>Yet again, it depends. Agents are just a rebadged Power Virtual Agents and that was always excellent, especially how it can directly plumb into Teams, Power Automate, Customer Service, etc. Where you use them for exactly what their niche is &#8211; you can&#8217;t beat it.</p><p>If you&#8217;re not going this far, prompts for advice can be excellent, like why your flow is failing. This can appear automatically sometimes and gives info where the flow checker is empty. Sometimes they don&#8217;t understand your prompt though.</p><p>On the bottom end &#8211; avoid building things with it at all costs. If your statement is too broad, it&#8217;ll wipe out your entire flow, or give you an action with completely incorrect functions.</p><div><hr></div><h2>Summary/Next&#8230;</h2><p>I think what it comes down to at the moment, is for it to be good you have to be very specific and it has to be when there&#8217;s a binary result to achieve. The more focussed the usage, the better it is. If you&#8217;re trying to be more creative, or the claim that it&#8217;s going to replace your job &#8211; like every other fad of the last 30 years, forget about it.</p><p>Think very hard about what you need from it &#8211; sometimes it&#8217;s a great compliment, sometimes it&#8217;s a huge hinderance. It&#8217;s no different to any other tool. Just don&#8217;t swallow the idea that Number 5 is alive, as it wont be, plus it&#8217;ll be a lot less fun than Johnny.</p><p>Next time I&#8217;ll be mopping up a few common questions like training, jobs, etc. Then moving into a series about software development in general, complemented by the start of a new (hopefully monthly) video series, with free form conversations about the industry.</p><p>p.s. give Hardware Unboxed a visit in the link earlier &#8211; they are great guys doing high quality work.</p>]]></content:encoded></item><item><title><![CDATA[Power Pages – Auto Assign Permissions]]></title><description><![CDATA[We have been rebuilding a website in work, to move from the path-to-deprecation Power Apps Portals to Power Pages with enhanced data model.]]></description><link>https://www.hollandhart.uk/p/power-pages-auto-assign-permissions</link><guid isPermaLink="false">https://www.hollandhart.uk/p/power-pages-auto-assign-permissions</guid><dc:creator><![CDATA[James Holland-Hart]]></dc:creator><pubDate>Fri, 20 Dec 2024 12:00:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/31f9f96c-249c-4106-afa8-0f7e92629c54_192x96.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>We have been rebuilding a website in work, to move from the path-to-deprecation Power Apps Portals to Power Pages with enhanced data model. I may write a post about the benefits of this (there&#8217;s lots, do it as soon as you can!), but one thing I struggled to find any useful information on, was how to assign permissions to contacts via a cloud flow.</p><div><hr></div><h2>Why automatic?</h2><p>You don&#8217;t need to. Power Pages includes registration options, where people create accounts via your configured authentication methods. However, our use case is contacts are created for various reasons, by staff, from the people registering, and used in various services.</p><p>We have a custom authentication service which allow logging in, but they will see the message of not having permissions to view the pages. This used to be solved via workflows/processes, but as everyone should know &#8211; they have been deprecated for years.</p><h2>How via cloud flows?</h2><p>Ultimately, there are 4 key columns that need updating on the contact and link to a web role. You should already have web roles setup when you built the website in Power Pages and assigned it to required pages and data.</p><p>Setup your flow with a trigger that ensures updates to a contact will not result in an infinite loop &#8211; ours are state is active, the columns required are already setup, plus other organisation specific data. The base trigger for us is row updated/added with filters.</p><p>Next, get the role from the <em>Site Components</em> table, either via get rows if you know IDs will be retained in each environment, or list rows if getting by name. Either way, you should use an environment variable to define the ID or name in each environment (see my previous articles in releases via Azure Devops).</p><p>Your 2nd action is where the main problem lies &#8211; assignging the web role to the contact.</p><ul><li><p>The table and ID is obviously contact and the ID of that.</p></li><li><p>Relationship is <em>powerpagecomponent_mspp_webrole_contact.</em></p><ul><li><p>There&#8217;s strange behaviour here, as powerpagecomponent is where most site elements reside (roles, settings, pages, etc) but mspp_webrole is a virtual table over the top of it (which you can&#8217;t access via SQL or webapi) and the one above, which is also selectable via SQL like a table.</p></li></ul></li><li><p>Relate with is the <em>@odata.id</em> column of the role.</p><ul><li><p>This cannot be the id with syntax pluraltablenae(id) due to the nature of how these components work, which has been too convoluted to understand.</p></li></ul></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jRUY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64566fc1-ace0-49da-ace0-c2c2e1161ccb_1037x409.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jRUY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64566fc1-ace0-49da-ace0-c2c2e1161ccb_1037x409.png 424w, https://substackcdn.com/image/fetch/$s_!jRUY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64566fc1-ace0-49da-ace0-c2c2e1161ccb_1037x409.png 848w, https://substackcdn.com/image/fetch/$s_!jRUY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64566fc1-ace0-49da-ace0-c2c2e1161ccb_1037x409.png 1272w, https://substackcdn.com/image/fetch/$s_!jRUY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64566fc1-ace0-49da-ace0-c2c2e1161ccb_1037x409.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jRUY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64566fc1-ace0-49da-ace0-c2c2e1161ccb_1037x409.png" width="1037" height="409" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/64566fc1-ace0-49da-ace0-c2c2e1161ccb_1037x409.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:409,&quot;width&quot;:1037,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!jRUY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64566fc1-ace0-49da-ace0-c2c2e1161ccb_1037x409.png 424w, https://substackcdn.com/image/fetch/$s_!jRUY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64566fc1-ace0-49da-ace0-c2c2e1161ccb_1037x409.png 848w, https://substackcdn.com/image/fetch/$s_!jRUY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64566fc1-ace0-49da-ace0-c2c2e1161ccb_1037x409.png 1272w, https://substackcdn.com/image/fetch/$s_!jRUY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64566fc1-ace0-49da-ace0-c2c2e1161ccb_1037x409.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Finally, update the contact with the following columns:</p><ul><li><p>Email Confirmed = Yes</p></li><li><p>Login Enabled = Yes</p></li><li><p>Security Stamp = function <em>guid()</em></p></li><li><p>Username = whatever string that matches the login of your authentication service.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fqDe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf120058-26b5-49b8-ab19-37e24d1ffac5_628x267.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fqDe!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf120058-26b5-49b8-ab19-37e24d1ffac5_628x267.png 424w, https://substackcdn.com/image/fetch/$s_!fqDe!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf120058-26b5-49b8-ab19-37e24d1ffac5_628x267.png 848w, https://substackcdn.com/image/fetch/$s_!fqDe!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf120058-26b5-49b8-ab19-37e24d1ffac5_628x267.png 1272w, https://substackcdn.com/image/fetch/$s_!fqDe!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf120058-26b5-49b8-ab19-37e24d1ffac5_628x267.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fqDe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf120058-26b5-49b8-ab19-37e24d1ffac5_628x267.png" width="628" height="267" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bf120058-26b5-49b8-ab19-37e24d1ffac5_628x267.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:267,&quot;width&quot;:628,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!fqDe!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf120058-26b5-49b8-ab19-37e24d1ffac5_628x267.png 424w, https://substackcdn.com/image/fetch/$s_!fqDe!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf120058-26b5-49b8-ab19-37e24d1ffac5_628x267.png 848w, https://substackcdn.com/image/fetch/$s_!fqDe!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf120058-26b5-49b8-ab19-37e24d1ffac5_628x267.png 1272w, https://substackcdn.com/image/fetch/$s_!fqDe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf120058-26b5-49b8-ab19-37e24d1ffac5_628x267.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h2>Summary/Next&#8230;</h2><p>I hope you found this useful, it was very frustrating to find the answer, which in turn was actually quite simple. Credit goes to this blog <a href="https://community.powerplatform.com/forums/thread/details/?threadid=9f300dd1-b679-47a2-ab58-dcfbb501e82f">https://community.powerplatform.com/forums/thread/details/?threadid=9f300dd1-b679-47a2-ab58-dcfbb501e82f</a> which helped explain the tables well.</p><p>Next, I&#8217;ll be switching topics to the current trend of AI and Copilot. Until then, have an excellent end of the year break.</p>]]></content:encoded></item><item><title><![CDATA[New “make” Interfaces]]></title><description><![CDATA[Experiences using the new interfaces, including improvements, inconsistencies and how-tos.]]></description><link>https://www.hollandhart.uk/p/new-make-interfaces</link><guid isPermaLink="false">https://www.hollandhart.uk/p/new-make-interfaces</guid><dc:creator><![CDATA[James Holland-Hart]]></dc:creator><pubDate>Fri, 09 Aug 2024 12:00:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/cfe10364-7e26-45c3-9251-b679c5b9a1cd_531x557.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The revamped Power Automate and Power Apps sites have been out quite a few months now. But after them properly embedding into our day to day development, there&#8217;s a few things to highlight.</p><div><hr></div><h2>Left Menu</h2><p>On the left hand side you will see all the usual options such as connections, solutions, etc however they are now moveable and pinnable. They are also contextual to the site you are using, be it <a href="https://make.powerautomate.com/">Automate</a> <a href="https://make.powerapps.com">Apps</a> or <a href="https://make.powerpages.microsoft.com">Pages</a> (although Pages is more limited).</p><h3>The Good</h3><p>Pinning and moving is obviously by far the best feature here, to create a layout that suits your development workflow individually, as per these screenshots</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!a3CL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb13daf3b-a2c5-4108-b123-c0606b6051cb_531x557.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!a3CL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb13daf3b-a2c5-4108-b123-c0606b6051cb_531x557.png 424w, https://substackcdn.com/image/fetch/$s_!a3CL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb13daf3b-a2c5-4108-b123-c0606b6051cb_531x557.png 848w, https://substackcdn.com/image/fetch/$s_!a3CL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb13daf3b-a2c5-4108-b123-c0606b6051cb_531x557.png 1272w, https://substackcdn.com/image/fetch/$s_!a3CL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb13daf3b-a2c5-4108-b123-c0606b6051cb_531x557.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!a3CL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb13daf3b-a2c5-4108-b123-c0606b6051cb_531x557.png" width="531" height="557" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b13daf3b-a2c5-4108-b123-c0606b6051cb_531x557.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:557,&quot;width&quot;:531,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:35584,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://brynhh.substack.com/i/197424290?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb13daf3b-a2c5-4108-b123-c0606b6051cb_531x557.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!a3CL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb13daf3b-a2c5-4108-b123-c0606b6051cb_531x557.png 424w, https://substackcdn.com/image/fetch/$s_!a3CL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb13daf3b-a2c5-4108-b123-c0606b6051cb_531x557.png 848w, https://substackcdn.com/image/fetch/$s_!a3CL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb13daf3b-a2c5-4108-b123-c0606b6051cb_531x557.png 1272w, https://substackcdn.com/image/fetch/$s_!a3CL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb13daf3b-a2c5-4108-b123-c0606b6051cb_531x557.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vUf_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ed04e95-8a01-4317-a63d-3311ccc94816_540x682.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vUf_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ed04e95-8a01-4317-a63d-3311ccc94816_540x682.png 424w, https://substackcdn.com/image/fetch/$s_!vUf_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ed04e95-8a01-4317-a63d-3311ccc94816_540x682.png 848w, https://substackcdn.com/image/fetch/$s_!vUf_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ed04e95-8a01-4317-a63d-3311ccc94816_540x682.png 1272w, https://substackcdn.com/image/fetch/$s_!vUf_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ed04e95-8a01-4317-a63d-3311ccc94816_540x682.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vUf_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ed04e95-8a01-4317-a63d-3311ccc94816_540x682.png" width="540" height="682" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1ed04e95-8a01-4317-a63d-3311ccc94816_540x682.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:682,&quot;width&quot;:540,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:48037,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://brynhh.substack.com/i/197424290?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ed04e95-8a01-4317-a63d-3311ccc94816_540x682.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!vUf_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ed04e95-8a01-4317-a63d-3311ccc94816_540x682.png 424w, https://substackcdn.com/image/fetch/$s_!vUf_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ed04e95-8a01-4317-a63d-3311ccc94816_540x682.png 848w, https://substackcdn.com/image/fetch/$s_!vUf_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ed04e95-8a01-4317-a63d-3311ccc94816_540x682.png 1272w, https://substackcdn.com/image/fetch/$s_!vUf_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ed04e95-8a01-4317-a63d-3311ccc94816_540x682.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>You will see many contextual options such as process mining on automate or choices on apps, as it saves too many options being available on a single tool. There are also filters for unmanaged and managed solutions.</p><p>There are also some very useful features such as editing tables, flows, etc within solutions in new tabs, however they only work within the relevant make site (flows within Power Apps don&#8217;t have new tabs for example)</p><h3>The Bad</h3><p>If there are contextual options, why does tables appear on automate and open apps? Or websites on apps that opens pages? Solution filtering is also not on automate yet. This is confusing matters tremendously for developers and it should either be a single site for the entire platform and group on the left, or properly segregate the options.</p><div><hr></div><h2>Summary&#8230;</h2><p>This is a more succinct article, as this is the fundamental core of the new interfaces. My recommendation for now would be to use all 3 sites depending what you are editing &#8211; apps, flows, sites, etc. Do not cross them over as it will become a poor experience.</p><p>However, as always, keep as much as you can in solutions (this blog is primarily focussed on pro-developers at the moment, so this should be a given) and this will naturally happen anyway.</p>]]></content:encoded></item><item><title><![CDATA[European Power Platform Conference]]></title><description><![CDATA[Topics, technical community and experiences from this years EPPC.]]></description><link>https://www.hollandhart.uk/p/european-power-platform-conference</link><guid isPermaLink="false">https://www.hollandhart.uk/p/european-power-platform-conference</guid><dc:creator><![CDATA[James Holland-Hart]]></dc:creator><pubDate>Tue, 06 Aug 2024 12:00:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/cfd64b4f-aa12-4226-81a2-2698f1691770_2560x1448.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I recently went to the European conference in Belguim with work colleagues and it was incredibly eye opening to new technologies becoming available, as well as the varying levels of maturity with the platform. This post will discuss some key points, but alongside Microsoft&#8217;s release plan, this will roll into ongoing updates as our teams evaluate them during our development to make it more digestable.</p><div><hr></div><h2>Key Community Members</h2><p>As well as meeting new people via talks and finally saying hello to those already connected with online, here are some recommendations of very interesting and useful people to follow their work,</p><p><a href="https://www.linkedin.com/in/mattbeard7/">Matt Beard</a>, <a href="https://www.linkedin.com/in/bendenblanken/">Ben den Blanken</a> and <a href="https://www.linkedin.com/in/markmpn/">Mark Carrington</a> gave superb talks on extending the platform, especially PowerFx. That&#8217;s going to be a complete game changer. Matt is also part of the team that organise Scottish Summit and Mark has some well regarded plugins for XRM Toolbox.</p><p><a href="https://www.linkedin.com/in/mikebassani/">Mike Bassani</a> and <a href="https://www.linkedin.com/in/slfiene/">Sean Fiene</a> head up the Dataverse team at Microsoft and have some amazing things coming for pro devs, governance and security (cough source control public preview next month cough).</p><p><a href="https://www.linkedin.com/in/aprildunnam/">April Dunnam</a> has a YouTube channel about new features, but importantly soft skills and inclusion in the workplace.</p><p>An honourable mention to <a href="https://www.linkedin.com/in/scottdurow/">Scott Durow</a> who also not from the conference, has some fantastic technical development videos online with the product teams at Microsoft. I&#8217;d also give <a href="https://www.linkedin.com/in/williamdorrington">Will Dorrington</a> a follow who will open your eyes to how to be a lot more strategic with Power Platform, even if you&#8217;re a experienced pro-developer and your organisation is progressing down the maturity path.</p><h2>Platform Extending</h2><p>There are many options to extend the platform beyond the core tools of model driven apps, Power Automate, business rules, etc. I would follow Mark, Ben and Matt&#8217;s work to get more and better detail on this, but I&#8217;d like to summarise some key points I discovered about web resources, PCF and PowerFx.</p><p>Web resources are commonly JavaScript, which althought powerful are not within the native editors (you edit outside then upload), so it is very hard to debug, unit test, etc. It is also less responsive as it sits higher up the execution stack. There&#8217;s always a debate between business rules and JS in terms of out of the box tools or code, but being honest, I don&#8217;t think either suit the bill particularly well. Although both are solution aware, so you can tie them into your release pipelines.</p><p>PCFs can be written in C# or React, which gives many advantages &#8211; they are a lot more responsive as they sit at the same layer as the Microsoft code behind the scenes; react allows use of Fluent UI; also solution aware and browsable via the plugins panel on the left.</p><p>I wont mention webhooks and processes here as they are quite old at this point and Power Automate can pretty much do what both used to do.</p><h2>PowerFx</h2><p>Although primarily focussed around plugins, PowerFx has the ability to be a total game changer. The primary reason is it currently supporting 4 of the 5 execution pipeline stages: Pre Operation, Main Operation, Post Operation Sync and Post Operation Async. Only the first Pre Validation is currently not supported, but planned. This differs to flows, as they only operate at the very end after the transaction is completed, at an unknown time.</p><p>This has the potential to simplify plugins away from C# due to a simpler language and building them directly within the platform. They also have the potential to replace workflows/processes, webhooks, business rules and JavaScript, depending how far Microsoft take it, due to the real-time nature of execution. They also have robust monitoring, unit testing and can use connection references just like flows and apply to flows, model driven apps and canvas apps due to being tied to a table.</p><p>They are not fully there though. This is very much in preview, do not support steps like in C# plugins and do not support custom connectors.</p><p>If you wish to try it, go to make.preview.powerapps.com, click more on the left, then more again and it will be down the very bottom.</p><h2>Governance</h2><p>During an AMA, Mike Bassani mentioned &#8220;Power Catalogue&#8221; a tool to organise and group customisations, which sounded very useful. Not a great deal of detail was mentioned, but keep an eye out for this.</p><p>Source control is coming into public preview this month. This could be a total game changer to allow proper isolated developer environments (like branching) and therefore increase in cadence and reduction in risk during your CI/CD pipelines.</p><p>Microsoft Purview now has a Dataverse connector, which is great news for departments needing to act on Subject Access and Freedom of Information requests on this data without custom tools. We are currently testing this in work and I will write an article of my findings soon.</p><p>Security Hub is in preview and has many useful features which I wont go into here &#8211; but again Microsoft have some articles and presentations on this, please go to the source for more detail. Think Centre of Excellence and Admin Centre, but a lot bigger and a lot better.</p><div><hr></div><h2>Summary/Next&#8230;</h2><p>It is difficult to not make this too long whilst also not copying other peoples presentations. I will write further articles soon, which will go into the detail of various features discussed here, strategic approaches to the platform, plus more.</p><p>I will also be starting some YouTube videos to discuss some items that are easier in audio/video format rather than text. But for anything you would like to learn or discuss, please comment, email or contact me on linkedin.</p>]]></content:encoded></item><item><title><![CDATA[Microsoft Features – Release Plan]]></title><description><![CDATA[An incredibly useful website from Microsoft, to track upcoming features. It needs improvement, but it's a start.]]></description><link>https://www.hollandhart.uk/p/microsoft-features-release-plan</link><guid isPermaLink="false">https://www.hollandhart.uk/p/microsoft-features-release-plan</guid><dc:creator><![CDATA[James Holland-Hart]]></dc:creator><pubDate>Wed, 17 Apr 2024 12:00:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/847c5951-5e2f-4db5-9167-96ec058b0043_2486x1232.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>As part of our regular checks of updates to the platform in our workplace, we have recently discovered release plans. If you already keep track of wave releases, you will be aware of websites Microsoft update for the last 2 waves, however they are text and PDF based and can be hard to navigate. Release plans change all that.</p><div><hr></div><h2>Page Structure</h2><p>Firstly, visit <a href="https://releaseplans.microsoft.com/">releaseplans.microsoft.com</a> and you will be taken to 1 of 2 tabs &#8220;All release plans&#8221;. You will see this is for Dynamics 365 and Power Platform, with all modules and tools segregated</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!elq3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa86498a-989d-4e16-a728-0239fbb81e89_2486x1232.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!elq3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa86498a-989d-4e16-a728-0239fbb81e89_2486x1232.png 424w, https://substackcdn.com/image/fetch/$s_!elq3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa86498a-989d-4e16-a728-0239fbb81e89_2486x1232.png 848w, https://substackcdn.com/image/fetch/$s_!elq3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa86498a-989d-4e16-a728-0239fbb81e89_2486x1232.png 1272w, https://substackcdn.com/image/fetch/$s_!elq3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa86498a-989d-4e16-a728-0239fbb81e89_2486x1232.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!elq3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa86498a-989d-4e16-a728-0239fbb81e89_2486x1232.png" width="1456" height="722" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/aa86498a-989d-4e16-a728-0239fbb81e89_2486x1232.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:722,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:198112,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://brynhh.substack.com/i/197424292?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa86498a-989d-4e16-a728-0239fbb81e89_2486x1232.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!elq3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa86498a-989d-4e16-a728-0239fbb81e89_2486x1232.png 424w, https://substackcdn.com/image/fetch/$s_!elq3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa86498a-989d-4e16-a728-0239fbb81e89_2486x1232.png 848w, https://substackcdn.com/image/fetch/$s_!elq3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa86498a-989d-4e16-a728-0239fbb81e89_2486x1232.png 1272w, https://substackcdn.com/image/fetch/$s_!elq3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa86498a-989d-4e16-a728-0239fbb81e89_2486x1232.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><ul><li><p>Left panel &#8211; Individual modules of Dynamics such as Sales, Customer Service, etc, or areas of Power Platform such as Apps, Automate, etc. Select each one individually to show the features for that item.</p></li><li><p>All release plans &#8211; This shows everything from the selected area.</p></li><li><p>My release plans &#8211; Items you have added to your personal list, from the all list.</p></li><li><p>Planned &#8211; Features that are yet to be released in any form.</p></li><li><p>Coming soon &#8211; Features that are due to be released in the next month. Note &#8211; this may be in the state of early access, public preview or general availability.</p></li><li><p>Try now &#8211; Features currently available, but may be in any state.</p></li><li><p>Main panel &#8211; List of features from the area and period selected. Expand the feature to show details on the left and current dates for each stage on the right.</p></li><li><p>Plus symbol &#8211; Add the feature to your release plan. This will be retained for next time you login.</p></li></ul><blockquote><p>Dates of the 3 phases of release may be far apart. For example, a feature in &#8220;try now&#8221; may have been in public preview in 2023, but isn&#8217;t planned for final release until summer 2024. Do not assume Planned, Coming soon and Try it now mean it is a fully production ready feature.</p></blockquote><h2>My Release Plan</h2><p>To use your section, you must be logged in first. In the top right there will be a button, then choose to login as your personal or work Microsoft account</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!YRNA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F539bbbaf-eb90-4872-8241-5d158f5c2433_2484x423.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YRNA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F539bbbaf-eb90-4872-8241-5d158f5c2433_2484x423.png 424w, https://substackcdn.com/image/fetch/$s_!YRNA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F539bbbaf-eb90-4872-8241-5d158f5c2433_2484x423.png 848w, https://substackcdn.com/image/fetch/$s_!YRNA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F539bbbaf-eb90-4872-8241-5d158f5c2433_2484x423.png 1272w, https://substackcdn.com/image/fetch/$s_!YRNA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F539bbbaf-eb90-4872-8241-5d158f5c2433_2484x423.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YRNA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F539bbbaf-eb90-4872-8241-5d158f5c2433_2484x423.png" width="1456" height="248" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/539bbbaf-eb90-4872-8241-5d158f5c2433_2484x423.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:248,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:67771,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://brynhh.substack.com/i/197424292?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F539bbbaf-eb90-4872-8241-5d158f5c2433_2484x423.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!YRNA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F539bbbaf-eb90-4872-8241-5d158f5c2433_2484x423.png 424w, https://substackcdn.com/image/fetch/$s_!YRNA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F539bbbaf-eb90-4872-8241-5d158f5c2433_2484x423.png 848w, https://substackcdn.com/image/fetch/$s_!YRNA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F539bbbaf-eb90-4872-8241-5d158f5c2433_2484x423.png 1272w, https://substackcdn.com/image/fetch/$s_!YRNA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F539bbbaf-eb90-4872-8241-5d158f5c2433_2484x423.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>You will see &#8220;Power Platform&#8221; is available to select in this view, as well as the areas underneath. This allows you to show all items, unlike the All release plan view, or filter by area if you choose.</p><p>Items can be expanded in the same way, as well as notes added for your tracking. You will also see the + has now been replaced with a bin, to remove items from your plan.</p><p>Finally, the share icon in the top right creates a link that you can share with your teams. This is highly useful as everyone can view the same plan for items that are relevant to your organisation. However there are some caveats to note:</p><ul><li><p>After a fairly short period, you will need to login again, it doesn&#8217;t retain your session onto the next day which is a shame.</p></li><li><p>Others cannot modify your plan, only add notes to the items added. Keep this in mind when you choose who manages this list and have everyone inform them what to add or delete, otherwise multiple plans becomes unmanageable.</p></li></ul><p>When you expand the item, sometimes there are links to MS Learn for more details on the feature, such as how to set it up, known limitations, etc. Also don&#8217;t forget that when an item moves forward in its release cycle, it may move between the 3 tabs &#8211; it has not disappeared, you simply need to look elsewhere for it.</p><div><hr></div><h2>Summary/Next&#8230;</h2><p>This is just a quick intro to what release plans do. You will find how it suits you best, but we have found it extremely valuable in the less than a month we have used it, as it now allows us to keep track of items we intend to research and test. We can then plan far better in when we will make them available to users or technies, rather than be reactive when less information was available previously.</p><p>I&#8217;ll be following this up with some very interesting features I have researched. These will be spread over time, based on when they actually launch from Microsoft and we have determined the usefulness. I hope you&#8217;ll find some value in these.</p><blockquote><p>Some other video and article creators upload content mere hours after Microsoft release their info. Please note this is not be the case with this blog, as everyone knows how to access MS Learn material, so copying and pasting here provides little value to you. This blog is based on experiences in my day job and therefore only features I have used in the real world will be discussed, with a little delay to document those experiences for you.</p></blockquote>]]></content:encoded></item><item><title><![CDATA[Community Question – Connections In Multiple Environments]]></title><description><![CDATA[How do you use connections between environments? My attempt to clarify a question from the online community.]]></description><link>https://www.hollandhart.uk/p/community-question-connections-in-multiple-environments</link><guid isPermaLink="false">https://www.hollandhart.uk/p/community-question-connections-in-multiple-environments</guid><dc:creator><![CDATA[James Holland-Hart]]></dc:creator><pubDate>Fri, 15 Mar 2024 12:00:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/708ac9be-c69c-42e3-8a8c-e0c087b3d620_1800x900.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A question recently came up on <a href="https://discord.com/invite/3BFQ2CRe">Discord</a> which I found interesting, as although the answer (hint: solutions) is the fundamental aspect of Power Platform development, the sharing and proper control aspect shows a great intent to achieve sustainable working practices (the entire intention of setting up this site).</p><blockquote><p>Is there a blog or information on best practices regarding custom connectors, connections and connections references and how should these be managed in multiple environments? How should these components be shared among devs for proper control?</p></blockquote><div><hr></div><h2>What are these?</h2><p>This has been covered in various articles previously and I will not go into the detail of automation, etc as it is covered heavily in the Azure Devops series. But as a brief intoduction to the concepts:</p><ul><li><p>Connectors: Sevices available to be used by Power Automate, Apps, Copilot, etc.</p><ul><li><p>Outlook, Onedrive, Dataverse, Twitter, SQL Server, etc.</p></li></ul></li><li><p>Connections: The account/details with which you will connect to these services. Note &#8211; this account will obviously need permission to access these services.</p><ul><li><p>Personal/service interactive account, SQL database username/password, external service API key, etc.</p></li></ul></li><li><p>Connection references: Items within solutions that flows use, which in turn point to connections. This prevents the flows using connections directly.</p></li></ul><h2>Why do I need references?</h2><p>If your flow uses a connection directly and it needs to access the service as a different account, the connection will need to change. In turn, the flow will need to be edited. This in turn will mean you have different versions of the flow in different environments, fundamentally defeating the main purpose of multiple environments.</p><p>Connection references being used by the flow means the connection (and in turn the account used) can change with no effect on the flow and in turn, reduced risk. This does not mean any changes should happen in non-dev environments, but the concept stands.</p><h2>How to use in different environments?</h2><p>Solutions. Regardless of references, flows, apps, you should always use solutions. All customisations (flows, apps, variables, JS, etc) should exist in a number of solutions that suit your use csae and changes are only ever done in the unmanaged solutions in dev. These should then be exported as managed (I&#8217;d recommend automatically, see my previous articles covering this). This will prevent any changes being made in those environments and ensure stability of your test and live environments. Microsoft also have a feature coming soon where you can completely lock down an environment to not allow customisations at all.</p><p>When you import, If you wish to change the connection it uses, you simply repoint the reference to that connection. Easy and safe.</p><h2>Sharing between devs?</h2><p>Using them in dev between multiple devs is a slightly strange answer. If you have a flow that already has an action, let&#8217;s say send an email for the Outlook connector &#8211; even if that action uses a connection reference that points to another devs connection (this is legitimate in dev) it will continue to work and you can still edit the flow, even if you add more Outlook actions.</p><p>The difficulty comes when you want to add new connectors to that flow. Let&#8217;s say you want to add a row to Dataverse &#8211; even if you have a connection reference that will be exported, you may not be able to see it within a flow that does not already use it. Sometimes it will work, but if it doesn&#8217;t, the reason is almost always because you cannot see the connection the reference is pointing at. To solve this, ensure no one else needs to edit flows for it and change the reference to point at one of your connections, it will then work no problem.</p><p>Please note an important point: This is dev environment only. Your references should always point to connections owned by a service account in test and live environments (where managed solutions exist), as this avoids issues such as people leaving and accounts being deactivated or deleted.</p><p>If Microsoft make this better in the future (ideally being able to share connections), I will cover it in an article, as it will have a big impact.</p><h2>What about custom connectors?</h2><p>See above. References will point to connections for your custom connector like connections for any out of the box connector, the behaviour is no different in any way. Obviously it goes without saying, like any customisation &#8211; include your custom connector in a solution to export to other environments.</p><div><hr></div><h2>Summary&#8230;</h2><p>I hope this gives a simple but understandable explanation of why and how to use connections and references. I am always happy to clarify anything, please comment here or leave a comment on discord or post on the Reddit community.</p><p>Also, as this is the first community question, please feel free to ask for anything you would like to know and I will try to address it in an article.</p>]]></content:encoded></item><item><title><![CDATA[New Cloud Flow Designer – My Experience]]></title><description><![CDATA[The key differences between the old and new designers, plus benefits of switching.]]></description><link>https://www.hollandhart.uk/p/new-cloud-flow-designer-my-experience</link><guid isPermaLink="false">https://www.hollandhart.uk/p/new-cloud-flow-designer-my-experience</guid><dc:creator><![CDATA[James Holland-Hart]]></dc:creator><pubDate>Fri, 16 Feb 2024 12:00:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/042ef5a7-a0d7-4ff7-9af4-ce082052f518_848x983.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Welcome back after a bit of a delay, due to new year and less than simple project completions! I hope you all had a wonderful new year and I&#8217;m back with something easy and exciting to start.</p><p>It may seem a little late to the game to talk about the new designer, but it&#8217;s a slight blessing in disguise, as this was planned before Christmas and would have been a very middling observation, with poor performance, missing features, but a lot of promise. Now it has had time to bed in, it&#8217;s not perfect but we&#8217;re on the right track in a big way.</p><div><hr></div><h2>What came before?</h2><p>We all know what the old designer looked like, but in case anyone has forgotten, here&#8217;s a reminder</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cbFK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50d0f584-bb2c-4f95-b9ec-0e835abdda3e_684x710.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cbFK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50d0f584-bb2c-4f95-b9ec-0e835abdda3e_684x710.png 424w, https://substackcdn.com/image/fetch/$s_!cbFK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50d0f584-bb2c-4f95-b9ec-0e835abdda3e_684x710.png 848w, https://substackcdn.com/image/fetch/$s_!cbFK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50d0f584-bb2c-4f95-b9ec-0e835abdda3e_684x710.png 1272w, https://substackcdn.com/image/fetch/$s_!cbFK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50d0f584-bb2c-4f95-b9ec-0e835abdda3e_684x710.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cbFK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50d0f584-bb2c-4f95-b9ec-0e835abdda3e_684x710.png" width="684" height="710" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/50d0f584-bb2c-4f95-b9ec-0e835abdda3e_684x710.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:710,&quot;width&quot;:684,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:27698,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://brynhh.substack.com/i/197424295?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50d0f584-bb2c-4f95-b9ec-0e835abdda3e_684x710.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!cbFK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50d0f584-bb2c-4f95-b9ec-0e835abdda3e_684x710.png 424w, https://substackcdn.com/image/fetch/$s_!cbFK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50d0f584-bb2c-4f95-b9ec-0e835abdda3e_684x710.png 848w, https://substackcdn.com/image/fetch/$s_!cbFK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50d0f584-bb2c-4f95-b9ec-0e835abdda3e_684x710.png 1272w, https://substackcdn.com/image/fetch/$s_!cbFK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50d0f584-bb2c-4f95-b9ec-0e835abdda3e_684x710.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>It was very visual and did a good job, but it became very clunky when it came to loops (items not moving in or out), moving items to the top of a chain didn&#8217;t work, copy and past sometimes worked sometimes didn&#8217;t, etc. However, one of the main issues what the sheer space it took up, especially if you used a switch with multiple cases, or parallel branches, as well as not seeing the progress of a loop during a run.</p><h2>Layout</h2><p>As mentioned, zooming in and out as well as moving the canvas around makes things a lot more flexible and overcomes the serious issues with space constraints in the old designer. You will see from the example below (text modified to obscure sensitive naming) that loops are a lot more compact and easier to read and manage</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5g1Q!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1990fd86-90c4-467a-bf36-dc10c77000ec_848x983.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5g1Q!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1990fd86-90c4-467a-bf36-dc10c77000ec_848x983.png 424w, https://substackcdn.com/image/fetch/$s_!5g1Q!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1990fd86-90c4-467a-bf36-dc10c77000ec_848x983.png 848w, https://substackcdn.com/image/fetch/$s_!5g1Q!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1990fd86-90c4-467a-bf36-dc10c77000ec_848x983.png 1272w, https://substackcdn.com/image/fetch/$s_!5g1Q!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1990fd86-90c4-467a-bf36-dc10c77000ec_848x983.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5g1Q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1990fd86-90c4-467a-bf36-dc10c77000ec_848x983.png" width="848" height="983" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1990fd86-90c4-467a-bf36-dc10c77000ec_848x983.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:983,&quot;width&quot;:848,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:53835,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://brynhh.substack.com/i/197424295?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1990fd86-90c4-467a-bf36-dc10c77000ec_848x983.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!5g1Q!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1990fd86-90c4-467a-bf36-dc10c77000ec_848x983.png 424w, https://substackcdn.com/image/fetch/$s_!5g1Q!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1990fd86-90c4-467a-bf36-dc10c77000ec_848x983.png 848w, https://substackcdn.com/image/fetch/$s_!5g1Q!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1990fd86-90c4-467a-bf36-dc10c77000ec_848x983.png 1272w, https://substackcdn.com/image/fetch/$s_!5g1Q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1990fd86-90c4-467a-bf36-dc10c77000ec_848x983.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Another massive bugbear is also fixed &#8211; actions can be moved to the top of a path! In my example above, the 2nd action within the loop couldn&#8217;t be moved about the 1st, you had to do it the opposite way around and play a game to get them into order.</p><p>Finally, copy and paste. This now works, every time, even if you try pasting into a loop which before regularly gave an error at the top for no reason. One issue is you can only copy 1 action at a time &#8211; in the old designer you could do multiple and they would all appear in the list. Let&#8217;s hope this will return in the future, but for now I will take a fully working option and do them 1 at a time over a half baked one.</p><h2>Actions</h2><p>A huge improvement with creating and using actions is the left panel. Combining everything from within each action and the 3 dot menu, gives a lot more space (body of the email below gives a great example of this) for these items, plus handles them in the exact same consistent clean way.</p><p>Advanced parameters can also now be chosen, instead of everything or not appearing.</p><p>Finally, the connection appears at the bottom and when you click &#8220;change&#8221;, it is a far cleaner list to chose from.</p><p>I would recommend looking into the rest of this panel yourself, but these are the major benefits for me so far</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SEUH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fd8acf6-30c3-4b0e-897f-be154dd3eba2_601x806.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SEUH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fd8acf6-30c3-4b0e-897f-be154dd3eba2_601x806.png 424w, https://substackcdn.com/image/fetch/$s_!SEUH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fd8acf6-30c3-4b0e-897f-be154dd3eba2_601x806.png 848w, https://substackcdn.com/image/fetch/$s_!SEUH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fd8acf6-30c3-4b0e-897f-be154dd3eba2_601x806.png 1272w, https://substackcdn.com/image/fetch/$s_!SEUH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fd8acf6-30c3-4b0e-897f-be154dd3eba2_601x806.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SEUH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fd8acf6-30c3-4b0e-897f-be154dd3eba2_601x806.png" width="601" height="806" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8fd8acf6-30c3-4b0e-897f-be154dd3eba2_601x806.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:806,&quot;width&quot;:601,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:34861,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://brynhh.substack.com/i/197424295?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fd8acf6-30c3-4b0e-897f-be154dd3eba2_601x806.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!SEUH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fd8acf6-30c3-4b0e-897f-be154dd3eba2_601x806.png 424w, https://substackcdn.com/image/fetch/$s_!SEUH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fd8acf6-30c3-4b0e-897f-be154dd3eba2_601x806.png 848w, https://substackcdn.com/image/fetch/$s_!SEUH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fd8acf6-30c3-4b0e-897f-be154dd3eba2_601x806.png 1272w, https://substackcdn.com/image/fetch/$s_!SEUH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fd8acf6-30c3-4b0e-897f-be154dd3eba2_601x806.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Runs</h2><p>When a flow runs, everything you can see is as before, but in the new layout. Therefore it has all the same benefits as above, however there is one major one &#8211; loops are now visible in real time! Have a loop of 1000 records? You can see what the first 100 have done without waiting, which is fantastic for development, debugging errors, etc.</p><p>However, there is one major gripe with runs. The new designer only appears when you use &#8220;test&#8221; mode running manually. If you run manually via the &#8220;run&#8221; option, or it&#8217;s an automated run, the old designer appears. It seems bizarre why this is the case and a massive shame, but I&#8217;d be shocked if this isn&#8217;t update very soon by Microsoft.</p><h2>Copilot</h2><p>This is where I try and restrain myself and keep the blog short. In my view, there is one and only one benefit of this &#8211; giving you the framework of a flow from scratch. I tried to add a new action and it wiped my entire flow out; I gave it more detail and it did add the action in the correct place, but with the wrong information; I tried to add a condition on the initial trigger and it put the entirely wrong text in the wrong place.</p><p>For the effort to figure out what you need to type for the AI to understand it and action it properly, in my view you might as well do the work yourself. You&#8217;ll have full control and safety, just like in the good old days of coding.</p><p>Overall, I can see why this may suit learners, but despite what some may like to say with AI is going to write all your code, build all your apps, make your breakfast and everything for you (which trying to be polite I see nothing more than a headline to get YouTube clicks), as a professional developer I see no current benefit from it. Current being the key word.</p><div><hr></div><h2>Summary/Next&#8230;</h2><p>I hope this gives a little insight into the day to day changes I&#8217;ve been able to make in the real world. I&#8217;d highly encourage researching it yourself, as there&#8217;s a lot to it, but overall it&#8217;s a fantastic update to Power Automate.</p><p>Next time I&#8217;ll be covering the new changes to the Power Apps and Power Automate interfaces outside of your apps/flows (mostly excellent, with weird inconsistencies). Take it easy and see you soon.</p>]]></content:encoded></item><item><title><![CDATA[Environment Variables Exports – Fixed!]]></title><description><![CDATA[First news item! We're talking about the very good news about environment variable behaviour on import, which has been a long time coming.]]></description><link>https://www.hollandhart.uk/p/environment-variables-exports-fixed</link><guid isPermaLink="false">https://www.hollandhart.uk/p/environment-variables-exports-fixed</guid><dc:creator><![CDATA[James Holland-Hart]]></dc:creator><pubDate>Wed, 20 Dec 2023 00:00:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/8e35292c-4eeb-4106-9a0a-c45ef051481d_760x455.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>After swearing this site would never contain news, this is where I eat my words. This is the first news based article, but this wont be in the format of &#8220;here&#8217;s a new feature, this is how to use it&#8221;, as there&#8217;s plenty of people who already do that and you can find Microsoft blogs to do the same thing.</p><p>These news posts will be my real world perspective of why I think they are useful, i.e. how the previous version worked (likely poorly) and how this improves on that. Like all my articles, it will have a practical focus.</p><div><hr></div><h2>What happened before?</h2><p>If you&#8217;re not aware, when you use environment variables in a solution, there&#8217;s 2 options &#8211; default value and current value. Default value means the content will be retained in all environments you import the solution into and cannot be overridden. Current value can be changes per environment on import (if default isn&#8217;t set). That&#8217;s how Microsoft advertised it, but it wasn&#8217;t how it worked.</p><p>In reality, default was fine, but current values could only be set once. After that, on 2nd and further imports, you could never set the variable value again, regardless of the source. So both were effectively acting like default values, but based on the target value not the source. It was very bizarre and made no practical sense, with the only way around it being deployment settings files in DevOps pipelines (highly recommended, with a 4 part series recently published, hint hint).</p><h2>What has changed?</h2><p>The main detail is in <a href="https://powerapps.microsoft.com/en-us/blog/environment-variables-are-now-always-visible-and-editable-during-solution-import-and-pipeline-deployments/">this article from Microsoft</a>. I&#8217;m not going to repeat it here and pass it off as my own. You will see that they have now allowed the ability the set the current value of the variable, regardless if anything is set in the source environment. This is massive when you&#8217;re importing manually and should have been the behaviour all along.</p><p>I have tested this with a current value set and on 1st import, it uses that value, but allows you to edit it. One thing that&#8217;s not mentioned in the article, is if you do change it, a button appears for &#8220;reset&#8221;. On subsequent imports, it has the value you have set in the target environment, which is excellent as you have no risk of setting it incorrectly.</p><p>My second test was having a default and current value set in the source environment. This doesn&#8217;t seem to make any difference and behaves the same as above during import. However, after import the value is actually set to the default. This is what you would expect, but is very confusing as it is letting you set the current.</p><p>My final test was a default set, current not. This showed exactly the same as the 2nd test.</p><div><hr></div><h2>Summary/Next&#8230;</h2><p>Ultimately, this is a massive improvement and if anyone from the MS product team read this, well done, it will be very useful to people. Sadly, due to the very odd default value behaviours, it&#8217;s a little 2 steps 1 back situation. Still, we&#8217;ll take what we can get.</p><p>Next time I&#8217;ll have another small news item about the new cloud flow editor, covering the key differences I&#8217;ve found day to day.</p>]]></content:encoded></item><item><title><![CDATA[Azure DevOps ALM – Running & Summary]]></title><description><![CDATA[Part 4 of about how and most important why, to run your newly built pipelines and releases.]]></description><link>https://www.hollandhart.uk/p/azure-devops-alm-running-summary</link><guid isPermaLink="false">https://www.hollandhart.uk/p/azure-devops-alm-running-summary</guid><dc:creator><![CDATA[James Holland-Hart]]></dc:creator><pubDate>Fri, 08 Dec 2023 12:00:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/ae090711-d153-4fe5-926a-a0187de538e6_584x292.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>You now have everything setup, so it&#8217;s finally time to get this thing running, have your releases automated, then relax on the beach. This article will talk about steps to carry out, but within the context of why, both technically and ways of working.</p><blockquote><p>Terminology: ADO = Azure DevOps. Pipelines Service = Group on left that contains pipelines and releases. Pipeline = Build that exports solutions. Release = Release that imports solutions.</p></blockquote><div><hr></div><h2>Preparation</h2><p>There is 1 step you need to perform before we start running your pipelines, as it ensures the account DevOps imports solutions as can access the connections defined in your connection settings file.</p><ul><li><p>Visit make.powerapps or make.powerautomate and select each target environment.</p></li><li><p>Select Connections</p></li><li><p>For each connection, click the 3 dots, then Share.</p></li><li><p>Enter the name of your app registration that ADO uses in the release.</p></li><li><p>Ensure Permission is Can use then save</p></li></ul><p>Repeat the above for all connections and all target environmens.</p><h2>Running Pipelines</h2><p>As you will be aware, Power Platform does not use code and therefore does not use a git repo, pull requests, CD, CI, etc, so instigating the process is manual. However, manual is still a different context to fully manual via PP itself.</p><p>Firstly, navigate to pipeline service &gt; pipelines &gt; all &gt; the folder you created. Within here you created your multiple pipelines for each solution and each will be run individually. This may seem confusing, as you have multiple pipelines but only 1 release, but the reason is the release can be triggered from any of the artifacts generated from these pipelines.</p><ul><li><p>Click the 3 dots on the right of the pipeline representing the solution you need to export.</p></li><li><p>Ensure Branch/tag is your mainline branch, such as develop, master, etc.</p></li><li><p>Click Run</p></li></ul><p>The pipeline will now run completely unattended, version and export your solutions and publish the files ready for the release. You should ensure it did not fail and this should be repeated for each solution you need to export for the work item you have been working on.</p><h2>Running Releases</h2><p>This stage, in terms of actioning the running itself is fully automated. Although only 1 release exists, an instance of that release will be created for every successful pipeline. So let&#8217;s say 2 pipelines were run in the previous section to export 2 solutions &#8211; you will have 2 release instances automatically created, 1 for each and they will release your 2 solutions in completely isolated paths.</p><p>The renaming stage will run automatically, then the release will pause before your first environment. This is because you have set a pre-approval condition, to ensure appropriate staff approve it rather than it automatically flying into each environment instantly. To approve:</p><ul><li><p>Each person (be they individuals in the list or part of a team) will recieve an email from ADO. You can click this to take you to the release.</p></li><li><p>If you don&#8217;t do the above, you can go to the renamed release instance.</p></li><li><p>With both options, click the Approve button underneath the first stage.</p></li><li><p>A panel will fly out from the right hand side, you need to click Approve or Reject on here.</p></li></ul><p>You should do the above when you are happy the change has been reviewed and is an appropriate time to import. Once everyone (as individuals or representative of a team) has approved, the stage will start and import the solution automatically.</p><p>At this point your ways of working take over and you carry out work your teams are required to, such as QA testing. When you are happy the change is acceptable in that environment, you can repeat the process above for the next environment (you will already have receive the email), all the way to live.</p><div><hr></div><h2>Summary/Next&#8230;</h2><p>This may seem short, but this is really all there is to releasing your solutions to other environments after development. This is by design, to provide the following benefits:</p><ul><li><p>Faster release process and less manual steps.</p></li><li><p>Decreased risk of human error.</p></li><li><p>Increased visibility and governance of entire process.</p></li><li><p>Increased accountability of process stages and actions to be perfomed within them.</p></li><li><p>Increased security with personal accounts not required to be logged in to untake this.</p></li></ul><p>This is a massive step towards improving the overall governance of Power Platform in your organisation. You will start to discover more and more items you can improve from here, such as security, environment structure and we will discuss some of these wider ways of working in future articles, in collaboration with specialists from other fields such as QA, infrastructure, coders.</p><p>I hope you have enjoyed this series and it serves as a helpful basis to start your ALM journey. I am openly available to discuss these topics on Reddit, Discord and Linkedin (links on this and all pages of this site), to help others as well as discuss options where we can all learn.</p><p>As an important thing to remember &#8211; no one is automatically wrong or right, but we should understand ways of working can and should always be improved and we can adapt with that to make things easier and safer for ourselves.</p><p>I&#8217;ll see you next time.</p>]]></content:encoded></item><item><title><![CDATA[Azure DevOps ALM – Releases]]></title><description><![CDATA[Part 3 of 4, covering all aspects of releasing - importing, approvals and backups, ready for the final article to get the whole thing running.]]></description><link>https://www.hollandhart.uk/p/azure-devops-alm-releases</link><guid isPermaLink="false">https://www.hollandhart.uk/p/azure-devops-alm-releases</guid><dc:creator><![CDATA[James Holland-Hart]]></dc:creator><pubDate>Mon, 04 Dec 2023 12:00:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/15122e29-9f30-471a-b1cc-3f1f29977e42_584x292.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Now you have your pipeline setup, it&#8217;s time for next major step and 3rd in the series, which is releasing your exported solutions to multiple environments.</p><p>This guide will also include information such as backing up the solutions, linking work items and others, which are not critical but long term will prove valuable to your team. I will briefly touch on those, to limit the length of this post and give the general idea, but I would highly recommend you use this to research your own preferred extras to have in your ALM strategy.</p><blockquote><p>Terminology of &#8220;ADO&#8221;, &#8220;pipelines&#8221; and &#8220;pipelines service&#8221; are as per previous post.</p></blockquote><div><hr></div><h2>Preparation</h2><p>There are a few steps to cover before you can start to create your release, as they will become critical to the whole process and need to be maintained. These are:</p><ul><li><p>Deployment settings JSON file</p></li><li><p>Environment variable values</p></li><li><p>Connection IDs</p></li></ul><h3>Deployment Settings</h3><p>In your git repository, you should already have created a <em>pipelines</em> folder in the previous blog post, with a folder for each solution within that. In the first solution folder, create a file named <em>deployment_settings.json</em> and copy the following sample. This name and sample must be exact.</p><pre><code>{
"EnvironmentVariables": [
{
"SchemaName": "myorg_VarName",
"Value": "#{EnvVar-myorg_VarName}#"
}
],
"ConnectionReferences": [
{
"LogicalName": "myorg_O365Outlook",
"ConnectionId": "#{ConRef-myorg_O365Outlook}#"
"ConnectorId": "/providers/Microsoft.PowerApps/apis/shared_office365"
}</code></pre><p>The above sample reflects the structure of your file, but the content should match the exact number of environment variables and connection references that are in your solution. If there are none of one, then remove everything between the {} and simply keep the []. This means the structure is maintained, preventing errors, but it is an empty array and the release will now there is nothing to use. If you have none of both, then make them both empty.</p><ul><li><p>SchemaName &#8211; This is the &#8220;name&#8221; of your environment variable in full, as displayed when you edit it. Not the display name.</p></li><li><p>Value &#8211; Ensure the format is exactly as above and between the <em>EnvVar</em>&#8211; and }# enter the exact same text from SchemaName.</p></li><li><p>LogicalName &#8211; This is the &#8220;name&#8221; of your connection reference in full, as displayed when you edit it. Not the display name.</p></li><li><p>ConnectionId &#8211; Ensure the format is exactly as above and between the <em>ConRef&#8211;</em> and <em>}#</em> enter the exact same text from LogicalName.</p></li><li><p>ConnectorId &#8211; This is the type of connector you are using. Go to your connection (which you should already have in dev), open it and in the URL, copy the value after <em>apiName</em> and replace <em>shared_office365</em> with this.</p></li></ul><p>You will now have a complete settings file for your solution. Check it in and repeat the above for every one of your remaining solutions, then pull request them all into your main branch (such as develop, depending on your git strategy).</p><h3>Environment Variables</h3><p>For each solution that contains environment variables, open the variable and note down the name, value and solution somewhere safe. Once this is done, determine what value each variable should have in your target environments. This may legtimately be the same for every environment, or may be different.</p><blockquote><p>It is best practice to never use <em>default value</em> unless you know the value will never change and you never need to set it. If you do need to set it, ensure default is empty and you use <em>current value</em> in all environments.</p></blockquote><h3>Connection IDs</h3><p>For each solution that contains a connection reference, you will already be aware these point to <em>connections</em>. Therefore, for all the connections you know you use, carry out the following steps. Note: this may not be equal, you may have 3 Outlook references, 2 Dataverse, 1 SharePoint, but the connections themselves may only be 3.</p><ul><li><p>Go to your connections.</p></li><li><p>Open each individually.</p></li><li><p>In the URL, copy the text after <em>connectionName</em> as well as noting down the connector and connection reference that uses it.</p></li></ul><h2>Setup &amp; Artifacts</h2><p>Select <em>Pipelines</em> then <em>Releases</em>. From here, click the folder icon and create a new folder under <em>All pipelines</em>. Finally, select that folder then <em>New release pipeline</em>.</p><p>The first main stage within your release will be artifacts. In a typical code based project, there will be only one, which will a CI build triggered by a pull request completion (not Connor MacLeod from the Highlander). However, as you may have multiple solutions containing your customisations, you will need to link to all pipelines created in the previous article.</p><p>The first will be your git repository, to allow backups of the solutions to be added.</p><ul><li><p>Next to <em>Artifacts</em>, click <em>Add</em></p></li><li><p>Source type = Azure Repos Git</p></li><li><p>Project = the main project you&#8217;re working within (viewable in the top left as the second item in the path).</p></li><li><p>Source = repository you used or created in the previous articles.</p></li><li><p>Default version = latest</p></li><li><p>Keep everything else as is.</p></li></ul><p>Next, add your first pipeline (representing your first solution).</p><ul><li><p>Source type = build</p></li><li><p>Source = name of pipeline from previous article.</p></li><li><p>Source alias = same text as your solution internal name and global variable in pipeline.</p></li><li><p>All other options remain the same as above.</p></li></ul><p>Finally, ensure your triggers are as below.</p><ul><li><p>Click lightning bolt in top right of artifact.</p></li><li><p>Enabled</p></li><li><p>No filter</p></li><li><p>PR trigger disabled.</p></li></ul><p>Repeat the above 2 steps (not the first git repo) for all remaining solutions/pipelines you created in the previous article.</p><h2>Rename</h2><p>For the first part of our stages, we will be renaming the release to something more meaningful and backing up the solution to your git repo.</p><ul><li><p>Next to stages, click +Add then <em>New stage</em>, then <em>Empty job</em></p></li><li><p>Stage name = something meaningful to you</p></li><li><p>Owner = defaults to yourself, but change account if you wish. Notifications will go to this account.</p></li></ul><p>Within the stage, click <em>1 job, 0 task</em> and you will see the basic structure of a release stage. This is where your steps will exist to carry out many different actions, such as importing, renaming, backing up, etc. On <em>Agent job</em>:</p><ul><li><p>Agent pool = Azure Pipelines</p><ul><li><p>This means the stage will run on your default ADO agent. If you are using different custom ones, select those.</p></li></ul></li><li><p>Agent Spec = windows-latest</p></li><li><p>Artifact download = click every item and deselect <em>Select all artifacts</em></p><ul><li><p>This ensures artifacts are not downloaded for this stage, reducing execution time as they are not required.</p></li></ul></li></ul><p>You are now ready to add a step, by clicking on the + icon next to Agent job. You will see there are many steps available, just like in your pipeline. For this stage, we will use <em>PowerShell</em>.</p><ul><li><p>Display name = Something meaningful of your choosing.</p></li><li><p>Type = Inline</p></li><li><p>Script = <strong>Write-Host &#8220;&#8216;##vso[release.updatereleasename]&#8221;$(ReleaseCustomName)</strong></p><ul><li><p>This is the command to rename your release. The ##vso command is built into ADO and you can search online for many more. ReleaseCustomName is a variable we will shortly set to contain the text and as we progress, you will see all variables have to be referred to in this format.</p></li></ul></li></ul><h2>Git Backup</h2><p>Next, we will create another stage for git backups. As understanding how this script works is quite detailed and will not be covered here, feel free to skip this section. Otherwise, this can serve as a basic first step to get it working, but I would highly recommend researching it to maintain it in the future.</p><ul><li><p>Add a new stage with agent settings as above.</p></li><li><p>Add a step with <em>Power Platform Tool Installer</em></p></li><li><p>Add a step with <em>Power Platform Unpack Solution</em></p><ul><li><p>Solution Input File = <strong>$(System.DefaultWorkingDirectory)/$(Release.TriggeringArtifact.Alias)/SolutionArtifacts/solution_unmanaged.zip</strong></p><ul><li><p>This points to where ADO uses files during pipelines and the directories within it where your artifact from the pipeline was published.</p></li></ul></li><li><p>Target Folder to Unpack Solution = <strong>$(System.DefaultWorkingDirectory)/$(Release.TriggeringArtifact.Alias)/unpack/$(ReleaseCustomName)</strong></p><ul><li><p>This points to your solution directory within the ADO directory and a new unique folder within that to place the unzipped files from the solution.</p></li></ul></li><li><p>Type = Unmanaged</p></li></ul></li><li><p>Add a step with PowerShell</p><ul><li><p>Name = your choosing</p></li><li><p>Type = Inline</p></li><li><p>Script = copy the entire text below.</p></li></ul></li></ul><pre><code>Write-Host "** Setup **"
$branchName = "dataverse/release-unmanaged_solution_backup"
git config --global user.email "xxx@uk.teams.ms"
git config --global user.name "Release_Dataverse-ImportSolutions"</code></pre><p># Check branch exists<br>if (git ls-remote --heads origin $branchName)<br>{<br>Write-Host "** Branch exists - checking out **"<br>git checkout $branchName<br>git pull<br>}<br>else<br>{<br>Write-Host "** Branch does not exist - creating **"<br>git checkout -b $branchName<br>}</p><p>if (Test-Path -Path './$(Release.TriggeringArtifact.Alias)')<br>{<br>}<br>else<br>{<br>New-Item -Path . -Name "$(Release.TriggeringArtifact.Alias)" -ItemType "directory"<br>}</p><p>Write-Host "** Copying unpacked files **"<br>Copy-Item -Recurse -Force $(System.DefaultWorkingDirectory)/$(Release.TriggeringArtifact.Alias)/unpack/$(ReleaseCustomName)/* ./$(Release.TriggeringArtifact.Alias)</p><p>Write-Host "** Checking for changes **"<br>$changedFiles = $(git status --porcelain | Measure-Object | Select-Object -expand Count)</p><p>if($changedFiles -gt 0)<br>{<br>Write-Host "** Changes exist **"<br>Write-Host "** Staging files **"<br>git add .<br>git status</p><p>Write-Host "** Committing changes **"<br>git commit -m "Automated Release - $(Release.TriggeringArtifact.Alias)_$(Release.ReleaseId) #9999"</p><p>Write-Host "** Pushing to repository **"<br>git -c http.extraheader="AUTHORIZATION: bearer $(System.AccessToken)" push origin $branchName<br>}<br>else<br>{<br>Write-Host "** No changes **"<br>}</p><p>I will not go into all the detail of this script, but ultimately it is creating a new branch or using one if it already exists, taking the unzipped solution files, checking if there&#8217;s changes and commiting them to the branch.</p><h2>Environment Import</h2><p>This section will cover importing a solution to a single environment. This stage should be repeated for all other environments, with changing elements detailed at the end.</p><ul><li><p>Add another stage, but this time ensure agent settings has <em>Select all artifacts</em> ticked for all artifacts apart from your git repo.</p></li><li><p>Task: Replace Tokens (this is a 3rd party step, ensure you use the one by <em>Guillaume Rouchon</em>) </p><ul><li><p><strong>Root directory</strong>: $(ArtifactPath)</p></li><li><p><strong>Target files</strong>: $(DeploySettingsFile)</p></li><li><p><strong>Token pattern</strong>: #{&#8230;}# </p><ul><li><p>You will see this reflects the format specified in the deployment settings json created in the preparation section of this guide.</p></li></ul></li></ul></li><li><p>Task: Power Platform Tool Installer<br>Task: Power Platform Import Solution </p><ul><li><p><strong>Auth type</strong>: Service Principal</p></li><li><p><strong>Service connection</strong>: Connection for relevant environment you created in the first setup ADO guide.</p></li><li><p><strong>Environment Url</strong>: $(BuildTools.EnvironmentUrl)</p></li><li><p><strong>Solution Input File</strong>: $(System.DefaultWorkingDirectory)/$(Release.TriggeringArtifact.Alias)/SolutionArtifacts/solution_managed.zip</p></li><li><p><strong>Use deployment settings file</strong>: ticked</p></li><li><p><strong>Import solution as asynchronous operation</strong>: ticked</p></li><li><p><strong>Import as a holding solution</strong>: ticked </p><ul><li><p>This is equivalent to the &#8220;stage&#8221; option, as a straight upgrade is not possible in DevOps.</p></li></ul></li><li><p><strong>Activate plugins</strong>: ticked if you want flows, etc to be on, unticked if not.</p></li></ul></li><li><p>Task: Power Platform Apply Solution Upgrade </p><ul><li><p><strong>Auth type</strong>: Service Principal</p></li><li><p><strong>Service connection</strong>: Connection for relevant environment you created in the first setup ADO guide.</p></li><li><p><strong>Environment Url</strong>: $(BuildTools.EnvironmentUrl)</p></li><li><p><strong>Solution Name</strong>: $(Release.TriggeringArtifact.Alias)</p></li></ul></li></ul><p>This will now import and upgrade your managed solution into your target environment. You will need to repeat all steps from this section for the remaining environments, only changing the service connection to point to a different location.</p><h2>Pre-Deployment Rules</h2><p>This section will cover how to place your stages in a specific order, as well as approvals for each. It is key to ensure you are releasing solutions in a specific order and not jumping to live before QA for example. It also ensures you undertake peer reviews and approvals prior to import.</p><p>In each stage, click the lightning bolt and person icon to the left, then follow these recommended settings:</p><h3>Rename</h3><ul><li><p><strong>Triggers</strong>: After release</p></li><li><p><strong>Pre-deployment approvals</strong>: disabled</p></li></ul><h3>Backup</h3><ul><li><p><strong>Triggers</strong>: After stage, rename</p></li><li><p><strong>Pre-deployment approvals</strong>: disabled</p></li></ul><h3>QA</h3><ul><li><p><strong>Triggers</strong>: After stage, rename</p></li><li><p><strong>Pre-deployment approvals</strong>: enabled</p></li><li><p><strong>Approvers</strong>: Enter names or groups of people you wish to approve to this step.</p></li><li><p><strong>Approval order</strong>: Any order</p></li><li><p><strong>Policies</strong>: The user requesting a release or deployment should not approve it</p></li></ul><h3>UAT</h3><ul><li><p><strong>Triggers</strong>: After stage, QA</p></li><li><p><strong>Pre-deployment approvals</strong>: enabled</p></li><li><p><strong>Approvers</strong>: Enter names or groups of people you wish to approve to this step.</p></li><li><p><strong>Approval order</strong>: Any order</p></li><li><p><strong>Policies</strong>: The user requesting a release or deployment should not approve it</p></li></ul><h3>Live</h3><ul><li><p><strong>Triggers</strong>: After stage, UAT</p></li><li><p><strong>Pre-deployment approvals</strong>: enabled</p></li><li><p><strong>Approvers</strong>: Enter names or groups of people you wish to approve to this step.</p></li><li><p><strong>Approval order</strong>: Any order</p></li><li><p><strong>Policies</strong>: The user requesting a release or deployment should not approve it</p></li></ul><h2>Variables</h2><h3>Environment Variables</h3><p>This section will cover how we will use your deployment settings file to populate the environment variable and connection reference settings you created at the start of this article.</p><p>Click <em>Variables</em> at the top, you will an option to add and you can provide a name, value and scope.</p><ul><li><p><strong>Name</strong>: This should be exactly the same as the Value text of your environment variable in the file. For example <em>EnvVar-MyVariable</em></p></li><li><p><strong>Value</strong>: This should be the value you intend to put into the variable.</p></li><li><p><strong>Scope</strong>: This is the stage in the release where this will be used. This means for each variable, you will need to add multiple versions if the values are to be different between environments and select the relevant stage. Otherwise, if it is to be the same, just select <em>Release</em>.</p></li></ul><p>This is important &#8211; you now need to add a variable for every single environment variable you have in all your deployment settings files. Then in the future, if any are added or removed, they should also be added or removed from here. This means if a value is to change, you don&#8217;t need to edit the settings file, but it can be done here and is therefore a lot easier to manage. It also provides better visibility of the values.</p><h3>Connection References</h3><ul><li><p>Click <em>Variable groups</em></p></li><li><p>Click <em>Manage variable groups</em></p></li><li><p>Add a new group</p></li><li><p>Give the group a meaningful name, such as <em>Dataverse Connection Refs &#8211; QA</em></p></li><li><p>Add all your connection references from all settings files and values from <em>Connection IDs</em> section earlier in this article in exactly the same way as environment variables.</p></li><li><p>When done, save.</p></li><li><p>Return to your release and click <em>Link variable group</em> and select the group you just created.</p></li></ul><p>The above separates these out from variables, as the values will rarely change, unless you add or remove connections, or change which account you use. Therefore it provides security in not mistakingly changing values within the release.</p><p>Repeat the above for all remaining environments, then apply a scope to determine which stage will use each group, just like environment variables.</p><div><hr></div><h2>Summary/Next&#8230;</h2><p>This is a lot of information to take in, so I would recommend reading it first before attempting to create your builds and releases. Once the concepts have fully sunk in, you can then start applying ALM options that suit your organisations needs, such as linking work items, different approvals and more. But this will serve as a solid foundation to build off.</p><p>The next and final guide will, you will be happy, be a shorter one to explain how to run these and a summary of general concepts to continue on with.</p><p>Please feel free to reach out in the comments, on Reddit or on Discord if you have any questions. I am very active there and happy to help, as well as many other community members.</p>]]></content:encoded></item><item><title><![CDATA[Azure DevOps ALM – Pipelines/Builds]]></title><description><![CDATA[Part 2 of 4. We discuss exporting and creating the YAML files to do this.]]></description><link>https://www.hollandhart.uk/p/azure-devops-alm-pipelines-builds</link><guid isPermaLink="false">https://www.hollandhart.uk/p/azure-devops-alm-pipelines-builds</guid><dc:creator><![CDATA[James Holland-Hart]]></dc:creator><pubDate>Fri, 17 Nov 2023 12:00:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/2fb7657c-381e-46ee-a508-f608aeb242dd_584x292.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This post will discuss the first part of building your automation process, which includes exporting from your source environment and preparing the files for release.</p><p>Ensure you have read, understood and carried out the setup in the previous post, as you will not be able to connect to your source environment in a reliable way. Also ensure your environment, security and licensing strategy is defined and fixed before continuing, otherwise time consuming re-creation of your ALM processes will be required.</p><blockquote><p>Azure DevOps will be referred to as &#8220;ADO&#8221;.</p></blockquote><blockquote><p>The whole group containing releases, task groups, etc will be referred to as &#8220;pipelines&#8221;</p></blockquote><blockquote><p>&#8220;Builds&#8221; are the previous term used for what is now &#8220;Pipelines&#8221;. There is also a service (groups on the left menu such as boards, repos, etc) names pipelines, this can be very confusing. For this guide, pipelines will refer to what you are building and &#8220;pipelines service&#8221; will refer to the menu item/group.</p></blockquote><div><hr></div><h2>Preparation</h2><p>Firstly, you will need to ensure you have a code repository (Git is recommended). If you have an existing repo you wish to use, I would recommend adding an identifiable folder such as &#8220;dataverse&#8221;, or create a new repo specifically for dataverse/PP/D365 work.</p><p>Next, create an initial set of folders as below. You could consider adding more in the future for additional usages such as backups of other components, plugin code, etc. For the location, &#8220;root&#8221; refers to within your &#8220;dataverse&#8221; directory or root of repo, depending what you have chosen above.</p><ul><li><p><strong>pipelines</strong> (root) &#8211; This will contain folders and files required for solution exports and imports.</p></li><li><p>Solution folders (within pipelines folder) &#8211; Create a folder for every solution you will use, named the same as the <strong>internal name</strong> of the solution (no spaces), not the display name.</p></li><li><p><strong>solutions</strong> (root) &#8211; This will contain backups of your solutions after export.</p></li></ul><p>Finally, visit <em>pipelines &gt; pipelines &gt; all &gt; new folder</em>. Enter a name of your choosing to include your pipelines, as there will be many (something like &#8220;Dynamics Power Platform&#8221;.</p><h2>Create YAML File</h2><p>You will need to setup the initial file with the following steps. There is an otion for ADO to create the file for you, but this will be put into the root of the repository, which you may not want.</p><ul><li><p>Check out your repo to your local machine and create a branch.</p></li><li><p>Within your pipelines folder, create a file with a meaningful description and <em>.yml</em> extension. An example is <em>dataverse-export-solution.yml</em></p></li><li><p>Commit and push your branch to the remote repo.</p></li></ul><p>Next, you will start creating the pipeline with this file.</p><ul><li><p>Click 3 dots on the folder you created, then <em>new pipeline</em>.</p></li><li><p>Under where is your code, select <em>Azure Repos Git</em>.</p></li><li><p>Select the repository you created or are using in preparation.</p></li><li><p>Select <em>Existing Azure Pipelines</em> YAML file</p></li><li><p>Select the branch you created above.</p></li><li><p>Select the path to the file you created.</p></li><li><p>Select <em>continue</em>.</p></li></ul><p>You will now have your empty file within the editor, allowing you to select options from the right, add variables, etc.</p><p>Finally, click the arrow next to run, then click <em>Save</em>. Then click the <em>3 dots</em>, <em>rename</em> and enter a new name of your choice, I would recommend a description followed by the internal solution name, such as <em>Export Solution &#8211; MySol1</em>.</p><h2>Pipeline Core Settings</h2><p>In this section, we will add the initial variables and settings to the pipeline prior to the main steps. As futher steps and subsequent release depend on this information, it is key to understand why the setup exists..</p><p>First, you will need the basic pipeline starter information. Pool defines what virtual machine to run it on (linux, windows, etc). You also need a trigger value, in this case there is none as we are not running the pipeline based off a code check in, pull request, etc. Finally, a name is required which is used to name each instance/run of the pipeline. As we will be creating a pipeline for every solution with a unique name, this should be the version number as it will be easily identifiable and be useful later.</p><pre><code>pool:
vmImage: windows-latest
trigger:
- none;
name: $(Date:yyyy.MM.dd)$(Rev:.r)</code></pre><p>Next, we will setup a global variable, available to the whole pipeline but not settable.</p><ul><li><p>Click the variables button in the top right.</p></li><li><p>Click the + button.</p></li><li><p>Enter your chosen variable name. To align with examples in this guide, I will use SolutionNameGlobal.</p></li><li><p>Value should reflect the internal name of your solution. In line with the prep section, I will use MySol1.</p></li><li><p>Ensure keep this value secret and let users override options are unticked.</p></li></ul><p>Next, we will need to setup local variables (ones used within the pipeline but cannot be used or seen outside). Each of these are described below, with a code sample.</p><ul><li><p>deploySettingsFullPath &#8211; This is local path (within the ADO build agent) where your git repo is checked out to and the json file within it. Replace your specific folders with the ones created in the preparation section.</p></li><li><p>solutionFilesDirectory &#8211; Although not strictly required, it will be very useful to have separation in folders for your solutions.</p></li><li><p>solutionManagedFileName &#8211; A fixed name for your exported managed file, this is very important for releases later.</p></li><li><p>solutionUnmanagedFileName &#8211; As above, but for unmanaged.</p></li></ul><pre><code>variables:
deploySettingsFullPath: $(Agent.BuildDirectory)\s\dataverse\pipelines-releases\$(SolutionNameGlobal)\deployment_settings.json
solutionFilesDirectory: $(Build.ArtifactStagingDirectory)\$(SolutionNameGlobal)
solutionManagedFileName: solution_managed.zip
solutionUnmanagedFileName: solution_unmanaged.zip</code></pre><p>This concludes the initial core of your pipeline. The next section will cover the remaining steps, which are the actual exporting of the files.</p><h2>Pipeline Steps</h2><p>This where you will now add steps to your pipeline to perform actions, such as exporting, publishing artifacts, etc. On the right hand &#8220;tasks&#8221; panel, this will allow you to add items to the file and edit what is already there.</p><p>This guide will cover the following steps, to allow you to perform cross-environment releases:</p><ul><li><p>Version chosen solution.</p></li><li><p>Export chosen solution.</p></li><li><p>Publish artifacts for release to use.</p></li></ul><p>First, in your .yml file, underneath the variables, add the following line:</p><pre><code>steps:</code></pre><p>When you perform the next steps, ensure your cursor is underneath the code above. Open the tasks panel by clicking <em>show assistant</em> on the right and type &#8220;power platform&#8221; into <em>search tasks</em>. This will show you all tasks available to use in your pipeline. As per the previous guide, you will notice these are very similar to the CLI, as they are ultimately wrappers for that. When you add each item, you will be presented with fields to fill in before adding (apart from tool installer). We will now go through each task to add, with the fields to complete and an explanation of what it does.</p><p>Authentication type &#8211; where available, this should always be <em>Service Principal</em> regardless of the task, as it allows us to use the Azure App Registration.</p><p>Service connection &#8211; this will always be the name of the connection you created at the end of the last post for your dev environment.</p><ul><li><p><strong>Power Platform Tool Installer</strong> [this is always required once, prior to every series of PP tasks]</p><ul><li><p>No values required</p></li></ul></li><li><p><strong>Power Platform Set Solution Version</strong> [as with manual releases, this is done prior to export]</p><ul><li><p><strong>Solution Name</strong>: $(SolutionNameGlobal) [the name of the global variable in the previous section]</p></li><li><p><strong>Solution Version Number</strong>: $(Build.BuildNumber) [obtained from the name field populated earlier]</p></li></ul></li><li><p><strong>Power Platform Export Solution</strong></p><ul><li><p><strong>Environment Url</strong>: $(BuildTools.EnvironmentUrl)</p></li><li><p><strong>Solution Name</strong>: $(SolutionNameGlobal)</p></li><li><p><strong>Solution Output File</strong>: $(solutionFilesDirectory)/$(solutionManagedFileName) [puts the managed zip file in the specific solution build directory]</p></li><li><p><strong>Export as Managed Solution</strong>: ticked</p></li><li><p><strong>Target Version</strong>: $(Build.BuildNumber) [to use the version set above]</p></li><li><p><strong>Export async</strong>: ticked</p></li><li><p><strong>Advanced &gt; Overwrite local solution.zip</strong>: ticked</p></li></ul></li><li><p><strong>Power Platform Export Solution</strong></p><ul><li><p><strong>Environment Url</strong>: $(BuildTools.EnvironmentUrl)</p></li><li><p><strong>Solution Name</strong>: $(SolutionNameGlobal)</p></li><li><p><strong>Solution Output File</strong>: $(solutionFilesDirectory)/$(solutionUnmanagedFileName) [puts the unmanaged zip file in the specific solution build directory]</p></li><li><p><strong>Export as Managed Solution</strong>: unticked</p></li><li><p><strong>Target Version</strong>: $(Build.BuildNumber)</p></li><li><p><strong>Export async</strong>: ticked</p></li><li><p><strong>Advanced &gt; Overwrite local solution.zip</strong>: ticked</p></li></ul></li><li><p><strong>PowerShell</strong></p><ul><li><p><strong>Type</strong>: inline [this means you don&#8217;t have to store a .ps1 file anywhere]</p></li><li><p><strong>Script</strong>: cp &#8220;$(deploySettingsFullPath&#8221; &#8220;$(solutionFilesDirectory)&#8221; [this copies your deployment settings json file to the directory that will later be published as an artifact]</p></li></ul></li><li><p>Publish build artifacts</p><ul><li><p><strong>Path to publish</strong>: $(solutionFilesDirectory) [2 solution zips and settings json are all here, so all 3 will be published for the release to use]</p></li><li><p><strong>Artifact name</strong>: SolutionArtifacts [set this to whatever you like, just ensure you remember it for the release]</p></li><li><p><strong>Artifact publish location</strong>: Azure Pipelines</p></li></ul></li></ul><div><hr></div><h2>Summary/Next&#8230;</h2><p>This concludes your pipeline. From above, you should now see that both a managed and unmanaged solution have been exported from your dev environment, as well as the deployment settings, all ready for the next stage which is importing to your target environments.</p><p>Before moving on to the next post to start your releases, ensure you do the following. Repeat the Pipeline Core Settings and Pipeline Steps for every solution you have in your source environment. You will use the exact same yaml file, so the steps should already be there, but you will need to create a new global variable for each pipeline. The end result of this is if you have 5 solutions, you have 5 pipelines, as you will be triggering them individually. There will be a future blog post on how this all runs and ties together.</p>]]></content:encoded></item><item><title><![CDATA[Azure DevOps ALM – Setup]]></title><description><![CDATA[First part of a long awaited guide on how to create Azure DevOps pipelines. This covers initial setup, prior to creating the build.]]></description><link>https://www.hollandhart.uk/p/azure-devops-pipelines-setup</link><guid isPermaLink="false">https://www.hollandhart.uk/p/azure-devops-pipelines-setup</guid><dc:creator><![CDATA[James Holland-Hart]]></dc:creator><pubDate>Fri, 10 Nov 2023 12:00:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/a469c200-e8bc-49c1-a9f4-ef01a434d4c0_584x292.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>After my <a href="https://brynhh.substack.com/p/azure-devops-or-power-platform-pipelines">not so recent post</a> comparing the relatively new built-in Power Platform Pipelines to Azure DevOps, this is a guide on how to build your ALM processes in DevOps, as it can become quite complex and confusing. The whole process will be split between multiple blog posts, in order, so it&#8217;s not too overwhelming and each unique stage can be understood clearly and prepared for correctly.</p><blockquote><p>All examples below will use my organisation environment structure, for ease of explanation via consistency. Dev, QA, UAT, Live with solutions exported from Dev and into the others in turn.</p></blockquote><div><hr></div><h2>Initial Reading and Preparation</h2><p>To reiterate one thing from the previous post, all tasks within DevOps are ultimately wrapped for the Power Platform CLI and I would highly recommend reading this first, as even though we are not using it directly, it will help to debug problems.</p><p>To understand the basics of what the build tools are, read this page but refrain from setup for now. I will cover this via App Registrations within Azure Portal, which is visually more understandable and maintainable. You can decide to do things differently in the future if you choose.</p><p>Read about deployment settings files prior to even thinking about DevOps, as they are fundamental to using DevOps. You will not be able to populate connection reference or environment variable values without them.</p><p>Ensure you or an infrastructure colleague have access to Azure Portal from your infrastructure teams. Good practice is this being a different from your regular account, such as an admin account.</p><p>Ensure you or a colleague have access to the environments you wish to include, as above typically via an admin account.</p><h2>Azure App Registration</h2><p>The following steps below should be repeated for each environment you wish to use in your ALM process. 4 app registrations are required in this example to ensure isolation and security.</p><ul><li><p>Sign into <a href="https://portal.azure.com/">portal.azure.com</a></p></li><li><p>Open App registrations</p></li><li><p>Select New registration</p></li><li><p>Enter a meaningful and consistent name, such as Dataverse &#8211; ALM &#8211; Env Name</p></li><li><p>In app registration, select Certificates &amp; secrets</p></li><li><p>Click New secret and enter a meaningful name and select chosen dates</p></li><li><p>Copy value</p><ul><li><p>Do not store this anywhere after you have used it in steps below, it is a security risk.</p></li></ul></li><li><p>In Overview, copy Application (secret ID)</p></li><li><p>Copy Directory (tenant) ID</p></li></ul><h2>Power Platform Admin Centre</h2><ul><li><p>Sign into the <a href="https://admin.powerplatform.microsoft.com/">admin centre</a></p></li><li><p>Select your first environment (Dev)</p></li><li><p>Select Users on the right</p></li><li><p>Select app users list link at the top</p></li><li><p>Select New app user then add an app</p></li><li><p>Search for name of app registration you created above and add</p></li><li><p>Select appropriate business unit</p></li><li><p>Assign system administrator role</p></li><li><p>Create</p></li></ul><p>Repeat the above steps for the other 3 environments, ensuring the use the 3 other app registrations from above. This will result in the 4 environments each having their unique app users assigned to them.</p><h2>Azure DevOps Service Connections</h2><ul><li><p>Sign into your organisations DevOps instance</p></li><li><p>In bottom left, select project settings, service connections</p></li><li><p>Select New service connection, then Power Platform</p></li><li><p>Ensure Application Id and client secret is selected</p></li><li><p>Enter URL of Power Platform environment, for example https://my-dev-env.crm11.dynamics.com</p></li><li><p>Enter directory/tenant ID from above into Tenant ID</p></li><li><p>Enter application ID from above into Application ID</p></li><li><p>Enter secret value from above into Client secret of Application ID</p></li><li><p>Enter descriptive name</p></li><li><p>Ensure grant access permission is ticked</p></li></ul><p>Repeat the above steps for the other 3 environments, using the details copied from the 3 remaining app registrations.</p><div><hr></div><h2>Summary/Next&#8230;</h2><p>This will get you to the point where the services are connected and you are ready to start the build part of your pipeline. This will be in the next post, followed by releases.</p>]]></content:encoded></item><item><title><![CDATA[Azure DevOps or Power Platform Pipelines?]]></title><description><![CDATA[Both technical options are good for releasing, but serve very different needs and complexities.]]></description><link>https://www.hollandhart.uk/p/azure-devops-or-power-platform-pipelines</link><guid isPermaLink="false">https://www.hollandhart.uk/p/azure-devops-or-power-platform-pipelines</guid><dc:creator><![CDATA[James Holland-Hart]]></dc:creator><pubDate>Tue, 10 Oct 2023 12:00:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/1667750b-a4fd-4382-85e5-04687b2673ea_612x289.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Firstly, a basic intro to both. Azure DevOps is a catch-all tool for software development that has been around for years, originating in Team Foundation Server. It has very robust work management, source control, build and release and other options, primarily built around traditional coding but has in the last couple of years had Power Platform tasks added.</p><p>PP Pipelines are a relatively recent addition that exist within the platform itself and allow to export and import solutions between configured environments.</p><p>To a degree, a direct comparison is unfair as they appear to be aimed at different audiences, however due to the nature of both existing, it is worth a discussion.</p><div><hr></div><h2>Pipelines</h2><p>For more information on and how to setup pipelines, visit the following sites from Microsoft</p><p><a href="https://learn.microsoft.com/en-us/power-platform/alm/pipelines">Overview of pipelines in Power Platform</a></p><p><a href="https://learn.microsoft.com/en-us/power-platform/alm/set-up-pipelines">Set up pipelines in Power Platform</a></p><p>Fundamentally, pipelines export and import solutions, it&#8217;s as simple as that. If you require simple exports and imports, with the same behaviour as manual and the account does not matter, I would recommend them. They will be a lot easier to setup than DevOps and will be in an ecosystem you are familiar with (it&#8217;s all via Model-Driven Apps), as well as the setup process ensuring strict usage of specific environments and accounts. It will also force you into an order of environments.</p><p>On the opposite end, you cannot perform any of the following: linking to work items; approvals; pre-defining environment variable and connection reference values; import as someone who doesn&#8217;t own the connections. If you are operating in a team and are trying to achieve full ALM process like coding teams, pipelines are not currently for you, as these are fundamental requirements for that process to happen.</p><p>Overall, if Microsoft extend Pipelines to be more feature rich, they could become excellent and a far simpler alternative to ADO. As it stands though, they are more aimed at one audience.</p><h2>Azure DevOps</h2><p>As mentioned above, ADO is a far more complex and robust toolset, including releasing. You will have full control of every aspect of connecting to the environment, to what you do within it. This does mean a learning curve and complexity of setting up the releases, however it is fundamentally worth the effort. I will go into more detail on how to set it up in another post, but here are some key benefits:</p><ul><li><p>Non-interactive users via Azure App Registrations and PP App Users is possible. No license is required and you cannot login &#8211; extra security.</p></li><li><p>Values in environment variables and connection references can be populated in and used from a configuration file, regardless of who owns the connection the reference will use.</p></li><li><p>Approvals prior to each environment (or any stage you choose).</p></li><li><p>Automated testing and backups of solutions to git.</p></li><li><p>Work items can be updated (read the next post for more info, it&#8217;s not the same way as coding).</p></li></ul><p>ADO is nothing special &#8211; it is ultimately a wrapper for the Power Platform CLI. This means the more familiar you are with one, the quicker you will become with the other (a very good thing). It would be my one and only choice to achieve true automation within ALM.</p>]]></content:encoded></item><item><title><![CDATA[Why Is ALM Important?]]></title><description><![CDATA[Requirements, Engineering/Infrastructure, Testing and Releasing are all critical parts of ALM. I talk about the importance of managing them well for high quality products.]]></description><link>https://www.hollandhart.uk/p/why-is-alm-important</link><guid isPermaLink="false">https://www.hollandhart.uk/p/why-is-alm-important</guid><dc:creator><![CDATA[James Holland-Hart]]></dc:creator><pubDate>Tue, 26 Sep 2023 12:00:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/7a152cb0-a2e3-4479-9307-4db5b11ed32e_1538x769.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>After a brief introduction in my first post, this will expand into more detail as to why ALM (Application Lifecycle Management) is critically important to your projects. Along with platform governance, it is a core aspect of using Power Platform and Dynamics as professional development tools to complement traditional methods such as coding. Without them and without multiple teams, the ecosystem will not be able to be managed efficiently and projects will never be able to move to enterprise scale.</p><div><hr></div><h2>Requirements</h2><p>Power Platform is a software development tool and with any software development project, requirements (functional and non-functional are key). I will start with a controversial statement to many &#8211; software is not about developers or IT. It&#8217;s not about what code we want to write, what tools we want to use, if we follow scrum or not, it&#8217;s about users. Without being able to help people do what they need to do in a simpler, understandable way, it is just a hobby.</p><p>With that out of the way, let&#8217;s look at requirements. For this, you need a dedicated product/project manager who understands non-technical user needs and what is technically possible. They can draw up change requests, proof of concepts, technical research, etc in tools such as Azure DevOps which by the time it reaches the engineering team, are fully defined and ready to plan and implement. At this stage of my career, I believe developers drawing up their own requirements will not end up with the best software &#8211; there will always be technical bias that cannot be challenged by a user due to lack of knowledge.</p><h2>Engineering / Infrastructure</h2><p>These teams are 2 sides of the same coin &#8211; infrastructure look after the environments, security and licensing; engineering oversee customisation of Dynamics and process creation. All elements have to be done by the nature of the platform, but too many in the hands of one team (or person) is running a very high risk of becoming unsustainable.</p><p>Let&#8217;s use some examples. All control with engineering focussed staff &#8211; they want to get things done and do it quickly. They may use System Administrator roles, not use teams, choose a Dynamics license instead of Power Apps per-user, not have multiple environments to build, test and live &#8211; you can see how quickly this will unravel and become a security and cost risk. Infrastructure focussed staff &#8211; they will want to ensure security and affordability, but this may make changes slower, using inefficient tools, not release managed solutions &#8211; usability will become poor.</p><p>Both teams have to exist, specialise in their areas and hold each other accountable. It isn&#8217;t about throwing tasks over the wall, but complementing each other to have high quality development, released in a minimised risk way. It is vital for the leads to help team members understand both sides and that each are heavily intertwined with the other.</p><h2>Testing</h2><p>Developers cannot reliably test their changes in a full and robust way. We can write unit tests, run flows, check the interface, but QA staff are as specialist in their own area as developers are in theirs. Testing isn&#8217;t just running a script (manual or automated) over and over again &#8211; that just proves what works &#8211; you have to prove what doesn&#8217;t work. A combination of manual smoke tests, automated regression and performance, UAT by the organisation are all highly important and if you don&#8217;t do them all, you haven&#8217;t tested.</p><p>Things can also go the other way &#8211; too much of 1 thing. Do you do unit tests and mocked integration and real integration and front end and&#8230; and&#8230; and&#8230; which make your builds take 30 minutes to run? It&#8217;s too much. Testing needs focus and a reason, just like development needs a reason &#8211; it&#8217;s all about the users.</p><p>We&#8217;ll aim to go into this in more detail in the future with a QA lead sharing their ideas.</p><h2>Releasing</h2><p>This is a big technical topic that has partially been covered in the previous post about what is Power Platform? To repeat:</p><ul><li><p>Always have a minimum of 3, if not 4 environments &#8211; Dev, Test (QA and UAT), Live.</p></li><li><p>Only use unmanaged solutions in dev, nowhere else &#8211; really, absolutely, nowhere else.</p></li><li><p>Use managed everywhere else &#8211; Test, Live, the Moon. You should not be making any changes outside dev.</p></li></ul><p>To add some detail, I would recommend a 5th environment &#8211; Prototyping. This is a mimic of dev to allow for proof of concept work, which is still properly planned via your Product Manager, but may not go into full development after demo. If it doesn&#8217;t, the changes are reverted, but if it does, the unmanaged solution is copied to dev and continued from there. If staff want to do training, experiment, etc then use trial or developer environments &#8211; never let anyone into your non-default environments unless there is a specific need and only for fully defined change requests.</p><p>Define your solutions in a structured way that works for you and stick with it. Never create new solutions as you go along &#8211; this isn&#8217;t a .net project, releasing cannot operate in the same way as code, but even if it could &#8211; would you create a new project or class file every time? Of course not. I like to define around business usage, say emails, document management, etc rather than technical item (flows, apps, JS, etc) as you will eventually have dependencies between customisations and will have to include mixed types. It will also make it easier to find your customisations.</p><p>To release solutions, always ensure you have connection references within them. If you don&#8217;t, you will not be able to retain what accounts are used and fundamentally breaks the premise of solutions.</p><p>Use automation. When you import a solution, the owner becomes the person importing and connections the references use have to be owned by that user. This will very quickly become a major issue if that person leaves &#8211; the flows will stop, the connections will break and your system will stop working. It may sound extreme, but I&#8217;ve seen it happen. Power Platform has a new built-in pipelines option, but I wouldn&#8217;t use this as it simply automates a manual import. Azure DevOps is the only robust answer, as you can then use Azure App Registrations which are non-interactive users and therefore will never expire and have increased security. I will be writing 2 full posts soon about Pipelines vs DevOps and how to build a DevOps release.</p><div><hr></div><h2>Conclusion&#8230;</h2><p>All of this ensures consistency between environments and therefore a reliable system the users can trust and developers can support.</p>]]></content:encoded></item><item><title><![CDATA[What is Power Platform]]></title><description><![CDATA[In this article, we cover the tools, tends, governance and training within Power Platform, as well as professional development (it's not only low code).]]></description><link>https://www.hollandhart.uk/p/what-is-power-platform</link><guid isPermaLink="false">https://www.hollandhart.uk/p/what-is-power-platform</guid><dc:creator><![CDATA[James Holland-Hart]]></dc:creator><pubDate>Fri, 15 Sep 2023 12:00:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/7fec974b-5b14-4923-b07d-0f7814e4e8a7_192x96.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Let&#8217;s start this thing with an expansion of the introduction on the home page. It has become extremely popular in the last year, so there&#8217;s some key points to consider what Power Platform and Dynamics can do and where it&#8217;s going. Firstly, the very basics, what are the core tools and are you aware of them all existing?</p><ul><li><p>Power Apps &#8211; Canvas</p></li><li><p>Power Apps &#8211; Model Driven</p></li><li><p>Power Automate</p></li><li><p>Power BI</p></li><li><p>Power Pages (formerly Apps Portals)</p></li><li><p>Power Virtual Agents</p></li><li><p>Dynamics 365</p></li><li><p>Dataverse</p></li></ul><div><hr></div><h2>Trends</h2><p>There&#8217;s always been trends in I.T. from the useful to the fads, Power Platform is no different. The tools were created 6 years ago, with the longest experience around 4 years, but usually 1-2 and primarily canvas Power apps. This is fine, but now we&#8217;re going through the explosion of companies jumping on it (presumably as the new thing to make quick money from), there seems to be a dangerous lack of consideration of the platform being more than Power Apps, as well as other topics below.</p><p>This is the primary focus of my blog, as I want to spread useful knowledge I&#8217;ve picked up in my own job and from colleagues. I love the tools and think they are incredibly powerful, with a lot of potential, however it is incredibly easy to do things badly with no focus on ALM and governance</p><h2>Not Only Low Code/Citizen Developers</h2><p>Although it started as a toolset for &#8220;Citizen Developers&#8221;, there are more and more aspects that need to be considered and technical options available, which now show it is anything but only that. The sheer number of options available (listed above), provide many different approaches to providing what users need, with some being potential replacements to traditional coding methods such as HTML, CSS, JS, .net, Java etc and some complementary. There is no one size fits all in software development and this couldn&#8217;t be truer of Power Platform &#8211; embrace what they do, but be cautious.</p><p>2 key aspects (which you&#8217;ll see repeated quite often) that are now incredibly important for pro developers are ALM and governance. ALM (Application Lifecycle Management) should consider the following:</p><p>How and where do you make your changes?<br>How and where do you release them?<br>Is this manual or automated?<br>Who can do it?</p><p>It is best practice that you should always use solutions. Solutions are effectively groups of customisations, be it apps, cloud flows, JavaScript files, connection references, variables, many things and come in 2 types &#8211; unmanaged and managed. You should always make your changes in an unmanaged solution in a dev environment, then release them as managed into QA (any number that suits your org) and live. Never make changes in any environment other than dev, as you will cause layering where next time you import, the updates will never trump the direct change.</p><p>Manual exporting and importing is a useful method of releasing, however this comes with certain risks:</p><p>Values from variables have to be removed prior to export (very time consuming).<br>Owners of customisations become the importing account (risky if not a service account).<br>System Customiser is required for the account performing this action (risk if on a personal account, as this will give access to nearly every part of that environment).<br>General human error (it&#8217;s a manual process).</p><p>Automation is possible either via Power Platform pipelines, or Azure DevOps. Pipelines are excellent, but you cannot run tests or external steps, have limited visibility, owners and permissions are as above (the import still happens as the running user). They show a lot of potential, but for enterprise systems, I would not use these in their current early stages.</p><p>Azure DevOps is far more robust, as you have full control, can connect as an Azure App Registration, have any type of approvals or gates, backup the zips, link to work items. You cannot operate in the exact same way as coding ALM, such as Pull Requests, as there&#8217;s no code to review, but there are ways to mimic this process in alternate ways effectively. This would be my chosen method of releasing to reduce risk and increase efficiency.</p><h2>Governance</h2><p>Governance is the definition and management of the operational side of the platform. The most common and critical areas are licensing, environments, security. Without well defined usages of each of these and control of that, the entire platform and applications/processes within it would become unsupportable in months.</p><p>Licensing is important as it is so complex. For example &#8211; there are 3 direct ways to build Power Apps and Power Automate (free with A/E3 without non-premium connections, Per App/Flow and Per User), with Power Pages and Virtual Agents being usage based and BI having desktop and service. I wont go into the details here, but a useful starting point is keep it basic &#8211; use what you get out of the box and don&#8217;t dive into wanting hundreds of Dynamics or Power App licences (again &#8211; canvas apps are not the entirety of the platform), as that when the common question will soon appear of it being unaffordable. Build, research and iterate your requirements and solutions, then ask on communities like Reddit and Discord for advice.</p><p>Environments are fundamental to professional development in the platform. You will always have a default environment and as per Microsoft&#8217;s own best practice (see training below), this should be for non-business critical work only. This is the one and only place where the &#8220;citizen developer&#8221; idea should be allowed and they should not be able to do anything more than standard flows, apps etc. When you start to build a proper ALM process, you should at least have dev, test and live, but I would argue 4 &#8211; dev, QA (internal test team), UAT (wider organisation testing) and live. Each environment should have well defined and limited access, such as own accounts in dev, only test accounts in QA and no engineering access to live. This is where security comes in, where those different accounts can use a mix of out of the box roles and custom.</p><p>All of the above should be managed by an infrastructure team separate to engineering, but open to suggestions from anyone, as any good agile workplace should. Infra and engineering will act as 2 sides of the same coin to maintaining a safe and productive system, with one having no more influence than the other.</p><h2>Training</h2><p>Questions that comes up more regularly than they should are do I need experience to pass an exam? What jobs can I get after passing an exam? Can I get a pay rise after&#8230;I think you can see the pattern. Exams have virtually no impact on jobs &#8211; forget about them. If you want to do a certification, it should be for you and you only to measure your experience, personal fulfilment, whatever you want from it. The key aspect is the Microsoft Learn material &#8211; it is incredibly well structured, covers many topics and a perfect complement to practicing on the job.</p><p>That is the key point &#8211; practice. Experience wont grow and exams wont be passed by just doing the material, knowing how it relates to the real world is very different and also fulfilling. This is like any IT role &#8211; software developer using code, tester, networks and it shouldn&#8217;t be expected to walk into senior roles after a year, this is no different in Power Platform.</p><p>Key courses to do are PL-900, 100 and 200 in that order. This will give you a great general knowledge to then apply. You can branch out into specifics such as Azure by doing 400, Power BI or chatbots with 300 and 500, all culminating in an overarching view of the entire ecosystem which you will need to be a tech lead, in PL-600. These are difficult &#8211; just like a degree is to learn C# or Java, so take from them what you want and need. Visit <a href="https://www.reddit.com/r/PowerPlatform/wiki/index/certifications/">this page on Reddit</a> which will give a wider view of the various options.</p>]]></content:encoded></item></channel></rss>