<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://patton-tech.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://patton-tech.com/" rel="alternate" type="text/html" /><updated>2026-05-07T18:18:55+00:00</updated><id>https://patton-tech.com/feed.xml</id><title type="html">Patton-Tech</title><subtitle>Making It Go</subtitle><author><name>Jeff Patton</name></author><entry><title type="html">Docker Desktop</title><link href="https://patton-tech.com/blog/2026/05/06/docker-desktop.html" rel="alternate" type="text/html" title="Docker Desktop" /><published>2026-05-06T16:29:00+00:00</published><updated>2026-05-06T16:29:00+00:00</updated><id>https://patton-tech.com/blog/2026/05/06/docker-desktop</id><content type="html" xml:base="https://patton-tech.com/blog/2026/05/06/docker-desktop.html"><![CDATA[<p>Working on migrating my personal site <a href="https://kansaspattons.org">kansaspattons.org</a> and decided I wanted to pull down all my “posts” from Social Media aka Facebook and Instagram. This has resulted in a very large number of images and posts, and we’re at the very limit of what Jekyll on Github Pages can do. So I did what any sane person would do and write a full backend photo api, hence <a href="https://github.com/jeffpatton1971/PhotoArchive">PhotoArchive</a>.</p>

<p>Ultimately since I currently write all images to a storage account in Azure, I decided that I’ll continue to leverage that and create an Azure PostgreSql instance. In order to develop the API I needed to haev PostgreSql installed locally, so instead of doing a whole installation I thought Docker was the answer.</p>

<p>So the issue, on Windows (I’m  running Windows 11, but this may be an issue for earlier vesrions), I was getting a weird error message:</p>

<blockquote>
  <p>C:\ProgramData\DockerDesktop must be owned by an elevated account</p>
</blockquote>

<p>This error occurs when Docker Desktop’s installer detects that the C:\ProgramData\DockerDesktop folder is not owned by an elevated (administrator) account. It’s a security measure introduced to prevent privilege escalation vulnerabilities. The issue often happens if the folder already exists with incorrect permissions or ownership, possibly from a previous installation attempt.</p>

<p>My solution as I had not attempted to install Docker was to open an elevated prompt and delete and recreate that folder:</p>

<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">cd</span><span class="w"> </span><span class="nx">C:\ProgramData\DockerDesktop</span><span class="w">
</span><span class="n">Remove-Item</span><span class="w"> </span><span class="nx">DockerDesktop</span><span class="w"> </span><span class="nt">-Recurse</span><span class="w"> </span><span class="nt">-Force</span><span class="w">
</span><span class="n">New-Item</span><span class="w"> </span><span class="nt">-Name</span><span class="w"> </span><span class="nx">DockerDesktop</span><span class="w"> </span><span class="nt">-ItemType</span><span class="w"> </span><span class="nx">Directory</span><span class="w">
</span></code></pre></div></div>

<p>After that re-run the installation and everything should go, if however you already had Docker installed, it might be enough to just take ownership and assign Administrators. If you want to do that via PowerShell:</p>

<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$dockerData</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"C:\ProgramData\DockerDesktop"</span><span class="w">
</span><span class="nv">$owner</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">New-Object</span><span class="w"> </span><span class="nx">System.Security.Principal.NTAccount</span><span class="p">(</span><span class="s2">"Administrators"</span><span class="p">)</span><span class="w">
</span><span class="nv">$dir</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Get-Item</span><span class="w"> </span><span class="nv">$dockerData</span><span class="w">
</span><span class="nv">$sd</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">$dir</span><span class="o">.</span><span class="nf">GetAccessControl</span><span class="p">()</span><span class="w">
</span><span class="nv">$sd</span><span class="o">.</span><span class="nf">SetOwner</span><span class="p">(</span><span class="nv">$owner</span><span class="p">)</span><span class="w">
</span><span class="nv">$dir</span><span class="o">.</span><span class="nf">SetAccessControl</span><span class="p">(</span><span class="nv">$sd</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<p>Your mileage may vary on that one.</p>]]></content><author><name>Jeff</name></author><category term="blog" /><category term="May" /><category term="2026" /><category term="Development" /><category term="Docker" /><summary type="html"><![CDATA[Working on migrating my personal site kansaspattons.org and decided I wanted to pull down all my “posts” from Social Media aka Facebook and Instagram. This has resulted in a very large number of images and posts, and we’re at the very limit of what Jekyll on Github Pages can do. So I did what any sane person would do and write a full backend photo api, hence PhotoArchive.]]></summary></entry><entry><title type="html">A whole lot of nothing, until there was something</title><link href="https://patton-tech.com/blog/2024/01/22/a-whole-lot-of-nothing.html" rel="alternate" type="text/html" title="A whole lot of nothing, until there was something" /><published>2024-01-22T04:21:00+00:00</published><updated>2024-01-22T04:21:00+00:00</updated><id>https://patton-tech.com/blog/2024/01/22/a-whole-lot-of-nothing</id><content type="html" xml:base="https://patton-tech.com/blog/2024/01/22/a-whole-lot-of-nothing.html"><![CDATA[<p>This week was filled with a lot of meetings, a few unexpected, and at least one was mandatory. I always hated those mandatory meetings, they always went the same way, 5 min of information followed by an eternity of things that hvae no bearing on what I do in my day to day. Beyond meetings, progress was made at work, my service account has been approved and I’ll be finally sorting out the last of my deployment work. In an effort to stay productive I have also resurrected a project that I have ignored for a long time. The nice thing is that when I’m stuck waiting on other folks so I can do my job, I can work on this. Looking forward, this work shoud lead me to having a full API to handle the entire process, and possibly provide the ability to define command-line tools as not everyone will want to go through a UI.</p>

<p>My own work has progressed nicely as well, I have now created several <a href="https://docs.github.com/en/actions">GitHub Actions</a> that should really help me in the long run. As always you can find the code living in the <a href="https://github.com/mod-posh">Mod-Posh Organizatin</a>. I’ve got 4 Actions down and I think at least 4 more to go, not including things I pull out and create seperate actions for. For example, I’m working on an Action that will setup my environment for building and deploying, part of that required pulling a version from a PowerShell module or a C-Sharp project file. I have moved that into a seperate Action dedicated to just getting the verison, this allows the Action I’m working on to be solely dedicated to that aspect. Basically anything that can be calculated or passed into the Action by some other means should be. The Action should only do the thing it was written to do and not anything beyond that.</p>

<p>As I work through these, I’m beginning to realize that they can also be written to work with <a href="https://azure.microsoft.com/en-us/products/devops/">Azure DevOps</a> as <a href="https://learn.microsoft.com/en-us/azure/devops/pipelines/process/templates?view=azure-devops&amp;pivots=templates-includes">Pipeline Templates</a>. As I do a lot of work in both environments this may lend itself very nicely to that work as well.</p>

<p>Finally, I’m starting to work on a <a href="https://github.com/mod-posh/BuildAutomation">BuildAutomation</a> project that is akin to the Github Actions I’m working on. But this project is a PowerShell module that will allow me to really pare down my <a href="https://github.com/psake/psake">psake</a> file. This BuildAutomation module will encapsulate the code in that script now, into easy to use cmdlets. Not everything will be able to be removed, but I’m hopeful that I can pull out a large percentage of that code. I may also spin up a few <a href="https://learn.microsoft.com/en-us/powershell/scripting/developer/module/how-to-write-a-powershell-script-module?view=powershell-7.4">PowerShell script modules</a> for <a href="https://github.com/bluesky-social/atproto">BlueSky</a> and <a href="https://discord.com/developers/docs/reference">Discord</a> for the notifications that I use.</p>

<p>I hope you have a great week ahead, and I’ll write more later!</p>]]></content><author><name>Jeff</name></author><category term="blog" /><category term="January" /><category term="2024" /><category term="Development" /><category term="WIR" /><summary type="html"><![CDATA[This week was filled with a lot of meetings, a few unexpected, and at least one was mandatory. I always hated those mandatory meetings, they always went the same way, 5 min of information followed by an eternity of things that hvae no bearing on what I do in my day to day. Beyond meetings, progress was made at work, my service account has been approved and I’ll be finally sorting out the last of my deployment work. In an effort to stay productive I have also resurrected a project that I have ignored for a long time. The nice thing is that when I’m stuck waiting on other folks so I can do my job, I can work on this. Looking forward, this work shoud lead me to having a full API to handle the entire process, and possibly provide the ability to define command-line tools as not everyone will want to go through a UI.]]></summary></entry><entry><title type="html">Github Actions and Ramifications of moving</title><link href="https://patton-tech.com/blog/2024/01/13/github-actions-ramifications.html" rel="alternate" type="text/html" title="Github Actions and Ramifications of moving" /><published>2024-01-13T14:26:00+00:00</published><updated>2024-01-13T14:26:00+00:00</updated><id>https://patton-tech.com/blog/2024/01/13/github-actions-ramifications</id><content type="html" xml:base="https://patton-tech.com/blog/2024/01/13/github-actions-ramifications.html"><![CDATA[<p>The majority of this week was spent yet again waiting for others, but the good news is I think I may be on the home stretch of my actual work. Honestly I was dead on accurate in the amount of time I dedicated to the work I needed to get done, I did not account for the holiday stretch between November and December, on top of that folks taking time at the end of the year. Needless to say this won’t happen again, and really to add to that, I will start to slot in other work when I’m forced to wait for others. Since November this has all been a very long ride on the struggle bus, and I will not be taking that ride again!</p>

<p>In other more pertinent news I have begun to start the conversion from my local psake environment over to Github Actions. My first stab was writing the in Python, while not terribly complex, that’s a muscle I don’t really want to stretch, so I’ve decided to re-write them in PowerShell. This is in line with what I typically write in for my personal and business code. Since I’m starting to consolidate all that code into the <a href="https://github.com/mod-posh">Mod-Posh</a> Organization, I decided to move them from my personal repositories to that org.</p>

<p>My assumption was that I could unlist the Github Action and then publish it from the new repository. This was incredibly inacurate on my part, what needs to actually happen is to just transfer the repository. When you transfer the Github Action repository to a new owner/organization it updates everything for you on the back-end. Long story short, I didn’t do that for the first one, I’ve now been on a Github Support journey, where the action can’t be published because of a naming conflict, but when you search for that name in the marketplace it doesn’t exist.</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Name must be unique. Cannot match an existing action, user or organization name.
</code></pre></div></div>

<p>I am not aware of the backend process, but my guess is there is a database entry someplace that contains the name of my action and it’s all messed up. So in order to prevent you from facing this issue, please just transfer the repo, that’s what I’ve done with the remaining Github Action repos and no issue at all.</p>

<p>Once things have been sorted I plan on writing about the actions and how to set them up and use them. For the most part these will mimic my current workflow which may or may not be yours, but hopefully I will have built enough flexibility in so that you can also use them either all together or individually.</p>

<p>Have a great week!</p>]]></content><author><name>Jeff</name></author><category term="blog" /><category term="January" /><category term="2024" /><category term="Development" /><category term="WIR" /><summary type="html"><![CDATA[The majority of this week was spent yet again waiting for others, but the good news is I think I may be on the home stretch of my actual work. Honestly I was dead on accurate in the amount of time I dedicated to the work I needed to get done, I did not account for the holiday stretch between November and December, on top of that folks taking time at the end of the year. Needless to say this won’t happen again, and really to add to that, I will start to slot in other work when I’m forced to wait for others. Since November this has all been a very long ride on the struggle bus, and I will not be taking that ride again!]]></summary></entry><entry><title type="html">Querying PowerShell Gallery and Nuget.org</title><link href="https://patton-tech.com/blog/2024/01/08/querying-powershell-nuget.html" rel="alternate" type="text/html" title="Querying PowerShell Gallery and Nuget.org" /><published>2024-01-08T14:43:00+00:00</published><updated>2024-01-08T14:43:00+00:00</updated><id>https://patton-tech.com/blog/2024/01/08/querying-powershell-nuget</id><content type="html" xml:base="https://patton-tech.com/blog/2024/01/08/querying-powershell-nuget.html"><![CDATA[<p>I’ve decided that I want to changeup how I display my projects on the blog, I think I could create a landing page for all my code and then create dedicated locations for things that are published. Additionally I think it would be fun to see some of the stats displayed here, which is easy enough for an individual project, but not for a large group. This got me thinking how can I query nuget.org and powershellgallery.com for a list of packages that I’ve published.</p>

<p>In terms of nuget.org it’s not to terribly difficult and after a few hit and miss attempts I was able to put together a nice little one-liner that returns all the code that I have published there. It was simply a matter of finding the right <a href="https://learn.microsoft.com/en-us/nuget/api/search-query-service-resource">endpoint</a> and knowing what to ask.</p>

<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="n">Invoke-RestMethod</span><span class="w"> </span><span class="nt">-Method</span><span class="w"> </span><span class="nx">Get</span><span class="w"> </span><span class="nt">-Uri</span><span class="w"> </span><span class="s2">"https://azuresearch-usnc.nuget.org/query?q=owner:jeffpatton1971"</span><span class="p">)</span><span class="w"> </span><span class="o">|</span><span class="n">Select-Object</span><span class="w"> </span><span class="nt">-ExpandProperty</span><span class="w"> </span><span class="nx">data</span><span class="w">

</span><span class="err">@</span><span class="n">id</span><span class="w">             </span><span class="p">:</span><span class="w"> </span><span class="nx">https://api.nuget.org/v3/registration5-semver1/patton.githubclient/index.json</span><span class="w">
</span><span class="err">@</span><span class="kr">type</span><span class="w">           </span><span class="p">:</span><span class="w"> </span><span class="n">Package</span><span class="w">
</span><span class="nx">registration</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">https://api.nuget.org/v3/registration5-semver1/patton.githubclient/index.json</span><span class="w">
</span><span class="n">id</span><span class="w">              </span><span class="p">:</span><span class="w"> </span><span class="nx">Patton.GithubClient</span><span class="w">
</span><span class="n">version</span><span class="w">         </span><span class="p">:</span><span class="w"> </span><span class="nx">2.3.0</span><span class="w">
</span><span class="n">description</span><span class="w">     </span><span class="p">:</span><span class="w"> </span><span class="nx">A</span><span class="w"> </span><span class="nx">C</span><span class="c"># Dll library for working with the Github Rest API</span><span class="w">
</span><span class="n">summary</span><span class="w">         </span><span class="p">:</span><span class="w">
</span><span class="n">title</span><span class="w">           </span><span class="p">:</span><span class="w"> </span><span class="nx">Patton.GithubClient</span><span class="w">
</span><span class="n">licenseUrl</span><span class="w">      </span><span class="p">:</span><span class="w"> </span><span class="nx">https://www.nuget.org/packages/Patton.GithubClient/2.3.0/license</span><span class="w">
</span><span class="n">projectUrl</span><span class="w">      </span><span class="p">:</span><span class="w"> </span><span class="nx">https://jeffpatton1971.github.io/GithubClient/</span><span class="w">
</span><span class="n">tags</span><span class="w">            </span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="n">Github</span><span class="p">,</span><span class="w"> </span><span class="nx">GithubApi</span><span class="p">}</span><span class="w">
</span><span class="n">authors</span><span class="w">         </span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="n">Jeffrey</span><span class="w"> </span><span class="nx">Patton</span><span class="p">}</span><span class="w">
</span><span class="n">owners</span><span class="w">          </span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="n">jeffpatton1971</span><span class="p">}</span><span class="w">
</span><span class="n">totalDownloads</span><span class="w">  </span><span class="p">:</span><span class="w"> </span><span class="nx">1694</span><span class="w">
</span><span class="n">verified</span><span class="w">        </span><span class="p">:</span><span class="w"> </span><span class="nx">False</span><span class="w">
</span><span class="n">packageTypes</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="p">{@{</span><span class="nx">name</span><span class="o">=</span><span class="nx">Dependency</span><span class="p">}}</span><span class="w">
</span><span class="n">versions</span><span class="w">        </span><span class="p">:</span><span class="w"> </span><span class="p">{@{</span><span class="nx">version</span><span class="o">=</span><span class="mf">1.0.0</span><span class="p">;</span><span class="w"> </span><span class="nx">downloads</span><span class="o">=</span><span class="mi">339</span><span class="p">;</span><span class="w"> </span><span class="err">@</span><span class="nx">id</span><span class="o">=</span><span class="nx">https</span><span class="err">://</span><span class="nx">api</span><span class="err">.</span><span class="nx">nuget</span><span class="err">.</span><span class="nx">org</span><span class="err">/</span><span class="nx">v3</span><span class="err">/</span><span class="nx">registration5</span><span class="err">-</span><span class="nx">semver1</span><span class="err">/</span><span class="nx">patton</span><span class="err">.</span><span class="nx">githubclient</span><span class="err">/</span><span class="mf">1.0.0</span><span class="err">.</span><span class="nx">json</span><span class="p">},</span><span class="w"> </span><span class="p">@{</span><span class="nx">version</span><span class="o">=</span><span class="mf">1.1.0</span><span class="p">;</span><span class="w"> </span><span class="nx">downloads</span><span class="o">=</span><span class="mi">327</span><span class="p">;</span><span class="w">
                  </span><span class="err">@</span><span class="nx">id</span><span class="o">=</span><span class="nx">https</span><span class="err">://</span><span class="nx">api</span><span class="err">.</span><span class="nx">nuget</span><span class="err">.</span><span class="nx">org</span><span class="err">/</span><span class="nx">v3</span><span class="err">/</span><span class="nx">registration5</span><span class="err">-</span><span class="nx">semver1</span><span class="err">/</span><span class="nx">patton</span><span class="err">.</span><span class="nx">githubclient</span><span class="err">/</span><span class="mf">1.1.0</span><span class="err">.</span><span class="nx">json</span><span class="p">},</span><span class="w"> </span><span class="p">@{</span><span class="nx">version</span><span class="o">=</span><span class="mf">1.1.1</span><span class="p">;</span><span class="w"> </span><span class="nx">downloads</span><span class="o">=</span><span class="mi">341</span><span class="p">;</span><span class="w">
                  </span><span class="err">@</span><span class="nx">id</span><span class="o">=</span><span class="nx">https</span><span class="err">://</span><span class="nx">api</span><span class="err">.</span><span class="nx">nuget</span><span class="err">.</span><span class="nx">org</span><span class="err">/</span><span class="nx">v3</span><span class="err">/</span><span class="nx">registration5</span><span class="err">-</span><span class="nx">semver1</span><span class="err">/</span><span class="nx">patton</span><span class="err">.</span><span class="nx">githubclient</span><span class="err">/</span><span class="mf">1.1.1</span><span class="err">.</span><span class="nx">json</span><span class="p">},</span><span class="w"> </span><span class="p">@{</span><span class="nx">version</span><span class="o">=</span><span class="mf">2.0.0</span><span class="p">;</span><span class="w"> </span><span class="nx">downloads</span><span class="o">=</span><span class="mi">336</span><span class="p">;</span><span class="w">
                  </span><span class="err">@</span><span class="nx">id</span><span class="o">=</span><span class="nx">https</span><span class="err">://</span><span class="nx">api</span><span class="err">.</span><span class="nx">nuget</span><span class="err">.</span><span class="nx">org</span><span class="err">/</span><span class="nx">v3</span><span class="err">/</span><span class="nx">registration5</span><span class="err">-</span><span class="nx">semver1</span><span class="err">/</span><span class="nx">patton</span><span class="err">.</span><span class="nx">githubclient</span><span class="err">/</span><span class="mf">2.0.0</span><span class="err">.</span><span class="nx">json</span><span class="p">}</span><span class="err">…</span><span class="p">}</span><span class="w">
</span><span class="n">vulnerabilities</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="p">{}</span><span class="w">

</span><span class="err">@</span><span class="n">id</span><span class="w">             </span><span class="p">:</span><span class="w"> </span><span class="nx">https://api.nuget.org/v3/registration5-semver1/retrosheet/index.json</span><span class="w">
</span><span class="err">@</span><span class="kr">type</span><span class="w">           </span><span class="p">:</span><span class="w"> </span><span class="n">Package</span><span class="w">
</span><span class="nx">registration</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">https://api.nuget.org/v3/registration5-semver1/retrosheet/index.json</span><span class="w">
</span><span class="n">id</span><span class="w">              </span><span class="p">:</span><span class="w"> </span><span class="nx">RetroSheet</span><span class="w">
</span><span class="n">version</span><span class="w">         </span><span class="p">:</span><span class="w"> </span><span class="nx">2.0.0</span><span class="w">
</span><span class="n">description</span><span class="w">     </span><span class="p">:</span><span class="w"> </span><span class="nx">A</span><span class="w"> </span><span class="nx">collection</span><span class="w"> </span><span class="nx">of</span><span class="w"> </span><span class="nx">models</span><span class="w"> </span><span class="nx">that</span><span class="w"> </span><span class="nx">represent</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">data</span><span class="w"> </span><span class="nx">structures</span><span class="w"> </span><span class="nx">in</span><span class="w"> </span><span class="nx">Retrosheet</span><span class="w"> </span><span class="nx">data</span><span class="w"> </span><span class="nx">files.</span><span class="w">
</span><span class="n">summary</span><span class="w">         </span><span class="p">:</span><span class="w">
</span><span class="n">title</span><span class="w">           </span><span class="p">:</span><span class="w"> </span><span class="nx">RetroSheet</span><span class="w">
</span><span class="n">tags</span><span class="w">            </span><span class="p">:</span><span class="w"> </span><span class="p">{}</span><span class="w">
</span><span class="n">authors</span><span class="w">         </span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="n">Jeffrey</span><span class="w"> </span><span class="nx">S.</span><span class="w"> </span><span class="nx">Patton</span><span class="p">}</span><span class="w">
</span><span class="n">owners</span><span class="w">          </span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="n">jeffpatton1971</span><span class="p">}</span><span class="w">
</span><span class="n">totalDownloads</span><span class="w">  </span><span class="p">:</span><span class="w"> </span><span class="nx">118</span><span class="w">
</span><span class="n">verified</span><span class="w">        </span><span class="p">:</span><span class="w"> </span><span class="nx">False</span><span class="w">
</span><span class="n">packageTypes</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="p">{@{</span><span class="nx">name</span><span class="o">=</span><span class="nx">Dependency</span><span class="p">}}</span><span class="w">
</span><span class="n">versions</span><span class="w">        </span><span class="p">:</span><span class="w"> </span><span class="p">{@{</span><span class="nx">version</span><span class="o">=</span><span class="mf">2.0.0</span><span class="p">;</span><span class="w"> </span><span class="nx">downloads</span><span class="o">=</span><span class="mi">118</span><span class="p">;</span><span class="w"> </span><span class="err">@</span><span class="nx">id</span><span class="o">=</span><span class="nx">https</span><span class="err">://</span><span class="nx">api</span><span class="err">.</span><span class="nx">nuget</span><span class="err">.</span><span class="nx">org</span><span class="err">/</span><span class="nx">v3</span><span class="err">/</span><span class="nx">registration5</span><span class="err">-</span><span class="nx">semver1</span><span class="err">/</span><span class="nx">retrosheet</span><span class="err">/</span><span class="mf">2.0.0</span><span class="err">.</span><span class="nx">json</span><span class="p">}}</span><span class="w">
</span><span class="n">vulnerabilities</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="p">{}</span><span class="w">

</span><span class="err">@</span><span class="n">id</span><span class="w">             </span><span class="p">:</span><span class="w"> </span><span class="nx">https://api.nuget.org/v3/registration5-semver1/modposh.logger/index.json</span><span class="w">
</span><span class="err">@</span><span class="kr">type</span><span class="w">           </span><span class="p">:</span><span class="w"> </span><span class="n">Package</span><span class="w">
</span><span class="nx">registration</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">https://api.nuget.org/v3/registration5-semver1/modposh.logger/index.json</span><span class="w">
</span><span class="n">id</span><span class="w">              </span><span class="p">:</span><span class="w"> </span><span class="nx">ModPosh.Logger</span><span class="w">
</span><span class="n">version</span><span class="w">         </span><span class="p">:</span><span class="w"> </span><span class="nx">1.0.0</span><span class="w">
</span><span class="n">description</span><span class="w">     </span><span class="p">:</span><span class="w"> </span><span class="nx">A</span><span class="w"> </span><span class="nx">Logging</span><span class="w"> </span><span class="nx">library</span><span class="w"> </span><span class="nx">for</span><span class="w"> </span><span class="o">.</span><span class="nf">Net</span><span class="w"> </span><span class="nx">and</span><span class="w"> </span><span class="nx">PowerShell</span><span class="w">
</span><span class="n">summary</span><span class="w">         </span><span class="p">:</span><span class="w">
</span><span class="n">title</span><span class="w">           </span><span class="p">:</span><span class="w"> </span><span class="nx">ModPosh.Logger</span><span class="w">
</span><span class="n">projectUrl</span><span class="w">      </span><span class="p">:</span><span class="w"> </span><span class="nx">https://github.com/mod-posh/Logger</span><span class="w">
</span><span class="n">tags</span><span class="w">            </span><span class="p">:</span><span class="w"> </span><span class="p">{}</span><span class="w">
</span><span class="n">authors</span><span class="w">         </span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="n">Jeffrey</span><span class="w"> </span><span class="nx">S.</span><span class="w"> </span><span class="nx">Patton</span><span class="p">}</span><span class="w">
</span><span class="n">owners</span><span class="w">          </span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="n">jeffpatton1971</span><span class="p">}</span><span class="w">
</span><span class="n">totalDownloads</span><span class="w">  </span><span class="p">:</span><span class="w"> </span><span class="nx">55</span><span class="w">
</span><span class="n">verified</span><span class="w">        </span><span class="p">:</span><span class="w"> </span><span class="nx">False</span><span class="w">
</span><span class="n">packageTypes</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="p">{@{</span><span class="nx">name</span><span class="o">=</span><span class="nx">Dependency</span><span class="p">}}</span><span class="w">
</span><span class="n">versions</span><span class="w">        </span><span class="p">:</span><span class="w"> </span><span class="p">{@{</span><span class="nx">version</span><span class="o">=</span><span class="mf">1.0.0</span><span class="p">;</span><span class="w"> </span><span class="nx">downloads</span><span class="o">=</span><span class="mi">55</span><span class="p">;</span><span class="w"> </span><span class="err">@</span><span class="nx">id</span><span class="o">=</span><span class="nx">https</span><span class="err">://</span><span class="nx">api</span><span class="err">.</span><span class="nx">nuget</span><span class="err">.</span><span class="nx">org</span><span class="err">/</span><span class="nx">v3</span><span class="err">/</span><span class="nx">registration5</span><span class="err">-</span><span class="nx">semver1</span><span class="err">/</span><span class="nx">modposh</span><span class="err">.</span><span class="nx">logger</span><span class="err">/</span><span class="mf">1.0.0</span><span class="err">.</span><span class="nx">json</span><span class="p">}}</span><span class="w">
</span><span class="n">vulnerabilities</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="p">{}</span><span class="w">
</span></code></pre></div></div>

<p>Asking the PowerShellGallery was a little more difficult, where the nuget api is version 3 and there is decent <a href="https://learn.microsoft.com/en-us/nuget/api/overview">documentation</a> for it, the PowerShellGallery is an older version of nuget. It seems really to be geared almost exclusively to the tools you are meant to use to interact with it and the only <a href="https://joelverhagen.github.io/NuGetUndocs/">documentation</a> I’ve found is an unofficial documentation page. Fortunately I was able to get something to work.</p>

<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Invoke-RestMethod</span><span class="w"> </span><span class="nt">-Method</span><span class="w"> </span><span class="nx">Get</span><span class="w"> </span><span class="nt">-Uri</span><span class="w"> </span><span class="s2">"https://www.powershellgallery.com/api/v2/Packages()?</span><span class="se">`$</span><span class="s2">filter=Authors eq 'jeffrey@patton-tech.com'"</span><span class="w">

</span><span class="n">id</span><span class="w">         </span><span class="p">:</span><span class="w"> </span><span class="nx">https://www.powershellgallery.com/api/v2/Packages</span><span class="p">(</span><span class="n">Id</span><span class="o">=</span><span class="s1">'AzDevOps'</span><span class="p">,</span><span class="n">Version</span><span class="o">=</span><span class="s1">'1.0.0'</span><span class="p">)</span><span class="w">
</span><span class="n">category</span><span class="w">   </span><span class="p">:</span><span class="w"> </span><span class="nx">category</span><span class="w">
</span><span class="n">link</span><span class="w">       </span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="n">link</span><span class="p">,</span><span class="w"> </span><span class="nx">link</span><span class="p">}</span><span class="w">
</span><span class="n">title</span><span class="w">      </span><span class="p">:</span><span class="w"> </span><span class="nx">title</span><span class="w">
</span><span class="n">updated</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">2022-12-31T11:17:41Z</span><span class="w">
</span><span class="n">author</span><span class="w">     </span><span class="p">:</span><span class="w"> </span><span class="nx">author</span><span class="w">
</span><span class="n">content</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">content</span><span class="w">
</span><span class="n">properties</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="nx">properties</span><span class="w">

</span><span class="n">id</span><span class="w">         </span><span class="p">:</span><span class="w"> </span><span class="nx">https://www.powershellgallery.com/api/v2/Packages</span><span class="p">(</span><span class="n">Id</span><span class="o">=</span><span class="s1">'AzDevOps'</span><span class="p">,</span><span class="n">Version</span><span class="o">=</span><span class="s1">'1.0.1'</span><span class="p">)</span><span class="w">
</span><span class="n">category</span><span class="w">   </span><span class="p">:</span><span class="w"> </span><span class="nx">category</span><span class="w">
</span><span class="n">link</span><span class="w">       </span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="n">link</span><span class="p">,</span><span class="w"> </span><span class="nx">link</span><span class="p">}</span><span class="w">
</span><span class="n">title</span><span class="w">      </span><span class="p">:</span><span class="w"> </span><span class="nx">title</span><span class="w">
</span><span class="n">updated</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">2022-12-31T17:37:49Z</span><span class="w">
</span><span class="n">author</span><span class="w">     </span><span class="p">:</span><span class="w"> </span><span class="nx">author</span><span class="w">
</span><span class="n">content</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">content</span><span class="w">
</span><span class="n">properties</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="nx">properties</span><span class="w">

</span><span class="n">id</span><span class="w">         </span><span class="p">:</span><span class="w"> </span><span class="nx">https://www.powershellgallery.com/api/v2/Packages</span><span class="p">(</span><span class="n">Id</span><span class="o">=</span><span class="s1">'AzDevOps'</span><span class="p">,</span><span class="n">Version</span><span class="o">=</span><span class="s1">'1.0.2'</span><span class="p">)</span><span class="w">
</span><span class="n">category</span><span class="w">   </span><span class="p">:</span><span class="w"> </span><span class="nx">category</span><span class="w">
</span><span class="n">link</span><span class="w">       </span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="n">link</span><span class="p">,</span><span class="w"> </span><span class="nx">link</span><span class="p">}</span><span class="w">
</span><span class="n">title</span><span class="w">      </span><span class="p">:</span><span class="w"> </span><span class="nx">title</span><span class="w">
</span><span class="n">updated</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">2023-09-30T19:03:41Z</span><span class="w">
</span><span class="n">author</span><span class="w">     </span><span class="p">:</span><span class="w"> </span><span class="nx">author</span><span class="w">
</span><span class="n">content</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">content</span><span class="w">
</span><span class="n">properties</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="nx">properties</span><span class="w">

</span><span class="n">id</span><span class="w">         </span><span class="p">:</span><span class="w"> </span><span class="nx">https://www.powershellgallery.com/api/v2/Packages</span><span class="p">(</span><span class="n">Id</span><span class="o">=</span><span class="s1">'AzDevOps'</span><span class="p">,</span><span class="n">Version</span><span class="o">=</span><span class="s1">'2.0.0'</span><span class="p">)</span><span class="w">
</span><span class="n">category</span><span class="w">   </span><span class="p">:</span><span class="w"> </span><span class="nx">category</span><span class="w">
</span><span class="n">link</span><span class="w">       </span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="n">link</span><span class="p">,</span><span class="w"> </span><span class="nx">link</span><span class="p">}</span><span class="w">
</span><span class="n">title</span><span class="w">      </span><span class="p">:</span><span class="w"> </span><span class="nx">title</span><span class="w">
</span><span class="n">updated</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">2023-12-19T22:54:04Z</span><span class="w">
</span><span class="n">author</span><span class="w">     </span><span class="p">:</span><span class="w"> </span><span class="nx">author</span><span class="w">
</span><span class="n">content</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">content</span><span class="w">
</span><span class="n">properties</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="nx">properties</span><span class="w">

</span><span class="n">id</span><span class="w">         </span><span class="p">:</span><span class="w"> </span><span class="nx">https://www.powershellgallery.com/api/v2/Packages</span><span class="p">(</span><span class="n">Id</span><span class="o">=</span><span class="s1">'AzDevOps'</span><span class="p">,</span><span class="n">Version</span><span class="o">=</span><span class="s1">'2.1.0'</span><span class="p">)</span><span class="w">
</span><span class="n">category</span><span class="w">   </span><span class="p">:</span><span class="w"> </span><span class="nx">category</span><span class="w">
</span><span class="n">link</span><span class="w">       </span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="n">link</span><span class="p">,</span><span class="w"> </span><span class="nx">link</span><span class="p">}</span><span class="w">
</span><span class="n">title</span><span class="w">      </span><span class="p">:</span><span class="w"> </span><span class="nx">title</span><span class="w">
</span><span class="n">updated</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">2024-01-08T14:30:19Z</span><span class="w">
</span><span class="n">author</span><span class="w">     </span><span class="p">:</span><span class="w"> </span><span class="nx">author</span><span class="w">
</span><span class="n">content</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">content</span><span class="w">
</span><span class="n">properties</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="nx">properties</span><span class="w">

</span><span class="n">id</span><span class="w">         </span><span class="p">:</span><span class="w"> </span><span class="nx">https://www.powershellgallery.com/api/v2/Packages</span><span class="p">(</span><span class="n">Id</span><span class="o">=</span><span class="s1">'Pipelines'</span><span class="p">,</span><span class="n">Version</span><span class="o">=</span><span class="s1">'1.4.0'</span><span class="p">)</span><span class="w">
</span><span class="n">category</span><span class="w">   </span><span class="p">:</span><span class="w"> </span><span class="nx">category</span><span class="w">
</span><span class="n">link</span><span class="w">       </span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="n">link</span><span class="p">,</span><span class="w"> </span><span class="nx">link</span><span class="p">}</span><span class="w">
</span><span class="n">title</span><span class="w">      </span><span class="p">:</span><span class="w"> </span><span class="nx">title</span><span class="w">
</span><span class="n">updated</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">2024-01-04T18:07:26Z</span><span class="w">
</span><span class="n">author</span><span class="w">     </span><span class="p">:</span><span class="w"> </span><span class="nx">author</span><span class="w">
</span><span class="n">content</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">content</span><span class="w">
</span><span class="n">properties</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="nx">properties</span><span class="w">

</span><span class="n">id</span><span class="w">         </span><span class="p">:</span><span class="w"> </span><span class="nx">https://www.powershellgallery.com/api/v2/Packages</span><span class="p">(</span><span class="n">Id</span><span class="o">=</span><span class="s1">'Pipelines'</span><span class="p">,</span><span class="n">Version</span><span class="o">=</span><span class="s1">'1.5.0'</span><span class="p">)</span><span class="w">
</span><span class="n">category</span><span class="w">   </span><span class="p">:</span><span class="w"> </span><span class="nx">category</span><span class="w">
</span><span class="n">link</span><span class="w">       </span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="n">link</span><span class="p">,</span><span class="w"> </span><span class="nx">link</span><span class="p">}</span><span class="w">
</span><span class="n">title</span><span class="w">      </span><span class="p">:</span><span class="w"> </span><span class="nx">title</span><span class="w">
</span><span class="n">updated</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">2024-01-04T18:07:26Z</span><span class="w">
</span><span class="n">author</span><span class="w">     </span><span class="p">:</span><span class="w"> </span><span class="nx">author</span><span class="w">
</span><span class="n">content</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">content</span><span class="w">
</span><span class="n">properties</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="nx">properties</span><span class="w">

</span><span class="n">id</span><span class="w">         </span><span class="p">:</span><span class="w"> </span><span class="nx">https://www.powershellgallery.com/api/v2/Packages</span><span class="p">(</span><span class="n">Id</span><span class="o">=</span><span class="s1">'Pipelines'</span><span class="p">,</span><span class="n">Version</span><span class="o">=</span><span class="s1">'1.6.0'</span><span class="p">)</span><span class="w">
</span><span class="n">category</span><span class="w">   </span><span class="p">:</span><span class="w"> </span><span class="nx">category</span><span class="w">
</span><span class="n">link</span><span class="w">       </span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="n">link</span><span class="p">,</span><span class="w"> </span><span class="nx">link</span><span class="p">}</span><span class="w">
</span><span class="n">title</span><span class="w">      </span><span class="p">:</span><span class="w"> </span><span class="nx">title</span><span class="w">
</span><span class="n">updated</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">2024-01-04T18:07:26Z</span><span class="w">
</span><span class="n">author</span><span class="w">     </span><span class="p">:</span><span class="w"> </span><span class="nx">author</span><span class="w">
</span><span class="n">content</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">content</span><span class="w">
</span><span class="n">properties</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="nx">properties</span><span class="w">

</span><span class="n">id</span><span class="w">         </span><span class="p">:</span><span class="w"> </span><span class="nx">https://www.powershellgallery.com/api/v2/Packages</span><span class="p">(</span><span class="n">Id</span><span class="o">=</span><span class="s1">'Pipelines'</span><span class="p">,</span><span class="n">Version</span><span class="o">=</span><span class="s1">'2.0.0'</span><span class="p">)</span><span class="w">
</span><span class="n">category</span><span class="w">   </span><span class="p">:</span><span class="w"> </span><span class="nx">category</span><span class="w">
</span><span class="n">link</span><span class="w">       </span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="n">link</span><span class="p">,</span><span class="w"> </span><span class="nx">link</span><span class="p">}</span><span class="w">
</span><span class="n">title</span><span class="w">      </span><span class="p">:</span><span class="w"> </span><span class="nx">title</span><span class="w">
</span><span class="n">updated</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">2024-01-07T16:15:17Z</span><span class="w">
</span><span class="n">author</span><span class="w">     </span><span class="p">:</span><span class="w"> </span><span class="nx">author</span><span class="w">
</span><span class="n">content</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">content</span><span class="w">
</span><span class="n">properties</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="nx">properties</span><span class="w">

</span><span class="n">id</span><span class="w">         </span><span class="p">:</span><span class="w"> </span><span class="nx">https://www.powershellgallery.com/api/v2/Packages</span><span class="p">(</span><span class="n">Id</span><span class="o">=</span><span class="s1">'PoshAdoTask'</span><span class="p">,</span><span class="n">Version</span><span class="o">=</span><span class="s1">'1.0.0'</span><span class="p">)</span><span class="w">
</span><span class="n">category</span><span class="w">   </span><span class="p">:</span><span class="w"> </span><span class="nx">category</span><span class="w">
</span><span class="n">link</span><span class="w">       </span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="n">link</span><span class="p">,</span><span class="w"> </span><span class="nx">link</span><span class="p">}</span><span class="w">
</span><span class="n">title</span><span class="w">      </span><span class="p">:</span><span class="w"> </span><span class="nx">title</span><span class="w">
</span><span class="n">updated</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">2024-01-01T07:32:03Z</span><span class="w">
</span><span class="n">author</span><span class="w">     </span><span class="p">:</span><span class="w"> </span><span class="nx">author</span><span class="w">
</span><span class="n">content</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">content</span><span class="w">
</span><span class="n">properties</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="nx">properties</span><span class="w">

</span><span class="n">id</span><span class="w">         </span><span class="p">:</span><span class="w"> </span><span class="nx">https://www.powershellgallery.com/api/v2/Packages</span><span class="p">(</span><span class="n">Id</span><span class="o">=</span><span class="s1">'PoshMongo'</span><span class="p">,</span><span class="n">Version</span><span class="o">=</span><span class="s1">'1.0.0'</span><span class="p">)</span><span class="w">
</span><span class="n">category</span><span class="w">   </span><span class="p">:</span><span class="w"> </span><span class="nx">category</span><span class="w">
</span><span class="n">link</span><span class="w">       </span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="n">link</span><span class="p">,</span><span class="w"> </span><span class="nx">link</span><span class="p">}</span><span class="w">
</span><span class="n">title</span><span class="w">      </span><span class="p">:</span><span class="w"> </span><span class="nx">title</span><span class="w">
</span><span class="n">updated</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">2022-11-24T03:40:04Z</span><span class="w">
</span><span class="n">author</span><span class="w">     </span><span class="p">:</span><span class="w"> </span><span class="nx">author</span><span class="w">
</span><span class="n">content</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">content</span><span class="w">
</span><span class="n">properties</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="nx">properties</span><span class="w">

</span><span class="n">id</span><span class="w">         </span><span class="p">:</span><span class="w"> </span><span class="nx">https://www.powershellgallery.com/api/v2/Packages</span><span class="p">(</span><span class="n">Id</span><span class="o">=</span><span class="s1">'PoshMongo'</span><span class="p">,</span><span class="n">Version</span><span class="o">=</span><span class="s1">'1.1.0'</span><span class="p">)</span><span class="w">
</span><span class="n">category</span><span class="w">   </span><span class="p">:</span><span class="w"> </span><span class="nx">category</span><span class="w">
</span><span class="n">link</span><span class="w">       </span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="n">link</span><span class="p">,</span><span class="w"> </span><span class="nx">link</span><span class="p">}</span><span class="w">
</span><span class="n">title</span><span class="w">      </span><span class="p">:</span><span class="w"> </span><span class="nx">title</span><span class="w">
</span><span class="n">updated</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">2022-11-24T03:40:04Z</span><span class="w">
</span><span class="n">author</span><span class="w">     </span><span class="p">:</span><span class="w"> </span><span class="nx">author</span><span class="w">
</span><span class="n">content</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">content</span><span class="w">
</span><span class="n">properties</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="nx">properties</span><span class="w">

</span><span class="n">id</span><span class="w">         </span><span class="p">:</span><span class="w"> </span><span class="nx">https://www.powershellgallery.com/api/v2/Packages</span><span class="p">(</span><span class="n">Id</span><span class="o">=</span><span class="s1">'PoshMongo'</span><span class="p">,</span><span class="n">Version</span><span class="o">=</span><span class="s1">'2.2.0'</span><span class="p">)</span><span class="w">
</span><span class="n">category</span><span class="w">   </span><span class="p">:</span><span class="w"> </span><span class="nx">category</span><span class="w">
</span><span class="n">link</span><span class="w">       </span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="n">link</span><span class="p">,</span><span class="w"> </span><span class="nx">link</span><span class="p">}</span><span class="w">
</span><span class="n">title</span><span class="w">      </span><span class="p">:</span><span class="w"> </span><span class="nx">title</span><span class="w">
</span><span class="n">updated</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">2022-11-26T07:25:57Z</span><span class="w">
</span><span class="n">author</span><span class="w">     </span><span class="p">:</span><span class="w"> </span><span class="nx">author</span><span class="w">
</span><span class="n">content</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">content</span><span class="w">
</span><span class="n">properties</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="nx">properties</span><span class="w">

</span><span class="n">id</span><span class="w">         </span><span class="p">:</span><span class="w"> </span><span class="nx">https://www.powershellgallery.com/api/v2/Packages</span><span class="p">(</span><span class="n">Id</span><span class="o">=</span><span class="s1">'PoshMongo'</span><span class="p">,</span><span class="n">Version</span><span class="o">=</span><span class="s1">'2.3.0'</span><span class="p">)</span><span class="w">
</span><span class="n">category</span><span class="w">   </span><span class="p">:</span><span class="w"> </span><span class="nx">category</span><span class="w">
</span><span class="n">link</span><span class="w">       </span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="n">link</span><span class="p">,</span><span class="w"> </span><span class="nx">link</span><span class="p">}</span><span class="w">
</span><span class="n">title</span><span class="w">      </span><span class="p">:</span><span class="w"> </span><span class="nx">title</span><span class="w">
</span><span class="n">updated</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">2022-12-05T14:59:18Z</span><span class="w">
</span><span class="n">author</span><span class="w">     </span><span class="p">:</span><span class="w"> </span><span class="nx">author</span><span class="w">
</span><span class="n">content</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">content</span><span class="w">
</span><span class="n">properties</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="nx">properties</span><span class="w">

</span><span class="n">id</span><span class="w">         </span><span class="p">:</span><span class="w"> </span><span class="nx">https://www.powershellgallery.com/api/v2/Packages</span><span class="p">(</span><span class="n">Id</span><span class="o">=</span><span class="s1">'PoshMongo'</span><span class="p">,</span><span class="n">Version</span><span class="o">=</span><span class="s1">'2.4.0'</span><span class="p">)</span><span class="w">
</span><span class="n">category</span><span class="w">   </span><span class="p">:</span><span class="w"> </span><span class="nx">category</span><span class="w">
</span><span class="n">link</span><span class="w">       </span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="n">link</span><span class="p">,</span><span class="w"> </span><span class="nx">link</span><span class="p">}</span><span class="w">
</span><span class="n">title</span><span class="w">      </span><span class="p">:</span><span class="w"> </span><span class="nx">title</span><span class="w">
</span><span class="n">updated</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">2022-12-05T14:59:18Z</span><span class="w">
</span><span class="n">author</span><span class="w">     </span><span class="p">:</span><span class="w"> </span><span class="nx">author</span><span class="w">
</span><span class="n">content</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">content</span><span class="w">
</span><span class="n">properties</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="nx">properties</span><span class="w">

</span><span class="n">id</span><span class="w">         </span><span class="p">:</span><span class="w"> </span><span class="nx">https://www.powershellgallery.com/api/v2/Packages</span><span class="p">(</span><span class="n">Id</span><span class="o">=</span><span class="s1">'PoshMongo'</span><span class="p">,</span><span class="n">Version</span><span class="o">=</span><span class="s1">'2.4.1'</span><span class="p">)</span><span class="w">
</span><span class="n">category</span><span class="w">   </span><span class="p">:</span><span class="w"> </span><span class="nx">category</span><span class="w">
</span><span class="n">link</span><span class="w">       </span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="n">link</span><span class="p">,</span><span class="w"> </span><span class="nx">link</span><span class="p">}</span><span class="w">
</span><span class="n">title</span><span class="w">      </span><span class="p">:</span><span class="w"> </span><span class="nx">title</span><span class="w">
</span><span class="n">updated</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">2022-12-08T03:34:27Z</span><span class="w">
</span><span class="n">author</span><span class="w">     </span><span class="p">:</span><span class="w"> </span><span class="nx">author</span><span class="w">
</span><span class="n">content</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">content</span><span class="w">
</span><span class="n">properties</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="nx">properties</span><span class="w">

</span><span class="n">id</span><span class="w">         </span><span class="p">:</span><span class="w"> </span><span class="nx">https://www.powershellgallery.com/api/v2/Packages</span><span class="p">(</span><span class="n">Id</span><span class="o">=</span><span class="s1">'PoshMongo'</span><span class="p">,</span><span class="n">Version</span><span class="o">=</span><span class="s1">'2.4.2'</span><span class="p">)</span><span class="w">
</span><span class="n">category</span><span class="w">   </span><span class="p">:</span><span class="w"> </span><span class="nx">category</span><span class="w">
</span><span class="n">link</span><span class="w">       </span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="n">link</span><span class="p">,</span><span class="w"> </span><span class="nx">link</span><span class="p">}</span><span class="w">
</span><span class="n">title</span><span class="w">      </span><span class="p">:</span><span class="w"> </span><span class="nx">title</span><span class="w">
</span><span class="n">updated</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">2022-12-08T10:34:28Z</span><span class="w">
</span><span class="n">author</span><span class="w">     </span><span class="p">:</span><span class="w"> </span><span class="nx">author</span><span class="w">
</span><span class="n">content</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">content</span><span class="w">
</span><span class="n">properties</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="nx">properties</span><span class="w">

</span><span class="n">id</span><span class="w">         </span><span class="p">:</span><span class="w"> </span><span class="nx">https://www.powershellgallery.com/api/v2/Packages</span><span class="p">(</span><span class="n">Id</span><span class="o">=</span><span class="s1">'PoshMongo'</span><span class="p">,</span><span class="n">Version</span><span class="o">=</span><span class="s1">'3.0.0'</span><span class="p">)</span><span class="w">
</span><span class="n">category</span><span class="w">   </span><span class="p">:</span><span class="w"> </span><span class="nx">category</span><span class="w">
</span><span class="n">link</span><span class="w">       </span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="n">link</span><span class="p">,</span><span class="w"> </span><span class="nx">link</span><span class="p">}</span><span class="w">
</span><span class="n">title</span><span class="w">      </span><span class="p">:</span><span class="w"> </span><span class="nx">title</span><span class="w">
</span><span class="n">updated</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">2022-12-20T21:09:53Z</span><span class="w">
</span><span class="n">author</span><span class="w">     </span><span class="p">:</span><span class="w"> </span><span class="nx">author</span><span class="w">
</span><span class="n">content</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">content</span><span class="w">
</span><span class="n">properties</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="nx">properties</span><span class="w">

</span><span class="n">id</span><span class="w">         </span><span class="p">:</span><span class="w"> </span><span class="nx">https://www.powershellgallery.com/api/v2/Packages</span><span class="p">(</span><span class="n">Id</span><span class="o">=</span><span class="s1">'PoshMongo'</span><span class="p">,</span><span class="n">Version</span><span class="o">=</span><span class="s1">'3.1.0'</span><span class="p">)</span><span class="w">
</span><span class="n">category</span><span class="w">   </span><span class="p">:</span><span class="w"> </span><span class="nx">category</span><span class="w">
</span><span class="n">link</span><span class="w">       </span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="n">link</span><span class="p">,</span><span class="w"> </span><span class="nx">link</span><span class="p">}</span><span class="w">
</span><span class="n">title</span><span class="w">      </span><span class="p">:</span><span class="w"> </span><span class="nx">title</span><span class="w">
</span><span class="n">updated</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">2022-12-20T21:09:53Z</span><span class="w">
</span><span class="n">author</span><span class="w">     </span><span class="p">:</span><span class="w"> </span><span class="nx">author</span><span class="w">
</span><span class="n">content</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">content</span><span class="w">
</span><span class="n">properties</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="nx">properties</span><span class="w">

</span><span class="n">id</span><span class="w">         </span><span class="p">:</span><span class="w"> </span><span class="nx">https://www.powershellgallery.com/api/v2/Packages</span><span class="p">(</span><span class="n">Id</span><span class="o">=</span><span class="s1">'PoshMongo'</span><span class="p">,</span><span class="n">Version</span><span class="o">=</span><span class="s1">'3.1.1'</span><span class="p">)</span><span class="w">
</span><span class="n">category</span><span class="w">   </span><span class="p">:</span><span class="w"> </span><span class="nx">category</span><span class="w">
</span><span class="n">link</span><span class="w">       </span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="n">link</span><span class="p">,</span><span class="w"> </span><span class="nx">link</span><span class="p">}</span><span class="w">
</span><span class="n">title</span><span class="w">      </span><span class="p">:</span><span class="w"> </span><span class="nx">title</span><span class="w">
</span><span class="n">updated</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">2022-12-20T21:09:53Z</span><span class="w">
</span><span class="n">author</span><span class="w">     </span><span class="p">:</span><span class="w"> </span><span class="nx">author</span><span class="w">
</span><span class="n">content</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">content</span><span class="w">
</span><span class="n">properties</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="nx">properties</span><span class="w">

</span><span class="n">id</span><span class="w">         </span><span class="p">:</span><span class="w"> </span><span class="nx">https://www.powershellgallery.com/api/v2/Packages</span><span class="p">(</span><span class="n">Id</span><span class="o">=</span><span class="s1">'PoshMongo'</span><span class="p">,</span><span class="n">Version</span><span class="o">=</span><span class="s1">'3.2.0'</span><span class="p">)</span><span class="w">
</span><span class="n">category</span><span class="w">   </span><span class="p">:</span><span class="w"> </span><span class="nx">category</span><span class="w">
</span><span class="n">link</span><span class="w">       </span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="n">link</span><span class="p">,</span><span class="w"> </span><span class="nx">link</span><span class="p">}</span><span class="w">
</span><span class="n">title</span><span class="w">      </span><span class="p">:</span><span class="w"> </span><span class="nx">title</span><span class="w">
</span><span class="n">updated</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">2022-12-20T21:09:53Z</span><span class="w">
</span><span class="n">author</span><span class="w">     </span><span class="p">:</span><span class="w"> </span><span class="nx">author</span><span class="w">
</span><span class="n">content</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">content</span><span class="w">
</span><span class="n">properties</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="nx">properties</span><span class="w">

</span><span class="n">id</span><span class="w">         </span><span class="p">:</span><span class="w"> </span><span class="nx">https://www.powershellgallery.com/api/v2/Packages</span><span class="p">(</span><span class="n">Id</span><span class="o">=</span><span class="s1">'PoshMongo'</span><span class="p">,</span><span class="n">Version</span><span class="o">=</span><span class="s1">'3.2.1'</span><span class="p">)</span><span class="w">
</span><span class="n">category</span><span class="w">   </span><span class="p">:</span><span class="w"> </span><span class="nx">category</span><span class="w">
</span><span class="n">link</span><span class="w">       </span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="n">link</span><span class="p">,</span><span class="w"> </span><span class="nx">link</span><span class="p">}</span><span class="w">
</span><span class="n">title</span><span class="w">      </span><span class="p">:</span><span class="w"> </span><span class="nx">title</span><span class="w">
</span><span class="n">updated</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">2024-01-04T21:52:28Z</span><span class="w">
</span><span class="n">author</span><span class="w">     </span><span class="p">:</span><span class="w"> </span><span class="nx">author</span><span class="w">
</span><span class="n">content</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">content</span><span class="w">
</span><span class="n">properties</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="nx">properties</span><span class="w">

</span><span class="n">id</span><span class="w">         </span><span class="p">:</span><span class="w"> </span><span class="nx">https://www.powershellgallery.com/api/v2/Packages</span><span class="p">(</span><span class="n">Id</span><span class="o">=</span><span class="s1">'RetroSheetModule'</span><span class="p">,</span><span class="n">Version</span><span class="o">=</span><span class="s1">'2.0.0'</span><span class="p">)</span><span class="w">
</span><span class="n">category</span><span class="w">   </span><span class="p">:</span><span class="w"> </span><span class="nx">category</span><span class="w">
</span><span class="n">link</span><span class="w">       </span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="n">link</span><span class="p">,</span><span class="w"> </span><span class="nx">link</span><span class="p">}</span><span class="w">
</span><span class="n">title</span><span class="w">      </span><span class="p">:</span><span class="w"> </span><span class="nx">title</span><span class="w">
</span><span class="n">updated</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">2024-01-01T08:42:04Z</span><span class="w">
</span><span class="n">author</span><span class="w">     </span><span class="p">:</span><span class="w"> </span><span class="nx">author</span><span class="w">
</span><span class="n">content</span><span class="w">    </span><span class="p">:</span><span class="w"> </span><span class="nx">content</span><span class="w">
</span><span class="n">properties</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="nx">properties</span><span class="w">
</span></code></pre></div></div>

<p>The main difference here, is while Nuget has an Owner property, PowerShellGallery only has an Authors property. Turns out I’ve used 3 different Author names over the years! So step one will be to re-push all the packages so they all share the same Author and then see if we can consolidate the data. The PowerShellGallery returns all packages as discreet id’s, there is a Properties property that will allow this list to be sorted, grouped and filtered.</p>

<p>At any rate this little post is just to remind me that I’ve actually done this, so we can come back to this later and try to create some sort of landing page that would accumulate downloads and such.</p>

<p>Have a great Monday!
(if that’s possible)</p>]]></content><author><name>Jeff</name></author><category term="blog" /><category term="January" /><category term="2024" /><category term="Development" /><summary type="html"><![CDATA[I’ve decided that I want to changeup how I display my projects on the blog, I think I could create a landing page for all my code and then create dedicated locations for things that are published. Additionally I think it would be fun to see some of the stats displayed here, which is easy enough for an individual project, but not for a large group. This got me thinking how can I query nuget.org and powershellgallery.com for a list of packages that I’ve published.]]></summary></entry><entry><title type="html">First week of the New Year</title><link href="https://patton-tech.com/blog/2024/01/06/first-week-of-the-new-year.html" rel="alternate" type="text/html" title="First week of the New Year" /><published>2024-01-06T17:47:00+00:00</published><updated>2024-01-06T17:47:00+00:00</updated><id>https://patton-tech.com/blog/2024/01/06/%20first-week-of-the-new-year</id><content type="html" xml:base="https://patton-tech.com/blog/2024/01/06/first-week-of-the-new-year.html"><![CDATA[<p>We’ve started a new year and this year my goal is to improve my communication skills, start writing more and really try and get back into my music. One of the things I struggle with, and if you know me you know, is connecting and talking with people. That’s something that’s not really in my wheel-house, unless I know really well. So I want to get better in that part of my life, it will help me a lot at work as well as in social settings. I used to write and journal a lot, not like “Dear Diary” stuff, but track progress throughout my day on what I was working on and just jotting out notes. I’ve decided to get back into that, and I picked up <a href="https://www.amazon.com/gp/product/B0BPS3NSL4/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&amp;th=1">Moleskine 2024 Daily Planner</a> and the <a href="https://www.amazon.com/gp/product/B0B4VH8Q88/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&amp;psc=1">Moleskine Kaweco Fountain Pen</a>, I really enjoy pens. Finally getting back into music, you may not know, I was a Music Education major in college, and my focus was Brass, and specifically Trumpet and French Horn. I miss playing music and really miss writing music, I’m not good at it, but I miss the act of putting things together musically. I decided for writing I would download <a href="https://musescore.com/">Musescore</a> as it seems to be the best choice, and for playing, going back to <a href="https://arbansmethodcoach.com/">Arbans</a>, I used that book during high school and college and still have my copy, the app might make it more enjoyable. I plan to get that started once my trumpet is back from the shop getting repairs. That’s a lot right off the bat, but I felt I needed to get it out, so let’s go over this past week.</p>

<p>Monday was a holiday, and honestly I didn’t even realize that, actually had to look it up on the HR page at work, so I put in an hour or so before knowing I didn’t need to! This is rather par for me, I don’t often notice holidays outside of a few, and I guess New Year’s Day was never really one I paid attention to! Over the weekend and into Monday I did a lot on a new PowerShell module that should really help with some of the things I need to do for work.</p>

<p><a href="https://github.com/mod-posh/Pipelines">Pipelines</a> is the name of the module, and the goal is really to make it easier to work with either [Azure Devops pipelines(https://learn.microsoft.com/en-us/azure/devops/pipelines/?view=azure-devops)] or <a href="https://docs.github.com/en/actions">Github Actions</a>. I wrote a YamlSerializer that converts the pipeline classes into yaml, those can then be written to a file so that you can programatically create a pipeline. This will fill a very niche need of my own, not sure how popular it may be for anyone else, but I’m very proud of it, it’s my first dive into creating a more feature rich C# application/module for PowerShell.</p>

<p>As part of that I am wanting to step-up my <a href="https://github.com/mod-posh/LocalAutomation">Local Automation</a> game. I’ve re-visited a few of those configurations and spent a significant amount of time learning and using the Github GraphQL API. I was thinking about a way to automate some of what I was doing and report it back into a project or pulling down unassigned cards from a project and creating a TODO out of those. I need more time learning this, but I may see about writing something up in the near term on using the Github GraphQL API.</p>

<p>Wednesday was spent learning about Logging Providers, enoguh so that I have started my own Log Provider, <a href="https://github.com/mod-posh/Logger">Logger</a>. It’s a simple Provider that should write to console or a log file, and includes some basic log rotation capability. As part of a first release I wanted to have at least the basics of console/file writing enabled, additionally there should be tests as part of the project. This is the first C# project I’ve put up that incorporates a Test project. I’m using <a href="https://nunit.org/">Nunit</a> tests to make sure the provider covers the basics. The best part of this for me is that it works with the current release of PowerShell wihtout too much work at all, this has been an issue of mine for a while now, I’m sure it’s possible with <a href="https://nlog-project.org/">Nlog</a> or other Providers, but I’ve never really had much luck getting that sorted out and working for me.</p>

<p>My Thursday was filled with work meetings and a lot of waiting on other people so I could progress. I spent time between reading and working out the Unit tests for the log provider. Friday was a very good day, again a LOT of meetings, but progress was made. I wrote a lot of documentaiton for work about an overly complex process that really shouldn’t be and I added a C# project to my Local Automation repo.</p>

<p>I’m also thinking that it may be time to convert a lot of my automation tasks into Github Actions. Thinking about how my automation work for local development, a lot of that can also be done via workflows in Github. Most of my <a href="https://psake.readthedocs.io/en/latest/">psake</a> tasks could just as easily be steps in a workflow. As I think about how I use pipeline technologies in Azure Devops, it’s possible that I could create those tasks as individual Github Actions and then tie them all together in a larger workflow that performs most of the same functions as my psake does locally. Considering most of my work is C# and .Net, it turns out I will need to figure out <a href="https://www.docker.com/">Docker</a> as well. Not sure if that’s good bad or ugly at the moment, but I guess we shall see.</p>

<p>I understand that this has been a long winded post, but if you’ve stuck through to the end, congratulations you made it! I hope you all have a wonderful weekend and I look forward to what comes next week!</p>]]></content><author><name>Jeff</name></author><category term="blog" /><category term="January" /><category term="2024" /><category term="Development" /><category term="WIR" /><summary type="html"><![CDATA[We’ve started a new year and this year my goal is to improve my communication skills, start writing more and really try and get back into my music. One of the things I struggle with, and if you know me you know, is connecting and talking with people. That’s something that’s not really in my wheel-house, unless I know really well. So I want to get better in that part of my life, it will help me a lot at work as well as in social settings. I used to write and journal a lot, not like “Dear Diary” stuff, but track progress throughout my day on what I was working on and just jotting out notes. I’ve decided to get back into that, and I picked up Moleskine 2024 Daily Planner and the Moleskine Kaweco Fountain Pen, I really enjoy pens. Finally getting back into music, you may not know, I was a Music Education major in college, and my focus was Brass, and specifically Trumpet and French Horn. I miss playing music and really miss writing music, I’m not good at it, but I miss the act of putting things together musically. I decided for writing I would download Musescore as it seems to be the best choice, and for playing, going back to Arbans, I used that book during high school and college and still have my copy, the app might make it more enjoyable. I plan to get that started once my trumpet is back from the shop getting repairs. That’s a lot right off the bat, but I felt I needed to get it out, so let’s go over this past week.]]></summary></entry><entry><title type="html">Azure Devops Pipelines : Lesson’s Learned</title><link href="https://patton-tech.com/blog/2023/11/14/azure-devops-lessons-learned.html" rel="alternate" type="text/html" title="Azure Devops Pipelines : Lesson’s Learned" /><published>2023-11-14T13:46:00+00:00</published><updated>2023-11-14T13:46:00+00:00</updated><id>https://patton-tech.com/blog/2023/11/14/azure-devops-lessons-learned</id><content type="html" xml:base="https://patton-tech.com/blog/2023/11/14/azure-devops-lessons-learned.html"><![CDATA[<p>Azure DevOps Pipelines serve as a cornerstone for automating software delivery, offering a robust framework to streamline CI/CD processes. In this exploration, we’ll dissect four example pipelines, each highlighting a distinct aspect - ‘stageDependencies,’ ‘dependencies,’ variables, and parameters.</p>

<h2 id="understanding-stagedependencies-and-dependencies">Understanding ‘stageDependencies’ and ‘dependencies’</h2>

<p>In the world of Azure DevOps Pipelines, both ‘stageDependencies’ and ‘dependencies’ play a pivotal role in orchestrating the flow of your pipeline. Let’s distinguish between them and understand when to use each.</p>

<h2 id="unraveling-stagedependencies">Unraveling ‘stageDependencies’</h2>

<p>In the first example, the utilization of ‘stageDependencies’ orchestrates a sequential order between the ‘Build’ and ‘Deploy’ stages. The ‘Build’ stage, encapsulating the application’s compilation, acts as a prerequisite for the ‘Deploy’ stage. This dependency ensures that deployment only proceeds when the build is successfully completed, providing a structured and controlled progression through the pipeline.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">stages</span><span class="pi">:</span>
<span class="pi">-</span> <span class="na">stage</span><span class="pi">:</span> <span class="s">Build</span>
  <span class="na">jobs</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="na">job</span><span class="pi">:</span> <span class="s">BuildJob</span>
    <span class="na">pool</span><span class="pi">:</span>
      <span class="na">vmImage</span><span class="pi">:</span> <span class="s1">'</span><span class="s">windows-latest'</span>
    <span class="na">steps</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="na">script</span><span class="pi">:</span> <span class="s">echo "Building the application"</span>

<span class="pi">-</span> <span class="na">stage</span><span class="pi">:</span> <span class="s">Deploy</span>
  <span class="na">dependsOn</span><span class="pi">:</span> <span class="s">Build</span>
  <span class="na">jobs</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="na">job</span><span class="pi">:</span> <span class="s">DeployJob</span>
    <span class="na">pool</span><span class="pi">:</span>
      <span class="na">vmImage</span><span class="pi">:</span> <span class="s1">'</span><span class="s">windows-latest'</span>
    <span class="na">steps</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="na">script</span><span class="pi">:</span> <span class="s">echo "Deploying the application"</span>
</code></pre></div></div>

<h2 id="navigating-dependencies">Navigating ‘dependencies’</h2>

<p>The second example showcases the role of ‘dependencies’ within a job. Here, ‘SecondTask’ depends on the successful completion of ‘FirstTask’ within the same job. This setup ensures a sequential execution of tasks, where the output of one task serves as the input for another. ‘dependencies’ within a job prove instrumental in maintaining task order and inter-task dependencies. The ‘name’ property of tasks is instrumental in defining dependencies between tasks within a job or template. To ensure a smooth dependency chain, it is vital to place the ‘name’ property strategically.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">jobs</span><span class="pi">:</span>
<span class="pi">-</span> <span class="na">job</span><span class="pi">:</span> <span class="s">ExampleJob</span>
  <span class="na">pool</span><span class="pi">:</span>
    <span class="na">vmImage</span><span class="pi">:</span> <span class="s1">'</span><span class="s">windows-latest'</span>
  <span class="na">steps</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="na">task</span><span class="pi">:</span> <span class="s">Task1</span>
    <span class="na">name</span><span class="pi">:</span> <span class="s">FirstTask</span>
    <span class="na">script</span><span class="pi">:</span> <span class="s">echo "Executing the first task"</span>
  
  <span class="pi">-</span> <span class="na">task</span><span class="pi">:</span> <span class="s">Task2</span>
    <span class="na">name</span><span class="pi">:</span> <span class="s">SecondTask</span>
    <span class="na">script</span><span class="pi">:</span> <span class="s">echo "Executing the second task"</span>
    <span class="na">dependsOn</span><span class="pi">:</span> <span class="s">FirstTask</span>
</code></pre></div></div>

<h2 id="proper-handling-of-variables-and-parameters">Proper Handling of Variables and Parameters</h2>

<p>In addition to managing dependencies, understanding how to handle variables and parameters is crucial for building flexible and reusable pipelines.</p>

<h2 id="mastering-variables-in-pipelines">Mastering Variables in Pipelines</h2>

<p>Moving beyond dependencies, our third example introduces the strategic use of variables at the pipeline level. The ‘solution’ variable holds the name of the solution file and is accessed in the ‘BuildJob.’ This centralized definition of common values simplifies maintenance and ensures consistency across the pipeline, showcasing the power of variables in maintaining a coherent and adaptable pipeline structure.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">variables</span><span class="pi">:</span>
  <span class="na">solution</span><span class="pi">:</span> <span class="s1">'</span><span class="s">MySolution.sln'</span>

<span class="na">stages</span><span class="pi">:</span>
<span class="pi">-</span> <span class="na">stage</span><span class="pi">:</span> <span class="s">Build</span>
  <span class="na">jobs</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="na">job</span><span class="pi">:</span> <span class="s">BuildJob</span>
    <span class="na">pool</span><span class="pi">:</span>
      <span class="na">vmImage</span><span class="pi">:</span> <span class="s1">'</span><span class="s">windows-latest'</span>
    <span class="na">steps</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="na">script</span><span class="pi">:</span> <span class="s">msbuild $</span>
</code></pre></div></div>

<h2 id="harnessing-parameters-for-customization">Harnessing Parameters for Customization</h2>

<p>Parameters allow you to make your pipeline more dynamic by accepting values from external sources. They are defined at the job or template level using the ‘parameters’ keyword. Our final example introduces the concept of parameters at the job level. The ‘ExampleJob’ accepts a parameter named ‘inputParameter’ with a default value. Parameters provide flexibility, allowing external inputs to customize job behavior. This adaptability is crucial for handling diverse scenarios, making pipelines more dynamic and responsive to changing requirements.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">jobs</span><span class="pi">:</span>
<span class="pi">-</span> <span class="na">job</span><span class="pi">:</span> <span class="s">ExampleJob</span>
  <span class="na">pool</span><span class="pi">:</span>
    <span class="na">vmImage</span><span class="pi">:</span> <span class="s1">'</span><span class="s">windows-latest'</span>
  <span class="na">parameters</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">inputParameter</span>
      <span class="na">default</span><span class="pi">:</span> <span class="s1">'</span><span class="s">defaultValue'</span>
  <span class="na">steps</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="na">script</span><span class="pi">:</span> <span class="s">echo "Using parameter</span><span class="err">:</span> <span class="s">$"</span>
</code></pre></div></div>

<p>By mastering the use of ‘stageDependencies’ and ‘dependencies’ for managing dependencies and understanding the proper handling of variables and parameters, you can create efficient, flexible, and reusable Azure DevOps Pipelines. The examples provided should serve as a guide to help you navigate these concepts seamlessly in your CI/CD processes. Happy coding!</p>]]></content><author><name>Jeff</name></author><category term="blog" /><category term="November" /><category term="2023" /><category term="Development" /><category term="AzureDevops" /><summary type="html"><![CDATA[Azure DevOps Pipelines serve as a cornerstone for automating software delivery, offering a robust framework to streamline CI/CD processes. In this exploration, we’ll dissect four example pipelines, each highlighting a distinct aspect - ‘stageDependencies,’ ‘dependencies,’ variables, and parameters.]]></summary></entry><entry><title type="html">Managing Template Output Variables Across Azure DevOps Pipelines</title><link href="https://patton-tech.com/blog/2023/11/07/managing-template-output.html" rel="alternate" type="text/html" title="Managing Template Output Variables Across Azure DevOps Pipelines" /><published>2023-11-07T23:22:00+00:00</published><updated>2023-11-07T23:22:00+00:00</updated><id>https://patton-tech.com/blog/2023/11/07/managing-template-output</id><content type="html" xml:base="https://patton-tech.com/blog/2023/11/07/managing-template-output.html"><![CDATA[<h2 id="introduction">Introduction</h2>

<p>As a seasoned C# and PowerShell developer, you’re likely familiar with the challenges of managing templates and their output variables in different pipelines within Azure DevOps. In this article, we’ll explore a common issue: how to pass outputs between discreet pipeline files, which isn’t directly supported by Azure DevOps. We’ll delve into a practical workaround involving the use of the Azure DevOps REST API to update a variable group, enabling seamless access across pipelines.</p>

<h2 id="problem-statement">Problem Statement</h2>

<p>Azure DevOps pipelines are powerful, but managing template output variables across different pipelines can be challenging. You might find that passing outputs directly between separate pipeline files isn’t supported out-of-the-box.</p>

<h2 id="scope-of-output-variables-in-azure-devops">Scope of Output Variables in Azure DevOps</h2>

<p>It’s crucial to understand that the scope of output variables in Azure DevOps is limited to the job in which they were set. This means that accessing output variables across different pipeline files directly is currently not supported in Azure DevOps. This limitation can pose a challenge when you need to share data or outputs between distinct pipelines.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">jobs</span><span class="pi">:</span>
<span class="pi">-</span> <span class="na">job</span><span class="pi">:</span> <span class="s">Build</span>
  <span class="na">steps</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="na">script</span><span class="pi">:</span> <span class="pi">|</span>
        <span class="s"># Your build steps here</span>
      <span class="na">displayName</span><span class="pi">:</span> <span class="s1">'</span><span class="s">Build'</span>
<span class="pi">-</span> <span class="na">job</span><span class="pi">:</span> <span class="s">Deploy</span>
  <span class="na">steps</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="na">script</span><span class="pi">:</span> <span class="pi">|</span>
        <span class="s"># Your deploy steps here</span>
      <span class="na">displayName</span><span class="pi">:</span> <span class="s1">'</span><span class="s">Deploy'</span>
</code></pre></div></div>

<h2 id="workarounds-for-sharing-data-across-pipelines">Workarounds for Sharing Data Across Pipelines</h2>

<p>To address this limitation, you’ll need to employ alternative methods for sharing data across multiple pipelines. Three commonly used approaches are:</p>

<h3 id="1-updating-a-variable-group">1. Updating a Variable Group</h3>

<p>One effective method is to leverage variable groups in Azure DevOps. Variable groups allow you to define a set of variables that can be used across multiple pipelines. By updating the variable group using the Azure DevOps REST API, you can dynamically adjust the values of these variables, ensuring they are accessible in various pipelines.</p>

<ul>
  <li><a href="https://docs.microsoft.com/en-us/azure/devops/pipelines/library/variable-groups?view=azure-devops&amp;tabs=yaml#create-a-variable-group">Microsoft Documentation: Create a variable group</a></li>
  <li><a href="https://docs.microsoft.com/en-us/rest/api/azure/devops/distributedtask/variablegroups/update?view=azure-devops-rest-7.1">Microsoft Documentation: Update a variable group</a></li>
</ul>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="pi">-</span> <span class="na">task</span><span class="pi">:</span> <span class="s">PowerShell@2</span>
  <span class="na">displayName</span><span class="pi">:</span> <span class="s1">'</span><span class="s">Update</span><span class="nv"> </span><span class="s">Variable</span><span class="nv"> </span><span class="s">Group'</span>
  <span class="na">inputs</span><span class="pi">:</span>
    <span class="na">targetType</span><span class="pi">:</span> <span class="s1">'</span><span class="s">inline'</span>
    <span class="na">script</span><span class="pi">:</span> <span class="pi">|</span>
      <span class="s">$url = "$(System.CollectionUri)$(System.TeamProject)/_apis/distributedtask/variablegroups/{variableGroupId}?api-version=6.0-preview.2"</span>
      <span class="s">$token = "YOUR_PERSONAL_ACCESS_TOKEN"</span>
      <span class="s">$headers = @{</span>
        <span class="s">"Content-Type" = "application/json"</span>
        <span class="s">"Authorization" = "Basic $(System.AccessToken)"</span>
      <span class="s">}</span>
      <span class="s">$body = @{</span>
        <span class="s">variables = @{</span>
          <span class="s">'VariableName' = 'NewValue'</span>
          <span class="s"># Add more variables as needed</span>
        <span class="s">}</span>
      <span class="s">} | ConvertTo-Json</span>

      <span class="s">Invoke-RestMethod -Uri $url -Method PUT -Headers $headers -Body $body -UseBasicParsing</span>
</code></pre></div></div>

<ul>
  <li>Replace <code class="language-plaintext highlighter-rouge">YOUR_PERSONAL_ACCESS_TOKEN</code> with the generated Personal Access Token.</li>
  <li>Replace <code class="language-plaintext highlighter-rouge">{variableGroupId}</code> with the ID of the variable group you want to update.</li>
</ul>

<h3 id="2-using-azure-redis-cache-with-output-variable">2. Using Azure Redis Cache with Output Variable</h3>

<p>You can leverage Azure Redis Cache and Azure Storage Account to store and retrieve output variables in your pipelines. This approach provides a reliable and scalable solution for sharing data across pipelines.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="pi">-</span> <span class="na">task</span><span class="pi">:</span> <span class="s">PowerShell@2</span>
  <span class="na">displayName</span><span class="pi">:</span> <span class="s1">'</span><span class="s">Use</span><span class="nv"> </span><span class="s">Azure</span><span class="nv"> </span><span class="s">Redis</span><span class="nv"> </span><span class="s">Cache'</span>
  <span class="na">inputs</span><span class="pi">:</span>
    <span class="na">targetType</span><span class="pi">:</span> <span class="s1">'</span><span class="s">inline'</span>
    <span class="na">script</span><span class="pi">:</span> <span class="pi">|</span>
      <span class="s"># Connect to Azure Redis Cache</span>
      <span class="s">$redisHost = "your-redis-host.redis.cache.windows.net"</span>
      <span class="s">$redisPort = 6380</span>
      <span class="s">$redisKey = "$(YourRedisCacheKey)"</span>

      <span class="s">$redisConnection = [Microsoft.Azure.Commands.RedisCache.Models.RedisCacheManagementClient]::new($redisHost, $redisPort, $redisKey)</span>

      <span class="s"># Set a value in Redis Cache using an output variable</span>
      <span class="s">$myValue = "$(OutputValue)"</span>
      <span class="s">$redisConnection.StringSet("myKey", $myValue)</span>
</code></pre></div></div>

<h4 id="3-using-azure-storage-account-to-store-output-variable">3. Using Azure Storage Account to Store Output Variable</h4>

<p>Storing output variables in an Azure Storage Table can be a valid approach, depending on your specific use case and requirements. Azure Storage Tables are a NoSQL data storage service provided by Microsoft Azure that can store large amounts of structured data.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">steps</span><span class="pi">:</span>
<span class="pi">-</span> <span class="na">powershell</span><span class="pi">:</span> <span class="pi">|</span>
    <span class="s"># Define your output variable</span>
    <span class="s">$outputVariable = "Hello, Azure Storage Table!"</span>

    <span class="s"># Authenticate with Azure using a service principal or other method</span>
    <span class="s"># For simplicity, this example uses a Personal Access Token (PAT)</span>
    <span class="s">$token = "YOUR_PERSONAL_ACCESS_TOKEN"</span>
    <span class="s">az login --output none --service-principal --username http://azure-cli-2016-08-05-14-31-15 --password $token --tenant YOUR_TENANT_ID</span>

    <span class="s"># Define variables for storage account and table</span>
    <span class="s">$storageAccount = "yourstorageaccount"</span>
    <span class="s">$tableName = "yourtablename"</span>

    <span class="s"># Create a new entity in the table with the output variable</span>
    <span class="s">az storage entity insert -t $tableName --account-name $storageAccount --partition-key "PartitionKey" --row-key "RowKey" --property @{"OutputVariable"="$outputVariable"} --if-none-match "*"</span>

  <span class="na">displayName</span><span class="pi">:</span> <span class="s1">'</span><span class="s">Store</span><span class="nv"> </span><span class="s">Output</span><span class="nv"> </span><span class="s">Variable</span><span class="nv"> </span><span class="s">in</span><span class="nv"> </span><span class="s">Azure</span><span class="nv"> </span><span class="s">Storage</span><span class="nv"> </span><span class="s">Table'</span>

</code></pre></div></div>

<h2 id="additional-insights-from-stack-overflow">Additional Insights from Stack Overflow</h2>

<p><strong>How to pass variables from one pipeline to another pipeline in azure devops:</strong></p>

<p>This discussion suggests using a variable group to store values that you want to control and make available across multiple pipelines. Variable groups can also be utilized for storing secrets and other values that might need to be passed into a YAML pipeline. It’s important to note that this method is more suitable for sharing static values across builds and release pipelines.</p>

<p><em>Example:</em></p>

<p>Consider a scenario where you have a variable that represents a version number. If you need to ensure this version number is consistent across multiple pipelines, using a variable group would be an effective approach.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">variables</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="na">group</span><span class="pi">:</span> <span class="s">MyVariableGroup</span>
</code></pre></div></div>

<ul>
  <li><a href="https://stackoverflow.com/questions/64593712/how-to-pass-variables-from-one-pipeline-to-another-pipeline-in-azure-devops">How to pass variables from one pipeline to another pipeline in azure devops</a></li>
</ul>

<p><strong>Share variables across stages in Azure DevOps Pipelines:</strong></p>

<p>This thread focuses on how to share variables across stages within a single Azure DevOps Pipeline. It mentions that output variables may now be used across stages in a YAML-based pipeline. This capability allows you to pass useful information, such as a go/no-go decision or the ID of a generated output, from one stage to the next.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">jobs</span><span class="pi">:</span>
<span class="pi">-</span> <span class="na">job</span><span class="pi">:</span> <span class="s">Build</span>
  <span class="na">steps</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="na">script</span><span class="pi">:</span> <span class="pi">|</span>
        <span class="s"># Your build steps here</span>
        <span class="s">echo "##vso[task.setvariable variable=GeneratedOutput;isOutput</span>

<span class="s">=true]OutputValue"</span>
      <span class="s">displayName</span><span class="err">:</span> <span class="s1">'</span><span class="s">Build'</span>
<span class="pi">-</span> <span class="na">job</span><span class="pi">:</span> <span class="s">Deploy</span>
  <span class="na">dependsOn</span><span class="pi">:</span> <span class="s">Build</span>
  <span class="na">steps</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="na">script</span><span class="pi">:</span> <span class="pi">|</span>
        <span class="s">echo "$(Build.GeneratedOutput)"</span>
      <span class="na">displayName</span><span class="pi">:</span> <span class="s1">'</span><span class="s">Deploy'</span>
</code></pre></div></div>

<ul>
  <li><a href="https://stackoverflow.com/questions/57485621/share-variables-across-stages-in-azure-devops-pipelines">Share variables across stages in Azure DevOps Pipelines</a></li>
</ul>

<p><strong>Passing variables between release pipelines in azure:</strong></p>

<p>This post explains that output variables are created by the pipeline and referenced by the other tasks in the pipeline. It emphasizes that these variables cannot be defined statically, and their value can only be known after running the task in the pipeline.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">jobs</span><span class="pi">:</span>
<span class="pi">-</span> <span class="na">job</span><span class="pi">:</span> <span class="s">Build</span>
  <span class="na">steps</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="na">script</span><span class="pi">:</span> <span class="pi">|</span>
        <span class="s"># Your build steps here</span>
        <span class="s">echo "##vso[task.setvariable variable=GeneratedOutput;isOutput=true]OutputValue"</span>
      <span class="na">displayName</span><span class="pi">:</span> <span class="s1">'</span><span class="s">Build'</span>
<span class="pi">-</span> <span class="na">job</span><span class="pi">:</span> <span class="s">Deploy</span>
  <span class="na">dependsOn</span><span class="pi">:</span> <span class="s">Build</span>
  <span class="na">steps</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="na">script</span><span class="pi">:</span> <span class="pi">|</span>
        <span class="s">echo "$(Build.GeneratedOutput)"</span>
      <span class="na">displayName</span><span class="pi">:</span> <span class="s1">'</span><span class="s">Deploy'</span>
</code></pre></div></div>

<ul>
  <li><a href="https://stackoverflow.com/questions/70412082/passing-variables-between-release-pipelines-in-azure-trigger-azure-pipeline-ext">Passing variables between release pipelines in azure (trigger azure pipeline extension)</a></li>
</ul>

<h2 id="summary">Summary</h2>

<p>In conclusion, we covered different scenarios where sharing data or variables is essential in the CI/CD process. It’s important to note that while Azure DevOps provides mechanisms for sharing data within a pipeline, passing variables directly between different pipeline files is currently not supported. As a workaround, methods like updating a variable group or utilizing external services or storage can be employed to achieve the desired outcome.</p>

<p>It’s essential to carefully evaluate your pipeline architecture and choose the approach that best suits your specific requirements. By adopting these workarounds, you can effectively manage template output variables across Azure DevOps pipelines, ensuring smooth and reliable CI/CD processes.</p>

<p><strong>URL References:</strong></p>

<ul>
  <li><a href="https://docs.microsoft.com/en-us/azure/devops/pipelines/library/variable-groups?view=azure-devops&amp;tabs=yaml#create-a-variable-group">Microsoft Documentation: Create a variable group</a></li>
  <li><a href="https://docs.microsoft.com/en-us/rest/api/azure/devops/distributedtask/variablegroups/update?view=azure-devops-rest-7.1">Microsoft Documentation: Update a variable group</a></li>
  <li><a href="https://stackoverflow.com/questions/64593712/how-to-pass-variables-from-one-pipeline-to-another-pipeline-in-azure-devops">How to pass variables from one pipeline to another pipeline in azure devops</a></li>
  <li><a href="https://stackoverflow.com/questions/57485621/share-variables-across-stages-in-azure-devops-pipelines">Share variables across stages in Azure DevOps Pipelines</a></li>
  <li><a href="https://stackoverflow.com/questions/70412082/passing-variables-between-release-pipelines-in-azure-trigger-azure-pipeline-ext">Passing variables between release pipelines in azure (trigger azure pipeline extension)</a></li>
</ul>]]></content><author><name>Jeff</name></author><category term="blog" /><category term="November" /><category term="2023" /><category term="Development" /><category term="AzureDevops" /><summary type="html"><![CDATA[Introduction]]></summary></entry><entry><title type="html">Azure DevOps Pipelines and Templates with Azure KeyValues</title><link href="https://patton-tech.com/blog/2023/11/06/azure-devops-pipelines-templates-and-keyvaults.html" rel="alternate" type="text/html" title="Azure DevOps Pipelines and Templates with Azure KeyValues" /><published>2023-11-06T14:43:00+00:00</published><updated>2023-11-06T14:43:00+00:00</updated><id>https://patton-tech.com/blog/2023/11/06/azure-devops-pipelines-templates-and-keyvaults</id><content type="html" xml:base="https://patton-tech.com/blog/2023/11/06/azure-devops-pipelines-templates-and-keyvaults.html"><![CDATA[<h2 id="introduction">Introduction</h2>

<p>In modern application development, managing secrets and sensitive configuration data is crucial. Azure Key Vault provides a secure and efficient way to store these sensitive values. In this article, we’ll explore how to integrate Azure DevOps pipelines with Azure Key Vault using templates and variable groups.</p>

<h2 id="prerequisites">Prerequisites</h2>

<p>Before we begin, ensure you have the following:</p>

<ul>
  <li>An Azure DevOps project set up with appropriate permissions.</li>
  <li>An Azure Key Vault with secrets you want to access in your pipelines.</li>
  <li>Basic knowledge of YAML and Azure DevOps pipelines.</li>
</ul>

<h2 id="using-variable-groups-with-azure-key-vault">Using Variable Groups with Azure Key Vault</h2>

<p>Variable groups in Azure DevOps allow you to define a set of variables that can be reused across multiple pipelines. When combined with Azure Key Vault, you can securely store and reference sensitive information.</p>

<h3 id="creating-a-variable-group">Creating a Variable Group</h3>

<ol>
  <li>Navigate to your Azure DevOps project.</li>
  <li>Go to <code class="language-plaintext highlighter-rouge">Pipelines</code> &gt; <code class="language-plaintext highlighter-rouge">Library</code> &gt; <code class="language-plaintext highlighter-rouge">Variable groups</code>.</li>
  <li>Click on <code class="language-plaintext highlighter-rouge">+ Variable group</code> to create a new group.</li>
  <li>Add variables and their values, leaving the sensitive ones empty.</li>
</ol>

<h3 id="linking-variable-groups-to-key-vault">Linking Variable Groups to Key Vault</h3>

<p>To access secrets from Azure Key Vault in your pipelines, you’ll need to link your variable groups:</p>

<ol>
  <li>In the Azure DevOps project, go to <code class="language-plaintext highlighter-rouge">Pipelines</code> &gt; <code class="language-plaintext highlighter-rouge">Library</code> &gt; <code class="language-plaintext highlighter-rouge">Variable groups</code>.</li>
  <li>Select the variable group you created earlier.</li>
  <li>Click on <code class="language-plaintext highlighter-rouge">Link secrets from an Azure key vault as variables</code>.</li>
  <li>Choose your Azure subscription and Key Vault.</li>
</ol>

<p>Now, your variable group is linked to the Key Vault, allowing you to reference secrets in your pipeline.</p>

<p>For more detailed information, refer to the official documentation on <a href="https://learn.microsoft.com/en-us/azure/devops/pipelines/library/variable-groups?view=azure-devops">Variable Groups</a>.</p>

<h2 id="integrating-azure-key-vault-with-pipelines">Integrating Azure Key Vault with Pipelines</h2>

<p>Azure Key Vault integration with Azure DevOps pipelines allows you to securely store and use sensitive information in your CI/CD process. To learn more about this integration, refer to the official documentation on <a href="https://learn.microsoft.com/en-us/azure/devops/pipelines/release/azure-key-vault?view=azure-devops">Azure Key Vault integration in Release pipelines</a>.</p>

<h2 id="using-templates-for-code-reusability">Using Templates for Code Reusability</h2>

<p>Azure DevOps templates provide a way to define reusable, parameterized pipeline configurations. When combined with variable groups and Key Vault, you can streamline your CI/CD process.</p>

<h3 id="creating-a-template">Creating a Template</h3>

<p>Create a new YAML file in your repository (e.g., <code class="language-plaintext highlighter-rouge">azure-pipeline-template.yml</code>). This template will define the structure of your pipeline and accept parameters for customization.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">parameters</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">environment</span>
    <span class="na">displayName</span><span class="pi">:</span> <span class="s1">'</span><span class="s">Environment'</span>
    <span class="na">type</span><span class="pi">:</span> <span class="s">string</span>
    <span class="na">default</span><span class="pi">:</span> <span class="s1">'</span><span class="s">dev'</span>

  <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">buildConfiguration</span>
    <span class="na">displayName</span><span class="pi">:</span> <span class="s1">'</span><span class="s">Build</span><span class="nv"> </span><span class="s">Configuration'</span>
    <span class="na">type</span><span class="pi">:</span> <span class="s">string</span>
    <span class="na">default</span><span class="pi">:</span> <span class="s1">'</span><span class="s">Release'</span>

<span class="na">jobs</span><span class="pi">:</span>
<span class="pi">-</span> <span class="na">job</span><span class="pi">:</span> <span class="s">BuildAndDeploy</span>
  <span class="na">displayName</span><span class="pi">:</span> <span class="s1">'</span><span class="s">Build</span><span class="nv"> </span><span class="s">and</span><span class="nv"> </span><span class="s">Deploy</span><span class="nv"> </span><span class="s">Job'</span>
  <span class="na">pool</span><span class="pi">:</span>
    <span class="na">vmImage</span><span class="pi">:</span> <span class="s1">'</span><span class="s">windows-latest'</span>

  <span class="na">steps</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="na">script</span><span class="pi">:</span> <span class="pi">|</span>
      <span class="s">echo "Building for $ environment with configuration: $"</span>
      <span class="s"># Add your build and deployment steps here</span>
</code></pre></div></div>

<p>In this template, we define two parameters: <code class="language-plaintext highlighter-rouge">environment</code> and <code class="language-plaintext highlighter-rouge">buildConfiguration</code>. These parameters allow for customization when the template is used in a pipeline. Note how we reference the parameters using <code class="language-plaintext highlighter-rouge">$</code> and <code class="language-plaintext highlighter-rouge">$</code>.</p>

<h3 id="using-the-template-in-a-pipeline">Using the Template in a Pipeline</h3>

<p>In your pipeline YAML file (e.g., <code class="language-plaintext highlighter-rouge">main-pipeline.yml</code>), reference the template and pass the desired values for the parameters. Additionally, declare your regular variables using name/value pairs.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">variables</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">regularVariable</span>
    <span class="na">value</span><span class="pi">:</span> <span class="s1">'</span><span class="s">This</span><span class="nv"> </span><span class="s">is</span><span class="nv"> </span><span class="s">a</span><span class="nv"> </span><span class="s">regular</span><span class="nv"> </span><span class="s">variable'</span>

  <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">MyRegularVariable</span>
    <span class="na">value</span><span class="pi">:</span> <span class="s1">'</span><span class="s">This</span><span class="nv"> </span><span class="s">is</span><span class="nv"> </span><span class="s">another</span><span class="nv"> </span><span class="s">regular</span><span class="nv"> </span><span class="s">variable'</span>

  <span class="pi">-</span> <span class="na">group</span><span class="pi">:</span> <span class="s1">'</span><span class="s">MyVariableGroup'</span>  <span class="c1"># Reference to your variable group</span>

<span class="na">trigger</span><span class="pi">:</span>
  <span class="na">branches</span><span class="pi">:</span>
    <span class="na">exclude</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="s1">'</span><span class="s">*'</span>

<span class="na">pr</span><span class="pi">:</span>
  <span class="na">branches</span><span class="pi">:</span>
    <span class="na">include</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="s1">'</span><span class="s">*'</span>

<span class="na">jobs</span><span class="pi">:</span>
<span class="pi">-</span> <span class="na">template</span><span class="pi">:</span> <span class="s">azure-pipeline-template.yml</span>
  <span class="na">parameters</span><span class="pi">:</span>
    <span class="na">environment</span><span class="pi">:</span> <span class="s1">'</span>

<span class="s">prod'</span>
    <span class="na">buildConfiguration</span><span class="pi">:</span> <span class="s1">'</span><span class="s">Debug'</span>
</code></pre></div></div>

<p>In the above example, the template is referenced, and the <code class="language-plaintext highlighter-rouge">environment</code> parameter is set to <code class="language-plaintext highlighter-rouge">'prod'</code> and <code class="language-plaintext highlighter-rouge">buildConfiguration</code> is set to <code class="language-plaintext highlighter-rouge">'Debug'</code>. Note how we have defined our Variables and Variable Group references, when including both in your Variable block you must reference un-grouped variables using name/value syntax, as defined in the <a href="https://learn.microsoft.com/en-us/azure/devops/pipelines/library/variable-groups?view=azure-devops&amp;tabs=yaml#use-a-variable-group">documentation</a>.</p>

<h2 id="handling-issues-with-variable-groups-and-key-vaults">Handling Issues with Variable Groups and Key Vaults</h2>

<p>If you encounter any challenges while working with variable groups and Azure Key Vault integration, you’re not alone. Here are some Stack Overflow threads where developers have discussed and resolved similar issues:</p>

<ol>
  <li>
    <p><a href="https://stackoverflow.com/questions/75396933/storing-and-retrieving-secrets-in-azure-keyvault-with-variable-groups-in-azure-d">Storing and Retrieving Secrets in Azure Key Vault with Variable Groups in Azure DevOps</a></p>
  </li>
  <li>
    <p><a href="https://stackoverflow.com/questions/65504337/azure-release-pipeline-azure-key-vault-task-vs-variable-groups">Azure Release Pipeline: Azure Key Vault Task vs Variable Groups</a></p>
  </li>
  <li>
    <p><a href="https://stackoverflow.com/questions/59655982/authorize-button-when-linking-variable-group-to-azure-key-vault-in-azure-devops">Authorize Button when Linking Variable Group to Azure Key Vault in Azure DevOps</a></p>
  </li>
</ol>

<p>These threads cover a range of issues and solutions related to integrating variable groups with Azure Key Vault. Feel free to explore them for additional insights and solutions to potential challenges you may encounter.</p>

<h2 id="conclusion">Conclusion</h2>

<p>Integrating Azure DevOps pipelines with templates and variable groups linked to Azure Key Vault provides a robust solution for managing sensitive information in your CI/CD process. By following the steps outlined in this article, you can enhance the security and efficiency of your deployment pipeline.</p>

<p>For more detailed information, refer to the official documentation on <a href="https://learn.microsoft.com/en-us/azure/devops/pipelines/library/variable-groups?view=azure-devops">Variable Groups</a> and <a href="https://learn.microsoft.com/en-us/azure/devops/pipelines/release/azure-key-vault?view=azure-devops">Azure Key Vault integration in Release pipelines</a>.</p>]]></content><author><name>Jeff</name></author><category term="blog" /><category term="November" /><category term="2023" /><category term="Development" /><category term="AzureDevops" /><summary type="html"><![CDATA[Introduction]]></summary></entry><entry><title type="html">Creating a report in Jira</title><link href="https://patton-tech.com/blog/2023/11/03/creating-a-report-in-jira.html" rel="alternate" type="text/html" title="Creating a report in Jira" /><published>2023-11-03T22:27:00+00:00</published><updated>2023-11-03T22:27:00+00:00</updated><id>https://patton-tech.com/blog/2023/11/03/creating-a-report-in-jira</id><content type="html" xml:base="https://patton-tech.com/blog/2023/11/03/creating-a-report-in-jira.html"><![CDATA[<p>I’ve been doing a lot lately with ChatGPT, nothing terribly exciting and I think I’ll write a post about that at some point, most likely next year, big plans and all. Anyway, I needed to remember this for the next time I need one of these so here we are. I asked ChatGPT how to create Release Notes in Jira and it gave me this, sadly the exporting aspect did not work, but this may be a limitation imposed by my company.</p>

<h1 id="summary-generating-report-for-done-bugs-and-tasks-in-a-specific-epic">Summary: Generating Report for Done Bugs and Tasks in a Specific Epic</h1>

<h2 id="steps">Steps</h2>

<ol>
  <li>
    <p><strong>Navigate to the Epic</strong>:</p>

    <ul>
      <li>Open the epic you’re interested in by clicking on it from the backlog or board view.</li>
    </ul>
  </li>
  <li>
    <p><strong>Create a Filter for Done Tasks and Bugs within the Epic</strong>:</p>

    <ul>
      <li>
        <p>Click on the “Create Issue Filter” icon (looks like a funnel) at the top right of the epic window.</p>
      </li>
      <li>
        <p>In the filter creation window, use the following JQL query:</p>

        <pre><code class="language-JQL">"Epic Link" = EPIC-1234 AND issuetype in (Task, Bug) AND status = Done
</code></pre>

        <p>Replace <code class="language-plaintext highlighter-rouge">EPIC-1234</code> with the key of your epic.</p>
      </li>
      <li>
        <p>Click “Save As” to save this filter with a descriptive name like “Done Tasks and Bugs in Epic”.</p>
      </li>
    </ul>
  </li>
  <li>
    <p><strong>Use the Filter in a Board or Search</strong>:</p>

    <ul>
      <li>
        <p>Go back to your board or use the search functionality in Jira.</p>
      </li>
      <li>
        <p>Apply the filter you just created by selecting it from the list of available filters.</p>
      </li>
    </ul>
  </li>
  <li>
    <p><strong>Exporting the Report</strong>:</p>

    <ul>
      <li>
        <p>Once you have applied the filter and can see the list of done tasks and bugs, locate the export option (typically represented by an icon with an arrow pointing outwards or the word “Export”).</p>
      </li>
      <li>
        <p>Select the format you prefer for your export (e.g., CSV for a spreadsheet, PDF for a document).</p>
      </li>
      <li>
        <p>Save the file to your preferred location on your computer.</p>
      </li>
    </ul>
  </li>
</ol>]]></content><author><name>Jeff</name></author><category term="blog" /><category term="November" /><category term="2023" /><category term="Development" /><category term="Jira" /><summary type="html"><![CDATA[I’ve been doing a lot lately with ChatGPT, nothing terribly exciting and I think I’ll write a post about that at some point, most likely next year, big plans and all. Anyway, I needed to remember this for the next time I need one of these so here we are. I asked ChatGPT how to create Release Notes in Jira and it gave me this, sadly the exporting aspect did not work, but this may be a limitation imposed by my company.]]></summary></entry><entry><title type="html">There are no dumb questions!</title><link href="https://patton-tech.com/blog/2023/07/23/there-are-no-dumb-questions.html" rel="alternate" type="text/html" title="There are no dumb questions!" /><published>2023-07-23T21:06:00+00:00</published><updated>2023-07-23T21:06:00+00:00</updated><id>https://patton-tech.com/blog/2023/07/23/there-are-no-dumb-questions</id><content type="html" xml:base="https://patton-tech.com/blog/2023/07/23/there-are-no-dumb-questions.html"><![CDATA[<p>One of the many wonderful people I work with at Rackspace recently asked if they could as a dumb question. I taught technical classes for over 12 years before launching my career into “regular” IT work and in that time I learned that there truly are no dumb questions. If you are comfortable enough to talk to me and ask, then I will do my best to help you grasp whatever it is you want to know. That’s really just a function of who I am.</p>

<h2 id="ive-had-coding-classes-but-cant-grasp-converting-the-basics-into-something-functional">I’ve had coding classes, but can’t grasp converting the basics into something functional</h2>

<p>First off I want to set expectations, I write a lot of code and have been writing code for a very long time now. Do not take what I’m about to say as the best way to approach the problem, this is how I work day to day and it’s worked extremely well for me.</p>

<p>I’ve never really given any in-depth thought about how I approach a development problem. Perhaps the best way for me to explain it is to give an example of a recent problem I’ve been working. Last week I wrote about an issue I face with Azure Devops, where you can only grab the latest release of a nuget package regardless if the package has been flagged as “release” or “pre-release”.</p>

<p>My process starts researching the problem, in this instance I needed to validate that I didn’t have something configured incorrectly, or that I was using the tool in the wrong way. From what I was able to discover there was nothing misconfigured in Azure Devops and I was using the nuget command in the correct way. As I have been working on a PowerShell module for Azure Devops, I was aware of the API and focused my research on the API and how it would respond. After an hour or so of reading and poking at the API with PowerShell I came to the conclusion that the “release” or “pre-release” monikers had no impact when it comes to a repsonse. Everything was returned as “type” release, which mean that my “pre-release” view was basically ignored.</p>

<p>The next step for me is to then take the big picture problem and break it down into smaller more manageable pieces. How do I get from the name of a package to the latest release version that I need? In Azure Devops the packages are stored in an <a href="https://learn.microsoft.com/en-us/azure/devops/artifacts/concepts/feeds?view=azure-devops">Artifact Feed</a>. Those feeds have <a href="https://learn.microsoft.com/en-us/azure/devops/artifacts/concepts/views?view=azure-devops">Views</a> and Packages are associated with one or more of those Views. Each package has a specific version that goes along with it.</p>

<p>So I have my set of smaller steps:</p>

<ol>
  <li>Get the feed</li>
  <li>Get the view</li>
  <li>Get the package for that view</li>
  <li>Get the lastest version</li>
</ol>

<p>In reality for me, there are several sub-steps/tasks that go along with each step, for the purposes of this post we’ll stick to the high-level steps. Again this may or may not be the best way to do things, but this is how I approach the problem.</p>

<p>I have existing code that I can use as a reference, and then I just work with the API documentation and the command-line until I get something that works close to what I want. It’s at that point that I formalize the snippets I have into a function and then I iterate on that code until I feel it will always return what I expect it to return. The code itself is very straight forward and has never been truly complex, and this I think leads to the answer to this question.</p>

<h2 id="the-answer">The Answer</h2>

<p>Identify the problem you are facing, determine if there is a way to break it down into discreet steps and finally work out each step until it gives you the desire result. I know that sounds very simplistic, but that’s really how I approach the problem. I don’t try to solve the entire problem at once, I break it down into smaller pieces and then work on each piece until I get the desired result. I then take those pieces and put them together into a larger solution. What language you use makes little difference, the process is the same and all the languages functionally work in the same way.</p>

<ol>
  <li>Identify the problem</li>
  <li>Break the problem down into manageable pieces</li>
  <li>Solve each piece</li>
</ol>

<h2 id="conclusion">Conclusion</h2>

<p>Honestly this is how I approach most problems, not every problem I work can be solved with code, but the steps are always the same. I hope this helps, and I hope you have a great day!</p>]]></content><author><name>Jeff</name></author><category term="blog" /><category term="July" /><category term="2023" /><category term="Development" /><summary type="html"><![CDATA[One of the many wonderful people I work with at Rackspace recently asked if they could as a dumb question. I taught technical classes for over 12 years before launching my career into “regular” IT work and in that time I learned that there truly are no dumb questions. If you are comfortable enough to talk to me and ask, then I will do my best to help you grasp whatever it is you want to know. That’s really just a function of who I am.]]></summary></entry></feed>