Congratulations!

[Valid Atom 1.0] This is a valid Atom 1.0 feed.

Recommendations

This feed is valid, but interoperability with the widest range of feed readers could be improved by implementing the following recommendations.

Source: http://feeds.feedburner.com/OctopusDeploy

  1. <feed xmlns="http://www.w3.org/2005/Atom">
  2.  <title type="text">Octopus Deploy</title>
  3.  <subtitle type="text">Automated deployment platform</subtitle>
  4.  <id>https://octopus.com/feed</id>
  5.  <updated>2024-03-27T09:11:17.9489702Z</updated>
  6.  <link rel="alternate" href="https://octopus.com/blog" />
  7.  <link rel="self" href="https://octopus.com/feed" />
  8.  <entry>
  9.    <id>https://octopus.com/blog/task-log</id>
  10.    <title type="text">Task log UI improvements</title>
  11.    <published>2024-03-27T14:00:00Z</published>
  12.    <updated>2024-03-27T09:11:17.9489702Z</updated>
  13.    <author>
  14.      <name>paul.stovell@octopus.com, Octopus Deploy</name>
  15.    </author>
  16.    <link href="https://octopus.com/blog/task-log" />
  17.    <content type="html">&lt;p&gt;&lt;img src="https://i.octopus.com/blog/2024-03/task-log/blogimage-runningunittestsingithubactions-2022.png" alt="Open laptop sits behind a screen in dark mode showing a table of rows with green ticks, red crosses, and orange exclamation marks." /&gt;&lt;/p&gt;
  18.  
  19. &lt;p&gt;This week, we shipped a number of improvements and enhancements to the deployment log. The changes are rolling out to Octopus Cloud this week, and will be available in the next LTS release of Octopus Server.&lt;/p&gt;
  20.  
  21. &lt;p&gt;The main features are:&lt;/p&gt;
  22.  
  23. &lt;ul&gt;
  24. &lt;li&gt;A fresh and modern visual design that makes it delightful to read logs&lt;/li&gt;
  25. &lt;li&gt;Performance improvements – handles huge logs (with millions of lines) with ease without freezing&lt;/li&gt;
  26. &lt;li&gt;Intelligent Log Rendering™️ brings the most important events to your attention, even in huge logs&lt;/li&gt;
  27. &lt;/ul&gt;
  28.  
  29. &lt;p&gt;We also made many smaller improvements:&lt;/p&gt;
  30.  
  31. &lt;ul&gt;
  32. &lt;li&gt;Line numbering&lt;/li&gt;
  33. &lt;li&gt;Ability to select and link to log lines, and share the link with others&lt;/li&gt;
  34. &lt;li&gt;Clean Copy &amp;amp; Paste™️ without line numbers and other things polluting&lt;/li&gt;
  35. &lt;li&gt;Visual indication of the time different steps took&lt;/li&gt;
  36. &lt;li&gt;Defaulting to showing the task log if a deployment is running&lt;/li&gt;
  37. &lt;li&gt;Better progress indicators so you know what's happening&lt;/li&gt;
  38. &lt;/ul&gt;
  39.  
  40. &lt;h2 id="a-fresh-visual-design"&gt;A fresh visual design&lt;/h2&gt;
  41.  
  42. &lt;p&gt;The deployment log gets used as often as any other page in Octopus. People come to the deployment log many times a day, whether it's to try to work out why a deployment failed, or even just to check if it was successful. Yet the look and feel of the log hadn't changed in many years, and it was looking dated.&lt;/p&gt;
  43.  
  44. &lt;p&gt;Here's a short video showing the new log in action in light and dark modes:&lt;/p&gt;
  45.  
  46. &lt;p&gt;&lt;video src="https://i.octopus.com/blog/2024-03/task-log/quick-tour.mp4" width="750" height="400" controls autoplay loop muted&gt;&lt;/video&gt;&lt;/p&gt;
  47.  
  48. &lt;h2 id="performance-for-big-logs"&gt;Performance for big logs&lt;/h2&gt;
  49.  
  50. &lt;p&gt;We don't recommend it, but deployment logs can get &lt;em&gt;very big&lt;/em&gt;. Octopus runs steps in parallel across many targets, and some deployments are very complex, so sometimes large deployment logs are unavoidable.&lt;/p&gt;
  51.  
  52. &lt;p&gt;The old task log would typically start by showing a preview – the most recent 20 lines for each node in the log tree. There was a link above it indicating additional lines not shown, that you could click to show all. Even for big logs, that was pretty fast.&lt;/p&gt;
  53.  
  54. &lt;p&gt;The problem was what happened when you clicked that link to show all. The UI would then fetch the entire log and attempt to render it locally. As logs got large – tens of thousands of lines or more – the old UI simply froze and became unusable.&lt;/p&gt;
  55.  
  56. &lt;p&gt;We designed the new log to support &lt;em&gt;very&lt;/em&gt; large logs, including logs with hundreds of thousands of lines or hundreds of MB or more in log output. We use Intelligent Log Rendering to show you the parts of the log we think you'll be most interested in. Then you can click around to reveal specific sections of the log, which load quickly.&lt;/p&gt;
  57.  
  58. &lt;p&gt;&lt;video src="https://i.octopus.com/blog/2024-03/task-log/big-logs.mp4" width="750" height="400" controls autoplay loop muted&gt;&lt;/video&gt;&lt;/p&gt;
  59.  
  60. &lt;h2 id="intelligent-log-renderingtm"&gt;Intelligent Log Rendering™️&lt;/h2&gt;
  61.  
  62. &lt;p&gt;To make it easy to navigate even large logs, Octopus uses what we call Intelligent Log Rendering.&lt;/p&gt;
  63.  
  64. &lt;p&gt;Most CI/CD products either attempt to render the whole log (and freeze), or render the most recent log messages, meaning you lose important events that happened earlier in the process. Or they simply make you download and look through the full file yourself. None of these approaches actively helps customers debug CI/CD problems.&lt;/p&gt;
  65.  
  66. &lt;p&gt;Intelligent Log Rendering in Octopus solves this.&lt;/p&gt;
  67.  
  68. &lt;p&gt;When you first open a log, we always show:&lt;/p&gt;
  69.  
  70. &lt;ul&gt;
  71. &lt;li&gt;The first 20 lines&lt;/li&gt;
  72. &lt;li&gt;The last 50 lines&lt;/li&gt;
  73. &lt;/ul&gt;
  74.  
  75. &lt;p&gt;In between, we hide the logs, but you can click to load chunks of those logs. Octopus looks for &amp;quot;interesting&amp;quot; events, like warnings or errors, and also renders those with context around them – typically 50 lines before the warning/error, and 20 lines after. This all happens on the server, limiting the data transferred to the client.&lt;/p&gt;
  76.  
  77. &lt;p&gt;In the video above, a warning appeared halfway through a 100,000-line log file. Octopus shows:&lt;/p&gt;
  78.  
  79. &lt;ul&gt;
  80. &lt;li&gt;The first 50 lines&lt;/li&gt;
  81. &lt;li&gt;&amp;quot;Show more&amp;quot; placeholders&lt;/li&gt;
  82. &lt;li&gt;50 lines before the error&lt;/li&gt;
  83. &lt;li&gt;The error/warning&lt;/li&gt;
  84. &lt;li&gt;20 lines after the error&lt;/li&gt;
  85. &lt;li&gt;More &amp;quot;show more&amp;quot; placeholders&lt;/li&gt;
  86. &lt;li&gt;The last 50 lines&lt;/li&gt;
  87. &lt;/ul&gt;
  88.  
  89. &lt;p&gt;This means you immediately see what the error was and all the context around it, without needing to download and search a big log file. And it keeps the UI snappy and transfers the minimum data needed to the client to help you find and fix the error.&lt;/p&gt;
  90.  
  91. &lt;h2 id="smaller-improvements"&gt;Smaller improvements&lt;/h2&gt;
  92.  
  93. &lt;p&gt;We took the opportunity to make a number of other improvements.&lt;/p&gt;
  94.  
  95. &lt;p&gt;Logs now include line numbering:&lt;/p&gt;
  96.  
  97. &lt;p&gt;&lt;a href='#' data-featherlight='https://i.octopus.com/blog/2024-03/task-log/line-select-copy-link.png' class='zoom' data-title=''&gt;&lt;img src='https://i.octopus.com/blog/2024-03/task-log/line-select-copy-link.png' class="img-fluid center" alt='Line numbers with a copy link' /&gt;&lt;/a&gt;&lt;/p&gt;
  98.  
  99. &lt;p&gt;You can click to &amp;quot;select&amp;quot; a line, which changes the URL in the browser. You can copy and paste the URL and send it to someone else and they will see that same line selected. Or, right click a line number and copy the address.&lt;/p&gt;
  100.  
  101. &lt;p&gt;Dates and log levels are hidden by default, but you can click the gear button to reveal them, and the preference will be remembered.&lt;/p&gt;
  102.  
  103. &lt;p&gt;&lt;a href='#' data-featherlight='https://i.octopus.com/blog/2024-03/task-log/show-timings.png' class='zoom' data-title=''&gt;&lt;img src='https://i.octopus.com/blog/2024-03/task-log/show-timings.png' class="img-fluid center" alt='Show log timestamps and categories' /&gt;&lt;/a&gt;&lt;/p&gt;
  104.  
  105. &lt;p&gt;For most CI/CD tools, Copy &amp;amp; Paste of multiple lines from the log can be messy. This is due to how logs are rendered (typically as block-level HTML elements for alignment) and the quirks of how selection and copy work in HTML.&lt;/p&gt;
  106.  
  107. &lt;p&gt;We spent a lot of time making sure the Copy &amp;amp; Paste behavior works as expected so you can spend more time finding and fixing issues and less time hand-editing copied logs.&lt;/p&gt;
  108.  
  109. &lt;p&gt;Here is how Copy &amp;amp; Paste works when timestamps are not shown. Line numbers are effectively hidden from selection, so they aren't copied, and you get nice, neat log output.&lt;/p&gt;
  110.  
  111. &lt;p&gt;&lt;video src="https://i.octopus.com/blog/2024-03/task-log/copy-paste.mp4" width="750" height="400" controls autoplay loop muted&gt;&lt;/video&gt;&lt;/p&gt;
  112.  
  113. &lt;p&gt;During deployments, every minute counts. To help give you a sense of how long different parts of the deployment took, we now show indicators for how long each part of the log took.&lt;/p&gt;
  114.  
  115. &lt;p&gt;We also changed the default page you see when you click a task. Previously, Octopus showed the &lt;strong&gt;TASK SUMMARY&lt;/strong&gt; tab, but many people just wanted to go to the &lt;strong&gt;TASK LOG&lt;/strong&gt;, so it was always an extra click. Now, when you open a running deployment, you'll go immediately to the &lt;strong&gt;TASK LOG&lt;/strong&gt;.&lt;/p&gt;
  116.  
  117. &lt;p&gt;Lastly, when a task is running, we also now show a spinning indicator under the active tree node in the log. You can click this to &amp;quot;pin&amp;quot; your browser to that part of the log - as new log messages appear, the browser will automatically scroll and keep the pin visible.&lt;/p&gt;
  118.  
  119. &lt;p&gt;&lt;a href='#' data-featherlight='https://i.octopus.com/blog/2024-03/task-log/pin-log.png' class='zoom' data-title=''&gt;&lt;img src='https://i.octopus.com/blog/2024-03/task-log/pin-log.png' class="img-fluid center" height="auto" width="500" alt='Pinning a node to auto-scroll.' /&gt;&lt;/a&gt;&lt;/p&gt;
  120.  
  121. &lt;h2 id="coming-to-an-octopus-near-you"&gt;Coming to an Octopus near you&lt;/h2&gt;
  122.  
  123. &lt;p&gt;With intelligent log rendering, performance for large files, and lots of new usability enhancements, we hope these improvements will make it easier to find and fix deployment problems.&lt;/p&gt;
  124.  
  125. &lt;p&gt;Happy deployments!&lt;/p&gt;
  126. </content>
  127.  </entry>
  128.  <entry>
  129.    <id>https://octopus.com/blog/external-feed-triggers</id>
  130.    <title type="text">External feed triggers</title>
  131.    <published>2024-03-25T14:00:00Z</published>
  132.    <updated>2024-03-22T01:29:46.4308348Z</updated>
  133.    <author>
  134.      <name>mark.coafield@octopus.com, Octopus Deploy</name>
  135.    </author>
  136.    <link href="https://octopus.com/blog/external-feed-triggers" />
  137.    <content type="html">&lt;p&gt;&lt;img src="https://i.octopus.com/blog/2024-03/external-feed-triggers/blogimage-releasetriggersforcontainerimagesandhelmcharts-2024-1500x800-v2.png" alt="Docker and Helm logos connected to Octopus logo" /&gt;&lt;/p&gt;
  138.  
  139. &lt;p&gt;Octopus Deploy is introducing external feed triggers. This means you can trigger releases when new container images or Helm charts get pushed to their respective repositories. This new pull-based semantic lets you better automate GitOps flows in your Continuous Delivery pipelines.&lt;/p&gt;
  140.  
  141. &lt;h2 id="gitops-approach-to-continuous-delivery"&gt;GitOps approach to Continuous Delivery&lt;/h2&gt;
  142.  
  143. &lt;p&gt;&lt;a href="https://opengitops.dev/" rel="nofollow"&gt;GitOps&lt;/a&gt; principles provide a set of guidelines that use a declarative definition of your desired application. This gets brought into alignment with the actual state of your infrastructure.&lt;/p&gt;
  144.  
  145. &lt;p&gt;Traditionally, Continuous Delivery workflows followed a ‘one and done’ approach to deploying an application. An artifact gets built through a Continuous Integration (CI) pipeline. This then gets pushed to a Continuous Deployment (CD) tool that performs the deployment. The CD tool is passive in this process. It sits and waits until it's notified by the build server to perform a release, using specified application dependencies.&lt;/p&gt;
  146.  
  147. &lt;p&gt;Using a GitOps approach to Continuous Delivery, the desired state instead gets ‘pulled’ from the source. The CD server is actively comparing the system state in the target (typically Kubernetes clusters) with the desired state described by the declarative manifests in the source repository (typically Git). &lt;/p&gt;
  148.  
  149. &lt;p&gt;This decoupling creates a release process that more naturally supports a continuous reconciliation cycle. The changes to the desired state are automatically applied to the actual state, and drifts in the actual state get readjusted to bring them back in line with what's expected.&lt;/p&gt;
  150.  
  151. &lt;h3 id="a-pull-model-for-containerized-applications"&gt;A pull model for containerized applications&lt;/h3&gt;
  152.  
  153. &lt;p&gt;There are a few ways to work with a pull model for containerized applications.&lt;/p&gt;
  154.  
  155. &lt;p&gt;As explained in &lt;a href="https://codefresh.io/learn/gitops/gitops-workflow-vs-traditional-workflow-what-is-the-difference/" rel="nofollow"&gt;this Codefresh article&lt;/a&gt;,  one approach is to configure a deployment automator to find changes to an image repository. This then updates a YAML file in the configuration repository. This change gets identified by a GitOps agent that pulls the change and updates the cluster to match.&lt;/p&gt;
  156.  
  157. &lt;p&gt;Or, by using Octopus for your deployments, you can template your manifests so the container image gets injected when a release gets created. Our support for &lt;a href="https://octopus.com/docs/deployments/kubernetes/kustomize"&gt;Kustomize&lt;/a&gt; is an example of this pattern. This process puts the control for managing your containers and environment configuration outside your manifest repository. This reduces drift, merge-conflict, and security risks when using Git for environmental progression – something it was never built for.&lt;/p&gt;
  158.  
  159. &lt;h4 id="external-feed-triggers"&gt;External feed triggers&lt;/h4&gt;
  160.  
  161. &lt;p&gt;By configuring your Octopus project with container dependencies, you can now create external feed triggers that watch those repositories for new packages pushed by your build tool. Based on tags and &lt;a href="https://octopus.com/docs/releases/channels#version-rules"&gt;version rules&lt;/a&gt;, it detects if an image appears that is later than the image used in your previous release. Octopus then automatically creates a new release with all the latest container images or Helm chart dependencies. &lt;/p&gt;
  162.  
  163. &lt;p&gt;Your existing lifecycle will then promote that release through your environments or tenants, just like it does currently. If your lifecycle uses automatic release progression, then you've just set up a Continuous Delivery pipeline without explicitly letting Octopus know about your application changes! &lt;/p&gt;
  164.  
  165. &lt;p&gt;The details of these container images and Helm charts are already known in Octopus. This means we can use the registry locations, image names, chart names, and credentials to do this monitoring, without adding or maintaining this information anywhere else.&lt;/p&gt;
  166.  
  167. &lt;p&gt;It all just works.&lt;/p&gt;
  168.  
  169. &lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
  170.  
  171. &lt;p&gt;Using the new external release triggers in Octopus lets you cut down the amount of configuration in your build pipeline using a GitOps-style pull model. As you're likely making more frequent changes to your application than your infrastructure manifests, having Octopus observe and react to changes in your artifact repositories reduces risks from updating those manifest repositories directly. Release triggers also let you benefit from these capabilities, even if you aren't deploying to Kubernetes.&lt;/p&gt;
  172.  
  173. &lt;p&gt;Your CI system can focus on building and testing artifacts, and your CD system can focus on deployments and environments.&lt;/p&gt;
  174.  
  175. &lt;p&gt;We hope the external feed triggers help you ship your application changes to your environments in a faster, safer, and simpler way than ever before.&lt;/p&gt;
  176.  
  177. &lt;p&gt;Happy deployments!&lt;/p&gt;
  178. </content>
  179.  </entry>
  180.  <entry>
  181.    <id>https://octopus.com/blog/octopus-acquires-codefresh</id>
  182.    <title type="text">Octopus Deploy acquires Codefresh</title>
  183.    <published>2024-02-27T00:00:00Z</published>
  184.    <updated>2024-03-27T04:56:14.2101091Z</updated>
  185.    <author>
  186.      <name>paul.stovell@octopus.com, Octopus Deploy</name>
  187.    </author>
  188.    <link href="https://octopus.com/blog/octopus-acquires-codefresh" />
  189.    <content type="html">&lt;p&gt;&lt;img src="https://i.octopus.com/blog/2024-02/octopus-acquires-codefresh/blogimage-octopuscodefresh-750x400-2024.png" alt="Codefresh and Octopus Deploy logos in a yin and yang symbol." /&gt;&lt;/p&gt;
  190.  
  191. &lt;p&gt;I am very excited to share that Octopus has acquired Codefresh! Our &lt;a href="https://octopus.com/news/octopus-acquires-codefresh"&gt;press release&lt;/a&gt; has a good summary, but I want to share with you why I’m so excited about Codefresh joining Octopus, what we love about the Codefresh team, and why we think this is excellent news for our customers, Codefresh customers, and the Argo open-source community.&lt;/p&gt;
  192.  
  193. &lt;h2 id="codefresh-brings-argo-based-gitops-into-the-octopus-product-family"&gt;Codefresh brings Argo-based GitOps into the Octopus product family&lt;/h2&gt;
  194.  
  195. &lt;p&gt;Codefresh is a leader in Kubernetes CD, GitOps, and CI. Codefresh GitOps is built on top of the popular open-source Argo project, and Codefresh team members are maintainers of Argo. Their broad range of customers means the Codefresh team has more experience than anyone in operating Argo at an enterprise scale.&lt;/p&gt;
  196.  
  197. &lt;p&gt;This acquisition is the next step in strengthening our support for Kubernetes and our commitment to providing the most powerful, best-of-breed Continuous Delivery solution for all of your applications — from heritage applications in data centers, multi-cloud, and hybrid IT infrastructure to containerized, cloud-native applications.&lt;/p&gt;
  198.  
  199. &lt;h2 id="cd-or-gitops-why-not-both"&gt;CD or GitOps? Why not both?&lt;/h2&gt;
  200.  
  201. &lt;p&gt;To date, Octopus has helped thousands of customers on their containerization journey. Octopus has supported deployments to Kubernetes since 2018, and this year, we continue to have a 40+ person engineering group focused on making Octopus the best CD solution for Kubernetes.&lt;/p&gt;
  202.  
  203. &lt;p&gt;We built Octopus as an artifact-forward CD solution supporting everything from VMs to Kubernetes. With our focus on environment progression, observability, and enterprise compliance, we believe Octopus Deploy is the best tool for most teams continuously delivering applications to Kubernetes at scale.&lt;/p&gt;
  204.  
  205. &lt;p&gt;At the same time, some teams and application architectures benefit from — or simply prefer — a GitOps-style approach. Argo has become the most popular open-source GitOps tooling, but many teams often find the Argo projects alone fall short of a complete Continuous Delivery pipeline.&lt;/p&gt;
  206.  
  207. &lt;p&gt;Codefresh seamlessly blends the best features of Argo and so much more into an enterprise-ready unified CI/CD platform. A great example here is visibility: with Argo, when you release a new image of your application, the Git commit monitored by Argo will tell you the version of the new container image that should run in production. But what Jira tickets or code commits were included in that release? These are the kinds of visibility issues Codefresh has gracefully solved.&lt;/p&gt;
  208.  
  209. &lt;h2 id="well-continue-to-invest-in-the-argo-project"&gt;We’ll continue to invest in the Argo project&lt;/h2&gt;
  210.  
  211. &lt;p&gt;Like our customers, we care greatly about Kubernetes and the cloud-native movement. Octopus Cloud, our SaaS offering, has &lt;a href="https://octopus.com/blog/octopus-cloud-v2-why-kubernetes"&gt;run on Kubernetes since 2019&lt;/a&gt;. As active members and sponsors of the Linux Foundation and the CD Foundation since 2020, and more recently, the CNCF, we are committed to advancing Argo-based Kubernetes deployments and GitOps-based CD. This commitment will deepen with Codefresh co-founders, Raziel Tabib and Dan Garfield, joining our leadership team.&lt;/p&gt;
  212.  
  213. &lt;p&gt;In 2024, we have seen many venture-backed, open-core businesses collapse, leaving the projects they maintained — and organizations they supported — with an uncertain future. Our size and profitability mean we can continue to maintain Argo and even deepen our maintenance investment, ensuring the project has a viable future and enterprise-ready offering.&lt;/p&gt;
  214.  
  215. &lt;h2 id="how-it-happened"&gt;How it happened&lt;/h2&gt;
  216.  
  217. &lt;p&gt;There’s a popular conception that acquisitions happen because financial types engineer some kind of 1+1=3 logic. In our experience — we’ve explored a bunch over the years when trying to find ways to address customer challenges — they start excellent on paper but always fall down at the human level. The people at the other company seem nice enough, but would they be great Octonauts? I can probably work with them, but am I excited about it? As a result, the bar is incredibly high.&lt;/p&gt;
  218.  
  219. &lt;p&gt;I was in Chicago for KubeCon last year with our team where we were showing customers how Octopus can help Kubernetes users with environment progression, observability, and enterprise compliance. On the first day, I walked past the Codefresh booth on the way to ours, and I recognized the Codefresh CEO, Raziel Tabib, from his LinkedIn photo, and we started a conversation. It’s always fascinating to meet other founders in our space, and Raziel and I had never met before, so agreed to get a coffee. At that first coffee, it was clear Raziel and I shared the same vision for the industry and our customers' challenges. It was as if we’d been walking parallel but similar journeys.&lt;/p&gt;
  220.  
  221. &lt;p&gt;We both believe that software teams fundamentally exist to create valuable software, which is only valuable when it’s running in production and so the CD pipeline is the beating heart of any software team. Yet for many companies, the CD pipeline is still a source of pain; clogged up with slow builds and pipeline sprawl, loss of visibility, and propped up with home-grown “shadow” CD solutions bolted onto CI pipelines.&lt;/p&gt;
  222.  
  223. &lt;p&gt;What really brought it together was when other Octonauts met other Codefreshers as we further explored the idea of acquisition. The overwhelming reaction from Octonauts was, “we’d absolutely hire that person; they’d make a great Octonaut.”&lt;/p&gt;
  224.  
  225. &lt;p&gt;Any product embodies the lived experiences of the people who built it. Octopus has been helping thousands of customers for over 10 years to solve some of the most complex CD challenges, and that’s reflected in thousands of big and small ways in our product. Codefreshers have been solving similar challenges for a similar length of time, and those learnings and ideas are embodied in their product. Bringing both groups together to compare notes and continue to push the state of the art in CD is very exciting.&lt;/p&gt;
  226.  
  227. &lt;h2 id="octopus-is-now-the-largest-best-of-breed-cd-vendor"&gt;Octopus is now the largest best-of-breed CD vendor&lt;/h2&gt;
  228.  
  229. &lt;p&gt;With Codefresh joining Octopus, we are now proud to say we have:&lt;/p&gt;
  230.  
  231. &lt;ul&gt;
  232. &lt;li&gt;Best-of-breed CD, GitOps, and CI under one roof&lt;/li&gt;
  233. &lt;li&gt;Over 4,000 customers&lt;/li&gt;
  234. &lt;li&gt;Over 270 Octonauts (all Codefreshers will be continuing as employees of Octopus)&lt;/li&gt;
  235. &lt;li&gt;Over $60M USD in revenue&lt;/li&gt;
  236. &lt;li&gt;Been profitable for 10 out of the past 11 years, with 2023 being our best year ever, which fuels our further product investment&lt;/li&gt;
  237. &lt;/ul&gt;
  238.  
  239. &lt;p&gt;That makes us the most complete best-of-breed CD solution in the market today with the most guaranteed future. This makes Octopus very unique. Our size combined with our long history of profitability, means that we are a sustainable and reliable choice in good markets and bad.&lt;/p&gt;
  240.  
  241. &lt;p&gt;We are also very proud of the culture we have built at Octopus (you can read more about it in our &lt;a href="https://handbook.octopus.com/" rel="nofollow"&gt;Octopus Handbook&lt;/a&gt;) as employees who are being well taken care of pour the same dedication into customer care.&lt;/p&gt;
  242.  
  243. &lt;p&gt;To all Octopus and Codefresh customers - thank you for your continued loyalty, support, and feedback.&lt;/p&gt;
  244.  
  245. &lt;p&gt;We are excited about our future together.&lt;/p&gt;
  246.  
  247. &lt;p&gt;Happy deployments!&lt;/p&gt;
  248. </content>
  249.  </entry>
  250.  <entry>
  251.    <id>https://octopus.com/blog/octolint-best-practices</id>
  252.    <title type="text">Octolint best practices</title>
  253.    <published>2024-02-14T14:00:00Z</published>
  254.    <updated>2024-02-13T02:03:13.5327299Z</updated>
  255.    <author>
  256.      <name>steve.fenton@octopus.com, Octopus Deploy</name>
  257.    </author>
  258.    <link href="https://octopus.com/blog/octolint-best-practices" />
  259.    <content type="html">&lt;p&gt;&lt;img src="https://i.octopus.com/blog/2024-02/octolint-best-practices/blogimage-runbooksbestpractices-2022.png" alt="A book with legs and arms is wearing a toolbelt and running with a checklist in its hand" /&gt;&lt;/p&gt;
  260.  
  261. &lt;p&gt;Octolint is a tool that scans your Octopus instance and recommends improvements to your setup. This post explains the best practices we based Octolint on. It will help you understand the recommendations and avoid undesirable Octopus configurations.&lt;/p&gt;
  262.  
  263. &lt;p&gt;You can create a runbook to perform the Octolint scan using the Octolint step template or call it from the command line using the script on the step template page. You can use Octolint's recommendations to help you get the best from your Octopus instance.&lt;/p&gt;
  264.  
  265. &lt;pre&gt;&lt;code class="language-bash"&gt;$server = $OctopusParameters[&amp;quot;Octolint.Octopus.ServerUri&amp;quot;]
  266. $apiKey = $OctopusParameters[&amp;quot;Octolint.Octopus.ApiKey&amp;quot;]
  267. $spaceName = $OctopusParameters[&amp;quot;Octolint.Octopus.SpaceName&amp;quot;]
  268.  
  269. docker pull octopussamples/octolint
  270.  
  271. docker run --rm octopussamples/octolint -url &amp;quot;$server&amp;quot; -apiKey &amp;quot;$apiKey&amp;quot; -space &amp;quot;$spaceName&amp;quot; -verboseErrors
  272. &lt;/code&gt;&lt;/pre&gt;
  273.  
  274. &lt;p&gt;When you run Octolint in a runbook, the task log will contain messages that provide recommendations, like:&lt;/p&gt;
  275.  
  276. &lt;pre&gt;&lt;code&gt;OctoRecLifecycleRetention
  277. The following lifecycles have retention policies that keep releases or files forever:
  278. Default Lifecycle
  279. &lt;/code&gt;&lt;/pre&gt;
  280.  
  281. &lt;p&gt;In this post, you'll learn more about what each recommendation means.&lt;/p&gt;
  282.  
  283. &lt;h2 id="environment-count"&gt;Environment count&lt;/h2&gt;
  284.  
  285. &lt;blockquote class="blockquote"&gt;
  286. &lt;p&gt;A space should have 10 or fewer environments.&lt;/p&gt;
  287. &lt;/blockquote&gt;
  288.  
  289. &lt;p&gt;At a high level, environments model business processes and group distinct infrastructure copies.&lt;/p&gt;
  290.  
  291. &lt;p&gt;Environments typically represent copies of infrastructure that deployments progress through as they gain more stability and confidence that changes are ready to be exposed to end users.&lt;/p&gt;
  292.  
  293. &lt;p&gt;Teams may have special responsibilities for given environments. For example, only product owners can approve production deployments.&lt;/p&gt;
  294.  
  295. &lt;p&gt;Having too many environments is a sign they're being used to model a different concept, like projects, regions, or customer-specific environments.&lt;/p&gt;
  296.  
  297. &lt;p&gt;The tenants feature can represent concepts like customers, users, regions, or physical locations.&lt;/p&gt;
  298.  
  299. &lt;h2 id="default-project-group-size"&gt;Default project group size&lt;/h2&gt;
  300.  
  301. &lt;blockquote class="blockquote"&gt;
  302. &lt;p&gt;The default project group should have 10 or fewer projects.&lt;/p&gt;
  303. &lt;/blockquote&gt;
  304.  
  305. &lt;p&gt;Project groups show the progression of project deployments on the Octopus dashboard. You can also filter the dashboard to show only a subset of project groups.&lt;/p&gt;
  306.  
  307. &lt;p&gt;Project groups also provide a security boundary with user roles that you can scope to a project group.&lt;/p&gt;
  308.  
  309. &lt;p&gt;Organize projects into specific groups.&lt;/p&gt;
  310.  
  311. &lt;h2 id="empty-projects"&gt;Empty projects&lt;/h2&gt;
  312.  
  313. &lt;blockquote class="blockquote"&gt;
  314. &lt;p&gt;Projects should be deleted when not used.&lt;/p&gt;
  315. &lt;/blockquote&gt;
  316.  
  317. &lt;p&gt;Every project should either have a deployment process or one or more runbooks. Empty projects likely indicate projects that were never properly configured and that you should delete.&lt;/p&gt;
  318.  
  319. &lt;h2 id="project-specific-environments"&gt;Project-specific environments&lt;/h2&gt;
  320.  
  321. &lt;blockquote class="blockquote"&gt;
  322. &lt;p&gt;Environments should be reusable.&lt;/p&gt;
  323. &lt;/blockquote&gt;
  324.  
  325. &lt;p&gt;Environments typically represent high-level business processes and copies of infrastructure that deployments progress through. Environments used exclusively by one project may indicate an anti-pattern, as this can lead to unnecessarily specific environments, which in turn can be challenging to manage.&lt;/p&gt;
  326.  
  327. &lt;p&gt;Consider whether you can represent your project-specific environment with a more general, shared environment.&lt;/p&gt;
  328.  
  329. &lt;h2 id="unused-variables"&gt;Unused variables&lt;/h2&gt;
  330.  
  331. &lt;blockquote class="blockquote"&gt;
  332. &lt;p&gt;All variables should be used.&lt;/p&gt;
  333. &lt;/blockquote&gt;
  334.  
  335. &lt;p&gt;Project-level variables can only be referenced by the project deployment process, runbooks, or other variables. Unused variables can clutter the project settings and make it harder to manage.&lt;/p&gt;
  336.  
  337. &lt;div class="alert alert-warning"&gt;&lt;p&gt;Octolint can only detect if variables are not referenced by the deployment process or by other variables. There are edge cases Octolint can not detect. For example, if an output variable from a step references the project variable, or if an external package includes files that have variable substitution applied to them.&lt;/p&gt;
  338. &lt;/div&gt;
  339.  
  340. &lt;h3 id="cleaning-up-unused-variables"&gt;Cleaning up unused variables&lt;/h3&gt;
  341.  
  342. &lt;p&gt;To clean up unused variables, first rename the variables with a common prefix like &lt;code&gt;[UNUSED]&lt;/code&gt;. For example, if Octolint reported the variable &lt;code&gt;ConnectionString&lt;/code&gt; was unused, you would rename it to &lt;code&gt;[UNUSED] ConnectionString&lt;/code&gt;.&lt;/p&gt;
  343.  
  344. &lt;p&gt;Test that the deployment or runbooks continue to work as expected with the renamed variables. If there are no issues, then you can delete the variable. If it turns out the variable is still used, rename it back.
  345. This process ensures you don't delete the variable before proving it's no longer used.&lt;/p&gt;
  346.  
  347. &lt;h2 id="duplicated-variables"&gt;Duplicated variables&lt;/h2&gt;
  348.  
  349. &lt;blockquote class="blockquote"&gt;
  350. &lt;p&gt;Variables should represent unique values.&lt;/p&gt;
  351. &lt;/blockquote&gt;
  352.  
  353. &lt;p&gt;You'll often have a variable you use in many projects. If you copy and paste the value into each project's variables, it becomes difficult to manage the variable. You'd have to change it multiple times.
  354. Library variable sets are a better solution for sharing variables, as you can update their value centrally once.&lt;/p&gt;
  355.  
  356. &lt;h2 id="deployment-queued-by-administrators"&gt;Deployment queued by administrators&lt;/h2&gt;
  357.  
  358. &lt;blockquote class="blockquote"&gt;
  359. &lt;p&gt;Administrator accounts shouldn't be used for day-to-day operations.&lt;/p&gt;
  360. &lt;/blockquote&gt;
  361.  
  362. &lt;p&gt;Octopus provides many roles to represent typical responsibilities in a deployment pipeline. Admin users initiating deployments may indicate that the Octopus RBAC configuration does not reflect deployment responsibilities.&lt;/p&gt;
  363.  
  364. &lt;p&gt;This is like using a Windows administrator or Linux root account for day-to-day operations.&lt;/p&gt;
  365.  
  366. &lt;p&gt;Create users with restricted permissions to perform deployments.&lt;/p&gt;
  367.  
  368. &lt;h2 id="perpetual-api-keys"&gt;Perpetual API keys&lt;/h2&gt;
  369.  
  370. &lt;blockquote class="blockquote"&gt;
  371. &lt;p&gt;API keys should automatically expire.&lt;/p&gt;
  372. &lt;/blockquote&gt;
  373.  
  374. &lt;p&gt;API keys can either have an expiration date, or never expire. Keys that never expire may pose a security risk as they grant anyone with the key perpetual access to the Octopus instance.&lt;/p&gt;
  375.  
  376. &lt;p&gt;Replace perpetual keys with keys that expire.&lt;/p&gt;
  377.  
  378. &lt;h2 id="project-groups-with-exclusive-environments"&gt;Project groups with exclusive environments&lt;/h2&gt;
  379.  
  380. &lt;blockquote class="blockquote"&gt;
  381. &lt;p&gt;Projects in the same group should have the same environments.&lt;/p&gt;
  382. &lt;/blockquote&gt;
  383.  
  384. &lt;p&gt;Project groups contain related projects and group them on the dashboard. You can see all environments for all projects in a project group horizontally across the screen. This works well when projects in a project group share environments. However, it's inefficient when projects deploy to different sets of environments.&lt;/p&gt;
  385.  
  386. &lt;p&gt;Move projects into groups with projects that deploy to shared environments.&lt;/p&gt;
  387.  
  388. &lt;h2 id="too-many-steps"&gt;Too many steps&lt;/h2&gt;
  389.  
  390. &lt;blockquote class="blockquote"&gt;
  391. &lt;p&gt;A deployment process should have 20 or fewer steps.&lt;/p&gt;
  392. &lt;/blockquote&gt;
  393.  
  394. &lt;p&gt;Complex deployments can often involve many steps. However, deployment processes can become brittle and hard to manage when they include too many steps.&lt;/p&gt;
  395.  
  396. &lt;p&gt;You can create runbooks to group steps into a reusable unit or use separate projects to reduce the number of steps in a deployment process.&lt;/p&gt;
  397.  
  398. &lt;h2 id="direct-tenant-references"&gt;Direct tenant references&lt;/h2&gt;
  399.  
  400. &lt;blockquote class="blockquote"&gt;
  401. &lt;p&gt;Explicit groups should be created to manage tenants.&lt;/p&gt;
  402. &lt;/blockquote&gt;
  403.  
  404. &lt;p&gt;You'll often group tenants based on shared properties like regions, release rings, performance tiers, etc. These groupings are best expressed as tenant tags.&lt;/p&gt;
  405.  
  406. &lt;p&gt;However, it's also possible to refer to groups of tenants directly, creating an implicit group of tenants. You can see this when the same group of tenants is directly referenced across multiple resources like accounts, certificates, and targets. Replacing these implicit groups of tenants with explicit tenant tags makes it easier to manage the Octopus instance.&lt;/p&gt;
  407.  
  408. &lt;p&gt;Use tags to group tenants and use these tags rather than specific tenants for accounts, certificates, and targets.&lt;/p&gt;
  409.  
  410. &lt;h2 id="unhealthy-targets"&gt;Unhealthy targets&lt;/h2&gt;
  411.  
  412. &lt;blockquote class="blockquote"&gt;
  413. &lt;p&gt;Targets should not remain unhealthy for long periods.&lt;/p&gt;
  414. &lt;/blockquote&gt;
  415.  
  416. &lt;p&gt;Targets include health checks that indicate if they're online and healthy. Unhealthy targets are still included in deployments by default but are unlikely to complete the deployment successfully. Targets that have been unhealthy for some time likely need attention.&lt;/p&gt;
  417.  
  418. &lt;p&gt;Resolve health issues with targets, or remove them if they're no longer used.&lt;/p&gt;
  419.  
  420. &lt;h2 id="shared-git-usernames"&gt;Shared Git usernames&lt;/h2&gt;
  421.  
  422. &lt;blockquote class="blockquote"&gt;
  423. &lt;p&gt;Projects should use unique Git usernames.&lt;/p&gt;
  424. &lt;/blockquote&gt;
  425.  
  426. &lt;p&gt;Config as Code-enabled projects can either define project-specific Git credentials or reference shared credentials. Projects that define the same Git username likely indicate that they're duplicating Git credentials, which makes the Octopus instance harder to maintain.&lt;/p&gt;
  427.  
  428. &lt;p&gt;Create shared Git credentials to use in place of project-specific Git credentials.&lt;/p&gt;
  429.  
  430. &lt;h2 id="deployment-queue-times"&gt;Deployment queue times&lt;/h2&gt;
  431.  
  432. &lt;blockquote class="blockquote"&gt;
  433. &lt;p&gt;Deployments should queue for less than a minute.&lt;/p&gt;
  434. &lt;/blockquote&gt;
  435.  
  436. &lt;p&gt;The Octopus task cap limits how many tasks you execute in parallel. When the task queue exceeds the task cap, tasks wait for their turn to start. If too many tasks take too long to start, deployments and runbooks can be delayed.&lt;/p&gt;
  437.  
  438. &lt;p&gt;Increase the task cap, or if running Octopus HA, add another Server node to spread tasks between instances.&lt;/p&gt;
  439.  
  440. &lt;h2 id="unused-targets"&gt;Unused targets&lt;/h2&gt;
  441.  
  442. &lt;blockquote class="blockquote"&gt;
  443. &lt;p&gt;Targets should be actively used.&lt;/p&gt;
  444. &lt;/blockquote&gt;
  445.  
  446. &lt;p&gt;Targets represent where you perform deployments. Targets count towards license limits and often have health check tasks scheduled at regular intervals.&lt;/p&gt;
  447.  
  448. &lt;p&gt;You may not require targets you haven't used in the last month, but could still be creating tasks and contributing to the active target count on your license.&lt;/p&gt;
  449.  
  450. &lt;p&gt;Remove any targets you're no longer using.&lt;/p&gt;
  451.  
  452. &lt;h2 id="lifecycle-retention"&gt;Lifecycle retention&lt;/h2&gt;
  453.  
  454. &lt;blockquote class="blockquote"&gt;
  455. &lt;p&gt;Retention policies should be used to clean up old resources.&lt;/p&gt;
  456. &lt;/blockquote&gt;
  457.  
  458. &lt;p&gt;Lifecycle retention rules let you specify that resources, like releases and packages, get retained for a specific time or let you retain the last specified number of resources. You can also configure lifecycles to retain resources indefinitely.&lt;/p&gt;
  459.  
  460. &lt;p&gt;Retaining resources indefinitely is inefficient and can introduce performance issues over time.
  461. Use retention rules to clean up old resources to improve performance.&lt;/p&gt;
  462.  
  463. &lt;h2 id="good-practices"&gt;Good practices&lt;/h2&gt;
  464.  
  465. &lt;p&gt;You don't have to remember all these good practices. Use Octolint to do the hard work so you have more time to implement improvements.&lt;/p&gt;
  466.  
  467. &lt;p&gt;You can watch an &lt;a href="https://www.youtube.com/watch?v=hdJ3kbCPVds" rel="nofollow"&gt;introduction to Octolint on YouTube&lt;/a&gt; to see it in action and find the code on &lt;a href="https://github.com/OctopusSolutionsEngineering/OctopusRecommendationEngine" rel="nofollow"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
  468.  
  469. &lt;p&gt;Whether you improve your security by replacing API keys that don't expire or use step templates to convert complex processes into reusable templates, Octolint is a good way to find out what you can improve and make sure things stay in good shape.&lt;/p&gt;
  470.  
  471. &lt;p&gt;Happy deployments!&lt;/p&gt;
  472. </content>
  473.  </entry>
  474.  <entry>
  475.    <id>https://octopus.com/blog/liquibase-container</id>
  476.    <title type="text">Deploying database updates with Octopus and the Liquibase execution container</title>
  477.    <published>2024-02-12T14:00:00Z</published>
  478.    <updated>2024-02-13T23:32:00.6991675Z</updated>
  479.    <author>
  480.      <name>shawn.sesna@octopus.com, Octopus Deploy</name>
  481.    </author>
  482.    <link href="https://octopus.com/blog/liquibase-container" />
  483.    <content type="html">&lt;p&gt;&lt;img src="https://i.octopus.com/blog/2024-02/liquibase-container/blogimage-databaseoctopusliquibaseexecutioncontainer-2024.png" alt="Database connected to Octopus and Liquibase logos" /&gt;&lt;/p&gt;
  484.  
  485. &lt;p&gt;Until now, you had to do one of 2 things to deploy database updates using Octopus and the &lt;a href="https://liquibase.com" rel="nofollow"&gt;Liquibase&lt;/a&gt; product. The first option was installing the Liquibase CLI on the machine performing the updates. The other option was ticking the box &lt;strong&gt;Download Liquibase?&lt;/strong&gt; on the &lt;strong&gt;&lt;a href="https://library.octopus.com/step-templates/36df3e84-8501-4f2a-85cc-bd9eb22030d1/actiontemplate-liquibase-run-command" rel="nofollow"&gt;Liquibase - Run Command&lt;/a&gt;&lt;/strong&gt; community step template to dynamically download Liquibase and any dependencies at deploy time.&lt;/p&gt;
  486.  
  487. &lt;p&gt;In this post, I introduce a publicly available container image you can use with the &lt;a href="https://octopus.com/docs/projects/steps/execution-containers-for-workers"&gt;Execution Containers&lt;/a&gt; feature to execute Liquibase.&lt;/p&gt;
  488.  
  489. &lt;h2 id="using-the-liquibase-container-image"&gt;Using the Liquibase container image&lt;/h2&gt;
  490.  
  491. &lt;p&gt;The &lt;a href="https://hub.docker.com/r/octopuslabs/liquibase-workertools" rel="nofollow"&gt;octopuslabs/liquibase-workertools&lt;/a&gt; container image comes with most of the components to perform a deployment, including:&lt;/p&gt;
  492.  
  493. &lt;ul&gt;
  494. &lt;li&gt;Liquibase&lt;/li&gt;
  495. &lt;li&gt;Java&lt;/li&gt;
  496. &lt;li&gt;PowerShell&lt;/li&gt;
  497. &lt;li&gt;AWS CLI (to support AWS IAM authentication)&lt;/li&gt;
  498. &lt;/ul&gt;
  499.  
  500. &lt;p&gt;If you're selecting a database type that Liquibase doesn't ship with, like Cassandra or MongoDB, the &lt;strong&gt;Liquibase - Run Command&lt;/strong&gt; template automatically detects if it's running in a container and downloads any missing dependencies.&lt;/p&gt;
  501.  
  502. &lt;h2 id="updating-your-process"&gt;Updating your process&lt;/h2&gt;
  503.  
  504. &lt;p&gt;If you're using the &lt;strong&gt;Liquibase - Run Command&lt;/strong&gt;, the only change you need to make is updating the &lt;strong&gt;Container Image&lt;/strong&gt; section.&lt;/p&gt;
  505.  
  506. &lt;ol&gt;
  507. &lt;li&gt;Change &lt;strong&gt;Runs directly on a worker&lt;/strong&gt; to &lt;strong&gt;Runs inside a container, on a worker&lt;/strong&gt;.&lt;/li&gt;
  508. &lt;li&gt;Specify the image as &lt;code&gt;octopuslabs/liquibase-workertools&lt;/code&gt;.&lt;/li&gt;
  509. &lt;/ol&gt;
  510.  
  511. &lt;div class="alert alert-info"&gt;&lt;p&gt;If you don't have an &lt;a href="https://octopus.com/docs/packaging-applications/package-repositories/docker-registries" class="alert-link"&gt;external feed&lt;/a&gt; for Docker Hub, you'll need that as well.&lt;/p&gt;
  512. &lt;/div&gt;
  513.  
  514. &lt;p&gt;&lt;a href='#' data-featherlight='https://i.octopus.com/blog/2024-02/liquibase-container/octopus-liquibase-container.png' class='zoom' data-title=''&gt;&lt;img src='https://i.octopus.com/blog/2024-02/liquibase-container/octopus-liquibase-container.png' class="img-fluid center" alt='Select execution container' /&gt;&lt;/a&gt;&lt;/p&gt;
  515.  
  516. &lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
  517.  
  518. &lt;p&gt;We strive to make using Octopus Deploy as easy as possible. The &lt;code&gt;octopuslabs/liquibase-workertools&lt;/code&gt; image makes integrating the Liquibase product into your deployment process much easier, especially when coupled with Octopus Cloud &lt;a href="https://octopus.com/docs/infrastructure/workers/dynamic-worker-pools"&gt;Dynamic Workers&lt;/a&gt;.&lt;/p&gt;
  519.  
  520. &lt;p&gt;Happy deployments!&lt;/p&gt;
  521. </content>
  522.  </entry>
  523.  <entry>
  524.    <id>https://octopus.com/blog/octopus-is-a-quarterback</id>
  525.    <title type="text">Octopus is your deployment pipeline's quarterback</title>
  526.    <published>2024-02-07T14:00:00Z</published>
  527.    <updated>2024-02-06T07:57:13.2709103Z</updated>
  528.    <author>
  529.      <name>andrew.corrigan@octopus.com, Octopus Deploy</name>
  530.    </author>
  531.    <link href="https://octopus.com/blog/octopus-is-a-quarterback" />
  532.    <content type="html">&lt;p&gt;&lt;img src="https://i.octopus.com/blog/2024-02/octopus-is-a-quarterback/blog-email-octopusdeployment-pipelines-quarterback-750x400-2024.png" alt="Octopus character wearing a gridiron helmet holding a football." /&gt;&lt;/p&gt;
  533.  
  534. &lt;p&gt;I &lt;em&gt;love&lt;/em&gt; analogies as a learning tool. Applying daunting new concepts to simple ideas you already know makes learning about new things so much easier.&lt;/p&gt;
  535.  
  536. &lt;p&gt;Thanks to the Super Bowl taking place this weekend, I thought about using sport as a way to explain software development practices.&lt;/p&gt;
  537.  
  538. &lt;p&gt;I wondered if there were any connections between gridiron's unique phases and the methodologies software teams adopt. Besides the loose idea that both software and gridiron teams try to 'gain yards' to put themselves in the best position to achieve goals, there wasn't much to work with.&lt;/p&gt;
  539.  
  540. &lt;p&gt;Until I realized that the deployment pipeline itself is a &lt;em&gt;team&lt;/em&gt; of sorts.&lt;/p&gt;
  541.  
  542. &lt;h2 id="the-deployment-pipeline-as-a-gridiron-team"&gt;The deployment pipeline as a gridiron team&lt;/h2&gt;
  543.  
  544. &lt;p&gt;Like American football team players, each tool in a deployment pipeline has a specialist focus independent of the others. Yet, working together, all tools combine to serve the overall purpose - to get your software to production (the software equivalent of scoring a touchdown.)&lt;/p&gt;
  545.  
  546. &lt;p&gt;I looked at a typical American Football offensive line-up. By considering the ball as software (commentators sometimes even refer to the ball as 'the package', funnily enough), it became easy to make parallels between player positions and deployment pipeline tooling.&lt;/p&gt;
  547.  
  548. &lt;p&gt;The coach is the DevOps engineer and their playbook is the deployment process. Both coach and DevOps engineer know how they want things to work during each phase. Both decide how the team should best deliver 'the package'. Both decide on the team's structure and how it'll operate. Both always look for improvements and make changes when needed.&lt;/p&gt;
  549.  
  550. &lt;p&gt;The center is the player that snaps the ball back to the quarterback to start each offensive play. This could be either build service or package repository, depending on the pipeline you're comparing to. After all, both tools hand off packaged software to the deployment tool.&lt;/p&gt;
  551.  
  552. &lt;p&gt;That, naturally, makes the deployment tool the pipeline's quarterback.&lt;/p&gt;
  553.  
  554. &lt;p&gt;&lt;a href='#' data-featherlight='https://i.octopus.com/blog/2024-02/octopus-is-a-quarterback/deployment-pipeline-gridiron-team.png' class='zoom' data-title=''&gt;&lt;img src='https://i.octopus.com/blog/2024-02/octopus-is-a-quarterback/deployment-pipeline-gridiron-team.png' class="img-fluid center" alt='A gridiron tactics overview with key positions replaced by DevOps tooling' /&gt;&lt;/a&gt;&lt;/p&gt;
  555.  
  556. &lt;h2 id="why-octopus-is-the-quarterback"&gt;Why Octopus is the quarterback&lt;/h2&gt;
  557.  
  558. &lt;p&gt;I know, I know. It might seem a little arrogant to relate our tool to the most important position in an American football team (and in an analogy I made up). There are definite similarities, though.&lt;/p&gt;
  559.  
  560. &lt;p&gt;For every offensive play in an NFL game, where the goal is to move the ball from one end of the field to the other, the quarterback is the team's &lt;em&gt;master of distribution&lt;/em&gt;. The moment they receive the ball from their center, they look to deliver it to a willing target predetermined by the play they're running.&lt;/p&gt;
  561.  
  562. &lt;p&gt;Like the mighty quarterback, Octopus is also a delivery specialist. Octopus takes packages from a build service or package repository and promptly delivers them to the intended target with a predefined, well-practiced deployment process.&lt;/p&gt;
  563.  
  564. &lt;p&gt;What's more, the quarterback can deliver the ball to a variety of targets. They could throw long to a wide receiver as the team tries a classic 'Hail Mary' or pass short to a running back. Octopus also has variety in its passing game and can deliver software to any target or combination of deployment targets. Octopus has the range, whether it's Kubernetes, cloud services, physical hardware, or hybrid environments.&lt;/p&gt;
  565.  
  566. &lt;p&gt;Lastly, quarterbacks can also act as an on-field coach of sorts. They remind everyone of their roles in the next phase, the shape they should take, and make situational tweaks when needs arise. Likewise, Octopus helps organize the other troops in your pipeline with its &lt;a href="https://octopus.com/docs/runbooks"&gt;Runbooks feature&lt;/a&gt;, so you can be sure your other tools are ready to support your software.&lt;/p&gt;
  567.  
  568. &lt;h2 id="v22.35-set-hut"&gt;&amp;quot;v22.35, set, hut!&amp;quot;&lt;/h2&gt;
  569.  
  570. &lt;p&gt;So, there you have it! That's how a deployment pipeline is just like an American football team and Octopus its quarterback.&lt;/p&gt;
  571.  
  572. &lt;p&gt;If you're looking to sign a star quarterback to improve results for your team of DevOps tooling, why not &lt;a href="https://octopus.com/start?location=nav-bar"&gt;see how we perform in tryouts&lt;/a&gt;?&lt;/p&gt;
  573.  
  574. &lt;p&gt;Happy deployments!&lt;/p&gt;
  575. </content>
  576.  </entry>
  577.  <entry>
  578.    <id>https://octopus.com/blog/inside-devops-rahul-kumar-verma</id>
  579.    <title type="text">Inside DevOps with Rahul Kumar Verma from Infosys</title>
  580.    <published>2024-02-05T14:00:00Z</published>
  581.    <updated>2024-01-31T06:03:14.2508638Z</updated>
  582.    <author>
  583.      <name>joanna.wyganowska@octopus.com, Octopus Deploy</name>
  584.    </author>
  585.    <link href="https://octopus.com/blog/inside-devops-rahul-kumar-verma" />
  586.    <content type="html">&lt;p&gt;&lt;img src="https://i.octopus.com/blog/2024-02/inside-devops-rahul-kumar-verma/blogimage-insidedevops-rahulkumar-2024.png" alt="Photo of Rahul Kumar Verma" /&gt;&lt;/p&gt;
  587.  
  588. &lt;p&gt;This post is the next in our &lt;a href="https://octopus.com/blog/tag/Inside%20DevOps"&gt;Inside DevOps series&lt;/a&gt;, where we share lessons learned from those on the frontlines of DevOps.&lt;/p&gt;
  589.  
  590. &lt;p&gt;Hear from &lt;a href="https://www.linkedin.com/in/rahul-kumar-verma-558812161/" rel="nofollow"&gt;Rahul Kumar Verma&lt;/a&gt;, DevOps Engineer at Infosys, a  global leader in next-generation digital services and consulting.&lt;/p&gt;
  591.  
  592. &lt;p&gt;&lt;strong&gt;What is DevOps to you? How do you define it?&lt;/strong&gt;&lt;/p&gt;
  593.  
  594. &lt;p&gt;&lt;em&gt;Rahul:&lt;/em&gt; DevOps to me is like a well-choreographed dance between developers and operations teams, where they seamlessly collaborate to deliver and maintain software. For example, let's imagine developers writing code for a new feature. Simultaneously, automated tools ensure Continuous Integration, testing, and deployment. This harmonious interaction helps achieve faster, more reliable software releases.&lt;/p&gt;
  595.  
  596. &lt;p&gt;&lt;strong&gt;How did your DevOps journey start?&lt;/strong&gt;&lt;/p&gt;
  597.  
  598. &lt;p&gt;&lt;em&gt;Rahul:&lt;/em&gt; My journey in DevOps started in 2021. I became interested in streamlining the software development lifecycle and improving collaboration between development and operations teams.&lt;/p&gt;
  599.  
  600. &lt;p&gt;In my early experiences, I focused on implementing Continuous Integration and deployment pipelines to automate build and release processes. Over time, I’ve gained hands-on experience with various DevOps tools and methodologies. I've been involved in application development and maintenance projects where I applied DevOps principles to enhance efficiency and reliability in software delivery. I'm continually learning and adapting to new technologies and practices in the ever-evolving field of DevOps.&lt;/p&gt;
  601.  
  602. &lt;p&gt;&lt;strong&gt;What's the most challenging part of DevOps?&lt;/strong&gt;&lt;/p&gt;
  603.  
  604. &lt;p&gt;&lt;em&gt;Rahul:&lt;/em&gt; I think it depends on the organization and its circumstances. The most common challenges I’ve seen are implementing a cultural shift and fostering collaboration between siloed development and operations teams. Overcoming resistance to change and promoting a shared responsibility for the entire software delivery process is a significant part of DevOps adoption. You also need to choose the right tools and ensure they work seamlessly together. Automating and integrating security on each environment’s levels are constant challenges too.&lt;/p&gt;
  605.  
  606. &lt;p&gt;&lt;strong&gt;What's the most rewarding part of DevOps?&lt;/strong&gt;&lt;/p&gt;
  607.  
  608. &lt;p&gt;&lt;em&gt;Rahul:&lt;/em&gt; The most rewarding aspect of DevOps is its transformative power to create a synergy between development and operations. It fosters a culture of collaboration, shared responsibility, and continuous improvement. Witnessing the break down of traditional silos, DevOps empowers teams to work towards common goals, leading to faster time-to-market, enhanced software quality, and increased business agility.&lt;/p&gt;
  609.  
  610. &lt;p&gt;&lt;strong&gt;What DevOps trend have you been following lately?&lt;/strong&gt;&lt;/p&gt;
  611.  
  612. &lt;p&gt;&lt;em&gt;Rahul:&lt;/em&gt; The adoption of cloud-native technologies, like Kubernetes and Docker. I follow it closely and I use these technologies in my current projects.&lt;/p&gt;
  613.  
  614. &lt;p&gt;&lt;strong&gt;What are some DevOps best practices your organization has implemented?&lt;/strong&gt;&lt;/p&gt;
  615.  
  616. &lt;p&gt;&lt;em&gt;Rahul:&lt;/em&gt; We keep the focus on automating the manual tasks, especially the build and release processes. Other DevOps best practices include integration of security tools into CI/CD pipelines, cloud infrastructure set-up, deletion of un-used cloud resources, preparing the project documents, and daily scrum calls. These activities give me a clear picture of things happening in the project.&lt;/p&gt;
  617.  
  618. &lt;p&gt;&lt;strong&gt;What's the biggest challenge Octopus has helped you with?&lt;/strong&gt;&lt;/p&gt;
  619.  
  620. &lt;p&gt;&lt;em&gt;Rahul:&lt;/em&gt; Octopus Deploy facilitates reliable rollback and roll-forward mechanisms. If an issue arises during deployment, we can easily revert to a previous version or proceed with a newer version. This minimizes downtime and impact on users.&lt;/p&gt;
  621.  
  622. &lt;p&gt;Also, Octopus supports deployment to a variety of platforms, including Windows, Linux, and cloud environments. This flexibility is beneficial when working with diverse technology stacks and hybrid infrastructure.&lt;/p&gt;
  623.  
  624. &lt;p&gt;&lt;strong&gt;What advice would you give someone just starting their DevOps journey?&lt;/strong&gt;&lt;/p&gt;
  625.  
  626. &lt;p&gt;&lt;em&gt;Rahul:&lt;/em&gt;  Focus on understanding the collaborative essence of DevOps. Cultivate a mindset of continuous learning and diving into hands-on experiences with key tools. Begin small, automate relentlessly, and prioritize effective communication and teamwork.&lt;/p&gt;
  627.  
  628. &lt;p&gt;Embrace failure as a learning opportunity, stay curious about emerging technologies, and remember that DevOps is as much about people and culture as it is about automation.&lt;/p&gt;
  629.  
  630. &lt;p&gt;Commit to the journey, be patient with the process, and relish the satisfaction of witnessing improved collaboration, faster delivery, and increased efficiency in your software development practices.&lt;/p&gt;
  631.  
  632. &lt;p&gt;&lt;strong&gt;What DevOps book would you recommend reading?&lt;/strong&gt;&lt;/p&gt;
  633.  
  634. &lt;p&gt;&lt;em&gt;Rahul:&lt;/em&gt;  My must-read is the &lt;em&gt;&lt;a href="https://octopus.com/devops/reading-list/#the-devops-handbook"&gt;DevOps Handbook: How to Create World-Class Agility, Reliability, &amp;amp; Security in Technology Organizations&lt;/a&gt;&lt;/em&gt; by Gene Kim, Jez Humble, Patrick Debois, and John Willis.&lt;/p&gt;
  635.  
  636. &lt;p&gt;&lt;strong&gt;What's one thing about you that might surprise us?&lt;/strong&gt;&lt;/p&gt;
  637.  
  638. &lt;p&gt;&lt;em&gt;Rahul:&lt;/em&gt; One thing that might surprise you is my deep connection to agriculture and farming. Growing up in a farmer family, I developed a profound appreciation for the land and the hard work that goes into cultivating crops. This background has instilled in me a strong work ethic and resilience. It shaped my perspective on sustainability and the importance of responsible resource management.&lt;/p&gt;
  639.  
  640. &lt;p&gt;While my professional journey may seem unrelated, the values instilled in me through farming continue to influence my approach to problem-solving, emphasizing long-term thinking and a commitment to positively impacting the environment whenever possible.&lt;/p&gt;
  641.  
  642. &lt;div class="alert alert-info"&gt;&lt;p&gt;If you’d like to be featured in our series, &lt;a href="https://octopus.com/blog/tag/Inside%20DevOps" class="alert-link"&gt;Inside DevOps&lt;/a&gt;, please reach out to &lt;a href="https://www.linkedin.com/in/joannawyganowska/" class="alert-link" rel="nofollow"&gt;Joanna on LinkedIn&lt;/a&gt; to set up a time for a quick chat.&lt;/p&gt;
  643. &lt;/div&gt;
  644. </content>
  645.  </entry>
  646.  <entry>
  647.    <id>https://octopus.com/blog/git-resources-in-deployments</id>
  648.    <title type="text">Using Git resources directly in deployments</title>
  649.    <published>2024-01-29T14:00:00Z</published>
  650.    <updated>2024-01-23T00:46:06.8719998Z</updated>
  651.    <author>
  652.      <name>robert.erez@octopus.com, Octopus Deploy</name>
  653.    </author>
  654.    <link href="https://octopus.com/blog/git-resources-in-deployments" />
  655.    <content type="html">&lt;p&gt;&lt;img src="https://i.octopus.com/blog/2024-01/git-resources-in-deployments/blogimage-usinggitresourcesdirectlyindeployment-2024.png" alt="Code packages coming out of a Git machine, moving along a conveyor belt into an Octopus machine, then becoming versioned releases." /&gt;&lt;/p&gt;
  656.  
  657. &lt;p&gt;Deployments often rely on artifacts that don’t need processing during a Continuous Integration (CI) build. Scripts you can source directly from a repository without intermediate compilation are the norm. In some systems, this includes entire declarative configuration files, like Kubernetes manifests or Terraform templates. &lt;/p&gt;
  658.  
  659. &lt;p&gt;You previously needed to bundle these resources into an artifact, like a zip archive, for Octopus. These build outputs existed just so Octopus could reference them later, to extract and use during a deployment. This felt unnatural and added steps to an otherwise simple process. If the file is in your repository, you should be able to use it in your deployment directly.&lt;/p&gt;
  660.  
  661. &lt;p&gt;Updates to Octopus will make it possible to source these dependencies from your Git repository in a deployment process.&lt;/p&gt;
  662.  
  663. &lt;h2 id="the-benefits-of-sourcing-from-git"&gt;The benefits of sourcing from Git&lt;/h2&gt;
  664.  
  665. &lt;h3 id="improved-development-experience"&gt;Improved development experience&lt;/h3&gt;
  666.  
  667. &lt;p&gt;When creating or updating scripts or configurations for a deployment, you probably want to run them locally to validate your changes. Rather than cutting and pasting files between the Octopus portal and your local file system, it's safer and more reliable to edit the scripts directly from files sourced from a repository. This provides all the benefits of using source control:&lt;/p&gt;
  668.  
  669. &lt;ul&gt;
  670. &lt;li&gt;Versioning&lt;/li&gt;
  671. &lt;li&gt;Auditability&lt;/li&gt;
  672. &lt;li&gt;Change control&lt;/li&gt;
  673. &lt;/ul&gt;
  674.  
  675. &lt;h3 id="accessing-dependencies"&gt;Accessing dependencies&lt;/h3&gt;
  676.  
  677. &lt;p&gt;Often the dependencies include more than just one file. A Kustomize deployment is typically made up of multiple configuration files in various folder locations. Several sub-scripts might make up complex scripts, or they might rely on small tools. Since we clone the entire repository, all these pieces will be available at deployment time.&lt;/p&gt;
  678.  
  679. &lt;h3 id="managing-centralized-scripts-and-resources"&gt;Managing centralized scripts and resources&lt;/h3&gt;
  680.  
  681. &lt;p&gt;Storing scripts in a Git repository rather than in the process itself offers another way to share processes across projects and Octopus instances. Perhaps your platform team has provided a managed Kubernetes manifest for multiple teams to deploy their application. Each team only needs to configure their different application images and variables injected into the manifest at runtime. You might also have maintenance scripts to use in runbooks across different spaces. When you update the process, you want all new releases to use the latest version without consumers having to think about it. All sorts of new, simpler templating and sharing options become available.&lt;/p&gt;
  682.  
  683. &lt;h3 id="simpler-build-pipelines"&gt;Simpler build pipelines&lt;/h3&gt;
  684.  
  685. &lt;p&gt;Retrieving dependencies directly from a Git repository removes the intermediate packaging process to bundle them into a consumable artifact for Octopus. After you commit changes, they're available for deployment. This may eliminate the need to manage complex build processes, compress files, or store keys and passwords to access the feeds where you store these artifacts. Future improvements might result in these commits being automatically pushed to a release.&lt;/p&gt;
  686.  
  687. &lt;h2 id="two-new-git-sourced-options"&gt;Two new Git-sourced options&lt;/h2&gt;
  688.  
  689. &lt;p&gt;There are 2 new scenarios we  support:&lt;/p&gt;
  690.  
  691. &lt;ul&gt;
  692. &lt;li&gt;Files that exist in the same Git repository where you store your version-controlled Octopus project&lt;/li&gt;
  693. &lt;li&gt;Files that exist in some other external Git repository.&lt;/li&gt;
  694. &lt;/ul&gt;
  695.  
  696. &lt;p&gt;Let’s explore these 2 options and how you might use them.&lt;/p&gt;
  697.  
  698. &lt;h3 id="external-git-references"&gt;External Git references&lt;/h3&gt;
  699.  
  700. &lt;p&gt;We recently added support for &lt;a href="https://octopus.com/blog/manifests-from-git"&gt;YAML manifests from Git&lt;/a&gt; in the &lt;strong&gt;Deploy raw Kubernetes YAML&lt;/strong&gt; step. This provided an early look at a new way of sourcing dependencies for your deployments. We streamlined bringing entire Kubernetes manifests directly into a deployment without any intermediate packaging or build steps outside Octopus.&lt;/p&gt;
  701.  
  702. &lt;p&gt;This functionality will soon be available to all steps that support scripts and configuration manifests. This makes sourcing scripts from your Git repositories easier than ever and can centralize these shared dependencies across multiple Octopus projects.&lt;/p&gt;
  703.  
  704. &lt;h4 id="externally-sourced-script-example"&gt;Externally-sourced script example&lt;/h4&gt;
  705.  
  706. &lt;p&gt;In the following example, we have a simple Bash script committed to our repository.&lt;/p&gt;
  707.  
  708. &lt;p&gt;&lt;a href='#' data-featherlight='https://i.octopus.com/blog/2024-01/git-resources-in-deployments/external-git-bash.png' class='zoom' data-title=''&gt;&lt;img src='https://i.octopus.com/blog/2024-01/git-resources-in-deployments/external-git-bash.png' class="img-fluid center" alt='Simple Script in Git' /&gt;&lt;/a&gt;&lt;/p&gt;
  709.  
  710. &lt;p&gt;We can now reference this script directly, without packaging it. You do this by selecting the new Git Repository option in our &lt;strong&gt;Run a Script&lt;/strong&gt; step in Octopus. This works for &lt;a href="https://octopus.com/docs/projects/version-control"&gt;Configuration as Code (Config as Code) projects&lt;/a&gt; and standard database-backed projects.&lt;/p&gt;
  711.  
  712. &lt;p&gt;&lt;a href='#' data-featherlight='https://i.octopus.com/blog/2024-01/git-resources-in-deployments/external-git-run-a-script.png' class='zoom' data-title=''&gt;&lt;img src='https://i.octopus.com/blog/2024-01/git-resources-in-deployments/external-git-run-a-script.png' class="img-fluid center" alt='Run-a-Script Step with external Git resource' /&gt;&lt;/a&gt;&lt;/p&gt;
  713.  
  714. &lt;p&gt;Providing the default branch on the step itself means you can easily provide backward compatibility with tooling that might not yet know this feature exists. At the time of release creation, the tip of this branch will source the script contents.&lt;/p&gt;
  715.  
  716. &lt;p&gt;&lt;a href='#' data-featherlight='https://i.octopus.com/blog/2024-01/git-resources-in-deployments/external-git-release-creation.png' class='zoom' data-title=''&gt;&lt;img src='https://i.octopus.com/blog/2024-01/git-resources-in-deployments/external-git-release-creation.png' class="img-fluid center" alt='Release creation with external Git resource' /&gt;&lt;/a&gt;&lt;/p&gt;
  717.  
  718. &lt;p&gt;The commit selected during release creation gets recorded. At deployment time, that specific commit gets checked out and used during the execution. This means that, just like with standard packages, the commit needs to be available during the deployment. If the repository gets deleted, for example, future releases referencing it may fail to run.&lt;/p&gt;
  719.  
  720. &lt;h4 id="limitations"&gt;Limitations&lt;/h4&gt;
  721.  
  722. &lt;ul&gt;
  723. &lt;li&gt;&lt;p&gt;We have some work items in our backlog to support selecting the branch at release creation. However, at the time of writing, neither the branch nor the commit has changed during release creation. The tip of the defined default branch will always get recorded at release creation.&lt;/p&gt;
  724. &lt;/li&gt;
  725. &lt;li&gt;&lt;p&gt;To resolve a specific commit at release creation time, the &lt;code&gt;Repository Url&lt;/code&gt; and &lt;code&gt;Branch&lt;/code&gt; properties only support using unscoped variables. Conversely, the &lt;code&gt;Path&lt;/code&gt; and &lt;code&gt;Parameters&lt;/code&gt; options can use any scope since they get resolved and used during a deployment itself. Using a variable with an unsupported scope will result in an error at release creation.&lt;/p&gt;
  726. &lt;/li&gt;
  727. &lt;li&gt;&lt;p&gt;A full clone of the relevant project repository on the Octopus Server machine takes place during deployment to extract relevant files. Octopus Server can't know which files to use from deep within a customer’s potentially dynamic scripts. As such, the entire repository contents get transferred across to the target or Worker during a deployment. In the future, we may support cloning on the target or performing shallow clones. In this release, though, you should expect some time spent on the initial clone for each repository used.&lt;/p&gt;
  728. &lt;/li&gt;
  729. &lt;/ul&gt;
  730.  
  731. &lt;h3 id="config-as-code-project-references"&gt;Config as Code project references&lt;/h3&gt;
  732.  
  733. &lt;p&gt;If you're using Config as Code in Octopus, you'll soon be able to use files stored in the same repository as Octopus's deployment process files. Like the externally sourced scripts above, this will let you write and commit your files directly into a Git repository and use them in your project.&lt;/p&gt;
  734.  
  735. &lt;p&gt;By sourcing the scripts from the same repository as your project configuration, there's much less information to provide to Octopus to source the relevant files. The same repository and commit checked out for the deployment process get used to source the script itself. &lt;/p&gt;
  736.  
  737. &lt;p&gt;This also makes it simpler and more convenient to iterate on a script alongside the deployment process that uses it. Regardless of the branch or commit you're deploying, the right dependencies will automatically get included in the deployment. You can work on your scripts and processes simultaneously in a feature branch, testing them together before merging the changes in a single commit into your release branch.&lt;/p&gt;
  738.  
  739. &lt;p&gt;This also bypasses the limits with external Git references mentioned above that constrain the source of branch files. Since the release will automatically use whatever commit the process is using, this could be any branch, tag, or pull request.&lt;/p&gt;
  740.  
  741. &lt;h4 id="config-as-code-project-sourced-script-example"&gt;Config as Code project sourced script example&lt;/h4&gt;
  742.  
  743. &lt;p&gt;When configuring the sample Terraform step in a Config as Code-enabled project, the &lt;strong&gt;Git repository&lt;/strong&gt; option shows a second option for &lt;strong&gt;Repository Source&lt;/strong&gt;.  By selecting &lt;strong&gt;Project&lt;/strong&gt; you use the repository associated with the relevant Config as Code project. By selecting &lt;strong&gt;External&lt;/strong&gt;, you expose the options noted above for external Git references.&lt;/p&gt;
  744.  
  745. &lt;p&gt;&lt;a href='#' data-featherlight='https://i.octopus.com/blog/2024-01/git-resources-in-deployments/cac-git-terraform.png' class='zoom' data-title=''&gt;&lt;img src='https://i.octopus.com/blog/2024-01/git-resources-in-deployments/cac-git-terraform.png' class="img-fluid center" alt='Terraform Step with project Git resource' /&gt;&lt;/a&gt;&lt;/p&gt;
  746.  
  747. &lt;p&gt;The &lt;strong&gt;Repository Source&lt;/strong&gt; option only shows in Config as Code projects. It's otherwise implied for non-Config as Code projects with &lt;strong&gt;Git repository&lt;/strong&gt; sourced files using an external repository.&lt;/p&gt;
  748.  
  749. &lt;p&gt;After you configure your deployment process and go to create the release, you only need to select the branch that defines the Config as Code project process. The same commit selected for the release itself gets used for sourcing the relevant files.&lt;/p&gt;
  750.  
  751. &lt;p&gt;&lt;a href='#' data-featherlight='https://i.octopus.com/blog/2024-01/git-resources-in-deployments/image.png' class='zoom' data-title=''&gt;&lt;img src='https://i.octopus.com/blog/2024-01/git-resources-in-deployments/image.png' class="img-fluid center" alt='Alt text' /&gt;&lt;/a&gt;&lt;/p&gt;
  752.  
  753. &lt;div class="alert alert-info"&gt;&lt;p&gt;If your Kubernetes or Helm manifests reference &lt;em&gt;other&lt;/em&gt; repositories, these still get retrieved by the relevant tool (like kubectl or helm) at deployment time, as is standard for those commands.&lt;/p&gt;
  754. &lt;/div&gt;
  755.  
  756. &lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
  757.  
  758. &lt;p&gt;Although we've offered &lt;a href="https://octopus.com/docs/packaging-applications/package-repositories/github-feeds"&gt;GitHub Feeds&lt;/a&gt; for some time, this brought with it CI complexities. It also led to unnecessary overheads in today's world of GitOps.&lt;/p&gt;
  759.  
  760. &lt;p&gt;To open up new ways to structure your deployments, features will roll out to cloud instances in the next few weeks, so you can source your deployment dependencies from:&lt;/p&gt;
  761.  
  762. &lt;ul&gt;
  763. &lt;li&gt;The Git repository used for your Config as Code project&lt;/li&gt;
  764. &lt;li&gt;A separate external repository&lt;/li&gt;
  765. &lt;/ul&gt;
  766.  
  767. &lt;p&gt;We're excited to see how you use these features. Please let us know in the comments section below what new capabilities this does (or doesn't) open up for your release pipelines.&lt;/p&gt;
  768.  
  769. &lt;p&gt;Happy deployments!&lt;/p&gt;
  770. </content>
  771.  </entry>
  772.  <entry>
  773.    <id>https://octopus.com/blog/se-jack-of-all-trades</id>
  774.    <title type="text">Solutions engineer - the jack of all trades</title>
  775.    <published>2024-01-22T14:00:00Z</published>
  776.    <updated>2024-01-19T05:21:12.7070798Z</updated>
  777.    <author>
  778.      <name>shawn.sesna@octopus.com, Octopus Deploy</name>
  779.    </author>
  780.    <link href="https://octopus.com/blog/se-jack-of-all-trades" />
  781.    <content type="html">&lt;p&gt;&lt;img src="https://i.octopus.com/blog/2024-01/se-jack-of-all-trades/blogimage-jackofalltradesisagoodthing-2024.png" alt="Octopus-branded jack of diamonds card" /&gt;&lt;/p&gt;
  782.  
  783. &lt;p&gt;In the tech world, being a &amp;quot;jack of all trades&amp;quot; is often taken negatively as people finish the sentence with &amp;quot;master of none&amp;quot;.  It means you have a broad but shallow knowledge of many things, but your knowledge doesn't go deep in any one area. People consider this a hindrance rather than a boon.&lt;/p&gt;
  784.  
  785. &lt;p&gt;However, the phrase &amp;quot;jack of all trades, master of none&amp;quot; is incomplete. The full saying goes, &amp;quot;jack of all trades master of none, though oftentimes better than master of one&amp;quot;.  This is appropriate when it comes to the role of solutions engineer (SE), especially at Octopus Deploy.&lt;/p&gt;
  786.  
  787. &lt;h2 id="the-solutions-engineer-se-role"&gt;The solutions engineer (SE) role&lt;/h2&gt;
  788.  
  789. &lt;p&gt;At Octopus Deploy, the SEs need to know the entire software development lifecycle (SDLC), from source control to the deployed application and what hosts it. The knowledge we need falls into the following categories:&lt;/p&gt;
  790.  
  791. &lt;ul&gt;
  792. &lt;li&gt;Source control management&lt;/li&gt;
  793. &lt;li&gt;Build server&lt;/li&gt;
  794. &lt;li&gt;Artifact repository&lt;/li&gt;
  795. &lt;li&gt;Application host&lt;/li&gt;
  796. &lt;/ul&gt;
  797.  
  798. &lt;h3 id="source-control-management"&gt;Source control management&lt;/h3&gt;
  799.  
  800. &lt;p&gt;Git is the most common technology for source control management (SCM). SCM server technology, like Azure DevOps, Bitbucket, GitLab, and GitHub, implements Git as an option or the method of source control.  It's rare that an Octopus SE needs to work with a customer in source control management. However, our &lt;a href="https://octopus.com/docs/packaging-applications/build-servers/build-information"&gt;build information&lt;/a&gt; feature uses commit information, so it's vital to know how Git works.&lt;/p&gt;
  801.  
  802. &lt;p&gt;Source control is the beginning of the SDLC and feeds directly into the next topic, build servers.&lt;/p&gt;
  803.  
  804. &lt;h3 id="build-servers"&gt;Build servers&lt;/h3&gt;
  805.  
  806. &lt;p&gt;Build servers compile software on independent runners. They  ensure the code builds correctly and there aren't any missing dependencies. Like SCM, you have many build server choices. Some are part of all-in-one platforms, like Azure DevOps or GitLab. There are also dedicated build servers, like CircleCI or TeamCity.&lt;/p&gt;
  807.  
  808. &lt;p&gt;Build servers are often the first connection point with Octopus Deploy, so our SEs need to know many build servers and how to construct their build definitions. If Octopus doesn't have a plugin, SEs need to know how to invoke the Octopus CLI or make API calls from the build server.&lt;/p&gt;
  809.  
  810. &lt;p&gt;Build servers often produce artifacts that need to deploy to the application host. Whether the artifact is a container or an executable, an artifact repository needs to store the artifacts.&lt;/p&gt;
  811.  
  812. &lt;h3 id="artifact-repository"&gt;Artifact repository&lt;/h3&gt;
  813.  
  814. &lt;p&gt;While Octopus comes with a built-in repository, some customers use other repository tools. All-in-one platforms often have their own repositories. There are also other, purpose-built repositories, like Artifactory and Nexus. While the repository types implement the same protocols (like Nuget, Maven, and Docker registry), each platform connects to its endpoints differently. Octopus SEs need to be familiar with many different repository technologies to help customers connect with Octopus.&lt;/p&gt;
  815.  
  816. &lt;h3 id="application-host"&gt;Application host&lt;/h3&gt;
  817.  
  818. &lt;p&gt;The last part of the SDLC is the deployment of an application to an application host. This category requires the most extensive knowledge.&lt;/p&gt;
  819.  
  820. &lt;p&gt;Some application host technologies have many solutions. You can host the same Java application on Tomcat, Wildfly, IBM Websphere Liberty, or Payara (and perhaps others). However, each technology deploys the application to the server differently.&lt;/p&gt;
  821.  
  822. &lt;p&gt;In the container world, cloud providers have their own implementation of container orchestration. These include AWS Elastic Container Service (ECS) or Azure Container Instances (ACI), and their implementation of Kubernetes. This includes Azure Kubernetes Service (AKS), AWS Elastic Kubernetes Service (EKS), and Google Kubernetes Engine (GKE).&lt;/p&gt;
  823.  
  824. &lt;p&gt;Some cloud providers also offer managementless Kubernetes, like Azure Container Apps.(Managementless here means that Azure manages the cluster you deploy to. All you have to worry about is deploying the containers.)&lt;/p&gt;
  825.  
  826. &lt;p&gt;Other things we need to know include:&lt;/p&gt;
  827.  
  828. &lt;ul&gt;
  829. &lt;li&gt;Methods for automating database deployments&lt;/li&gt;
  830. &lt;li&gt;Specialized categories like automating deployments of SQL Server Reporting Services (SSRS) reports or SQL Server Integration Services (SSIS) packages&lt;/li&gt;
  831. &lt;/ul&gt;
  832.  
  833. &lt;p&gt;For database deployments, we need to know about the database technology you're deploying to. For example, Oracle is very different to SQL Server.&lt;/p&gt;
  834.  
  835. &lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
  836.  
  837. &lt;p&gt;Needing to know a little about a lot is not unique to Octopus or a solutions engineering role. Having broad rather than deep knowledge is an asset. This is especially the case when helping someone integrate technologies.&lt;/p&gt;
  838.  
  839. &lt;p&gt;If you identify as a jack of all trades, know that your skills are indeed useful and needed.&lt;/p&gt;
  840.  
  841. &lt;p&gt;Happy deployments!&lt;/p&gt;
  842. </content>
  843.  </entry>
  844.  <entry>
  845.    <id>https://octopus.com/blog/set-up-local-k8s-deployment-pipeline</id>
  846.    <title type="text">Set up a local Kubernetes deployment pipeline</title>
  847.    <published>2024-01-15T14:00:00Z</published>
  848.    <updated>2023-12-21T03:27:09.1772881Z</updated>
  849.    <author>
  850.      <name>andrew.corrigan@octopus.com, Octopus Deploy</name>
  851.    </author>
  852.    <link href="https://octopus.com/blog/set-up-local-k8s-deployment-pipeline" />
  853.    <content type="html">&lt;p&gt;&lt;img src="https://i.octopus.com/blog/2024-01/set-up-local-k8s-deployment-pipeline/blogimage-kubernetes-generic-4-2023.png" alt="Kubernetes icon peeking out of package with someone sitting in front of it with a laptop." /&gt;&lt;/p&gt;
  854.  
  855. &lt;p&gt;Kubernetes (also known as K8s) is a container management tool that solves complexity for software teams who might:&lt;/p&gt;
  856.  
  857. &lt;ul&gt;
  858. &lt;li&gt;Need to scale their application suddenly or automatically due to an influx of customers&lt;/li&gt;
  859. &lt;li&gt;Manage different versions of their software for many customers, as with multi-tenancy&lt;/li&gt;
  860. &lt;li&gt;Want fluidity and flexibility in their infrastructure to react to the ebb and flow of traffic&lt;/li&gt;
  861. &lt;li&gt;Use a microservices software architecture&lt;/li&gt;
  862. &lt;/ul&gt;
  863.  
  864. &lt;p&gt;Though it solves complexity, Kubernetes is complex itself. It's known for causing a few headaches for new adopters.&lt;/p&gt;
  865.  
  866. &lt;p&gt;A great way to start with Kubernetes, however, is to set up a local instance. A local instance lets you:&lt;/p&gt;
  867.  
  868. &lt;ul&gt;
  869. &lt;li&gt;Figure out how things work without pressure&lt;/li&gt;
  870. &lt;li&gt;Make those early mistakes without real environment consequences&lt;/li&gt;
  871. &lt;li&gt;Build out the local instance as you get more comfortable&lt;/li&gt;
  872. &lt;/ul&gt;
  873.  
  874. &lt;p&gt;In this post, we guide you through setting up a local Kubernetes deployment pipeline that:&lt;/p&gt;
  875.  
  876. &lt;ul&gt;
  877. &lt;li&gt;Builds a simple containerized application using GitHub Actions&lt;/li&gt;
  878. &lt;li&gt;Pushes the application's image to Docker Hub&lt;/li&gt;
  879. &lt;li&gt;Deploys the app to your local Kubernetes instance using Octopus Server&lt;/li&gt;
  880. &lt;/ul&gt;
  881.  
  882. &lt;h2 id="before-you-start"&gt;Before you start&lt;/h2&gt;
  883.  
  884. &lt;p&gt;Aside from a couple of external services, this guide creates the pipeline on Microsoft Windows.&lt;/p&gt;
  885.  
  886. &lt;p&gt;We use &lt;a href="https://microk8s.io/" rel="nofollow"&gt;Canonical's MicroK8s&lt;/a&gt; for the local Kubernetes instance. We consider it the easiest entry point as it includes everything you need to get started quickly (with a few minor quirks, which we'll cover).&lt;/p&gt;
  887.  
  888. &lt;p&gt;We reference the MicroK8s commands and steps to complete this guide as you need them. If you want to know more about MicroK8s and Kubernetes commands beyond this post, &lt;a href="https://microk8s.io/docs" rel="nofollow"&gt;MicroK8s' documentation&lt;/a&gt; is fantastic. It uses easy-to-understand language and has simpler explanations than most other Kubernetes guides.&lt;/p&gt;
  889.  
  890. &lt;p&gt;MicroK8s needs Microsoft's HyperV and Windows Hypervisor Platform enabled to run clusters as it hosts MicroK8s on an Ubuntu virtual machine. Use Windows search to find the &lt;strong&gt;Turn Windows features on or off&lt;/strong&gt; option and tick boxes for both features in the list. If you use VMWare on the same computer, we recommend fully uninstalling it (or at least stopping its services) before enabling HyperV, as it might cause you problems later on.&lt;/p&gt;
  891.  
  892. &lt;p&gt;You also need &lt;a href="https://github.com/" rel="nofollow"&gt;GitHub&lt;/a&gt; and &lt;a href="https://hub.docker.com/" rel="nofollow"&gt;Docker Hub&lt;/a&gt; accounts.&lt;/p&gt;
  893.  
  894. &lt;p&gt;Lastly, we use Octopus Server to deploy our Underwater App to your cluster. If you don't already have a license for Octopus Server, don't worry - we explain how to sign up for a free trial in the guide.&lt;/p&gt;
  895.  
  896. &lt;h2 id="step-1-install-microk8s-on-windows"&gt;Step 1: Install MicroK8s on Windows&lt;/h2&gt;
  897.  
  898. &lt;p&gt;Installing MicroK8s is easy. For Windows, download and run the &lt;a href="https://microk8s.io/" rel="nofollow"&gt;MicroK8s installer&lt;/a&gt;.&lt;/p&gt;
  899.  
  900. &lt;p&gt;Make sure you select &lt;code&gt;MicroK8s&lt;/code&gt; and &lt;code&gt;Kubectl&lt;/code&gt; when asked what commands to add to your system PATH. Leave all other steps as default.&lt;/p&gt;
  901.  
  902. &lt;p&gt;The installer will set up your MicroK8s instance. You can check it's running by using the &lt;code&gt;microk8s status --wait-ready&lt;/code&gt; command in Windows Terminal.&lt;/p&gt;
  903.  
  904. &lt;p&gt;You can stop and start MicroK8s with the following commands. Stopping MicroK8s when not in use will save system resources and battery performance:&lt;/p&gt;
  905.  
  906. &lt;ul&gt;
  907. &lt;li&gt;&lt;code&gt;microk8s start&lt;/code&gt;&lt;/li&gt;
  908. &lt;li&gt;&lt;code&gt;microk8s stop&lt;/code&gt;&lt;/li&gt;
  909. &lt;/ul&gt;
  910.  
  911. &lt;div class="alert alert-info"&gt;&lt;p&gt;MicroK8s seems to regularly fail starting the first time, advising an 'Exit Code 2' error. Just run the command again and it should start.&lt;/p&gt;
  912. &lt;/div&gt;
  913.  
  914. &lt;h2 id="step-2-configure-microk8s-networking"&gt;Step 2: Configure MicroK8s networking&lt;/h2&gt;
  915.  
  916. &lt;p&gt;You can experience problems running MicroK8s on Windows due to the way HyperV allocates IP addresses when it starts. We can solve those problems by adding an address string to MicroK8s' DNS settings that removes reliance on IP addresses. That way, the other tools in our pipeline always see our clusters.&lt;/p&gt;
  917.  
  918. &lt;ol&gt;
  919. &lt;li&gt;Open a Windows Terminal and connect directly to Ubuntu by running &lt;code&gt;multipass shell microk8s-vm&lt;/code&gt;.&lt;/li&gt;
  920. &lt;li&gt;Run &lt;code&gt;sudo nano /var/snap/microk8s/current/certs/csr.conf.template&lt;/code&gt;.&lt;/li&gt;
  921. &lt;li&gt;Use the arrow keys to move the cursor down to the DNS section and add the following entry to the DNS list: &lt;code&gt;DNS.6 = microk8s-vm.mshome.net&lt;/code&gt;&lt;/li&gt;
  922. &lt;li&gt;Press Ctrl and X to exit. Type &lt;code&gt;Y&lt;/code&gt; to confirm the changes. Press &lt;strong&gt;Enter&lt;/strong&gt; to confirm the file you're overwriting.&lt;/li&gt;
  923. &lt;/ol&gt;
  924.  
  925. &lt;p&gt;Now run &lt;code&gt;microk8s config&lt;/code&gt; in a fresh Windows Terminal for cluster information. Make a note of the 'Server' field as you need it later. It looks something like &lt;code&gt;https://111.111.111.111:12345&lt;/code&gt;. Specifically, note the numbers after the colon. This is your cluster's networking port number.&lt;/p&gt;
  926.  
  927. &lt;ol&gt;
  928. &lt;li&gt;Run &lt;code&gt;microk8s stop&lt;/code&gt; in your Windows Terminal. Wait for it to stop.&lt;/li&gt;
  929. &lt;li&gt;Open a Windows Explorer and browse to &lt;code&gt;C:\Users\*your profile*\AppData\Local\MicroK8s&lt;/code&gt; and open the 'config' file. Select &lt;strong&gt;Notepad&lt;/strong&gt; if you don't already have a default app. The 'AppData' folder may be hidden by default on Windows. You can make it visible by changing the &lt;a href="https://support.microsoft.com/en-us/windows/view-hidden-files-and-folders-in-windows-97fbc472-c603-9d90-91d0-1166d1d9f4b5" rel="nofollow"&gt;view settings for your profile folder&lt;/a&gt;.&lt;/li&gt;
  930. &lt;li&gt;Find the 'Server' field and replace its address with &lt;code&gt;https://microk8s-vm.mshome.net:12345&lt;/code&gt;. The last 5 digits should be the port number we noted earlier when running &lt;code&gt;microk8s config&lt;/code&gt;.&lt;/li&gt;
  931. &lt;li&gt;Save the file and close it.&lt;/li&gt;
  932. &lt;li&gt;Run &lt;code&gt;Start microk8s&lt;/code&gt; in Windows Terminal again (and yet again if the start command fails).&lt;/li&gt;
  933. &lt;/ol&gt;
  934.  
  935. &lt;p&gt;We also need to run the following command in Windows Terminal to enable Ingress on your local Kubernetes instance: &lt;code&gt;microk8s enable ingress&lt;/code&gt;.&lt;/p&gt;
  936.  
  937. &lt;p&gt;Ingress is a network routing tool for MicroK8s. It lets you see your app on your local instance without complex or problematic workarounds, like port forwarding.&lt;/p&gt;
  938.  
  939. &lt;h2 id="step-3-install-kubectl-cli-on-your-computer"&gt;Step 3: Install kubectl-cli on your computer&lt;/h2&gt;
  940.  
  941. &lt;p&gt;Before we install Octopus, we install and use a software manager called &lt;a href="https://chocolatey.org/install" rel="nofollow"&gt;Chocolatey&lt;/a&gt; to install the kubectl-cli (command-line interface).&lt;/p&gt;
  942.  
  943. &lt;p&gt;The kubectl-cli is what Octopus uses to interact with your local cluster and trigger processes for the deployment. It's different to the kubectl installed during the MicroK8s setup, which is only for your local K8s cluster.&lt;/p&gt;
  944.  
  945. &lt;p&gt;To install Chocolatey and the kubectl-cli:&lt;/p&gt;
  946.  
  947. &lt;ol&gt;
  948. &lt;li&gt;Open a PowerShell tab in Windows Terminal as an administrator.&lt;/li&gt;
  949. &lt;li&gt;Run the Chocolately install command: &lt;code&gt;Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))&lt;/code&gt;.&lt;/li&gt;
  950. &lt;li&gt;The install takes a few minutes. Close and reopen Windows Terminal when finished.&lt;/li&gt;
  951. &lt;li&gt;Now we can install kubectl. Run &lt;code&gt;choco install kubernetes-cli&lt;/code&gt; in Windows Terminal, and wait for the process to finish.&lt;/li&gt;
  952. &lt;/ol&gt;
  953.  
  954. &lt;p&gt;If you have any problems, see &lt;a href="https://chocolatey.org/install" rel="nofollow"&gt;Chocolatey's documentation&lt;/a&gt; for more information. Not running PowerShell or Windows Terminal as an administrator tends to be the cause of most issues.&lt;/p&gt;
  955.  
  956. &lt;h2 id="step-4-install-sql-server-express"&gt;Step 4: Install SQL Server Express&lt;/h2&gt;
  957.  
  958. &lt;p&gt;Octopus needs a SQL Server to store information about your projects and deployments.&lt;/p&gt;
  959.  
  960. &lt;p&gt;Technically, you can install SQL Server Express during the Octopus Setup Wizard covered in the next step. However, we'll install it now for clarity as it saves switching between apps during steps.&lt;/p&gt;
  961.  
  962. &lt;p&gt;As some point during the install, you may see a Windows Firewall warning. You should allow access otherwise you'll experience problems with connections.&lt;/p&gt;
  963.  
  964. &lt;ol&gt;
  965. &lt;li&gt;&lt;a href="https://www.hanselman.com/blog/download-sql-server-express" rel="nofollow"&gt;Download SQL Server Express&lt;/a&gt;. I used the Basic SQL Server 2019 Express Edition. It's a free download and the basic version is fine.&lt;/li&gt;
  966. &lt;li&gt;When downloaded, run the installer from your Downloads folder (or wherever you chose to save it.)&lt;/li&gt;
  967. &lt;li&gt;Choose where you'd like to extract the files and click &lt;strong&gt;OK&lt;/strong&gt;. It should default to your Downloads folder.&lt;/li&gt;
  968. &lt;li&gt;The 'SQL Server Installation Center' will open. Click &lt;strong&gt;New SQL Server stand-alone installation or add features to an existing installation&lt;/strong&gt;.&lt;/li&gt;
  969. &lt;li&gt;Accept the 'MICROSOFT SOFTWARE LICENSE TERMS' and click &lt;strong&gt;Next&lt;/strong&gt;.&lt;/li&gt;
  970. &lt;li&gt;You can use all the defaults for the rest of the setup wizard. Just click &lt;strong&gt;Next&lt;/strong&gt; to progress, then &lt;strong&gt;Close&lt;/strong&gt; when the install completes.&lt;/li&gt;
  971. &lt;/ol&gt;
  972.  
  973. &lt;h2 id="step-5-install-and-set-up-octopus-on-your-computer"&gt;Step 5: Install and set up Octopus on your computer&lt;/h2&gt;
  974.  
  975. &lt;p&gt;Now we can install Octopus Server.&lt;/p&gt;
  976.  
  977. &lt;ol&gt;
  978. &lt;li&gt;Go to the &lt;a href="https://octopus.com/downloads"&gt;Octopus downloads page&lt;/a&gt; and click the &lt;strong&gt;Download&lt;/strong&gt; button for the latest version.&lt;/li&gt;
  979. &lt;li&gt;When downloaded, run the installer MSI from your Downloads folder (or wherever you chose to save it.)&lt;/li&gt;
  980. &lt;li&gt;Progress through each stage of the install process by clicking &lt;strong&gt;Next&lt;/strong&gt; and click &lt;strong&gt;Finish&lt;/strong&gt; at the end. Make sure you:
  981. &lt;ul&gt;
  982. &lt;li&gt;Accept the 'End-User License Agreement'&lt;/li&gt;
  983. &lt;li&gt;Install Octopus where you're comfortable. The default install location is &lt;code&gt;C:\Program Files&lt;/code&gt; and is fine in most cases.&lt;/li&gt;
  984. &lt;/ul&gt;
  985. &lt;/li&gt;
  986. &lt;/ol&gt;
  987.  
  988. &lt;p&gt;Octopus auto-starts after the installation and takes you to the Octopus Setup Wizard. Complete the screens as follows:&lt;/p&gt;
  989.  
  990. &lt;ol&gt;
  991. &lt;li&gt;&lt;strong&gt;License key&lt;/strong&gt;: Click the &lt;strong&gt;free trial license key&lt;/strong&gt; link and enter your details. Copy the license text from the website code-box into the setup wizard's license-box. Click &lt;strong&gt;Next&lt;/strong&gt;.&lt;/li&gt;
  992. &lt;li&gt;&lt;strong&gt;Home&lt;/strong&gt;: Choose a home directory for Octopus to store settings and related files. The default is fine in most cases. Click &lt;strong&gt;Next&lt;/strong&gt;.&lt;/li&gt;
  993. &lt;li&gt;&lt;strong&gt;Service Account&lt;/strong&gt;: We're setting up a local pipeline, so select &lt;strong&gt;Use Local System account&lt;/strong&gt;.&lt;/li&gt;
  994. &lt;li&gt;&lt;strong&gt;Database&lt;/strong&gt;: Select &lt;strong&gt;(local)\SQLEXPRESS&lt;/strong&gt; from the 'Server name' dropdown (unless you called the SQL Server instance something else) and click &lt;strong&gt;Next&lt;/strong&gt;.&lt;/li&gt;
  995. &lt;li&gt;Click &lt;strong&gt;OK&lt;/strong&gt; on the pop-ups that ask:
  996. &lt;ul&gt;
  997. &lt;li&gt;If you want to create the 'OctopusDeploy-OctopusServer' database&lt;/li&gt;
  998. &lt;li&gt;If you want to grant access to the 'NT AUTHORITY\SYSTEM' account&lt;/li&gt;
  999. &lt;/ul&gt;
  1000. &lt;/li&gt;
  1001. &lt;li&gt;&lt;strong&gt;Web Portal&lt;/strong&gt;: The default is fine. Click &lt;strong&gt;Next&lt;/strong&gt;.&lt;/li&gt;
  1002. &lt;li&gt;&lt;strong&gt;Authentication&lt;/strong&gt;: Complete the following fields and click &lt;strong&gt;Next&lt;/strong&gt;:
  1003. &lt;ul&gt;
  1004. &lt;li&gt;&lt;strong&gt;Authentication mode&lt;/strong&gt;: Select &lt;strong&gt;Username/passwords stored in Octopus&lt;/strong&gt;&lt;/li&gt;
  1005. &lt;li&gt;&lt;strong&gt;Username&lt;/strong&gt;: Enter a username to log into Octopus&lt;/li&gt;
  1006. &lt;li&gt;&lt;strong&gt;Email&lt;/strong&gt;: Enter your email address&lt;/li&gt;
  1007. &lt;li&gt;&lt;strong&gt;Password and Retype password&lt;/strong&gt;: Enter the password you'll use to login into Octopus Server&lt;/li&gt;
  1008. &lt;/ul&gt;
  1009. &lt;/li&gt;
  1010. &lt;li&gt;Click &lt;strong&gt;Finish&lt;/strong&gt;.&lt;/li&gt;
  1011. &lt;/ol&gt;
  1012.  
  1013. &lt;p&gt;Octopus Manager will now open. Click &lt;strong&gt;Open in browser&lt;/strong&gt; to launch the Octopus dashboard and log in with the credentials you just created.&lt;/p&gt;
  1014.  
  1015. &lt;h2 id="step-6-create-a-project-in-octopus"&gt;Step 6: Create a project in Octopus&lt;/h2&gt;
  1016.  
  1017. &lt;ol&gt;
  1018. &lt;li&gt;Go to your Octopus dashboard and click &lt;strong&gt;Projects&lt;/strong&gt; from the top menu.&lt;/li&gt;
  1019. &lt;li&gt;Click &lt;strong&gt;Add New Project&lt;/strong&gt;.&lt;/li&gt;
  1020. &lt;li&gt;Give your project a suitable name and click &lt;strong&gt;SAVE&lt;/strong&gt;.&lt;/li&gt;
  1021. &lt;li&gt;Remove all environments but 'Development' and click &lt;strong&gt;SAVE&lt;/strong&gt;.&lt;/li&gt;
  1022. &lt;/ol&gt;
  1023.  
  1024. &lt;p&gt;We'll be back to create the deployment process later.&lt;/p&gt;
  1025.  
  1026. &lt;h2 id="step-7-connect-octopus-to-your-local-kubernetes-instance"&gt;Step 7: Connect Octopus to your local Kubernetes instance&lt;/h2&gt;
  1027.  
  1028. &lt;p&gt;Run &lt;code&gt;microk8s kubectl create token default --duration 525600m&lt;/code&gt; in your Windows Terminal to create a security token for your Kubernetes instance. This command sets the token to be valid for 10 years. By not stating a duration, the token will only last a few hours.&lt;/p&gt;
  1029.  
  1030. &lt;p&gt;To add the token to Octopus:&lt;/p&gt;
  1031.  
  1032. &lt;ol&gt;
  1033. &lt;li&gt;Click &lt;strong&gt;Infrastructure&lt;/strong&gt; from Octopus's top menu.&lt;/li&gt;
  1034. &lt;li&gt;Click &lt;strong&gt;Accounts&lt;/strong&gt; from the left menu.&lt;/li&gt;
  1035. &lt;li&gt;Click &lt;strong&gt;ADD ACCOUNT&lt;/strong&gt; and select &lt;strong&gt;Token&lt;/strong&gt; from the dropdown.&lt;/li&gt;
  1036. &lt;li&gt;Complete the following fields (leave everything else as default) and click &lt;strong&gt;SAVE&lt;/strong&gt;:
  1037. &lt;ul&gt;
  1038. &lt;li&gt;&lt;strong&gt;Name&lt;/strong&gt;: Give the account a short name. I opted for &lt;code&gt;Kubernetes Account&lt;/code&gt;&lt;/li&gt;
  1039. &lt;li&gt;&lt;strong&gt;Token&lt;/strong&gt;: Paste in the token you just generated in Windows Terminal&lt;/li&gt;
  1040. &lt;li&gt;&lt;strong&gt;Environment&lt;/strong&gt;: Select &lt;strong&gt;Development&lt;/strong&gt; from the dropdown&lt;/li&gt;
  1041. &lt;/ul&gt;
  1042. &lt;/li&gt;
  1043. &lt;/ol&gt;
  1044.  
  1045. &lt;p&gt;Now we'll create the deployment target:&lt;/p&gt;
  1046.  
  1047. &lt;ol&gt;
  1048. &lt;li&gt;Go to your Octopus dashboard and click &lt;strong&gt;Infrastructure&lt;/strong&gt; from the top menu.&lt;/li&gt;
  1049. &lt;li&gt;Click &lt;strong&gt;Deployment Targets&lt;/strong&gt;.&lt;/li&gt;
  1050. &lt;li&gt;Click &lt;strong&gt;ADD DEPLOYMENT TARGET&lt;/strong&gt;.&lt;/li&gt;
  1051. &lt;li&gt;Click &lt;strong&gt;KUBERNETES CLUSTER&lt;/strong&gt; and then &lt;strong&gt;Kubernetes Cluster&lt;/strong&gt; from the filtered results below.&lt;/li&gt;
  1052. &lt;li&gt;Complete the following fields (leave everything else as default) and click &lt;strong&gt;SAVE&lt;/strong&gt;:
  1053. &lt;ul&gt;
  1054. &lt;li&gt;&lt;strong&gt;Display Name&lt;/strong&gt;: Enter what you'll call the cluster in Octopus. I called it &lt;code&gt;Test Cluster&lt;/code&gt;.&lt;/li&gt;
  1055. &lt;li&gt;&lt;strong&gt;Environments&lt;/strong&gt;: Select &lt;strong&gt;Development&lt;/strong&gt; from the dropdown menu.&lt;/li&gt;
  1056. &lt;li&gt;&lt;strong&gt;Target Roles&lt;/strong&gt;: Type in a name for the Target Role and click &lt;strong&gt;Add new role&lt;/strong&gt;. We use target roles to help direct where deployments go. I called mine &lt;code&gt;Local Cluster&lt;/code&gt;.&lt;/li&gt;
  1057. &lt;li&gt;&lt;strong&gt;Authentication&lt;/strong&gt;: Select &lt;strong&gt;Token&lt;/strong&gt; from the dropdown, then select the credentials we created earlier from the &lt;strong&gt;Select account&lt;/strong&gt; dropdown.&lt;/li&gt;
  1058. &lt;li&gt;&lt;strong&gt;Kubernetes cluster URL&lt;/strong&gt;: Use the server address we set in the config file earlier: &lt;code&gt;https://microk8s-vm.mshome.net:12345&lt;/code&gt; (remember to replace the last 5 digits with the port number we noted earlier)&lt;/li&gt;
  1059. &lt;li&gt;&lt;strong&gt;Skip TLS verification&lt;/strong&gt;: Tick this box.&lt;/li&gt;
  1060. &lt;/ul&gt;
  1061. &lt;/li&gt;
  1062. &lt;/ol&gt;
  1063.  
  1064. &lt;p&gt;When saved, click &lt;strong&gt;Connectivity&lt;/strong&gt; from the left menu and click &lt;strong&gt;CHECK HEALTH&lt;/strong&gt;. Octopus will check it can see your cluster. If you see a green tick, you're good to go. If you see a red cross, go back and check your settings.&lt;/p&gt;
  1065.  
  1066. &lt;h2 id="step-8-create-your-github-projects-repository"&gt;Step 8: Create your GitHub project's repository&lt;/h2&gt;
  1067.  
  1068. &lt;p&gt;Log in to GitHub and create a fork of the &lt;a href="https://github.com/OctopusSamples/octopus-underwater-app" rel="nofollow"&gt;Octopus Underwater App repository&lt;/a&gt; by clicking the &lt;strong&gt;Fork&lt;/strong&gt; button and completing the short form.&lt;/p&gt;
  1069.  
  1070. &lt;p&gt;You should now see a copy of the repository in your list of repositories.&lt;/p&gt;
  1071.  
  1072. &lt;h2 id="step-9-create-a-docker-repository"&gt;Step 9: Create a Docker repository&lt;/h2&gt;
  1073.  
  1074. &lt;ol&gt;
  1075. &lt;li&gt;Log into your &lt;a href="https://hub.docker.com/" rel="nofollow"&gt;Docker Hub&lt;/a&gt; account.&lt;/li&gt;
  1076. &lt;li&gt;Click &lt;strong&gt;Create repository&lt;/strong&gt;.&lt;/li&gt;
  1077. &lt;li&gt;Complete the following fields and click &lt;strong&gt;Create&lt;/strong&gt;:
  1078. &lt;ul&gt;
  1079. &lt;li&gt;&lt;strong&gt;Namespace&lt;/strong&gt;: Set as your account name.&lt;/li&gt;
  1080. &lt;li&gt;&lt;strong&gt;Repository Name&lt;/strong&gt;: Enter &lt;code&gt;octopus-underwater-app&lt;/code&gt;.&lt;/li&gt;
  1081. &lt;li&gt;&lt;strong&gt;Visibility&lt;/strong&gt;: Leave as &lt;strong&gt;Public&lt;/strong&gt;.&lt;/li&gt;
  1082. &lt;/ul&gt;
  1083. &lt;/li&gt;
  1084. &lt;/ol&gt;
  1085.  
  1086. &lt;p&gt;You should now see the Docker repository in your list.&lt;/p&gt;
  1087.  
  1088. &lt;h2 id="step-10-set-up-a-package-feed-in-octopus"&gt;Step 10: Set up a package feed in Octopus&lt;/h2&gt;
  1089.  
  1090. &lt;ol&gt;
  1091. &lt;li&gt;Go back to Octopus Server and click on &lt;strong&gt;Library&lt;/strong&gt; from the top menu.&lt;/li&gt;
  1092. &lt;li&gt;Click &lt;strong&gt;External Feeds&lt;/strong&gt; from the left menu.&lt;/li&gt;
  1093. &lt;li&gt;Click &lt;strong&gt;ADD FEED&lt;/strong&gt;.&lt;/li&gt;
  1094. &lt;li&gt;Complete the following settings and click &lt;strong&gt;SAVE&lt;/strong&gt;:
  1095. &lt;ul&gt;
  1096. &lt;li&gt;&lt;strong&gt;Feed Type&lt;/strong&gt;: Select &lt;strong&gt;Docker Container Registry&lt;/strong&gt; from the dropdown.&lt;/li&gt;
  1097. &lt;li&gt;&lt;strong&gt;Name&lt;/strong&gt;: Give the feed a name to use in Octopus. I called mine &lt;code&gt;Docker&lt;/code&gt;.&lt;/li&gt;
  1098. &lt;li&gt;&lt;strong&gt;URL&lt;/strong&gt;: Leave as &lt;code&gt;https://index.docker.io&lt;/code&gt;.&lt;/li&gt;
  1099. &lt;li&gt;&lt;strong&gt;Credentials&lt;/strong&gt;: Select &lt;strong&gt;Username and Password&lt;/strong&gt; and enter your Docker username and password into the 'Feed Username' and 'Feed Password' fields.&lt;/li&gt;
  1100. &lt;/ul&gt;
  1101. &lt;/li&gt;
  1102. &lt;li&gt;Click the &lt;strong&gt;TEST&lt;/strong&gt; button and search for your Docker repository name to see if it appears in the results. If it's there, it's working.&lt;/li&gt;
  1103. &lt;/ol&gt;
  1104.  
  1105. &lt;h2 id="step-11-set-up-a-github-action-to-push-the-project-to-docker-hub"&gt;Step 11: Set up a GitHub Action to push the project to Docker Hub&lt;/h2&gt;
  1106.  
  1107. &lt;p&gt;First, we'll add your DockerHub credentials as secrets to your GitHub repository.&lt;/p&gt;
  1108.  
  1109. &lt;ol&gt;
  1110. &lt;li&gt;Click &lt;strong&gt;Settings&lt;/strong&gt; from your repository's top menu.&lt;/li&gt;
  1111. &lt;li&gt;Expand &lt;strong&gt;Secrets and variables&lt;/strong&gt; in the left menu and click &lt;strong&gt;Actions&lt;/strong&gt;.&lt;/li&gt;
  1112. &lt;li&gt;Under the &lt;strong&gt;Repository secrets&lt;/strong&gt; heading click &lt;strong&gt;New repository secret&lt;/strong&gt;.&lt;/li&gt;
  1113. &lt;li&gt;Complete the following fields and click &lt;strong&gt;Add secret&lt;/strong&gt;:
  1114. &lt;ul&gt;
  1115. &lt;li&gt;&lt;strong&gt;Name&lt;/strong&gt;: Enter &lt;code&gt;DOCKERHUB_USERNAME&lt;/code&gt;.&lt;/li&gt;
  1116. &lt;li&gt;&lt;strong&gt;Secret&lt;/strong&gt;: Enter your Docker username.&lt;/li&gt;
  1117. &lt;/ul&gt;
  1118. &lt;/li&gt;
  1119. &lt;li&gt;Click &lt;strong&gt;Add secret&lt;/strong&gt; again.&lt;/li&gt;
  1120. &lt;li&gt;Complete the following fields and click &lt;strong&gt;Add secret&lt;/strong&gt;:
  1121. &lt;ul&gt;
  1122. &lt;li&gt;&lt;strong&gt;Name&lt;/strong&gt;: Enter &lt;code&gt;DOCKERHUB_TOKEN&lt;/code&gt;.&lt;/li&gt;
  1123. &lt;li&gt;&lt;strong&gt;Secret&lt;/strong&gt;: Enter your Docker Hub password.&lt;/li&gt;
  1124. &lt;/ul&gt;
  1125. &lt;/li&gt;
  1126. &lt;/ol&gt;
  1127.  
  1128. &lt;p&gt;Now we can create the action. For this, we use the Build and push &lt;a href="https://github.com/marketplace/actions/build-and-push-docker-images" rel="nofollow"&gt;Docker images GitHub Action&lt;/a&gt;. Don't worry, we made it simpler by providing the action's workflow in the steps below.&lt;/p&gt;
  1129.  
  1130. &lt;ol&gt;
  1131. &lt;li&gt;Click &lt;strong&gt;Actions&lt;/strong&gt; from your repository's top menu.&lt;/li&gt;
  1132. &lt;li&gt;Click &lt;strong&gt;New workflow&lt;/strong&gt;.&lt;/li&gt;
  1133. &lt;li&gt;Click &lt;strong&gt;Set up a workflow yourself&lt;/strong&gt;.&lt;/li&gt;
  1134. &lt;li&gt;Call the file &lt;code&gt;build-push-action.yml&lt;/code&gt; and make sure it lives in a subdirectory called &lt;code&gt;workflows&lt;/code&gt;. If you don't already have a 'workflows' folder in your repository, you can create it by adding &lt;code&gt;workflows/&lt;/code&gt; when creating the workflow file.&lt;/li&gt;
  1135. &lt;li&gt;Copy and paste the following code into the code editing box.&lt;/li&gt;
  1136. &lt;li&gt;In the final line labelled 'tags', replace 'dockerusername' and 'dockerrepositoryname' with your own Docker username and repository name. For example, mine reads &lt;code&gt;andyoctopus/octopus-underwater-app:latest&lt;/code&gt;.&lt;/li&gt;
  1137. &lt;/ol&gt;
  1138.  
  1139. &lt;pre&gt;&lt;code&gt;   name: build-push-action
  1140.  
  1141. on:
  1142.  push:
  1143.    branches:
  1144.      - 'main'
  1145.  
  1146. jobs:
  1147.  docker:
  1148.    runs-on: ubuntu-latest
  1149.    steps:
  1150.      -
  1151.        name: Set up QEMU
  1152.        uses: docker/setup-qemu-action@v3
  1153.      -
  1154.        name: Set up Docker Buildx
  1155.        uses: docker/setup-buildx-action@v3
  1156.      -
  1157.        name: Login to Docker Hub
  1158.        uses: docker/login-action@v3
  1159.        with:
  1160.          username: ${{ secrets.DOCKERHUB_USERNAME }}
  1161.          password: ${{ secrets.DOCKERHUB_TOKEN }}
  1162.      -
  1163.        name: Build and push
  1164.        uses: docker/build-push-action@v5
  1165.        with:
  1166.          push: true
  1167.          tags: dockerusername/dockerrepositoryname:latest
  1168. &lt;/code&gt;&lt;/pre&gt;
  1169.  
  1170. &lt;p&gt;Next, click &lt;strong&gt;Commit changes...&lt;/strong&gt;.&lt;/p&gt;
  1171.  
  1172. &lt;p&gt;The Action should automatically run. You can track its progress by clicking the &lt;strong&gt;Actions&lt;/strong&gt; button again.&lt;/p&gt;
  1173.  
  1174. &lt;p&gt;If the action completes with a green tick, you can check your Docker repository to see if it has an image.&lt;/p&gt;
  1175.  
  1176. &lt;h2 id="step-12-create-run-and-test-your-first-deployment"&gt;Step 12: Create, run, and test your first deployment&lt;/h2&gt;
  1177.  
  1178. &lt;p&gt;Now we can go back and create the deployment process in Octopus. Remember, if we don't mention something, leave it at the default.&lt;/p&gt;
  1179.  
  1180. &lt;ol&gt;
  1181. &lt;li&gt;In Octopus, click &lt;strong&gt;Projects&lt;/strong&gt; from the top menu, then click on your recently created project.&lt;/li&gt;
  1182. &lt;li&gt;Click &lt;strong&gt;CREATE PROCESS&lt;/strong&gt;.&lt;/li&gt;
  1183. &lt;li&gt;Click &lt;strong&gt;Kubernetes&lt;/strong&gt; and then &lt;strong&gt;Deploy Kubernetes Containers&lt;/strong&gt; from the filtered options below.&lt;/li&gt;
  1184. &lt;li&gt;Complete the following sections and fields:
  1185. &lt;ul&gt;
  1186. &lt;li&gt;&lt;strong&gt;On Behalf Of&lt;/strong&gt;: Select the target role we created earlier from the dropdown. Mine was &lt;code&gt;Local Cluster&lt;/code&gt;.&lt;/li&gt;
  1187. &lt;li&gt;&lt;strong&gt;Deployment&lt;/strong&gt;:
  1188. &lt;ul&gt;
  1189. &lt;li&gt;&lt;strong&gt;Deployment Name&lt;/strong&gt;: Enter &lt;code&gt;octopus-underwater-app&lt;/code&gt;.&lt;/li&gt;
  1190. &lt;/ul&gt;
  1191. &lt;/li&gt;
  1192. &lt;li&gt;&lt;strong&gt;Container&lt;/strong&gt;:
  1193. &lt;ul&gt;
  1194. &lt;li&gt;Click &lt;strong&gt;ADD CONTAINER&lt;/strong&gt;, complete the following fields in the pop-up and click &lt;strong&gt;OK&lt;/strong&gt;:
  1195. &lt;ul&gt;
  1196. &lt;li&gt;&lt;strong&gt;Name&lt;/strong&gt;: Enter &lt;code&gt;octopus-underwater-app&lt;/code&gt;.&lt;/li&gt;
  1197. &lt;li&gt;&lt;strong&gt;Package Feed&lt;/strong&gt;: Select name of the feed we set earlier. I called mine &lt;code&gt;Docker&lt;/code&gt;.&lt;/li&gt;
  1198. &lt;li&gt;&lt;strong&gt;Package ID&lt;/strong&gt;: Start typing your Docker username and select &lt;strong&gt;octopus-underwater-app&lt;/strong&gt; from the list.&lt;/li&gt;
  1199. &lt;/ul&gt;
  1200. &lt;/li&gt;
  1201. &lt;li&gt;Click the &lt;strong&gt;ADD PORT&lt;/strong&gt; button and complete the fields as follows:
  1202. &lt;ul&gt;
  1203. &lt;li&gt;&lt;strong&gt;Name&lt;/strong&gt;: Enter &lt;code&gt;http&lt;/code&gt;.&lt;/li&gt;
  1204. &lt;li&gt;&lt;strong&gt;Port&lt;/strong&gt;: Enter &lt;code&gt;80&lt;/code&gt;.&lt;/li&gt;
  1205. &lt;li&gt;&lt;strong&gt;Protocol&lt;/strong&gt;: Select &lt;strong&gt;TCP&lt;/strong&gt; from the dropdown.&lt;/li&gt;
  1206. &lt;/ul&gt;
  1207. &lt;/li&gt;
  1208. &lt;/ul&gt;
  1209. &lt;/li&gt;
  1210. &lt;li&gt;&lt;strong&gt;Service&lt;/strong&gt;:
  1211. &lt;ul&gt;
  1212. &lt;li&gt;&lt;strong&gt;Service Name&lt;/strong&gt;: Enter &lt;code&gt;octopus-underwater-service&lt;/code&gt;.&lt;/li&gt;
  1213. &lt;li&gt;&lt;strong&gt;Service Ports&lt;/strong&gt;: Click &lt;strong&gt;ADD PORT&lt;/strong&gt;, complete the following fields and click &lt;strong&gt;OK&lt;/strong&gt;:
  1214. &lt;ul&gt;
  1215. &lt;li&gt;&lt;strong&gt;Name&lt;/strong&gt;: Enter &lt;code&gt;http&lt;/code&gt;.&lt;/li&gt;
  1216. &lt;li&gt;&lt;strong&gt;Port&lt;/strong&gt;: Enter &lt;code&gt;80&lt;/code&gt;.&lt;/li&gt;
  1217. &lt;li&gt;&lt;strong&gt;Protocol&lt;/strong&gt;: TCP.&lt;/li&gt;
  1218. &lt;/ul&gt;
  1219. &lt;/li&gt;
  1220. &lt;/ul&gt;
  1221. &lt;/li&gt;
  1222. &lt;li&gt;&lt;strong&gt;Ingress&lt;/strong&gt;:
  1223. &lt;ul&gt;
  1224. &lt;li&gt;&lt;strong&gt;Ingress Name&lt;/strong&gt;: Enter &lt;code&gt;octopus-underwater-ingress&lt;/code&gt;.&lt;/li&gt;
  1225. &lt;li&gt;&lt;strong&gt;Ingress Host Roles&lt;/strong&gt;: Click &lt;strong&gt;ADD HOST RULE&lt;/strong&gt;, then &lt;strong&gt;ADD PATH&lt;/strong&gt;. Complete the following fields and click &lt;strong&gt;OK&lt;/strong&gt;:
  1226. &lt;ul&gt;
  1227. &lt;li&gt;&lt;strong&gt;Path&lt;/strong&gt;: Enter &lt;code&gt;/&lt;/code&gt;.&lt;/li&gt;
  1228. &lt;li&gt;&lt;strong&gt;Service port&lt;/strong&gt;: Select &lt;strong&gt;HTTP&lt;/strong&gt; from the dropdown.&lt;/li&gt;
  1229. &lt;li&gt;&lt;strong&gt;Path Type&lt;/strong&gt;: Select &lt;strong&gt;Prefix&lt;/strong&gt; from the dropdown.&lt;/li&gt;
  1230. &lt;/ul&gt;
  1231. &lt;/li&gt;
  1232. &lt;/ul&gt;
  1233. &lt;/li&gt;
  1234. &lt;/ul&gt;
  1235. &lt;/li&gt;
  1236. &lt;li&gt;Leave everything else as default and click &lt;strong&gt;SAVE&lt;/strong&gt;.&lt;/li&gt;
  1237. &lt;/ol&gt;
  1238.  
  1239. &lt;p&gt;Now we create a release and try to deploy it:&lt;/p&gt;
  1240.  
  1241. &lt;ol&gt;
  1242. &lt;li&gt;Click &lt;strong&gt;CREATE RELEASE&lt;/strong&gt; from the left menu. Octopus will check it can see everything related to your package.&lt;/li&gt;
  1243. &lt;li&gt;Click &lt;strong&gt;SAVE&lt;/strong&gt;.&lt;/li&gt;
  1244. &lt;li&gt;Click &lt;strong&gt;DEPLOY TO DEVELOPMENT...&lt;/strong&gt; and wait for the deployment to finish.&lt;/li&gt;
  1245. &lt;/ol&gt;
  1246.  
  1247. &lt;p&gt;When the deployment completes successfully, you can test that the application's working by going to the URL we set in the DNS earlier: &lt;code&gt;http://microk8s-vm.mshome.net&lt;/code&gt;. An animated scene should greet you, with some reading suggestions.&lt;/p&gt;
  1248.  
  1249. &lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
  1250.  
  1251. &lt;p&gt;Congratulations, you just deployed an application to your own newly-created local Kubernetes instance!&lt;/p&gt;
  1252.  
  1253. &lt;p&gt;Now you have a mostly-local Kubernetes deployment pipeline, you can experiment with it consequence free. You could try:&lt;/p&gt;
  1254.  
  1255. &lt;ul&gt;
  1256. &lt;li&gt;Adding or swapping tooling in the pipeline&lt;/li&gt;
  1257. &lt;li&gt;Deploying your own project or changing the one we provided&lt;/li&gt;
  1258. &lt;li&gt;Creating new clusters and adding QA and production environments to see how lifecycles work in Octopus&lt;/li&gt;
  1259. &lt;/ul&gt;
  1260.  
  1261. &lt;p&gt;Remember, this guide represents Kubernetes as its simplest layer and there's much more to learn from here. Kubernetes is an excellent solution, but it's a complicated one. Its complexity only snowballs the more you scale - something large organizations, enterprises, and those with modern software architectures often discover.&lt;/p&gt;
  1262.  
  1263. &lt;p&gt;Octopus is a deployment automation tool that helps solve the complexity of Kubernetes deployments at scale. &lt;a href="https://octopus.com/use-case/kubernetes"&gt;Read how Octopus helps with Kubernetes deployments&lt;/a&gt;.&lt;/p&gt;
  1264.  
  1265. &lt;p&gt;Happy deployments!&lt;/p&gt;
  1266. </content>
  1267.  </entry>
  1268.  <entry>
  1269.    <id>https://octopus.com/blog/page-layout-improvements</id>
  1270.    <title type="text">Page layout improvements</title>
  1271.    <published>2024-01-10T14:00:00Z</published>
  1272.    <updated>2024-01-24T03:46:25.361291Z</updated>
  1273.    <author>
  1274.      <name>emily.pearce@octopus.com, Octopus Deploy</name>
  1275.    </author>
  1276.    <link href="https://octopus.com/blog/page-layout-improvements" />
  1277.    <content type="html">&lt;p&gt;&lt;img src="https://i.octopus.com/blog/2024-01/page-layout-improvements/blog-improved-page-layouts.png" alt="Person painting an oversized Octopus UI screen and another looking on with oversized color swatches." /&gt;&lt;/p&gt;
  1278.  
  1279. &lt;p&gt;We're always working on improving the user experience (UX) at Octopus Deploy. Most recently, we addressed feedback about our interface looking “messy” and “hard to navigate”. Addressing these concerns required a couple of changes. We focused on a layout that presents information in an easier-to-read structure.&lt;/p&gt;
  1280.  
  1281. &lt;p&gt;In this post, I walk you through our design updates.&lt;/p&gt;
  1282.  
  1283. &lt;h2 id="page-layouts"&gt;Page layouts&lt;/h2&gt;
  1284.  
  1285. &lt;p&gt;We began by looking at our project page layouts. Here we identified a couple of key elements that needed improving.&lt;/p&gt;
  1286.  
  1287. &lt;p&gt;We focused on our page headings and breadcrumbs. These are important for understanding your location in the app. These elements also set the stage for the page layout.&lt;/p&gt;
  1288.  
  1289. &lt;p&gt;&lt;figure&gt;&lt;a href='#' data-featherlight='https://i.octopus.com/blog/2024-01/page-layout-improvements/projectprocesseditold4.png' class='zoom' data-title=''&gt;&lt;img src='https://i.octopus.com/blog/2024-01/page-layout-improvements/projectprocesseditold4.png' class="img-fluid" alt='Screen shot of Octopus Deploy project layouts before' /&gt;&lt;/a&gt;&lt;figcaption&gt;This image highlights the areas where we placed our focus.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
  1290.  
  1291. &lt;p&gt;After we arrived at a design that worked well for projects, we took this layout across the entire app. You can see the new layout below.&lt;/p&gt;
  1292.  
  1293. &lt;p&gt;&lt;figure&gt;&lt;a href='#' data-featherlight='https://i.octopus.com/blog/2024-01/page-layout-improvements/projectprocesseditnew5.png' class='zoom' data-title=''&gt;&lt;img src='https://i.octopus.com/blog/2024-01/page-layout-improvements/projectprocesseditnew5.png' class="img-fluid" alt='Screen shot of Octopus Deploy project layouts before' /&gt;&lt;/a&gt;&lt;figcaption&gt;This image shows the new layout.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;
  1294.  
  1295. &lt;h3 id="benefits-of-these-changes"&gt;Benefits of these changes&lt;/h3&gt;
  1296.  
  1297. &lt;p&gt;These changes make the Octopus Deploy interface easier to understand. The headings are an appropriate size and in a better place relative to the page content. The breadcrumbs now have appropriate visual treatment and we've applied their behavior consistently.&lt;/p&gt;
  1298.  
  1299. &lt;p&gt;Customers were having trouble remembering the location of the &lt;strong&gt;CREATE RELEASE&lt;/strong&gt; button. By placing the button in the top area near other page actions, the button is now easier to find.&lt;/p&gt;
  1300.  
  1301. &lt;h3 id="a-few-other-notable-improvements"&gt;A few other notable improvements&lt;/h3&gt;
  1302.  
  1303. &lt;p&gt;We made some other improvements:&lt;/p&gt;
  1304.  
  1305. &lt;ul&gt;
  1306. &lt;li&gt;When moving between pages, we simplified loading animations&lt;/li&gt;
  1307. &lt;li&gt;Menu interaction states are clearer&lt;/li&gt;
  1308. &lt;li&gt;We simplified project navigation by removing headings and updating labels to match the page content&lt;/li&gt;
  1309. &lt;/ul&gt;
  1310.  
  1311. &lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
  1312.  
  1313. &lt;p&gt;We continually work to make improvements to your experience when using Octopus.&lt;/p&gt;
  1314.  
  1315. &lt;p&gt;If you're keen to share your feedback or want a sneak peek of upcoming UX changes, please &lt;a href="https://calendly.com/emily-pearce-1/octopus-deploy-user-experience-research" rel="nofollow"&gt;book a time with us&lt;/a&gt;.&lt;/p&gt;
  1316.  
  1317. &lt;p&gt;Happy deployments!&lt;/p&gt;
  1318. </content>
  1319.  </entry>
  1320.  <entry>
  1321.    <id>https://octopus.com/blog/using-azure-app-config-with-octopus</id>
  1322.    <title type="text">Using Azure App Config with Octopus</title>
  1323.    <published>2023-12-20T14:00:00Z</published>
  1324.    <updated>2023-12-15T01:07:33.783031Z</updated>
  1325.    <author>
  1326.      <name>mark.harrison@octopus.com, Octopus Deploy</name>
  1327.    </author>
  1328.    <link href="https://octopus.com/blog/using-azure-app-config-with-octopus" />
  1329.    <content type="html">&lt;p&gt;&lt;img src="https://i.octopus.com/blog/2023-12/using-azure-app-config-with-octopus/img-blog-usingazureappconfigwithoctopus-2023.png" alt="Stylized laptop screen showing Octopus logo connected to cogs in the cloud, with a clipboard to the right." /&gt;&lt;/p&gt;
  1330.  
  1331. &lt;p&gt;I've written previously about extending the functionality of Octopus to integrate with cloud-based services, like &lt;a href="https://octopus.com/blog/using-azure-key-vault-with-octopus"&gt;Azure Key Vault&lt;/a&gt; and &lt;a href="https://octopus.com/blog/using-aws-secrets-manager-with-octopus"&gt;AWS Secrets Manager&lt;/a&gt;, using step templates. We're committed to providing more ways for our customers to succeed with Octopus, so we're always creating more step templates that integrate with other cloud-based services.&lt;/p&gt;
  1332.  
  1333. &lt;p&gt;In this post, I walk through 2 new &lt;a href="https://library.octopus.com/listing/azure%20app%20config" rel="nofollow"&gt;Azure App Configuration step templates&lt;/a&gt; we introduced:&lt;/p&gt;
  1334.  
  1335. &lt;ol&gt;
  1336. &lt;li&gt;The &lt;a href="https://library.octopus.com/step-templates/5c4fbed9-dbba-4139-8440-d8e27318772e/actiontemplate-azure-appconfig-kv-retrieve-values" rel="nofollow"&gt;Azure AppConfig KV - Retrieve Values&lt;/a&gt; step. We designed this to retrieve values from an Azure App Configuration instance that you can use in your deployments or runbooks.&lt;/li&gt;
  1337. &lt;li&gt;The &lt;a href="https://library.octopus.com/step-templates/67fcc93c-509c-4c13-bc24-645eff53c5c2/actiontemplate-azure-function-set-appsettings-from-azure-appconfig" rel="nofollow"&gt;Azure Function - Set AppSettings from Azure AppConfig&lt;/a&gt; step. We designed this to retrieve values from an Azure App Configuration instance and add them to an Azure Function's AppSettings.&lt;/li&gt;
  1338. &lt;/ol&gt;
  1339.  
  1340. &lt;h2 id="before-you-start"&gt;Before you start&lt;/h2&gt;
  1341.  
  1342. &lt;p&gt;This post assumes you know how to use &lt;a href="https://octopus.com/docs/projects/custom-step-templates"&gt;custom step templates&lt;/a&gt; and the Octopus &lt;a href="https://octopus.com/docs/projects/community-step-templates"&gt;community library&lt;/a&gt;.&lt;/p&gt;
  1343.  
  1344. &lt;p&gt;I also don't go into great detail about Azure App Configuration concepts or how to set it up. You can learn more by reading the &lt;a href="https://learn.microsoft.com/en-us/azure/azure-app-configuration/overview" rel="nofollow"&gt;Azure App Configuration overview&lt;/a&gt; from Microsoft.&lt;/p&gt;
  1345.  
  1346. &lt;p&gt;The step templates in this post retrieve values from an &lt;a href="https://azure.microsoft.com/en-us/products/app-configuration/" rel="nofollow"&gt;Azure App Configuration instance&lt;/a&gt; using the &lt;a href="https://learn.microsoft.com/en-us/cli/azure/" rel="nofollow"&gt;Azure Command Line Interface (CLI)&lt;/a&gt;, known as &lt;strong&gt;az&lt;/strong&gt;. You need to download the CLI and install it on the deployment target or Worker before the steps can execute successfully. I tested the step templates on Windows and Linux (with PowerShell Core installed).&lt;/p&gt;
  1347.  
  1348. &lt;h2 id="authentication"&gt;Authentication&lt;/h2&gt;
  1349.  
  1350. &lt;p&gt;Before you can retrieve values from an Azure App Configuration instance, you must authenticate with Azure. In their &lt;a href="https://learn.microsoft.com/en-us/azure/azure-app-configuration/howto-disable-access-key-authentication?tabs=portal" rel="nofollow"&gt;security concepts documentation&lt;/a&gt;, Microsoft notes:&lt;/p&gt;
  1351.  
  1352. &lt;blockquote class="blockquote"&gt;
  1353. &lt;p&gt;By default, requests can be authenticated with either Microsoft Entra credentials, or by using an access key. Of these two types of authentication schemes, Microsoft Entra ID provides superior security and ease of use over access keys, and is recommended by Microsoft.&lt;/p&gt;
  1354. &lt;/blockquote&gt;
  1355.  
  1356. &lt;p&gt;In Octopus, you can achieve authentication with an Azure App Configuration instance with an &lt;a href="https://octopus.com/docs/infrastructure/accounts/azure"&gt;Azure account&lt;/a&gt;, using a service principal.&lt;/p&gt;
  1357.  
  1358. &lt;div class="alert alert-info"&gt;&lt;p&gt;In addition to accessing resources in Azure, your service principal may need further permissions configured to access and retrieve values stored in Azure App Configuration. To learn more, read the guide &lt;a href="https://learn.microsoft.com/en-us/azure/azure-app-configuration/concept-enable-rbac" class="alert-link" rel="nofollow"&gt;Authorize access to Azure App Configuration using Microsoft Entra ID&lt;/a&gt;.&lt;/p&gt;
  1359. &lt;/div&gt;
  1360.  
  1361. &lt;h2 id="retrieving-values"&gt;Retrieving Values&lt;/h2&gt;
  1362.  
  1363. &lt;p&gt;The &lt;a href="https://library.octopus.com/step-templates/5c4fbed9-dbba-4139-8440-d8e27318772e/actiontemplate-azure-appconfig-kv-retrieve-values" rel="nofollow"&gt;Azure AppConfig KV - Retrieve Values&lt;/a&gt; step template retrieves one or more keys/values from an Azure App Configuration instance. It then creates output variables for each one retrieved.&lt;/p&gt;
  1364.  
  1365. &lt;p&gt;For each key/value, you can optionally provide a custom output variable name.&lt;/p&gt;
  1366.  
  1367. &lt;p&gt;Retrieving a single key/value requires:&lt;/p&gt;
  1368.  
  1369. &lt;ul&gt;
  1370. &lt;li&gt;An Azure account with permission to retrieve key/values from the Azure App Config instance&lt;/li&gt;
  1371. &lt;li&gt;The name of the Azure App Config instance to retrieve the key/value from&lt;/li&gt;
  1372. &lt;li&gt;The name of the key to retrieve&lt;/li&gt;
  1373. &lt;/ul&gt;
  1374.  
  1375. &lt;p&gt;An advanced feature of the step template lets you retrieve multiple keys at once. This requires entering each key name on a new line. A wildcard search is also supported using the &lt;code&gt;*&lt;/code&gt; notation in the &lt;strong&gt;Key Names&lt;/strong&gt; parameter.&lt;/p&gt;
  1376.  
  1377. &lt;div class="alert alert-warning"&gt;&lt;p&gt;Note: Combining a wildcard search with custom output variable names is not supported.&lt;/p&gt;
  1378. &lt;/div&gt;
  1379.  
  1380. &lt;p&gt;For each key/value retrieved, an &lt;a href="https://octopus.com/docs/projects/variables/output-variables"&gt;output variable&lt;/a&gt; gets created for subsequent steps. By default, you only see a count of the number of variables created in the task log. To see the names of the variables in the task log, change the &lt;strong&gt;Print output variable names&lt;/strong&gt; parameter to &lt;code&gt;True&lt;/code&gt;.&lt;/p&gt;
  1381.  
  1382. &lt;h3 id="retrieve-values-parameters"&gt;Retrieve Values step template parameters&lt;/h3&gt;
  1383.  
  1384. &lt;p&gt;The step template uses the following parameters:&lt;/p&gt;
  1385.  
  1386. &lt;ul&gt;
  1387. &lt;li&gt;&lt;p&gt;&lt;strong&gt;Azure Account&lt;/strong&gt;: An Azure account with permissions to retrieve keys/values from the Azure App Config instance.&lt;/p&gt;
  1388. &lt;/li&gt;
  1389. &lt;li&gt;&lt;p&gt;&lt;strong&gt;Config Store Name&lt;/strong&gt;: The name of the Azure App Config instance. Provide this or the &lt;strong&gt;Config Store Endpoint&lt;/strong&gt;.&lt;/p&gt;
  1390. &lt;/li&gt;
  1391. &lt;li&gt;&lt;p&gt;&lt;strong&gt;Config Store Endpoint&lt;/strong&gt;: The endpoint for the Azure App Config instance. Provide this or the &lt;strong&gt;Config Store Name&lt;/strong&gt;.&lt;/p&gt;
  1392. &lt;/li&gt;
  1393. &lt;li&gt;&lt;p&gt;&lt;strong&gt;Retrieval Method&lt;/strong&gt;: Choose between retrieving all configuration values or each entry individually. Retrieving all values from the App Config instance is usually more efficient, but could result in the return of a larger payload.&lt;/p&gt;
  1394. &lt;/li&gt;
  1395. &lt;li&gt;&lt;p&gt;&lt;strong&gt;Key Names&lt;/strong&gt;: Specify the names of the keys to be returned from Azure App Configuration, in the format: &lt;code&gt;KeyName | OutputVariableName&lt;/code&gt; where:&lt;/p&gt;
  1396. &lt;ul&gt;
  1397. &lt;li&gt;&lt;strong&gt;KeyName&lt;/strong&gt; is the key to retrieve. Wildcards are supported by adding &lt;code&gt;*&lt;/code&gt; at the end of the key name.&lt;/li&gt;
  1398. &lt;li&gt;&lt;strong&gt;OutputVariableName&lt;/strong&gt; is the &lt;em&gt;optional&lt;/em&gt; Octopus output variable name to store the key's value in. &lt;em&gt;If this value isn't specified, an output name gets generated dynamically based on the matching key name&lt;/em&gt;.&lt;/li&gt;
  1399. &lt;/ul&gt;
  1400. &lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; You can retrieve multiple keys by entering each one on a new line.&lt;/p&gt;
  1401. &lt;/li&gt;
  1402. &lt;li&gt;&lt;p&gt;&lt;strong&gt;Labels (optional)&lt;/strong&gt;: Labels are an attribute of keys. Provide one or more labels in the format &lt;code&gt;label1,label2&lt;/code&gt; to retrieve only selected keys tagged with those labels.&lt;/p&gt;
  1403. &lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; You can include both label values and specify key names.&lt;/p&gt;
  1404. &lt;/li&gt;
  1405. &lt;li&gt;&lt;p&gt;&lt;strong&gt;Save sensitive output variables&lt;/strong&gt;: Set the Octopus output variables to sensitive values. Default: &lt;code&gt;False&lt;/code&gt;.&lt;/p&gt;
  1406. &lt;/li&gt;
  1407. &lt;li&gt;&lt;p&gt;&lt;strong&gt;Suppress warnings&lt;/strong&gt;: Suppress warnings from being written to the task log. For example, when a supplied key can't be found in the Azure App Config instance. Default: &lt;code&gt;False&lt;/code&gt;.&lt;/p&gt;
  1408. &lt;/li&gt;
  1409. &lt;li&gt;&lt;p&gt;&lt;strong&gt;Treat Warnings as Errors&lt;/strong&gt;: Treats warnings as errors. If enabled, the &lt;strong&gt;Suppress Warnings&lt;/strong&gt; parameter is ignored. Default: &lt;code&gt;True&lt;/code&gt;.&lt;/p&gt;
  1410. &lt;/li&gt;
  1411. &lt;li&gt;&lt;p&gt;&lt;strong&gt;Create AppSettings JSON&lt;/strong&gt;: Create an Azure App Service AppSettings JSON output variable called &lt;strong&gt;AppSettingsJson&lt;/strong&gt;. This can be useful when using the Octopus &lt;a href="https://octopus.com/blog/deploy-an-azure-app-service-step"&gt;Azure App Service step&lt;/a&gt; and you want to dynamically create the JSON app settings for the step. Default: &lt;code&gt;False&lt;/code&gt;.&lt;/p&gt;
  1412. &lt;/li&gt;
  1413. &lt;li&gt;&lt;p&gt;&lt;strong&gt;Print output variable names&lt;/strong&gt;: Write out the Octopus output variable names to the task log. Default: &lt;code&gt;False&lt;/code&gt;.&lt;/p&gt;
  1414. &lt;/li&gt;
  1415. &lt;/ul&gt;
  1416.  
  1417. &lt;p&gt;&lt;a href='#' data-featherlight='https://i.octopus.com/blog/2023-12/using-azure-app-config-with-octopus/azure-appconfig-retrieve-keyvalues-step-parameters.png' class='zoom' data-title=''&gt;&lt;img src='https://i.octopus.com/blog/2023-12/using-azure-app-config-with-octopus/azure-appconfig-retrieve-keyvalues-step-parameters.png' class="img-fluid center" alt='Parameters for the Azure AppConfig Retrieve Values step' /&gt;&lt;/a&gt;&lt;/p&gt;
  1418.  
  1419. &lt;h3 id="using-the-retrieve-values-step"&gt;Using the Retrieve Values step&lt;/h3&gt;
  1420.  
  1421. &lt;p&gt;The &lt;strong&gt;Azure AppConfig KV - Retrieve Values&lt;/strong&gt; step gets added to deployment and runbook processes in the &lt;a href="https://octopus.com/docs/projects/steps#adding-steps-to-your-deployment-processes"&gt;same way as other steps&lt;/a&gt;.&lt;/p&gt;
  1422.  
  1423. &lt;p&gt;After you add the step to your process, fill out the parameters in the step:&lt;/p&gt;
  1424.  
  1425. &lt;p&gt;&lt;a href='#' data-featherlight='https://i.octopus.com/blog/2023-12/using-azure-app-config-with-octopus/azure-appconfig-retrieve-keyvalues-step-in-process.png' class='zoom' data-title=''&gt;&lt;img src='https://i.octopus.com/blog/2023-12/using-azure-app-config-with-octopus/azure-appconfig-retrieve-keyvalues-step-in-process.png' class="img-fluid center" alt='The Azure AppConfig Retrieve Values step used in a process' /&gt;&lt;/a&gt;&lt;/p&gt;
  1426.  
  1427. &lt;p&gt;After you fill in the parameters, you can execute the step in a runbook or deployment process. On successful execution, any matching key/values get stored as output variables. If you configured your step to print the variable names, they appear in the task log:&lt;/p&gt;
  1428.  
  1429. &lt;p&gt;&lt;a href='#' data-featherlight='https://i.octopus.com/blog/2023-12/using-azure-app-config-with-octopus/azure-appconfig-retrieve-keyvalues-step-output-variable.png' class='zoom' data-title=''&gt;&lt;img src='https://i.octopus.com/blog/2023-12/using-azure-app-config-with-octopus/azure-appconfig-retrieve-keyvalues-step-output-variable.png' class="img-fluid center" alt='Task log output for the Azure AppConfig Retrieve Values step' /&gt;&lt;/a&gt;&lt;/p&gt;
  1430.  
  1431. &lt;p&gt;In subsequent steps, you can use output variables created from matching key/values in your deployment or runbook.&lt;/p&gt;
  1432.  
  1433. &lt;div class="alert alert-info"&gt;&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; Remember to replace &lt;code&gt;Azure AppConfig KV - Retrieve Values&lt;/code&gt; with the name of your step for any output variable names.&lt;/p&gt;
  1434. &lt;/div&gt;
  1435.  
  1436. &lt;h2 id="set-azurefunction-appsettings"&gt;Set Function Application settings&lt;/h2&gt;
  1437.  
  1438. &lt;p&gt;The &lt;a href="https://library.octopus.com/step-templates/67fcc93c-509c-4c13-bc24-645eff53c5c2/actiontemplate-azure-function-set-appsettings-from-azure-appconfig" rel="nofollow"&gt;Azure Function - Set AppSettings from Azure AppConfig&lt;/a&gt; step template retrieves one or more keys/values from an Azure App Configuration instance. It then adds them to an Azure Function's Application settings for each one retrieved.&lt;/p&gt;
  1439.  
  1440. &lt;p&gt;For each key/value, you can optionally provide a custom name to use in the Function's settings.&lt;/p&gt;
  1441.  
  1442. &lt;p&gt;Retrieving and setting a single key/value requires:&lt;/p&gt;
  1443.  
  1444. &lt;ul&gt;
  1445. &lt;li&gt;An Azure account with permission to both retrieve keys/values from the Azure App Config instance and publish the settings to an Azure App Function&lt;/li&gt;
  1446. &lt;li&gt;The name of the Azure App Config instance to retrieve the key/value from&lt;/li&gt;
  1447. &lt;li&gt;The name of the key to retrieve&lt;/li&gt;
  1448. &lt;li&gt;The Azure Function
  1449. &lt;ul&gt;
  1450. &lt;li&gt;Name&lt;/li&gt;
  1451. &lt;li&gt;Resource group name&lt;/li&gt;
  1452. &lt;/ul&gt;
  1453. &lt;/li&gt;
  1454. &lt;/ul&gt;
  1455.  
  1456. &lt;p&gt;An advanced feature of the step template offers support for retrieving multiple keys at once. This requires entering each key name on a new line. A wildcard search is also supported using the &lt;code&gt;*&lt;/code&gt; notation in the &lt;strong&gt;Key Names&lt;/strong&gt; parameter. You can also combine retrieved values with additional parameters supplied to the step using the &lt;strong&gt;Additional AppSettings&lt;/strong&gt; parameter.&lt;/p&gt;
  1457.  
  1458. &lt;div class="alert alert-warning"&gt;&lt;p&gt;Note: Combining a wildcard search with custom setting names is not supported.&lt;/p&gt;
  1459. &lt;/div&gt;
  1460.  
  1461. &lt;h3 id="set-azurefunction-appsettings-parameters"&gt;Set Function Application settings parameters&lt;/h3&gt;
  1462.  
  1463. &lt;p&gt;The step template uses the following parameters:&lt;/p&gt;
  1464.  
  1465. &lt;ul&gt;
  1466. &lt;li&gt;&lt;p&gt;&lt;strong&gt;Azure Account&lt;/strong&gt;: An Azure account with permission to both retrieve values from the Azure App Config instance and publish to the App Function.&lt;/p&gt;
  1467. &lt;/li&gt;
  1468. &lt;li&gt;&lt;p&gt;&lt;strong&gt;Config Store Name&lt;/strong&gt;: The name of the Azure App Config instance. Provide this or the &lt;strong&gt;Config Store Endpoint&lt;/strong&gt;.&lt;/p&gt;
  1469. &lt;/li&gt;
  1470. &lt;li&gt;&lt;p&gt;&lt;strong&gt;Config Store Endpoint&lt;/strong&gt;: The endpoint for the Azure App Config instance. Provide this or the &lt;strong&gt;Config Store Name&lt;/strong&gt;.&lt;/p&gt;
  1471. &lt;/li&gt;
  1472. &lt;li&gt;&lt;p&gt;&lt;strong&gt;Retrieval Method&lt;/strong&gt;: Choose between retrieving all configuration values or each entry individually. Retrieving all values from the App Config instance is usually more efficient, but could result in the return of a larger payload.&lt;/p&gt;
  1473. &lt;/li&gt;
  1474. &lt;li&gt;&lt;p&gt;&lt;strong&gt;Key Names&lt;/strong&gt;: Specify the names of the keys to be returned from Azure App Configuration, in the format: &lt;code&gt;KeyName | CustomSettingName&lt;/code&gt; where:&lt;/p&gt;
  1475. &lt;ul&gt;
  1476. &lt;li&gt;&lt;strong&gt;KeyName&lt;/strong&gt; is the key to retrieve. Wildcards are supported by adding &lt;code&gt;*&lt;/code&gt; at the end of the key name.&lt;/li&gt;
  1477. &lt;li&gt;&lt;strong&gt;CustomSettingName&lt;/strong&gt; is the &lt;em&gt;optional&lt;/em&gt; name to set for the AppSetting value in the App Function. &lt;em&gt;If this value isn't specified, the original key gets used&lt;/em&gt;.&lt;/li&gt;
  1478. &lt;/ul&gt;
  1479. &lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Multiple keys can be retrieved by entering each one on a new line.&lt;/p&gt;
  1480. &lt;/li&gt;
  1481. &lt;li&gt;&lt;p&gt;&lt;strong&gt;Labels (optional)&lt;/strong&gt;: Labels are an attribute of keys. Provide one or more labels in the format &lt;code&gt;label1,label2&lt;/code&gt; to retrieve only selected keys tagged with those labels.&lt;/p&gt;
  1482. &lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; You can include both label values and specify key names.&lt;/p&gt;
  1483. &lt;/li&gt;
  1484. &lt;li&gt;&lt;p&gt;&lt;strong&gt;Suppress warnings&lt;/strong&gt;: Suppress warnings from being written to the task log. For example, when a supplied key can't be found in the Azure App Config instance. Default: &lt;code&gt;False&lt;/code&gt;.&lt;/p&gt;
  1485. &lt;/li&gt;
  1486. &lt;li&gt;&lt;p&gt;&lt;strong&gt;Treat Warnings as Errors&lt;/strong&gt;: Treats warnings as errors. If enabled, the &lt;strong&gt;Suppress Warnings&lt;/strong&gt; parameter is ignored. Default: &lt;code&gt;True&lt;/code&gt;.&lt;/p&gt;
  1487. &lt;/li&gt;
  1488. &lt;li&gt;&lt;p&gt;&lt;strong&gt;Azure Function App Name&lt;/strong&gt;: The name of the Azure App Function.&lt;/p&gt;
  1489. &lt;/li&gt;
  1490. &lt;li&gt;&lt;p&gt;&lt;strong&gt;Resource Group&lt;/strong&gt;: The name of the resource group where the Function App is located.&lt;/p&gt;
  1491. &lt;/li&gt;
  1492. &lt;li&gt;&lt;p&gt;&lt;strong&gt;Slot (optional)&lt;/strong&gt;: The name of the slot for the Azure App Function. Defaults to the production slot if not specified.&lt;/p&gt;
  1493. &lt;/li&gt;
  1494. &lt;li&gt;&lt;p&gt;&lt;strong&gt;Additional AppSettings&lt;/strong&gt;: Specify the name and values of any &lt;strong&gt;additional&lt;/strong&gt; settings to be applied to the Azure App Function in the format: &lt;code&gt;KEY | VALUE&lt;/code&gt; where:&lt;/p&gt;
  1495. &lt;ul&gt;
  1496. &lt;li&gt;&lt;strong&gt;KEY&lt;/strong&gt; is the name of the app setting to add.&lt;/li&gt;
  1497. &lt;li&gt;&lt;strong&gt;VALUE&lt;/strong&gt; is the value to be used. &lt;a href="https://octopus.com/docs/projects/variables"&gt;Octopus variables&lt;/a&gt; can be used here.&lt;/li&gt;
  1498. &lt;/ul&gt;
  1499. &lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; You can add multiple settings by entering each one on a new line. As a result, any value for a key that spans multiple lines will result in an error.&lt;/p&gt;
  1500. &lt;/li&gt;
  1501. &lt;/ul&gt;
  1502.  
  1503. &lt;p&gt;&lt;a href='#' data-featherlight='https://i.octopus.com/blog/2023-12/using-azure-app-config-with-octopus/azfunction-set-appsettings-from-appconfig-step-parameters.png' class='zoom' data-title=''&gt;&lt;img src='https://i.octopus.com/blog/2023-12/using-azure-app-config-with-octopus/azfunction-set-appsettings-from-appconfig-step-parameters.png' class="img-fluid center" alt='Parameters for the Set Azure Funtion Application settings step' /&gt;&lt;/a&gt;&lt;/p&gt;
  1504.  
  1505. &lt;h3 id="using-the-set-azurefunction-appsettings-step"&gt;Using the Setting Function Application settings step&lt;/h3&gt;
  1506.  
  1507. &lt;p&gt;The &lt;strong&gt;Azure Function - Set AppSettings from Azure AppConfig&lt;/strong&gt; step gets added to deployment and runbook processes in the &lt;a href="https://octopus.com/docs/projects/steps#adding-steps-to-your-deployment-processes"&gt;same way as other steps&lt;/a&gt;.&lt;/p&gt;
  1508.  
  1509. &lt;p&gt;After you add the step to your process, fill out the parameters in the step:&lt;/p&gt;
  1510.  
  1511. &lt;p&gt;&lt;a href='#' data-featherlight='https://i.octopus.com/blog/2023-12/using-azure-app-config-with-octopus/azfunction-set-appsettings-from-appconfig-step-in-process.png' class='zoom' data-title=''&gt;&lt;img src='https://i.octopus.com/blog/2023-12/using-azure-app-config-with-octopus/azfunction-set-appsettings-from-appconfig-step-in-process.png' class="img-fluid center" alt='The Set Azure Funtion Application settings step used in a process' /&gt;&lt;/a&gt;&lt;/p&gt;
  1512.  
  1513. &lt;p&gt;After you fill in the parameters, you can execute the step in a runbook or deployment process. On successful execution, any matching key/values from the Azure App Config instance get published to the Azure App Function, and details appear in the task log:&lt;/p&gt;
  1514.  
  1515. &lt;p&gt;&lt;a href='#' data-featherlight='https://i.octopus.com/blog/2023-12/using-azure-app-config-with-octopus/azfunction-set-appsettings-from-appconfig-step-output.png' class='zoom' data-title=''&gt;&lt;img src='https://i.octopus.com/blog/2023-12/using-azure-app-config-with-octopus/azfunction-set-appsettings-from-appconfig-step-output.png' class="img-fluid center" alt='Task log output for the Set Azure Funtion Application settings step' /&gt;&lt;/a&gt;&lt;/p&gt;
  1516.  
  1517. &lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
  1518.  
  1519. &lt;p&gt;The step templates covered in this post show that it's easy to integrate with Azure App Configuration to retrieve the keys/values stored there. You can use these keys/values in subsequent steps in your Octopus deployments or runbooks or publish those values directly as application settings to an Azure App Function.&lt;/p&gt;
  1520.  
  1521. &lt;h2 id="watch-the-video-walkthrough-introducing-step-templates-for-azure-app-config"&gt;Watch the video walkthrough: Introducing step templates for Azure App Config&lt;/h2&gt;
  1522.  
  1523. &lt;iframe width="560" height="315" src="https://www.youtube.com/embed/dEUdIWpoAOA?si=_rCv_ApLNCfvAQNt" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen&gt;&lt;/iframe&gt;
  1524.  
  1525. &lt;p&gt;Happy deployments!&lt;/p&gt;
  1526. </content>
  1527.  </entry>
  1528.  <entry>
  1529.    <id>https://octopus.com/blog/tis-week-before-xmas</id>
  1530.    <title type="text">'Tis the week before Christmas...</title>
  1531.    <published>2023-12-18T14:00:00Z</published>
  1532.    <updated>2023-12-14T00:28:59.335894Z</updated>
  1533.    <author>
  1534.      <name>andrew.corrigan@octopus.com, Octopus Deploy</name>
  1535.    </author>
  1536.    <link href="https://octopus.com/blog/tis-week-before-xmas" />
  1537.    <content type="html">&lt;p&gt;&lt;img src="https://i.octopus.com/blog/2023-12/tis-week-before-xmas/blogimage-anoctopuschirstmas-2023.png" alt="Octopus santa driving sleigh, delivering packages around the world to different houses surrounded by trees and a snowman." /&gt;&lt;/p&gt;
  1538.  
  1539. &lt;p&gt;'Tis the week before Christmas, for many in DevOps,&lt;br&gt;
  1540. Soon not a sprint will start, not even at Microsoft.&lt;br&gt;
  1541. Late updates will commit, last-minute deployments will get done,&lt;br&gt;
  1542. And those who celebrate the holidays will gear up for some fun.&lt;br&gt;&lt;/p&gt;
  1543.  
  1544. &lt;p&gt;So what better time to reflect and celebrate,&lt;br&gt;
  1545. To think of the year behind, and how we improved deployment rates.&lt;br&gt;
  1546. 2023 has been a raging success,&lt;br&gt;
  1547. So let's look at all the things Octopus did, that only it does best.&lt;br&gt;&lt;/p&gt;
  1548.  
  1549. &lt;h2 id="how-we-improved-octopus"&gt;How we improved Octopus&lt;/h2&gt;
  1550.  
  1551. &lt;blockquote class="blockquote"&gt;
  1552. &lt;p&gt;We like solving problems for software teams,&lt;br&gt;
  1553. And we work hard on new features so you can deploy at great speeds.&lt;br&gt;
  1554. If multi-tenancy, Kubernetes, or operations get you blue,&lt;br&gt;
  1555. In 2023, Octopus might have released the right features for you.&lt;br&gt;&lt;/p&gt;
  1556. &lt;/blockquote&gt;
  1557.  
  1558. &lt;p&gt;This year, we invested our time heavily in 3 core areas: Kubernetes, tenanted deployments, and improvements that help you scale.&lt;/p&gt;
  1559.  
  1560. &lt;p&gt;Here are some of the standout features and changes we made to Octopus in 2023:&lt;/p&gt;
  1561.  
  1562. &lt;h3 id="better-kubernetes-deployments"&gt;Better Kubernetes deployments&lt;/h3&gt;
  1563.  
  1564. &lt;ul&gt;
  1565. &lt;li&gt;&lt;a href="https://octopus.com/blog/live-updates-kubernetes-objects-deployments"&gt;Live Kubernetes object status check&lt;/a&gt; - See how objects in your Kubernetes clusters are performing to help with maintenance and troubleshooting.&lt;/li&gt;
  1566. &lt;li&gt;&lt;a href="https://octopus.com/docs/deployments/kubernetes/kustomize"&gt;Kustomize support added&lt;/a&gt; - Our new Kustomize step lets you use one YAML template and easily adjust it for your apps, environments, or tenants.&lt;/li&gt;
  1567. &lt;li&gt;&lt;a href="https://octopus.com/blog/manifests-from-git"&gt;Get Kubernetes configuration straight from Git&lt;/a&gt; - Save time spent on packaging and use one repository for many projects.&lt;/li&gt;
  1568. &lt;/ul&gt;
  1569.  
  1570. &lt;h3 id="better-tenanted-deployments"&gt;Better tenanted deployments&lt;/h3&gt;
  1571.  
  1572. &lt;ul&gt;
  1573. &lt;li&gt;&lt;a href="https://octopus.com/blog/redesigned-tenant-overview-dashboard"&gt;Tenants dashboard makeover&lt;/a&gt; - It's now easier to track projects, environments, and tenant tags for all your tenants.&lt;/li&gt;
  1574. &lt;li&gt;&lt;a href="https://octopus.com/blog/connect-project-multiple-tenants-bulk-action"&gt;Tenant bulk actions&lt;/a&gt; - Easier tenant management at scale.&lt;/li&gt;
  1575. &lt;/ul&gt;
  1576.  
  1577. &lt;h3 id="reduced-manual-intervention"&gt;Reduced manual intervention&lt;/h3&gt;
  1578.  
  1579. &lt;ul&gt;
  1580. &lt;li&gt;&lt;a href="https://octopus.com/blog/step-retries"&gt;Step retries&lt;/a&gt; - Automatically retry deployment steps to reduce manual intervention when connectivity problems strike.&lt;/li&gt;
  1581. &lt;li&gt;&lt;a href="https://octopus.com/blog/execution-timeouts"&gt;Step timeouts&lt;/a&gt; - Set steps to timeout to help catch the times when processes hang.&lt;/li&gt;
  1582. &lt;li&gt;&lt;a href="https://octopus.com/blog/tentacle-communication-resiliency"&gt;Resilient Tentacles&lt;/a&gt; - Tentacles now automatically retry after communications failures.&lt;/li&gt;
  1583. &lt;/ul&gt;
  1584.  
  1585. &lt;h3 id="more-integration"&gt;More integration&lt;/h3&gt;
  1586.  
  1587. &lt;ul&gt;
  1588. &lt;li&gt;&lt;a href="https://octopus.com/blog/github-seamless-integration"&gt;OpenID Connect for both GitHub and Microsoft Azure&lt;/a&gt; - Add either tool to your deployment pipeline with ease.&lt;/li&gt;
  1589. &lt;/ul&gt;
  1590.  
  1591. &lt;h3 id="great-ui-changes"&gt;Great UI changes:&lt;/h3&gt;
  1592.  
  1593. &lt;ul&gt;
  1594. &lt;li&gt;Version-controlled variables - Manage variables alongside your deployment process code and scope them to environments, roles, targets, and more.&lt;/li&gt;
  1595. &lt;li&gt;&lt;a href="https://octopus.com/blog/reprioritize-task-queue"&gt;Reprioritize tasks&lt;/a&gt; - Easily shuffle tasks around in runbooks and deployments as priorities change.&lt;/li&gt;
  1596. &lt;li&gt;New onboarding process - Our improved onboarding helps you get to grips with Octopus faster.&lt;/li&gt;
  1597. &lt;/ul&gt;
  1598.  
  1599. &lt;h3 id="but-wait-theres-more"&gt;But wait, there's more!&lt;/h3&gt;
  1600.  
  1601. &lt;p&gt;These are just our standout updates. Check out our &lt;a href="https://octopus.com/whatsnew"&gt;What's new?&lt;/a&gt; page to see more changes and improvements to Octopus this year.&lt;/p&gt;
  1602.  
  1603. &lt;p&gt;Next year's planned improvements include:&lt;/p&gt;
  1604.  
  1605. &lt;ul&gt;
  1606. &lt;li&gt;A new, dedicated Kubernetes Tentacle to deploy to many clusters without compromising on enterprise-grade security&lt;/li&gt;
  1607. &lt;li&gt;GitHub App to connect Octopus and GitHub without managing credentials&lt;/li&gt;
  1608. &lt;li&gt;Resilient Deployment Pipeline to scale to 1000 concurrent deployments and more&lt;/li&gt;
  1609. &lt;li&gt;Config as Code for Octopus Runbooks&lt;/li&gt;
  1610. &lt;li&gt;Terraform Provider enhancements&lt;/li&gt;
  1611. &lt;li&gt;Streamlined project setup&lt;/li&gt;
  1612. &lt;li&gt;More usability, performance, and small improvements that make for happy deployments&lt;/li&gt;
  1613. &lt;/ul&gt;
  1614.  
  1615. &lt;p&gt;&lt;a href="https://roadmap.octopus.com/tabs/2-planned" rel="nofollow"&gt;See our roadmap&lt;/a&gt; to stay in the loop about what's coming next.&lt;/p&gt;
  1616.  
  1617. &lt;h2 id="we-travelled-the-world-to-meet-you"&gt;We travelled the world to meet you&lt;/h2&gt;
  1618.  
  1619. &lt;blockquote class="blockquote"&gt;
  1620. &lt;p&gt;We travelled the world, though slower than Saint Nick,&lt;br&gt;
  1621. To meet you in person at industry gigs.&lt;br&gt;
  1622. We showed off Octopus, talked shop, and heard of your pains,&lt;br&gt;
  1623. We learned lots, made friends, and can't wait to do it again.&lt;br&gt;&lt;/p&gt;
  1624. &lt;/blockquote&gt;
  1625.  
  1626. &lt;p&gt;We found so much value in meeting everyone at many of this year's industry events, including:&lt;/p&gt;
  1627.  
  1628. &lt;ul&gt;
  1629. &lt;li&gt;NDC London and Oslo&lt;/li&gt;
  1630. &lt;li&gt;KubeCon Europe and North America in Amsterdam and Chicago&lt;/li&gt;
  1631. &lt;li&gt;GitHub Universe in San Francisco&lt;/li&gt;
  1632. &lt;li&gt;DevOps Enterprise Summit in Las Vegas&lt;/li&gt;
  1633. &lt;li&gt;Gartner Sydney&lt;/li&gt;
  1634. &lt;/ul&gt;
  1635.  
  1636. &lt;p&gt;We also &lt;em&gt;loved&lt;/em&gt; talking about Octopus and sharing our experiences at events like:&lt;/p&gt;
  1637.  
  1638. &lt;ul&gt;
  1639. &lt;li&gt;Web Directions&lt;/li&gt;
  1640. &lt;li&gt;ProductTank&lt;/li&gt;
  1641. &lt;li&gt;Women in Tech&lt;/li&gt;
  1642. &lt;li&gt;Google Developer Group&lt;/li&gt;
  1643. &lt;li&gt;SSW .NET Group&lt;/li&gt;
  1644. &lt;li&gt;Cloud Native Summit&lt;/li&gt;
  1645. &lt;/ul&gt;
  1646.  
  1647. &lt;p&gt;A heartfelt thanks to anyone who stopped to talk or heard what we had to say. If you're a regular attendee of these events, we look forward to seeing you in person again next year!&lt;/p&gt;
  1648.  
  1649. &lt;p&gt;Make sure to keep track of &lt;a href="https://octopus.com/events"&gt;Octopus events&lt;/a&gt; and &lt;a href="https://octopus.com/webinars"&gt;webinars&lt;/a&gt; to see more of us in the future.&lt;/p&gt;
  1650.  
  1651. &lt;h2 id="we-launched-our-own-event-with-shipped23"&gt;We launched our own event with SHIPPED23&lt;/h2&gt;
  1652.  
  1653. &lt;blockquote class="blockquote"&gt;
  1654. &lt;p&gt;Not just content with our travels, we held an event of our own,&lt;br&gt;
  1655. With SHIPPED23, where we shared what we know.&lt;br&gt;
  1656. We talked software delivery in all the ways we could glean,&lt;br&gt;
  1657. Bringing the smartest of Octopus right to your screen.&lt;br&gt;&lt;/p&gt;
  1658. &lt;/blockquote&gt;
  1659.  
  1660. &lt;p&gt;On November 15, we held our own virtual conference in the form of SHIPPED23.&lt;/p&gt;
  1661.  
  1662. &lt;p&gt;SHIPPED23 featured talks covering many aspects of software delivery, from concepts and best practices to Octopus itself. Our talks included:&lt;/p&gt;
  1663.  
  1664. &lt;ul&gt;
  1665. &lt;li&gt;Accelerating software delivery at scale&lt;/li&gt;
  1666. &lt;li&gt;What's new for Octopus and what's on the roadmap&lt;/li&gt;
  1667. &lt;li&gt;How we're scaling Octopus Cloud&lt;/li&gt;
  1668. &lt;li&gt;Real-world release pipelines with GitHub Actions and Octopus&lt;/li&gt;
  1669. &lt;li&gt;Beyond GitOps: How to apply Kubernetes best practices to enterprises' reality&lt;/li&gt;
  1670. &lt;li&gt;Tracking, predicting, and preventing performance regressions in Octopus&lt;/li&gt;
  1671. &lt;li&gt;New features for tenanted deployments&lt;/li&gt;
  1672. &lt;li&gt;DORA, DevOps, and deployments&lt;/li&gt;
  1673. &lt;li&gt;Multi-tenancy architecture lessons learned&lt;/li&gt;
  1674. &lt;/ul&gt;
  1675.  
  1676. &lt;p&gt;Watch the event via our YouTube playlist:&lt;/p&gt;
  1677.  
  1678. &lt;iframe width="560" height="315" src="https://www.youtube.com/embed/g4HVEQDoJP0?si=XTO21SqT2_mZYPae" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen&gt;&lt;/iframe&gt;
  1679.  
  1680. &lt;p&gt;We have plenty of other great videos on the &lt;a href="https://www.youtube.com/@OctopusDeploy" rel="nofollow"&gt;Octopus Deploy YouTube channel&lt;/a&gt; too, including guides, industry talking points, and more.&lt;/p&gt;
  1681.  
  1682. &lt;p&gt;Our YouTube channel also hosts our podcasts, &lt;a href="https://www.youtube.com/watch?v=_46blr2aVU4&amp;amp;list=PLAGskdGvlaw27osVwBUbZ6xTKo6T7XNfH" rel="nofollow"&gt;Deploy on Friday&lt;/a&gt; - a weekly show about all things Octopus, hosted by John Bristowe and Jim Pelletier - and &lt;a href="https://www.youtube.com/watch?v=gZy2pgSjE5I&amp;amp;list=PLAGskdGvlaw3znIHGhO5b0ANq9z3yHGJH" rel="nofollow"&gt;Inside DevOps&lt;/a&gt;.&lt;/p&gt;
  1683.  
  1684. &lt;h2 id="our-website-continues-to-improve"&gt;Our website continues to improve&lt;/h2&gt;
  1685.  
  1686. &lt;blockquote class="blockquote"&gt;
  1687. &lt;p&gt;Octopus's website is a wonderful tool,&lt;br&gt;
  1688. It's where we give updates and explain our value to you.&lt;br&gt;
  1689. Its development is an ongoing task,&lt;br&gt;
  1690. But we made massive steps in the year that's just passed.&lt;br&gt;&lt;/p&gt;
  1691. &lt;/blockquote&gt;
  1692.  
  1693. &lt;p&gt;In late 2022, we gave our homepage a new look, but our work didn't stop there.&lt;/p&gt;
  1694.  
  1695. &lt;p&gt;We've been redeveloping our website over the entire year, so it better explains how Octopus simplifies enterprise, tenanted, and Kubernetes deployments.&lt;/p&gt;
  1696.  
  1697. &lt;p&gt;We have new pages that explain how Octopus helps with specific deployment strategies:&lt;/p&gt;
  1698.  
  1699. &lt;ul&gt;
  1700. &lt;li&gt;&lt;a href="https://octopus.com/use-case/tenanted-deployments"&gt;Tenanted deployments&lt;/a&gt;&lt;/li&gt;
  1701. &lt;li&gt;&lt;a href="https://octopus.com/use-case/kubernetes"&gt;Kubernetes deployments&lt;/a&gt;&lt;/li&gt;
  1702. &lt;li&gt;&lt;a href="https://octopus.com/use-case/container-deployments"&gt;Container deployments&lt;/a&gt;&lt;/li&gt;
  1703. &lt;/ul&gt;
  1704.  
  1705. &lt;p&gt;We have new and updated feature pages:&lt;/p&gt;
  1706.  
  1707. &lt;ul&gt;
  1708. &lt;li&gt;&lt;a href="https://octopus.com/features/tenants"&gt;Octopus Tenants&lt;/a&gt;&lt;/li&gt;
  1709. &lt;li&gt;&lt;a href="https://octopus.com/github"&gt;GitHub Actions&lt;/a&gt;&lt;/li&gt;
  1710. &lt;li&gt;&lt;a href="https://octopus.com/enterprise"&gt;Octopus and enterprise organizations&lt;/a&gt;&lt;/li&gt;
  1711. &lt;li&gt;&lt;a href="https://octopus.com/company/trust"&gt;Trust center&lt;/a&gt;&lt;/li&gt;
  1712. &lt;/ul&gt;
  1713.  
  1714. &lt;p&gt;We provided tools and specialist content that help you understand more about deployments, DevOps, and our value:&lt;/p&gt;
  1715.  
  1716. &lt;ul&gt;
  1717. &lt;li&gt;&lt;a href="https://octopus.com/deployment-capability-assessment"&gt;Deployment capability assessment&lt;/a&gt;&lt;/li&gt;
  1718. &lt;li&gt;&lt;a href="https://octopus.com/whitepapers"&gt;Octopus white papers on Continuous Delivery, deployment automation, and DevOps&lt;/a&gt;&lt;/li&gt;
  1719. &lt;/ul&gt;
  1720.  
  1721. &lt;p&gt;We also told the Octopus story in new ways:&lt;/p&gt;
  1722.  
  1723. &lt;ul&gt;
  1724. &lt;li&gt;&lt;a href="https://octopus.com/company"&gt;We are Octopus&lt;/a&gt; - about us and the company's timeline&lt;/li&gt;
  1725. &lt;li&gt;&lt;a href="https://octopus.com/company/customers"&gt;Octopus customer stories&lt;/a&gt; - read about how we made the lives of software teams much easier&lt;/li&gt;
  1726. &lt;li&gt;&lt;a href="https://octopus.com/partners"&gt;Octopus Partners&lt;/a&gt; - read about our partners helping with DevOps solutions, and apply to become one&lt;/li&gt;
  1727. &lt;/ul&gt;
  1728.  
  1729. &lt;h2 id="in-stats"&gt;2023 in stats&lt;/h2&gt;
  1730.  
  1731. &lt;blockquote class="blockquote"&gt;
  1732. &lt;p&gt;Like many in tech, we love some good stats,&lt;br&gt;
  1733. So we hit up our experts whose data we track.&lt;br&gt;
  1734. From all of the areas of which we hold dear,&lt;br&gt;
  1735. Here are some facts from another great year.&lt;br&gt;&lt;/p&gt;
  1736. &lt;/blockquote&gt;
  1737.  
  1738. &lt;p&gt;To finish, here are some fun stats about Octopus's year (at the time of writing):&lt;/p&gt;
  1739.  
  1740. &lt;ul&gt;
  1741. &lt;li&gt;Our customers completed over &lt;strong&gt;44,626,113&lt;/strong&gt; deployments.&lt;/li&gt;
  1742. &lt;li&gt;Our customers ran over &lt;strong&gt;600,000&lt;/strong&gt; Kubernetes steps each month.&lt;/li&gt;
  1743. &lt;li&gt;We archived over &lt;strong&gt;234,621,521&lt;/strong&gt; audit events in Octopus Cloud with our new audit log archiving feature.&lt;/li&gt;
  1744. &lt;li&gt;We had &lt;strong&gt;749,452&lt;/strong&gt; pageviews on our blog. &lt;a href="https://octopus.com/blog/kubernetes-pod-cpu-memory"&gt;Checking Kubernetes pod CPU and memory&lt;/a&gt; was our most popular post, with &lt;strong&gt;34,405&lt;/strong&gt; views.&lt;/li&gt;
  1745. &lt;li&gt;We ran over &lt;strong&gt;1.1 million&lt;/strong&gt; build and test jobs while working on Octopus Server, which is roughly 48 years of compute time! Octopus Server also had the following code changes:
  1746. &lt;ul&gt;
  1747. &lt;li&gt;&lt;strong&gt;14,788&lt;/strong&gt; files changed&lt;/li&gt;
  1748. &lt;li&gt;&lt;strong&gt;391,156&lt;/strong&gt; lines added&lt;/li&gt;
  1749. &lt;li&gt;&lt;strong&gt;190,860&lt;/strong&gt; lines deleted&lt;/li&gt;
  1750. &lt;li&gt;&lt;strong&gt;69,065&lt;/strong&gt; lines modified&lt;/li&gt;
  1751. &lt;/ul&gt;
  1752. &lt;/li&gt;
  1753. &lt;li&gt;Our support team:
  1754. &lt;ul&gt;
  1755. &lt;li&gt;Received &lt;strong&gt;4,984&lt;/strong&gt; support requests&lt;/li&gt;
  1756. &lt;li&gt;Sent &lt;strong&gt;15,267&lt;/strong&gt; responses&lt;/li&gt;
  1757. &lt;li&gt;Averaged a response time of &lt;strong&gt;18 minutes&lt;/strong&gt; for tickets for our enterprise customers, and &lt;strong&gt;48 minutes&lt;/strong&gt; for everyone else&lt;/li&gt;
  1758. &lt;/ul&gt;
  1759. &lt;/li&gt;
  1760. &lt;li&gt;Our People and Culture team's hiring process saw:
  1761. &lt;ul&gt;
  1762. &lt;li&gt;&lt;strong&gt;12,293&lt;/strong&gt; applications&lt;/li&gt;
  1763. &lt;li&gt;&lt;strong&gt;1,101&lt;/strong&gt; people interviewed&lt;/li&gt;
  1764. &lt;li&gt;&lt;strong&gt;40&lt;/strong&gt; accepted offers&lt;/li&gt;
  1765. &lt;/ul&gt;
  1766. &lt;/li&gt;
  1767. &lt;/ul&gt;
  1768.  
  1769. &lt;h2 id="happy-deployments-to-all-and-to-all-a-good-night"&gt;Happy deployments to all, and to all a good night!&lt;/h2&gt;
  1770.  
  1771. &lt;p&gt;As you can see, Octopus had a terrific year, and we can't wait to keep helping software teams with complex deployments in 2024.&lt;/p&gt;
  1772.  
  1773. &lt;p&gt;Just a reminder that staff at Octopus take a well-earned rest over the holidays. Fret not, &lt;a href="https://octopus.com/support"&gt;we'll still be available to support you&lt;/a&gt; if needed.&lt;/p&gt;
  1774.  
  1775. &lt;p&gt;Happy deployments!&lt;/p&gt;
  1776. </content>
  1777.  </entry>
  1778.  <entry>
  1779.    <id>https://octopus.com/blog/bulk-update-execution-container-image</id>
  1780.    <title type="text">How to bulk update the execution container image</title>
  1781.    <published>2023-12-13T14:00:00Z</published>
  1782.    <updated>2023-12-07T04:26:32.4231007Z</updated>
  1783.    <author>
  1784.      <name>shawn.sesna@octopus.com, Octopus Deploy</name>
  1785.    </author>
  1786.    <link href="https://octopus.com/blog/bulk-update-execution-container-image" />
  1787.    <content type="html">&lt;p&gt;&lt;img src="https://i.octopus.com/blog/2023-12/bulk-update-execution-container-image/executions-api-header-image.png" alt="Green speedometer with the arrow at maximum speed where a green rocket is launching." /&gt;&lt;/p&gt;
  1788.  
  1789. &lt;p&gt;&lt;a href="https://octopus.com/docs/projects/steps/execution-containers-for-workers"&gt;Execution containers&lt;/a&gt; in Octopus Deploy make it easy to ensure you have the tooling you need when running your steps.&lt;/p&gt;
  1790.  
  1791. &lt;p&gt;As with all things that use containers, you need to specify either the specific tag for the version you want to use or always accept the latest version.  For various reasons, you may need to update the image and or tag used with execution containers. This can be time-consuming if you have lots of processes or runbooks that make use of them.&lt;/p&gt;
  1792.  
  1793. &lt;p&gt;In this post, I show you how to use PowerShell and the Octopus API to programmatically update the execution container image.&lt;/p&gt;
  1794.  
  1795. &lt;h2 id="the-issue-using-worker-tools-for-execution-containers"&gt;The issue using worker-tools for execution containers&lt;/h2&gt;
  1796.  
  1797. &lt;p&gt;If you’re familiar with the &lt;a href="https://samples.octopus.app" rel="nofollow"&gt;Samples&lt;/a&gt; instance, you'll know that the projects make heavy use of execution containers. I maintain the Samples, so it's my job to make sure that the examples continue to function and deploy properly.&lt;/p&gt;
  1798.  
  1799. &lt;p&gt;Many of the example projects used the &lt;a href="https://hub.docker.com/r/octopusdeploy/worker-tools" rel="nofollow"&gt;octopusdeploy/worker-tools&lt;/a&gt; image as it contains commonly used tooling for a multitude of tasks.  However, this image doesn't use the &lt;code&gt;latest&lt;/code&gt; tag, so you need to specify the tag version in every step that uses it.&lt;/p&gt;
  1800.  
  1801. &lt;p&gt;We developed the example projects on Samples when the standard Ubuntu image was version 18.04. This is now deprecated and we tagged the worker-tools image this way.  Going through each project and updating the referenced container one-by-one was less than appealing - Octopus API to the rescue!&lt;/p&gt;
  1802.  
  1803. &lt;h3 id="powershell-script"&gt;PowerShell script&lt;/h3&gt;
  1804.  
  1805. &lt;p&gt;I knew this would be an ongoing issue, so I wrote a PowerShell script that uses the Octopus API to iterate through all spaces, projects, and runbooks and update them to use the image that I specified. &lt;/p&gt;
  1806.  
  1807. &lt;div class="alert alert-info"&gt;&lt;p&gt;The following script is just an example of how to perform bulk operations on deployment and runbook steps. Please review carefully if you intend to run this on your own instance.&lt;/p&gt;
  1808. &lt;/div&gt;
  1809.  
  1810. &lt;h4 id="variables"&gt;Variables&lt;/h4&gt;
  1811.  
  1812. &lt;p&gt;The script requires a few variables for execution:&lt;/p&gt;
  1813.  
  1814. &lt;ul&gt;
  1815. &lt;li&gt;&lt;code&gt;$octopusUrl&lt;/code&gt;: The URL to your Octopus instance&lt;/li&gt;
  1816. &lt;li&gt;&lt;code&gt;$octopusAPIKey&lt;/code&gt;: API key with sufficient permissions to update the deployment and runbook processes&lt;/li&gt;
  1817. &lt;li&gt;&lt;code&gt;$linuxWorkerToolsImage&lt;/code&gt;: The Linux image to update to (for example, &lt;code&gt;octopusdeploy/worker-tools:ubuntu.22.04&lt;/code&gt;)&lt;/li&gt;
  1818. &lt;li&gt;&lt;code&gt;$windowsWorkerToolsImage&lt;/code&gt;: The Windows image to update to (for example, &lt;code&gt;octopusdeploy/worker-tools:windows.ltsc2019&lt;/code&gt;)&lt;/li&gt;
  1819. &lt;/ul&gt;
  1820.  
  1821. &lt;h4 id="the-script"&gt;The script&lt;/h4&gt;
  1822.  
  1823. &lt;p&gt;The script below iterates through all spaces, deployment processes, and runbook processes looking for where an execution container is used.  If found, it checks to see if the name of the image contains &lt;code&gt;octopusdeploy/worker-tools&lt;/code&gt; and updates the image to the one specified in the &lt;code&gt;$linuxWorkerToolsImage&lt;/code&gt; or &lt;code&gt;$windowsWorkerToolsImage&lt;/code&gt;.&lt;/p&gt;
  1824.  
  1825. &lt;div class="alert alert-info"&gt;&lt;p&gt;Version controlled projects and runbooks that have never been published get skipped. I made an assumption that runbooks that have never been published are that way on purpose.&lt;/p&gt;
  1826. &lt;/div&gt;
  1827.  
  1828. &lt;pre&gt;&lt;code class="language-powershell"&gt;$ErrorActionPreference = &amp;quot;Stop&amp;quot;;
  1829.  
  1830.  
  1831. function Get-OctopusItems
  1832. {
  1833.    # Define parameters
  1834.    param(
  1835.        $OctopusUri,
  1836.        $ApiKey,
  1837.        $SkipCount = 0
  1838.    )
  1839.  
  1840.    # Define working variables
  1841.    $items = @()
  1842.    $skipQueryString = &amp;quot;&amp;quot;
  1843.    $headers = @{&amp;quot;X-Octopus-ApiKey&amp;quot;=&amp;quot;$ApiKey&amp;quot;}
  1844.  
  1845.  
  1846.    # Check to see if there there is already a querystring
  1847.    if ($octopusUri.Contains(&amp;quot;?&amp;quot;))
  1848.    {
  1849.        $skipQueryString = &amp;quot;&amp;amp;skip=&amp;quot;
  1850.    }
  1851.    else
  1852.    {
  1853.        $skipQueryString = &amp;quot;?skip=&amp;quot;
  1854.    }
  1855.  
  1856.  
  1857.    $skipQueryString += $SkipCount
  1858.  
  1859.    # Get intial set
  1860.    Write-Host &amp;quot;Calling $OctopusUri$skipQueryString&amp;quot;
  1861.    $resultSet = Invoke-RestMethod -Uri &amp;quot;$($OctopusUri)$skipQueryString&amp;quot; -Method GET -Headers $headers
  1862.  
  1863.  
  1864.    # Check to see if it returned an item collection
  1865.    if ($null -ne $resultSet.Items)
  1866.    {
  1867.        # Store call results
  1868.        $items += $resultSet.Items
  1869.  
  1870.        # Check to see if resultset is bigger than page amount
  1871.        if (($resultSet.Items.Count -gt 0) -and ($resultSet.Items.Count -eq $resultSet.ItemsPerPage))
  1872.        {
  1873.            # Increment skip count
  1874.            $SkipCount += $resultSet.ItemsPerPage
  1875.  
  1876.  
  1877.            # Recurse
  1878.            $items += Get-OctopusItems -OctopusUri $OctopusUri -ApiKey $ApiKey -SkipCount $SkipCount
  1879.        }
  1880.    }
  1881.    else
  1882.    {
  1883.        return $resultSet
  1884.    }
  1885.  
  1886.  
  1887.  
  1888.    # Return results
  1889.    return $items
  1890. }
  1891.  
  1892.  
  1893. # Define working variables
  1894. $octopusURL = &amp;quot;https://YourUrl&amp;quot;
  1895. $octopusAPIKey = &amp;quot;API-YourApiKey&amp;quot;
  1896. $linuxWorkerToolsImage = &amp;quot;octopusdeploy/worker-tools:ubuntu.22.04&amp;quot;
  1897. $windowsWorkerToolsImage = &amp;quot;octopusdeploy/worker-tools:windows.ltsc2019&amp;quot;
  1898. $header = @{ &amp;quot;X-Octopus-ApiKey&amp;quot; = $octopusAPIKey }
  1899.  
  1900.  
  1901. # Get space
  1902. $spaces = Get-OctopusItems -OctopusUri &amp;quot;$octopusURL/api/spaces&amp;quot; -ApiKey $octopusAPIKey
  1903.  
  1904.  
  1905. foreach ($space in $spaces) {
  1906.    Write-Host &amp;quot;Working on space $($space.name)&amp;quot;
  1907.  
  1908.  
  1909.    Write-Host &amp;quot;Getting project list ...&amp;quot;                                                                              
  1910.    $projects = Get-OctopusItems -OctopusUri &amp;quot;$octopusURL/api/$($space.Id)/projects&amp;quot; -ApiKey $octopusAPIKey
  1911.  
  1912.  
  1913.    # Loop through projects
  1914.    foreach ($project in $projects)
  1915.    {
  1916.        # Check to see if project is version controlled
  1917.        if ($project.IsVersionControlled -eq $true)
  1918.        {
  1919.            Write-Host &amp;quot;Project is version controlled, skipping ...&amp;quot;
  1920.            continue
  1921.        }
  1922.  
  1923.        # Get project deployment process
  1924.        Write-Host &amp;quot;Getting deployment process for $($project.Name)...&amp;quot;
  1925.        $deploymentProcess = Get-OctopusItems -OctopusUri &amp;quot;$octopusURL/api/$($space.Id)/deploymentProcesses/$($project.DeploymentProcessId)&amp;quot; -ApiKey $octopusAPIKey
  1926.        $processUpdated = $false
  1927.  
  1928.  
  1929.        # Analyze steps
  1930.        foreach ($step in $deploymentProcess.Steps)
  1931.        {
  1932.            # Analyze action
  1933.            foreach ($action in $step.Actions)
  1934.            {
  1935.                if (![string]::IsNullOrWhiteSpace($action.Container.Image))
  1936.                {
  1937.                    # Check to see if the image contains our name
  1938.                    if ($action.Container.Image.Contains(&amp;quot;octopusdeploy/worker-tools&amp;quot;))
  1939.                    {
  1940.                        # Determine architecture
  1941.                        if ($action.Container.Image.Contains(&amp;quot;ubuntu&amp;quot;) -and ($action.Container.Image -ne $linuxWorkerToolsImage))
  1942.                        {
  1943.                            # Update with specified image
  1944.                            Write-Host &amp;quot;Updating step $($step.Name) to use $linuxWorkerToolsImage ...&amp;quot;
  1945.                            $action.Container.Image = $linuxWorkerToolsImage
  1946.                            $processUpdated = $true
  1947.                        }
  1948.  
  1949.  
  1950.                        if ($action.Container.Image.Contains(&amp;quot;windows&amp;quot;)-and ($action.Container.Image -ne $windowsWorkerToolsImage))
  1951.                        {
  1952.                            # Update with specified image
  1953.                            Write-Host &amp;quot;Updating step $($step.Name) to use $windowsWorkerToolsImage ...&amp;quot;
  1954.                            $action.Container.Image = $windowsWorkerToolsImage
  1955.                            $processUpdated = $true
  1956.                        }
  1957.                    }
  1958.                    else
  1959.                    {
  1960.                        Write-Host &amp;quot;Specified container image does not match 'octopusdeploy/worker-tools', skipping ...&amp;quot;
  1961.                    }
  1962.                }
  1963.            }
  1964.        }
  1965.  
  1966.  
  1967.        # Update the deployment process
  1968.        Write-Host &amp;quot;Updating deployment process for $($project.Name) ...&amp;quot;
  1969.        Invoke-RestMethod -Method Put -Uri &amp;quot;$octopusURL/api/$($space.Id)/deploymentProcesses/$($project.DeploymentProcessId)&amp;quot; -Body ($deploymentProcess | ConvertTo-Json -Depth 10) -Headers $header
  1970.  
  1971.  
  1972.        # Get runbooks for project
  1973.        $runbooks = Get-OctopusItems -OctopusUri &amp;quot;$OctopusURL/api/$($space.Id)/projects/$($project.Id)/runbooks&amp;quot; -ApiKey $octopusAPIKey
  1974.  
  1975.        foreach ($runbook in $runbooks)
  1976.        {
  1977.            if ($null -ne $runbook.Id)
  1978.            {
  1979.  
  1980.                if ($null -ne $runbook.PublishedRunbookSnapshotId)
  1981.                {
  1982.                    # Get published snapshot process
  1983.                    $publishedRunbookSnapshot = Get-OctopusItems -OctopusUri &amp;quot;$octopusURL/api/$($space.Id)/runbooksnapshots/$($runbook.PublishedRunbookSnapshotId)&amp;quot; -ApiKey $octopusAPIKey
  1984.                    $processUpdated = $false
  1985.                    $runbookProcess = Get-OctopusItems -OctopusUri &amp;quot;$octopusURL/api/$($space.Id)/runbookprocesses/$($publishedRunbookSnapshot.FrozenRunbookProcessId)&amp;quot; -ApiKey $octopusAPIKey
  1986.                    $currentRunbookProces = Get-OctopusItems -OctopusUri &amp;quot;$octopusURL/api/$($space.Id)/runbookprocesses/$($runbook.RunbookProcessId)&amp;quot; -ApiKey $octopusAPIKey
  1987.  
  1988.  
  1989.                    # Analyze steps
  1990.                    foreach ($step in $runbookProcess.Steps)
  1991.                    {
  1992.                        # Analyze action
  1993.                        foreach ($action in $step.Actions)
  1994.                        {
  1995.                            if (![string]::IsNullOrWhiteSpace($action.Container.Image))
  1996.                            {
  1997.                                # Check to see if the image contains our name
  1998.                                if ($action.Container.Image.Contains(&amp;quot;octopusdeploy/worker-tools&amp;quot;))
  1999.                                {
  2000.                                    # Determine architecture
  2001.                                    if ($action.Container.Image.Contains(&amp;quot;ubuntu&amp;quot;) -and ($action.Container.Image -ne $linuxWorkerToolsImage))
  2002.                                    {
  2003.                                        # Update with specified image
  2004.                                        Write-Host &amp;quot;Updating step $($step.Name) to use $linuxWorkerToolsImage ...&amp;quot;
  2005.                                        $action.Container.Image = $linuxWorkerToolsImage
  2006.                                        $processUpdated = $true
  2007.                                    }
  2008.  
  2009.  
  2010.                                    if ($action.Container.Image.Contains(&amp;quot;windows&amp;quot;) -and ($action.Container.Image -ne $windowsWorkerToolsImage))
  2011.                                    {
  2012.                                        # Update with specified image
  2013.                                        Write-Host &amp;quot;Updating step $($step.Name) to use $windowsWorkerToolsImage ...&amp;quot;
  2014.                                        $action.Container.Image = $windowsWorkerToolsImage
  2015.                                        $processUpdated = $true
  2016.                                    }
  2017.  
  2018.  
  2019.                                    if (!$processUpdated)
  2020.                                    {
  2021.                                        Write-Host &amp;quot;Step $($step.Name) already using specified image, skipping ...&amp;quot;
  2022.                                    }
  2023.                                }
  2024.                                else
  2025.                                {
  2026.                                    Write-Host &amp;quot;Specified container image does not match 'octopusdeploy/worker-tools', skipping ...&amp;quot;
  2027.                                }
  2028.                            }
  2029.                        }
  2030.                    }
  2031.                }
  2032.                else
  2033.                {
  2034.                    Write-Host &amp;quot;Runbook $($runbook.Name) doesn't have a published snapshot, skipping ...&amp;quot;
  2035.                    Continue
  2036.                }
  2037.  
  2038.  
  2039.                # Create new runbook snaphot
  2040.                $runbookSnapshotTemplate = Get-OctopusItems -OctopusUri &amp;quot;$octopusURL/api/$($space.Id)/runbookprocesses/$($publishedRunbookSnapshot.FrozenRunbookProcessId)/runbookSnapshotTemplate&amp;quot; -ApiKey $octopusAPIKey
  2041.  
  2042.  
  2043.                $body = @{
  2044.                    ProjectId = $project.Id
  2045.                    RunbookId = $runbook.Id
  2046.                    Name = $runbookSnapshotTemplate.NextNameIncrement
  2047.                    Notes = $null
  2048.                    SelectedPackages = @()
  2049.                }
  2050.  
  2051.  
  2052.  
  2053.  
  2054.  
  2055.  
  2056.  
  2057.                # Include latest built-in feed packages
  2058.                foreach($package in $runbookSnapshotTemplate.Packages)
  2059.                {
  2060.                                            # Get latest package version
  2061.                    $packages = Invoke-RestMethod -Uri &amp;quot;$octopusURL/api/$($space.Id)/feeds/$($package.FeedId)/packages/versions?packageId=$($package.PackageId)&amp;amp;take=1&amp;quot; -Headers $header
  2062.                    $latestPackage = $packages.Items | Select-Object -First 1
  2063.                    $package = @{
  2064.                        ActionName = $package.ActionName
  2065.                        Version = $latestPackage.Version
  2066.                        PackageReferenceName = $package.PackageReferenceName
  2067.                    }
  2068.  
  2069.                    $body.SelectedPackages += $package
  2070.  
  2071.  
  2072.                }
  2073.  
  2074.  
  2075.                $body = $body | ConvertTo-Json -Depth 10
  2076.  
  2077.  
  2078.                Write-Host &amp;quot;Updating runbook process for $($runbook.Name) ...&amp;quot;
  2079.                $runbookProcess.Version = $currentRunbookProces.Version
  2080.                $runbookProcess.Id = $runbook.RunbookProcessId
  2081.                Invoke-RestMethod -Method Put -Uri &amp;quot;$octopusURL/api/$($space.Id)/runbookprocesses/$($runbookProcess.Id)&amp;quot; -Body ($runbookProcess | ConvertTo-Json -Depth 10) -Headers $header
  2082.  
  2083.  
  2084.                Write-Host &amp;quot;Creating new snapshot for $($runbook.Name) ...&amp;quot;
  2085.                $newRunbookSnapshot = Invoke-RestMethod -Method Post -Uri &amp;quot;$octopusURL/api/$($space.Id)/runbookSnapshots&amp;quot; -Body $body -Headers $header
  2086.  
  2087.  
  2088.  
  2089.  
  2090.                Write-Host &amp;quot;Publishing snapshot $($newRunbookSnapshot.Id) ...&amp;quot;
  2091.                $runbook.PublishedRunbookSnapshotId = $newRunbookSnapshot.Id
  2092.                Invoke-RestMethod -Method Put -Uri &amp;quot;$octopusURL/api/$($space.Id)/runbooks/$($runbook.Id)&amp;quot; -Body ($runbook | ConvertTo-Json -Depth 10) -Headers $header
  2093.            }
  2094.        }
  2095.    }
  2096. }
  2097. &lt;/code&gt;&lt;/pre&gt;
  2098.  
  2099. &lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
  2100.  
  2101. &lt;p&gt;Maintaining deployment processes is typically a non-issue, and done on an as-needs basis.  Execution containers is one of the few areas where you might need to update multiple items, and this would be tedious to do manually. Thankfully, the Octopus API is robust and you can use it to make mass updates in an automated fashion.&lt;/p&gt;
  2102.  
  2103. &lt;p&gt;Happy deployments!&lt;/p&gt;
  2104. </content>
  2105.  </entry>
  2106.  <entry>
  2107.    <id>https://octopus.com/blog/difference-between-day-0-1-2-operations</id>
  2108.    <title type="text">The difference between day-0, day-1, and day-2 operations</title>
  2109.    <published>2023-12-11T14:00:00Z</published>
  2110.    <updated>2023-12-07T00:53:46.2243218Z</updated>
  2111.    <author>
  2112.      <name>andrew.corrigan@octopus.com, Octopus Deploy</name>
  2113.    </author>
  2114.    <link href="https://octopus.com/blog/difference-between-day-0-1-2-operations" />
  2115.    <content type="html">&lt;p&gt;&lt;img src="https://i.octopus.com/blog/2023-12/difference-between-day-0-1-2-operations/blogimage-day0day1day2-2022.png" alt="The numerals zero, one, and two in circles that are joined together." /&gt;&lt;/p&gt;
  2116.  
  2117. &lt;p&gt;Operations teams have always been important in any organization that uses tech to do business. Thanks to &lt;a href="https://octopus.com/devops/"&gt;DevOps&lt;/a&gt; (the best methodology we know to improve processes between developers and operations), we can see just how important they are when that business &lt;em&gt;is&lt;/em&gt; tech.&lt;/p&gt;
  2118.  
  2119. &lt;p&gt;Simply put, operations is a function as essential to software delivery as development. We all know software can't exist without developers. Unless it's a small project, software also can't run at all, or as long as it should, without those who set up, monitor, and maintain the environments it lives on.&lt;/p&gt;
  2120.  
  2121. &lt;p&gt;Despite the unifying nature of DevOps, it feels like the software industry knows way more about development practices than operations practices. So, let's do something about that!&lt;/p&gt;
  2122.  
  2123. &lt;p&gt;In this post, I explore the 3 core phases of operations in software development: day-0, day-1, and day-2.&lt;/p&gt;
  2124.  
  2125. &lt;h2 id="day-0-operations"&gt;Day-0 operations&lt;/h2&gt;
  2126.  
  2127. &lt;p&gt;It's weird to start a numbered list of things with zero, I'll give you that. But, it makes sense given day-0 operations usually start before there's anything to, well, &lt;em&gt;operate&lt;/em&gt;.&lt;/p&gt;
  2128.  
  2129. &lt;p&gt;Which is to say, day-0 is all about &lt;em&gt;planning&lt;/em&gt;.&lt;/p&gt;
  2130.  
  2131. &lt;p&gt;Whether it's a brand new product or new features, all interested parties meet to discover what's needed to make sure the software performs as expected.&lt;/p&gt;
  2132.  
  2133. &lt;p&gt;Day-0 usually helps answer questions like:&lt;/p&gt;
  2134.  
  2135. &lt;ul&gt;
  2136. &lt;li&gt;Does the software architecture change at all?&lt;/li&gt;
  2137. &lt;li&gt;Do we need new infrastructure or changes to existing infrastructure?&lt;/li&gt;
  2138. &lt;li&gt;Do we need new hardware to make the changes?&lt;/li&gt;
  2139. &lt;li&gt;Is there a need for new tooling in the pipeline?&lt;/li&gt;
  2140. &lt;li&gt;Does the change affect databases? When do we back up or restore them?&lt;/li&gt;
  2141. &lt;li&gt;Is there anything new we need to monitor?&lt;/li&gt;
  2142. &lt;li&gt;Do we have any hard limits around finances? Can we afford how much this will cost, or do we need to scale back our ambitions?&lt;/li&gt;
  2143. &lt;/ul&gt;
  2144.  
  2145. &lt;p&gt;The bigger your organization, the more questions you probably need to answer. As your software grows more complex, the answers may take longer to find.&lt;/p&gt;
  2146.  
  2147. &lt;p&gt;Though the industry delivers many applications through the cloud where infrastructure setup can happen in a deployment process, you may find some bleed between day-0 and day-1 operations.&lt;/p&gt;
  2148.  
  2149. &lt;p&gt;For example, setup would start before deploying the application if using self-hosted servers to run software. After all, you can't deploy to targets that don't exist yet.&lt;/p&gt;
  2150.  
  2151. &lt;p&gt;Plus, if you need new tools in the pipeline, they'll need to be in place for deployment too.&lt;/p&gt;
  2152.  
  2153. &lt;h2 id="day-1-operations"&gt;Day-1 operations&lt;/h2&gt;
  2154.  
  2155. &lt;p&gt;Day-1 operations is where ideas become reality. The development team completed their work and committed their changes. Packages now work their way through the deployment pipeline built and managed by the operations team.&lt;/p&gt;
  2156.  
  2157. &lt;p&gt;That's right, day-1 is &lt;em&gt;all&lt;/em&gt; about deployments.&lt;/p&gt;
  2158.  
  2159. &lt;p&gt;Day-1 operations tasks include:&lt;/p&gt;
  2160.  
  2161. &lt;ul&gt;
  2162. &lt;li&gt;Setup or creation of new infrastructure if it doesn't already exist&lt;/li&gt;
  2163. &lt;li&gt;Pre-deployment database backups and post-deployment restores&lt;/li&gt;
  2164. &lt;li&gt;Starting the deployment (if the pipeline isn't fully automated)&lt;/li&gt;
  2165. &lt;li&gt;Stopping the deployment and starting rollbacks if there are major problems&lt;/li&gt;
  2166. &lt;/ul&gt;
  2167.  
  2168. &lt;p&gt;How deployments happen can differ between organizations, teams, and even projects. Manual deployments for small projects aren't uncommon, but they're not sustainable long term.&lt;/p&gt;
  2169.  
  2170. &lt;p&gt;And hey, big or small, deployments done badly can become a huge cause of anxiety for many in an organization. The reason is that deployments are no longer only a case of running an executable on a server somewhere.&lt;/p&gt;
  2171.  
  2172. &lt;p&gt;Deployment automation can help remove that anxiety in almost every case. Best practice methodologies, like DevOps and Continuous Delivery, recommend automating and improving your deployment process as much as possible.&lt;/p&gt;
  2173.  
  2174. &lt;p&gt;Like day-1 operations, Octopus is also &lt;em&gt;all&lt;/em&gt; about deployments, but we're specifically about deployment &lt;em&gt;automation&lt;/em&gt;. We believe deployments should be smooth-going and celebrated rather than feared.&lt;/p&gt;
  2175.  
  2176. &lt;p&gt;Hold that thought for now - we'll come back to that later.&lt;/p&gt;
  2177.  
  2178. &lt;h2 id="day-2-operations"&gt;Day-2 operations&lt;/h2&gt;
  2179.  
  2180. &lt;p&gt;Day-2 operations is the Boxing Day of software development. The fun stuff is over. Celebrations over a 'successful delivery' are behind you. It's time to embrace reality for a while, at least until you start all over again.&lt;/p&gt;
  2181.  
  2182. &lt;p&gt;If you're following Continuous Integration and &lt;a href="https://octopus.com/devops/continuous-delivery/"&gt;Continuous Delivery&lt;/a&gt; well, however, that will happen way more often than once a year. In fact, it's a process that should happen constantly.&lt;/p&gt;
  2183.  
  2184. &lt;p&gt;Yes, day-2 is the stuff that happens &lt;em&gt;after&lt;/em&gt; deployment.&lt;/p&gt;
  2185.  
  2186. &lt;p&gt;Day-2 operations tasks include:&lt;/p&gt;
  2187.  
  2188. &lt;ul&gt;
  2189. &lt;li&gt;Monitoring the application to prevent and respond to problems&lt;/li&gt;
  2190. &lt;li&gt;Gathering data that will help improve the pipeline and its processes in the next sprint&lt;/li&gt;
  2191. &lt;li&gt;Performing routine maintenance like backups and restores&lt;/li&gt;
  2192. &lt;li&gt;Restoring service if infrastructure fails, through spinning up new infrastructure or doing rollbacks&lt;/li&gt;
  2193. &lt;/ul&gt;
  2194.  
  2195. &lt;p&gt;You can sum up day-2 operations as 'business as usual' operations tasks. It's the phase that keeps your product ticking over so your customers can enjoy it when they need it.&lt;/p&gt;
  2196.  
  2197. &lt;p&gt;Fret not - another day-0 is just on the horizon.&lt;/p&gt;
  2198.  
  2199. &lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
  2200.  
  2201. &lt;p&gt;There's a perception that day-2 is where all an operations team's work takes place (and if your organization has that perception, &lt;a href="https://octopus.com/devops/culture/"&gt;it might be a sign your teams don't collaborate as well as they should&lt;/a&gt;). Operations should be ever-present throughout the entire deployment pipeline.&lt;/p&gt;
  2202.  
  2203. &lt;p&gt;As we talked about, operations teams can help keep ideas in check. They're important in tool discovery and finding out what developers need to make ideas real. They're active during the deployment process and, finally, they're vital in the application's ongoing performance.&lt;/p&gt;
  2204.  
  2205. &lt;p&gt;Octopus believes good deployment tools should recognize and cater for the roles of operations in the pipeline. &lt;a href="https://octopus.com/features/runbooks"&gt;Octopus's built-in Runbooks feature&lt;/a&gt; can help organizations automate many of the tasks we mentioned in this post, routine or otherwise.&lt;/p&gt;
  2206.  
  2207. &lt;p&gt;Happy deployments!&lt;/p&gt;
  2208. </content>
  2209.  </entry>
  2210.  <entry>
  2211.    <id>https://octopus.com/blog/inside-devops-anton-zagrebelny</id>
  2212.    <title type="text">Inside DevOps with Anton Zagrebelny from Stigg</title>
  2213.    <published>2023-12-06T14:00:00Z</published>
  2214.    <updated>2023-11-30T04:06:01.756993Z</updated>
  2215.    <author>
  2216.      <name>joanna.wyganowska@octopus.com, Octopus Deploy</name>
  2217.    </author>
  2218.    <link href="https://octopus.com/blog/inside-devops-anton-zagrebelny" />
  2219.    <content type="html">&lt;p&gt;&lt;img src="https://i.octopus.com/blog/2023-12/inside-devops-anton-zagrebelny/blogimage-insidedevops-antonz-stigg-2023.png" alt="Photo of Anton Zagrebelny" /&gt;&lt;/p&gt;
  2220.  
  2221. &lt;p&gt;This post is the next in our &lt;a href="https://octopus.com/blog/tag/Inside%20DevOps"&gt;Inside DevOps series&lt;/a&gt;, where we share lessons learned from those on the frontlines of DevOps.&lt;/p&gt;
  2222.  
  2223. &lt;p&gt;Hear from &lt;a href="https://www.linkedin.com/in/anton-zagrebelny/" rel="nofollow"&gt;Anton Zagrebelny&lt;/a&gt;, co-founder and CTO at Stigg, a headless pricing and packaging platform provider.&lt;/p&gt;
  2224.  
  2225. &lt;p&gt;&lt;strong&gt;What is DevOps to you? How do you define it?&lt;/strong&gt;&lt;/p&gt;
  2226.  
  2227. &lt;p&gt;&lt;em&gt;Anton:&lt;/em&gt; DevOps, to me, is the practice of materializing a software product and ensuring it runs effectively in terms of both scale and cost. It's not just about automating deployments or monitoring infrastructure. It's the entire lifecycle of a software product from development to production.&lt;/p&gt;
  2228.  
  2229. &lt;p&gt;To give you an example from &lt;a href="https://www.stigg.io/" rel="nofollow"&gt;Stigg&lt;/a&gt;, we invested in a DevOps culture from the get-go. Within the first 2 weeks, our engineering team had already automated the build, test, and deployment processes, and set up Infrastructure as Code (IaC) methodology. This let us iterate on our product rapidly, deploying new versions dozens of times a day and modifying our CloudFormation stacks on the fly without breaking a sweat. Given that our production environment is mission-critical, we opted for a serverless approach to ensure scalability. Adopting best practices in IaC and automation was crucial for us to support this kind of agility.&lt;/p&gt;
  2230.  
  2231. &lt;p&gt;&lt;strong&gt;How did your DevOps journey start?&lt;/strong&gt;&lt;/p&gt;
  2232.  
  2233. &lt;p&gt;&lt;em&gt;Anton:&lt;/em&gt; My DevOps journey kicked off when I founded a one-stop-shop software services company. We worked with a diverse set of clients, each with unique needs, tech stacks, and even different cloud providers. This complexity led us to invest heavily in Kubernetes and Terraform to create multi-tenant, multi-cloud deployment workflows that automated most of the work.&lt;/p&gt;
  2234.  
  2235. &lt;p&gt;&lt;strong&gt;What’s the most challenging part of DevOps?&lt;/strong&gt;&lt;/p&gt;
  2236.  
  2237. &lt;p&gt;&lt;em&gt;Anton:&lt;/em&gt; The most challenging part is staying up-to-date with both internal and external changes. Internally, company needs, products, and personnel are always evolving. Externally, the tech landscape is constantly shifting. Balancing these dynamics and adapting your DevOps practices accordingly separates a good DevOps engineer from a great one.&lt;/p&gt;
  2238.  
  2239. &lt;p&gt;&lt;strong&gt;What’s the most rewarding part of DevOps?&lt;/strong&gt;&lt;/p&gt;
  2240.  
  2241. &lt;p&gt;&lt;em&gt;Anton:&lt;/em&gt; The most rewarding part for me is seeing a fully automated process that starts with a simple code push to a Git repository and ends with both infrastructure provisioning and software deployment. It's like watching a well-oiled machine at work.&lt;/p&gt;
  2242.  
  2243. &lt;p&gt;&lt;strong&gt;What are some DevOps best practices you and your organization have implemented?&lt;/strong&gt;&lt;/p&gt;
  2244.  
  2245. &lt;p&gt;&lt;em&gt;Anton:&lt;/em&gt; At Stigg, we manage all our infrastructure using AWS CDK and CloudFormation, version-controlled in Git alongside our back-end code. Post-push, GitHub Actions takes over for build and test, and then Octopus Deploy handles the deployment to various environments. We even wrote a &lt;a href="https://www.stigg.io/blog-posts/how-we-built-our-ci-cd-pipeline-for-velocity-and-quality" rel="nofollow"&gt;blog post&lt;/a&gt; about our CI/CD pipeline and the principles behind it.&lt;/p&gt;
  2246.  
  2247. &lt;p&gt;&lt;strong&gt;What’s the biggest challenge Octopus has helped you with?&lt;/strong&gt;&lt;/p&gt;
  2248.  
  2249. &lt;p&gt;&lt;em&gt;Anton:&lt;/em&gt; We're using Octopus Deploy for managing our complex, multi-environment deployments. It allows us to design intricate deployment processes for infrastructure and application code, and trigger end-to-end tests. And it's great that we can roll back changes with a click if anything goes wrong.&lt;/p&gt;
  2250.  
  2251. &lt;p&gt;&lt;strong&gt;What advice would you give someone just starting their DevOps journey?&lt;/strong&gt;&lt;/p&gt;
  2252.  
  2253. &lt;p&gt;&lt;em&gt;Anton:&lt;/em&gt; Start small and get the basics down first. Familiarize yourself with Docker, understand containerization, get comfortable with bash scripting, and pick up some networking fundamentals. These foundational skills will serve you well as you dive deeper into the DevOps world.&lt;/p&gt;
  2254.  
  2255. &lt;p&gt;&lt;strong&gt;What DevOps book would you recommend reading?&lt;/strong&gt;&lt;/p&gt;
  2256.  
  2257. &lt;p&gt;&lt;em&gt;Anton:&lt;/em&gt; I'd recommend &lt;a href="https://github.com/mpattanaik7/docker-books/blob/master/The%20DevOps%202.0%20Toolkit.pdf" rel="nofollow"&gt;The DevOps 2.0 Toolkit&lt;/a&gt; by Victor Farcic. Whether you're a beginner or an expert, this book offers valuable insights into the evolving landscape of DevOps.&lt;/p&gt;
  2258.  
  2259. &lt;p&gt;&lt;strong&gt;What's one thing about you that might surprise us?&lt;/strong&gt;&lt;/p&gt;
  2260.  
  2261. &lt;p&gt;&lt;em&gt;Anton:&lt;/em&gt; By age 18, I’d spent 10 years learning 6 different types of martial arts. It's a discipline that has taught me a lot about focus and perseverance, which I find incredibly useful in my work.&lt;/p&gt;
  2262.  
  2263. &lt;div class="alert alert-info"&gt;&lt;p&gt;If you’d like to be featured in our series, &lt;a href="https://octopus.com/blog/tag/Inside%20DevOps" class="alert-link"&gt;Inside DevOps&lt;/a&gt;, please reach out to &lt;a href="https://www.linkedin.com/in/joannawyganowska/" class="alert-link" rel="nofollow"&gt;Joanna on LinkedIn&lt;/a&gt; to set up a time for a quick chat.&lt;/p&gt;
  2264. &lt;/div&gt;
  2265. </content>
  2266.  </entry>
  2267.  <entry>
  2268.    <id>https://octopus.com/blog/2024-deprecated-features</id>
  2269.    <title type="text">Deprecations coming in 2024</title>
  2270.    <published>2023-12-04T14:00:00Z</published>
  2271.    <updated>2024-01-29T00:28:53.2130327Z</updated>
  2272.    <author>
  2273.      <name>robert.erez@octopus.com, Octopus Deploy</name>
  2274.    </author>
  2275.    <link href="https://octopus.com/blog/2024-deprecated-features" />
  2276.    <content type="html">&lt;p&gt;&lt;img src="https://i.octopus.com/blog/2023-12/2024-deprecated-features/img-blog-unsupporteddeploymenttargetincwindows-2023.png" alt="Silhouette of a woman wearing headphones with a mic in an Octopus branded tee holding a tablet." /&gt;&lt;/p&gt;
  2277.  
  2278. &lt;p&gt;In 2024, we'll be making changes to modernize the Octopus feature set by dropping support for some heritage features.&lt;/p&gt;
  2279.  
  2280. &lt;p&gt;This post summarizes changes in future releases of Octopus Server.&lt;/p&gt;
  2281.  
  2282. &lt;h2 id="deprecations-and-changes-in-2024"&gt;Deprecations and changes in 2024&lt;/h2&gt;
  2283.  
  2284. &lt;h3 id="windows-server-2003-and-windows-server-2008-targets"&gt;Windows Server 2003 and Windows Server 2008 targets&lt;/h3&gt;
  2285.  
  2286. &lt;p&gt;The latest version of &lt;a href="https://octopus.com/docs/infrastructure/deployment-targets/tentacle/windows/requirements#windows-server"&gt;Tentacle&lt;/a&gt; has a minimum Windows requirement of Server 2012. But, we still support workloads to older Tentacle agents running on Windows Server 2003. To modernize our execution engine, we're beginning to only support platforms supported by the vendors themselves.&lt;/p&gt;
  2287.  
  2288. &lt;p&gt;Our first step is dropping support for running workloads on Windows Server 2003 targets and Workers.&lt;/p&gt;
  2289.  
  2290. &lt;p&gt;For Windows Machines running Windows Server 2012 and below, this change means the minimum requirement is that you have .NET4.6.2 installed.&lt;/p&gt;
  2291.  
  2292. &lt;div class="alert alert-info"&gt;&lt;p&gt;Please note, this is not a requirement for later Windows versions or Linux targets as modern platforms instead use .NET Core.&lt;/p&gt;
  2293. &lt;/div&gt;
  2294.  
  2295. &lt;p&gt;The updated requirement for .NET4.6.2 also has implications for Windows Server 2008 operating systems.
  2296. Installing .NET4.6.2 on Windows Server 2008 &lt;a href="https://learn.microsoft.com/en-us/dotnet/framework/migration-guide/versions-and-dependencies#net-framework-462" rel="nofollow"&gt;requires&lt;/a&gt; the installation of the latest service pack, which as a result, means that Octopus Server workloads only be possible from Windows Server 2008 SP2 and Windows Server R2 SP1&lt;/p&gt;
  2297.  
  2298. &lt;h4 id="what-to-expect"&gt;What to expect&lt;/h4&gt;
  2299.  
  2300. &lt;p&gt;As we upgrade our tooling to use .NET4.6.2 for targeting heritage operating systems, machines running Windows Server 2012 and earlier won't be able to run standard workloads unless they have installed the .NET4.6.2 framework or later. Health checks will provide a warning if Octopus detects this scenario. Due to the inability to run .NET4.6.2 on Windows Server 2003, these targets won't be able to run any standard Octopus steps unless the process uses &lt;a href="https://octopus.com/docs/deployments/custom-scripts/raw-scripting"&gt;raw scripting&lt;/a&gt;.&lt;/p&gt;
  2301.  
  2302. &lt;p&gt;For more background on this change, please read our post, &lt;a href="https://octopus.com/blog/deprecating-win2003"&gt;Dropping support for Windows Server 2003 machines&lt;/a&gt;.&lt;/p&gt;
  2303.  
  2304. &lt;h3 id="mono"&gt;Mono&lt;/h3&gt;
  2305.  
  2306. &lt;p&gt;The Mono runtime allowed Octopus to deploy to Linux servers before .NET Core was available. It also enabled advanced deployments of thousands of releases that wouldn't have been possible otherwise.&lt;/p&gt;
  2307.  
  2308. &lt;p&gt;Since then, .NET Core has become the standard execution framework for .NET workloads. And we've since provided both options for our customers depending on their target machine capabilities.&lt;/p&gt;
  2309.  
  2310. &lt;p&gt;To simplify our codebase and improve stability, we've had to consider the trade-offs in supporting both Mono and .NET Core for Linux targets. It now makes more sense to focus on .NET Core support. Its cross-platform capabilities mean we can build and orchestrate the same tools for Linux or Windows and ultimately .NET Core, the future of .NET development. &lt;/p&gt;
  2311.  
  2312. &lt;p&gt;If you're running Mono on your Linux targets today, the migration process is likely to be as simple as checking a radio box on your SSH target in Octopus. There are also some &lt;a href="https://octopus.com/blog/deprecating-mono#impacts"&gt;small caveats&lt;/a&gt; about the platforms that we'll continue to support.&lt;/p&gt;
  2313.  
  2314. &lt;h4 id="what-to-expect-1"&gt;What to expect&lt;/h4&gt;
  2315.  
  2316. &lt;p&gt;Attempting to run a step using an SSH target set up to use the &lt;strong&gt;Calamari on Mono&lt;/strong&gt; target runtime will fail to execute. The option, while still visible, will be read-only and you can't create further targets of this type.&lt;/p&gt;
  2317.  
  2318. &lt;p&gt;For more information about this change, please read our post, &lt;a href="https://octopus.com/blog/deprecating-mono"&gt;Deprecating Mono&lt;/a&gt;.&lt;/p&gt;
  2319.  
  2320. &lt;h3 id="azure-cloud-services"&gt;Azure Cloud Services&lt;/h3&gt;
  2321.  
  2322. &lt;p&gt;In 2013, Octopus provided built-in support for one of the first cloud products, &lt;a href="https://octopus.com/blog/octopus-azure-deployments"&gt;Azure Cloud Services&lt;/a&gt;.&lt;/p&gt;
  2323.  
  2324. &lt;p&gt;Since then, Azure has introduced dozens of new products and capabilities. And Octopus has often followed up with relevant built-in capabilities.&lt;/p&gt;
  2325.  
  2326. &lt;p&gt;However, Azure has announced the sunsetting of the original Cloud Service resource, renamed Cloud Services Classic. The &lt;a href="https://learn.microsoft.com/en-us/lifecycle/products/azure-cloud-services-classic" rel="nofollow"&gt;final retirement date is set as August 31, 2024&lt;/a&gt;. In around 6 months, teams still relying on this cloud service won't be able to deploy to it at all, with Octopus Deploy or otherwise.&lt;/p&gt;
  2327.  
  2328. &lt;p&gt;Over the next 6 months, we'll gradually remove our support in the new versions of Octopus Server for:&lt;/p&gt;
  2329.  
  2330. &lt;ul&gt;
  2331. &lt;li&gt;Azure Cloud Service target&lt;/li&gt;
  2332. &lt;li&gt;Azure Cloud Service step&lt;/li&gt;
  2333. &lt;li&gt;Management Certificate account type&lt;/li&gt;
  2334. &lt;/ul&gt;
  2335.  
  2336. &lt;h4 id="migration-options"&gt;Migration options&lt;/h4&gt;
  2337.  
  2338. &lt;p&gt;Azure recommends migrating to &lt;a href="https://learn.microsoft.com/en-us/azure/cloud-services-extended-support/overview" rel="nofollow"&gt;Azure Cloud Services extended support&lt;/a&gt;. This will let you continue using your existing application code with minimal changes, but has other implications for Octopus. Because of changes to the deployment model, the use, and likely temporary nature, Octopus is unlikely to support this like it did the Classic services.&lt;/p&gt;
  2339.  
  2340. &lt;h4 id="what-to-expect-2"&gt;What to expect&lt;/h4&gt;
  2341.  
  2342. &lt;p&gt;You'll no longer be able to create the Azure Cloud Service target, Azure Cloud Service step, and Management Certificates. They'll be read-only. If you use any of these, you'll see a warning in Octopus.&lt;/p&gt;
  2343.  
  2344. &lt;p&gt;To learn more, read our original post about this change, &lt;a href="https://octopus.com/blog/azure-management-certs"&gt;What does Microsoft deprecating Azure Service Management APIs mean for Octopus users?&lt;/a&gt;&lt;/p&gt;
  2345.  
  2346. &lt;h3 id="f-sharp"&gt;F sharp&lt;/h3&gt;
  2347.  
  2348. &lt;p&gt;We originally supported running scripts with F# because of customer requests. However, we never saw high adoption rates. &lt;/p&gt;
  2349.  
  2350. &lt;p&gt;The tool we use to invoke our customer's F# scripts isn't compatible with the .NET Core framework. Since we're moving our tooling towards .NET Core, and F# has low uptake, it makes sense to drop support for F#.&lt;/p&gt;
  2351.  
  2352. &lt;p&gt;We recommend migrating any F# scripts to one of our existing &lt;a href="https://octopus.com/docs/deployments/custom-scripts"&gt;built-in scripting options&lt;/a&gt;. You can also bundle and package your scripts and invoke them directly on the target using something like the &lt;a href="https://learn.microsoft.com/en-us/dotnet/fsharp/language-reference/fsharp-interactive-options" rel="nofollow"&gt;F# interactive tool&lt;/a&gt;. You can embed this as an additional deployment package or pre-install it on your target.&lt;/p&gt;
  2353.  
  2354. &lt;div class="alert alert-warning"&gt;&lt;p&gt;It's important to note that continuing to rely on your F# scripts will require changes to the way they access Octopus variables. This is because none of the &lt;a href="https://octopus.com/docs/deployments/custom-scripts/using-variables-in-scripts" class="alert-link"&gt;utility methods&lt;/a&gt; will be automatically available.&lt;/p&gt;
  2355. &lt;/div&gt;
  2356.  
  2357. &lt;h4 id="what-to-expect-3"&gt;What to expect&lt;/h4&gt;
  2358.  
  2359. &lt;p&gt;If you use F# for &lt;a href="https://octopus.com/docs/deployments/custom-scripts#how-to-use-custom-scripts"&gt;any task&lt;/a&gt;, either as a script step or a pre/post deployment script, you'll see warnings added to the deployment task, and F# will get removed as a scripting option. By 2024.3 these tasks will fail immediately.&lt;/p&gt;
  2360.  
  2361. &lt;h2 id="future-deprecations"&gt;Future deprecations&lt;/h2&gt;
  2362.  
  2363. &lt;p&gt;We're planning more updates soon that may result in breaking changes for some customers.&lt;/p&gt;
  2364.  
  2365. &lt;h3 id="windows-server-2008"&gt;Windows Server 2008&lt;/h3&gt;
  2366.  
  2367. &lt;p&gt;For some of the &lt;a href="https://octopus.com/blog/deprecating-win2003"&gt;same reasons&lt;/a&gt; that we're dropping support for Windows Server 2003, we plan to drop support for Windows Server 2008 in the 2025.1 release in 12 months.&lt;/p&gt;
  2368.  
  2369. &lt;p&gt;Microsoft flagged &lt;a href="https://learn.microsoft.com/en-us/troubleshoot/windows-server/windows-server-eos-faq/end-of-support-windows-server-2008-2008r2" rel="nofollow"&gt;end of support&lt;/a&gt; for the Windows Server 2008 family (Standard and R2) in January 2020. As mentioned, we aim to only support platforms supported by the platform vendors themselves. Unsupported platforms introduce risks to our customers with unpatched security vulnerabilities. Plus we want to encourage migration to more modern operating systems.&lt;/p&gt;
  2370.  
  2371. &lt;p&gt;To give you as much lead time as possible, we'll introduce warnings in Octopus Server 2024.1 when a task is being run against a Windows Server 2008 machine.&lt;/p&gt;
  2372.  
  2373. &lt;p&gt;Before any final removal of support, we'll provide details about the change and your migration options.&lt;/p&gt;
  2374.  
  2375. &lt;h3 id="scriptcs"&gt;ScriptCS&lt;/h3&gt;
  2376.  
  2377. &lt;p&gt;Earlier in 2023, we let you know we're moving the &lt;a href="https://octopus.com/blog/rfc-migrate-scriptcs-dotnet-script"&gt;C# script execution engine, from using ScriptCS to dotnet script&lt;/a&gt;.&lt;/p&gt;
  2378.  
  2379. &lt;p&gt;We're now midway through this process, so we temporarily support both mechanisms, controllable via a project variable. The behavior defaults to the existing ScriptCS library. This lets you opt in to the modern approach as it may need updates to some scripts as outlined in our &lt;a href="https://octopus.com/blog/rfc-migrate-scriptcs-dotnet-script"&gt;blog post&lt;/a&gt;.&lt;/p&gt;
  2380.  
  2381. &lt;p&gt;We aim to swap the default engine used by 2024.3 and then remove ScriptCS entirely by 2025.1.&lt;/p&gt;
  2382.  
  2383. &lt;h3 id="octo-cli"&gt;Octo CLI&lt;/h3&gt;
  2384.  
  2385. &lt;p&gt;While not directly tied to a specific Octopus Server version, we've &lt;a href="https://octopus.com/blog/building-octopus-cli-vnext"&gt;redesigned the CLI tool&lt;/a&gt; used to interact with your Octopus Server. The new tool provides a richer and more interactive experience that helps you fall into the pit of success. &lt;/p&gt;
  2386.  
  2387. &lt;p&gt;Although  we're &lt;a href="https://octopus.com/blog/deprecating-octo-cli"&gt;no longer updating the old CLI&lt;/a&gt;, and we'll eventually remove it from our &lt;a href="https://octopus.com/downloads"&gt;Downloads page&lt;/a&gt;, we designed our API to remain backwards compatible. This means we don't expect the use of the old CLI to cause any problems for the foreseeable future.&lt;/p&gt;
  2388.  
  2389. &lt;h2 id="summary"&gt;Summary&lt;/h2&gt;
  2390.  
  2391. &lt;p&gt;As Octopus continues to make your modern deployment scenarios simple, we must regularly consider the features and platforms we support. Sometimes the use of a feature doesn't justify the time to maintain and test it. Other times, changes by third-party vendors make the decision for us.&lt;/p&gt;
  2392.  
  2393. &lt;p&gt;Our goal is always to be transparent about the future of our product and help you as much as possible with changes and migrations.&lt;/p&gt;
  2394.  
  2395. &lt;p&gt;If any of the updates mentioned in this post surprise or concern you, please contact our helpful &lt;a href="mailto:support@octopus.com" rel="nofollow"&gt;support team&lt;/a&gt;.&lt;/p&gt;
  2396.  
  2397. &lt;p&gt;Happy deployments!&lt;/p&gt;
  2398. </content>
  2399.  </entry>
  2400.  <entry>
  2401.    <id>https://octopus.com/blog/deprecating-octo-cli</id>
  2402.    <title type="text">Deprecating the Octo CLI</title>
  2403.    <published>2023-11-29T14:00:00Z</published>
  2404.    <updated>2023-11-27T06:03:28.3671684Z</updated>
  2405.    <author>
  2406.      <name>eddy.moulton@octopus.com, Octopus Deploy</name>
  2407.    </author>
  2408.    <link href="https://octopus.com/blog/deprecating-octo-cli" />
  2409.    <content type="html">&lt;p&gt;&lt;img src="https://i.octopus.com/blog/2023-11/deprecating-octo-cli/blogimage-building-octopus-cli-vnext.png" alt="Desktop screen in the clouds with an Octopus Deploy logo in front of it." /&gt;&lt;/p&gt;
  2410.  
  2411. &lt;p&gt;Late last year, we announced our new and improved Octopus command-line interface (CLI Octopus). You can read more about how and why we built it in John Bristowe's blog post, &lt;a href="https://octopus.com/blog/building-octopus-cli-vnext"&gt;Building the Octopus CLI vNext&lt;/a&gt;.&lt;/p&gt;
  2412.  
  2413. &lt;p&gt;It's now time to retire the old Octo CLI (octo). In this post I explain why we're deprecating it and what you need to know for your integrations.&lt;/p&gt;
  2414.  
  2415. &lt;h2 id="why-were-deprecating-the-octo-cli"&gt;Why we're deprecating the Octo CLI&lt;/h2&gt;
  2416.  
  2417. &lt;p&gt;The Octo CLI has a range of limitations that you can read about in &lt;a href="https://octopus.com/blog/building-octopus-cli-vnext#the-state-of-the-octopus-cli-octo"&gt;John's blog post&lt;/a&gt;. These limitations mean we need to rebuild a CLI for more modern workflows. As such, we'll no longer be providing feature or security updates to the Octo CLI.&lt;/p&gt;
  2418.  
  2419. &lt;h2 id="whats-new-in-the-new-octopus-cli"&gt;What's new in the new Octopus CLI?&lt;/h2&gt;
  2420.  
  2421. &lt;p&gt;Since the announcement last year, we've been busy adding features to the new CLI. Take a look at the &lt;a href="https://github.com/OctopusDeploy/cli/releases" rel="nofollow"&gt;GitHub releases&lt;/a&gt; for a timeline of changes or skip straight to the &lt;a href="https://octopus.com/docs/octopus-rest-api/cli"&gt;docs&lt;/a&gt; to see everything you can do with the new CLI.&lt;/p&gt;
  2422.  
  2423. &lt;h2 id="what-to-expect-next"&gt;What to expect next&lt;/h2&gt;
  2424.  
  2425. &lt;p&gt;We haven't set a hard date to remove the Octo CLI, but it won't be a surprise.&lt;/p&gt;
  2426.  
  2427. &lt;p&gt;We intend to surface deprecation warnings in both the CLI tool and the Octopus portal at least 12 months before its removal.&lt;/p&gt;
  2428.  
  2429. &lt;h2 id="migrating-from-the-octo-cli"&gt;Migrating from the Octo CLI&lt;/h2&gt;
  2430.  
  2431. &lt;p&gt;The new Octopus CLI wasn't designed as a drop in replacement, but most of the functionality provided by the Octo CLI is now supported.&lt;/p&gt;
  2432.  
  2433. &lt;p&gt;Our public APIs are unlikely to undergo any large changes, so the Octo CLI will continue to work in your existing workflows for the foreseeable future. We recommend making the swap to the new Octopus CLI as soon as practical to enjoy new improvements as they become available.&lt;/p&gt;
  2434.  
  2435. &lt;p&gt;If you currently rely on functionality that doesn't have an equivalent in the new CLI, please either:&lt;/p&gt;
  2436.  
  2437. &lt;ul&gt;
  2438. &lt;li&gt;Create an &lt;a href="https://github.com/OctopusDeploy/cli/issues" rel="nofollow"&gt;issue in our GitHub repository&lt;/a&gt;&lt;/li&gt;
  2439. &lt;li&gt;Reach out in our &lt;a href="https://oc.to/CommunitySlack" rel="nofollow"&gt;Community Slack&lt;/a&gt;&lt;/li&gt;
  2440. &lt;/ul&gt;
  2441.  
  2442. &lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
  2443.  
  2444. &lt;p&gt;The Octo CLI has served us well for many years, but it's almost time to say goodbye.&lt;/p&gt;
  2445.  
  2446. &lt;p&gt;We want to continue making a CLI that customers love to use, so we'd be grateful for any feedback or suggestions. You can leave a comment below, contact us on &lt;a href="https://oc.to/CommunitySlack" rel="nofollow"&gt;Community Slack&lt;/a&gt;, or create an issue in &lt;a href="https://github.com/OctopusDeploy/cli/issues" rel="nofollow"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
  2447.  
  2448. &lt;p&gt;Happy deployments!&lt;/p&gt;
  2449. </content>
  2450.  </entry>
  2451.  <entry>
  2452.    <id>https://octopus.com/blog/reprioritize-task-queue</id>
  2453.    <title type="text">Reprioritizing the task queue</title>
  2454.    <published>2023-11-27T14:00:00Z</published>
  2455.    <updated>2023-11-22T04:44:24.3184597Z</updated>
  2456.    <author>
  2457.      <name>ian.khor@octopus.com, Octopus Deploy</name>
  2458.    </author>
  2459.    <link href="https://octopus.com/blog/reprioritize-task-queue" />
  2460.    <content type="html">&lt;p&gt;&lt;img src="https://i.octopus.com/blog/2023-11/reprioritize-task-queue/blogimage-reprioritizetaskqueue-2022.png" alt="Stylized Octopus task queue with an item being moved to number one position." /&gt;&lt;/p&gt;
  2461.  
  2462. &lt;p&gt;The Octopus task queue operates on a first in, first out basis. There are many types of tasks in Octopus, like deployments, runbooks, and system tasks. The task queue works at the instance level and each task needs to be complete before the next can begin. The task queue and task cap ensure you can view all the tasks running on the instance and know the limit on the number of tasks.&lt;/p&gt;
  2463.  
  2464. &lt;p&gt;We had feedback that people sometimes need to be able to elevate critical tasks over less important ones. Examples of critical tasks include hotfixes, production deployments, or runbooks that need to start before anything else in the queue.&lt;/p&gt;
  2465.  
  2466. &lt;p&gt;We addressed this with a new feature that lets you reprioritize tasks on the &lt;strong&gt;Tasks&lt;/strong&gt; overview dashboard and the &lt;strong&gt;Releases&lt;/strong&gt; page for a specific release in a project.&lt;/p&gt;
  2467.  
  2468. &lt;p&gt;In this post, I show you how to reprioritize your task queue at the space level. I explain how to do this on the Tasks overview dashboard and the Tasks page for a particular release.&lt;/p&gt;
  2469.  
  2470. &lt;h2 id="moving-a-queued-task-to-the-top-from-the-tasks-overview-dashboard"&gt;Moving a queued task to the top from the Tasks overview dashboard&lt;/h2&gt;
  2471.  
  2472. &lt;p&gt;&lt;a href='#' data-featherlight='https://i.octopus.com/blog/2023-11/reprioritize-task-queue/tasks-move-to-top.gif' class='zoom' data-title=''&gt;&lt;img src='https://i.octopus.com/blog/2023-11/reprioritize-task-queue/tasks-move-to-top.gif' class="img-fluid center" alt='Moving an important task to the top of the task queue using the 'Move to Top' button' /&gt;&lt;/a&gt;&lt;/p&gt;
  2473.  
  2474. &lt;p&gt;You can reprioritize the task queue on the space-level &lt;strong&gt;Tasks&lt;/strong&gt; overview dashboard.&lt;/p&gt;
  2475.  
  2476. &lt;p&gt;To move a queued task to run next:&lt;/p&gt;
  2477.  
  2478. &lt;ol&gt;
  2479. &lt;li&gt;Find the queued task you'd like to run next.&lt;/li&gt;
  2480. &lt;li&gt;Select the burger menu (3 vertical dots) on the right of the selected task.&lt;/li&gt;
  2481. &lt;li&gt;Click &lt;strong&gt;Move to Top&lt;/strong&gt;.&lt;/li&gt;
  2482. &lt;/ol&gt;
  2483.  
  2484. &lt;p&gt;The task will then move to the top of the queue and run next, after the task that's running. This won't affect a task that's already in progress. This only changes the order of tasks not yet started.&lt;/p&gt;
  2485.  
  2486. &lt;h2 id="moving-a-queued-task-to-the-top-from-the-tasks-page-for-a-release"&gt;Moving a queued task to the top from the Tasks page for a release&lt;/h2&gt;
  2487.  
  2488. &lt;p&gt;&lt;a href='#' data-featherlight='https://i.octopus.com/blog/2023-11/reprioritize-task-queue/task-move-to-top.gif' class='zoom' data-title=''&gt;&lt;img src='https://i.octopus.com/blog/2023-11/reprioritize-task-queue/task-move-to-top.gif' class="img-fluid center" alt='Moving an important task to the top of the task queue on the task page for a specific project using the 'Move to Top' button' /&gt;&lt;/a&gt;&lt;/p&gt;
  2489.  
  2490. &lt;p&gt;You can also reprioritize the task queue on the &lt;strong&gt;Tasks&lt;/strong&gt; page for a specific release.&lt;/p&gt;
  2491.  
  2492. &lt;p&gt;To move a queued task to run next:&lt;/p&gt;
  2493.  
  2494. &lt;ul&gt;
  2495. &lt;li&gt;Find the task in the release for a project that you want to run next.&lt;/li&gt;
  2496. &lt;li&gt;Navigate to &lt;strong&gt;Projects&lt;/strong&gt; in the top navigation bar.&lt;/li&gt;
  2497. &lt;li&gt;Go to &lt;strong&gt;Releases&lt;/strong&gt; on the left hand side of the page.&lt;/li&gt;
  2498. &lt;li&gt;Click &lt;strong&gt;MOVE TO TOP&lt;/strong&gt; in the top right corner.&lt;/li&gt;
  2499. &lt;/ul&gt;
  2500.  
  2501. &lt;p&gt;The task will then move to the top of the queue and run next, after the task that's running. This won't affect a task that's already in progress. This only changes the order of tasks not yet started.&lt;/p&gt;
  2502.  
  2503. &lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
  2504.  
  2505. &lt;p&gt;It's now easy to reprioritize the task queue. This gives you flexibility to manage your task queue and run critical tasks first.&lt;/p&gt;
  2506.  
  2507. &lt;p&gt;If you're an Octopus Cloud or Server customer, this feature is available from 2023.4.6612 onwards.&lt;/p&gt;
  2508.  
  2509. &lt;p&gt;If you have any feedback on this feature as we continue to refine it, please leave your comments below.&lt;/p&gt;
  2510.  
  2511. &lt;p&gt;Happy deployments!&lt;/p&gt;
  2512. </content>
  2513.  </entry>
  2514.  <entry>
  2515.    <id>https://octopus.com/blog/terraform-space-support</id>
  2516.    <title type="text">Space IDs for Terraform resources</title>
  2517.    <published>2023-11-20T14:00:00Z</published>
  2518.    <updated>2023-11-20T02:13:36.7532331Z</updated>
  2519.    <author>
  2520.      <name>domenic.simone@octopus.com, Octopus Deploy</name>
  2521.    </author>
  2522.    <link href="https://octopus.com/blog/terraform-space-support" />
  2523.    <content type="html">&lt;p&gt;&lt;img src="https://i.octopus.com/blog/2023-11/terraform-space-support/blogimage-terraformspacesscopedperresource-2023.png" alt="Terraform logo in the middle of a circle with resource icons." /&gt;&lt;/p&gt;
  2524.  
  2525. &lt;p&gt;Until now, the Octopus Deploy Terraform provider had a single space per provider configuration. This caused hurdles when creating Terraform resources across multiple spaces.&lt;/p&gt;
  2526.  
  2527. &lt;p&gt;We're pleased to announce we've addressed this issue. The Octopus Terraform provider now supports Space IDs per Terraform resource.&lt;/p&gt;
  2528.  
  2529. &lt;p&gt;In this post, I explain why we made this change and how it makes your process easier.&lt;/p&gt;
  2530.  
  2531. &lt;h2 id="issues-with-spaces-per-terraform-provider-configuration"&gt;Issues with spaces per Terraform provider configuration&lt;/h2&gt;
  2532.  
  2533. &lt;p&gt;Defining a space on the provider level does work, especially if you're creating many resources in the same space.&lt;/p&gt;
  2534.  
  2535. &lt;p&gt;However, you can face problems when trying to create resources across multiple spaces. This is because a new Terraform provider with an alias gets created for each space, as shown in the example below. This can be counterproductive and limiting.&lt;/p&gt;
  2536.  
  2537. &lt;pre&gt;&lt;code class="language-terraform"&gt;provider &amp;quot;octopusdeploy&amp;quot; {
  2538.  alias = &amp;quot;space_one&amp;quot;
  2539.  address = &amp;quot;https://octopus.example.com&amp;quot;
  2540.  api_key = &amp;quot;API-XXXXXXXXXXXXX&amp;quot;
  2541.  space_id = &amp;quot;Spaces-1&amp;quot;
  2542. }
  2543.  
  2544. provider &amp;quot;octopusdeploy&amp;quot; {
  2545.  alias = &amp;quot;space_two&amp;quot;
  2546.  address = &amp;quot;https://octopus.example.com&amp;quot;
  2547.  api_key = &amp;quot;API-XXXXXXXXXXXXX&amp;quot;
  2548.  space_id = &amp;quot;Spaces-2&amp;quot;
  2549. }
  2550.  
  2551. resource &amp;quot;octopusdeploy_username_password_account&amp;quot; &amp;quot;account1&amp;quot; {
  2552.  provider = octopusdeploy.space_one
  2553.  name = &amp;quot;Test Account&amp;quot;
  2554.  password = &amp;quot;XXXX&amp;quot;
  2555.  username = &amp;quot;testusernameone&amp;quot;
  2556. }
  2557.  
  2558. resource &amp;quot;octopusdeploy_username_password_account&amp;quot; &amp;quot;account2&amp;quot; {
  2559.  provider = octopusdeploy.space_two
  2560.  name = &amp;quot;Test Account&amp;quot;
  2561.  password = &amp;quot;XXXX&amp;quot;
  2562.  username = &amp;quot;testusernametwo&amp;quot;
  2563. }
  2564. &lt;/code&gt;&lt;/pre&gt;
  2565.  
  2566. &lt;h2 id="benefits-of-space-id-per-terraform-resource"&gt;Benefits of Space ID per Terraform resource&lt;/h2&gt;
  2567.  
  2568. &lt;p&gt;To improve your experience, we introduced the concept of a Space ID per Terraform resource. This lets each resource specify the space where it should be created. If no space is set on the resource, we'll seamlessly revert to using the space defined at the provider level.&lt;/p&gt;
  2569.  
  2570. &lt;p&gt;Below you can see the same example from above, but now we're using the concept of Space ID per Terraform resource for greater flexibility and control.&lt;/p&gt;
  2571.  
  2572. &lt;pre&gt;&lt;code class="language-terraform"&gt;provider &amp;quot;octopusdeploy&amp;quot; {
  2573.  address = &amp;quot;https://octopus.example.com&amp;quot;
  2574.  api_key = &amp;quot;API-XXXXXXXXXXXXX&amp;quot;
  2575.  space_id = &amp;quot;Spaces-1&amp;quot;
  2576. }
  2577.  
  2578. resource &amp;quot;octopusdeploy_username_password_account&amp;quot; &amp;quot;account1&amp;quot; {
  2579.  name = &amp;quot;Test Account&amp;quot;
  2580.  password = &amp;quot;XXXX&amp;quot;
  2581.  username = &amp;quot;testusernameone&amp;quot;
  2582. }
  2583.  
  2584. resource &amp;quot;octopusdeploy_username_password_account&amp;quot; &amp;quot;account2&amp;quot; {
  2585.  space_id = &amp;quot;Spaces-2&amp;quot;
  2586.  name = &amp;quot;Test Account&amp;quot;
  2587.  password = &amp;quot;XXXX&amp;quot;
  2588.  username = &amp;quot;testusernametwo&amp;quot;
  2589. }
  2590.  
  2591. &lt;/code&gt;&lt;/pre&gt;
  2592.  
  2593. &lt;h2 id="when-will-space-id-per-terraform-resource-be-available"&gt;When will Space ID per Terraform resource be available?&lt;/h2&gt;
  2594.  
  2595. &lt;p&gt;The Space ID per Terraform resource feature is available now in Octopus Deploy Terraform provider version 0.13 or newer.&lt;/p&gt;
  2596.  
  2597. &lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
  2598.  
  2599. &lt;p&gt;Updating the Octopus Deploy Terraform provider from a spaces per provider configuration to a Space ID per Terraform resource has improved usability and flexibility.&lt;/p&gt;
  2600.  
  2601. &lt;p&gt;Before, managing resources in different spaces was tricky. You needed to create separate Terraform provider configurations for each space. Now, it's much simpler. You can assign a space to each Terraform resource individually without complex configurations. This change gives you more control and makes the process easier.&lt;/p&gt;
  2602.  
  2603. &lt;p&gt;Happy deployments!&lt;/p&gt;
  2604. </content>
  2605.  </entry>
  2606. </feed>

If you would like to create a banner that links to this page (i.e. this validation result), do the following:

  1. Download the "valid Atom 1.0" banner.

  2. Upload the image to your own server. (This step is important. Please do not link directly to the image on this server.)

  3. Add this HTML to your page (change the image src attribute if necessary):

If you would like to create a text link instead, here is the URL you can use:

http://www.feedvalidator.org/check.cgi?url=http%3A//feeds.feedburner.com/OctopusDeploy

Copyright © 2002-9 Sam Ruby, Mark Pilgrim, Joseph Walton, and Phil Ringnalda