<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0"><channel><title>Pulumi Blog: Codespaces</title><link>https://www.pulumi.com/blog/tag/codespaces/</link><description>Pulumi blog posts: Codespaces.</description><language>en-us</language><pubDate>Tue, 23 Jan 2024 19:41:13 +0000</pubDate><item><title>The Pulumi 'Push to start' GitOps Experience</title><link>https://www.pulumi.com/blog/pulumi-developer-workflow/</link><pubDate>Tue, 23 Jan 2024 19:41:13 +0000</pubDate><guid>https://www.pulumi.com/blog/pulumi-developer-workflow/</guid><description>
&lt;img src="https://www.pulumi.com/images/generated/blog/pulumi-developer-workflow/index.png" /&gt;
&lt;p&gt;As a skeptic of &amp;ldquo;quick starts&amp;rdquo; myself, I approach most marketing promises with a measure of cautious excitement. If the great and powerful algorithm, friends, or a peer brought your attention here, then I invite you to take this one seriously.&lt;/p&gt;
&lt;p&gt;Pulumi, with its full support of many general-purpose programming languages, can appear like a chore to get started with. The feeling can haunt seasoned developers as much as practitioners new to infrastructure code.&lt;/p&gt;
&lt;p&gt;However, I&amp;rsquo;ll show you that finding the proverbial easy street is easier than you might believe. The &lt;code&gt;pulumi new&lt;/code&gt; developer story just gets sweeter when combined with a few other nice-to-have conveniences.&lt;/p&gt;
&lt;p&gt;This is a &amp;ldquo;bring your own &lt;a href="https://github.com"&gt;GitHub&lt;/a&gt; login&amp;rdquo; event, so refresh that login. You will want to grab a &lt;a href="https://app.pulumi.com/signup"&gt;Pulumi Cloud&lt;/a&gt; login as well. With credentials in hand, you are set with everything that you need to start. Let&amp;rsquo;s go!&lt;/p&gt;
&lt;h2 id="index"&gt;Index&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#new-technology-learning-advice"&gt;New technology learning advice&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#a-devops-journey"&gt;A DevOps Journey&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#devops-day-0"&gt;DevOps Day 0: Plan &amp;amp; Prepare&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#devops-day-1"&gt;DevOps Day 1: Execute&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#devops-day-2"&gt;DevOps Day 2: Enhance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusion"&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#cleanup"&gt;Cleanup&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Hint:
all of the steps in this demo are ready to run yourself from the &lt;a href="https://github.com/pulumi/devcontainer"&gt;Pulumi Devcontainer&lt;/a&gt; using just your web browser and a Github account. Even better, they are real activities that Pulumians use every day to orchestrate the cloud too!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="new-technology-learning-advice"&gt;New technology learning advice&lt;/h2&gt;
&lt;p&gt;When it comes to ice cream, sometimes just selecting your flavor can be too much. Similarly, when choosing where to start with cloud tooling the onset of &amp;ldquo;choice paralysis&amp;rdquo; can be chronic. Pulumi&amp;rsquo;s powerful toolset is both a worthy endeavor to learn and a rewarding challenge to master. There is no better time to learn than the present!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;If you are short on time and have a bike, do you stop to hop on the bike, or choose to walk because there is no time to stop and get on?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Freezing, while great for ice cream, is not quite as satisfying when building the next cloud solution and putting it off for next week or next year can be about as useful as walking fast and pushing a perfectly good bike because there is no time to stop and get on.&lt;/p&gt;
&lt;p&gt;How can we overcome the learning curve? Picking up and mastering a new tool can be easy if we choose to start small.&lt;/p&gt;
&lt;blockquote&gt;
&lt;h3 id="tech-learning-hacks"&gt;Tech learning hacks:&lt;/h3&gt;
&lt;p&gt;🏆 Do: Start&lt;br&gt;
🔨 Use: Helpful Tools&lt;br&gt;
🥅 Make: Achievable Goals&lt;br&gt;
🎉 Win: Celebrate Successes&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Recognizing achievable goals can be tricky when you are learning something new. Always over-estimate the complexity of each step. If you overestimate how complicated a task might be, the biggest risk is accomplishing the goal faster than you think! Either way, the learning journey should be enjoyable and rewarding by following this rule.&lt;/p&gt;
&lt;p&gt;Helpful tools are more abundant than ever. I recommend Pulumi as one of the most helpful tools but that is my bias showing through. Consider how intuitive, durable, and well-integrated any tool selection you make will be. Today we&amp;rsquo;re using multiple features and services of both the Pulumi and Pulumi Cloud offering, as well as demonstrating the benefits of a tightly integrated Git, Github, Devcontainers, and VSCode workflow to make light work of a traditionally considerably complicated achievement.&lt;/p&gt;
&lt;p&gt;The resulting developer stack left me feeling like I would be successful automating anything. Be sure to share your experience with us in the &lt;a href="https://join.slack.com/t/pulumi-community/shared_invite/zt-2amio1u4h-5Y35enT27Y0dk4N8ZYHbMg"&gt;Pulumi Community Slack&lt;/a&gt; or find us on &lt;a href="https://twitter.com/PulumiCorp"&gt;Twitter/X @PulumiCorp&lt;/a&gt; too!&lt;/p&gt;
&lt;h2 id="a-devops-journey"&gt;A DevOps journey&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;The best solutions are often buried in the details. The only way to reach them is to dig.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In true DevOps fashion, development for this blog post featured a roller coaster of chronic scope creep, pushing deadlines, discovering details that scrapped the original plan, and during the final finish line approach too! The worry and doubt was palpable.&lt;/p&gt;
&lt;p&gt;Have we taken on too much? Did project ambitions exceed the achievable? The solution emerged while hacking on a side quest with a friend. A single vision came into focus, tying everything together into a simple &amp;ldquo;&lt;em&gt;Push to Start&lt;/em&gt;&amp;rdquo; Pulumi developer workflow.&lt;/p&gt;
&lt;p&gt;In this story, it took two tries to achieve the goal. Often it can take several tries. With that backstory let&amp;rsquo;s begin this next learning adventure together.&lt;/p&gt;
&lt;h3 id="devops-day-0"&gt;DevOps day 0&lt;/h3&gt;
&lt;p&gt;Let&amp;rsquo;s track our DevOps journey in typical &amp;ldquo;DevOps Day&amp;rdquo; style. Because we&amp;rsquo;re &lt;a href="https://en.wikipedia.org/wiki/Zero-based_numbering#:~:text=In%20computer%20science%2C%20zero%20is,from%20zero%20rather%20than%20one."&gt;counting like computers&lt;/a&gt;, of course, we start with zero. In other words, we need a goal, and we will be starting from scratch.&lt;/p&gt;
&lt;p&gt;Day zero is going to be your design, planning, and prep phase. Sometimes this includes various stages of research and other times it is a matter of just getting started with hands-on investigation.&lt;/p&gt;
&lt;p&gt;Every journey includes a beginning and an end. To demonstrate the Pulumi &lt;em&gt;Push to Start&lt;/em&gt; developer workflow, we need a project to develop! For this adventure let&amp;rsquo;s use the &lt;a href="https://www.pulumi.com/registry/packages/kubernetes"&gt;Pulumi Kubernetes Provider&lt;/a&gt; from the Pulumi Providers registry to deploy an app on Kubernetes. This provider is one of our most popular providers, as you might guess.&lt;/p&gt;
&lt;p&gt;In this case, we can practice with a new project from the &lt;a href="https://www.pulumi.com/community/"&gt;Community Engineering&lt;/a&gt; team. The GitHub &lt;a href="https://github.com/pulumi/devcontainer"&gt;pulumi/devcontainer&lt;/a&gt; repository is a GitHub &lt;a href="https://docs.github.com/en/repositories/creating-and-managing-repositories/creating-a-repository-from-a-template"&gt;template repository&lt;/a&gt; containing all the fundamentals of a new Pulumi infrastructure as code GitOps project. Let&amp;rsquo;s begin with a quick tour of the GitOps repo boilerplate.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;&lt;em&gt;What belongs in a GitOps git repository?&lt;/em&gt;&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I have seen this question raised several times during the past year. Most recently it was brought up during a great customer conversation at AWS re:Invent.&lt;/p&gt;
&lt;p&gt;Filtering through the conflicting opinions and advice about proper GitOps repo hygiene, a few fundamentals remain consistent.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Ops Environment
&lt;ul&gt;
&lt;li&gt;Configuration&lt;/li&gt;
&lt;li&gt;Dependencies&lt;/li&gt;
&lt;li&gt;Artifacts&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Documentation
&lt;ul&gt;
&lt;li&gt;Who it is for&lt;/li&gt;
&lt;li&gt;What it does&lt;/li&gt;
&lt;li&gt;How to Operate&lt;/li&gt;
&lt;li&gt;Why it is important&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Actions
&lt;ul&gt;
&lt;li&gt;Testing: Continuous Integration&lt;/li&gt;
&lt;li&gt;Deployment: Continuous Deployment&lt;/li&gt;
&lt;li&gt;Safety: Version Controls&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You may have assembled projects piece by piece before. In the &lt;a href="https://github.com/pulumi/devcontainer"&gt;pulumi/devcontainer repository&lt;/a&gt;, we provide a turnkey &amp;ldquo;known good&amp;rdquo; starter kit which will even improve over time. As a community resource, we welcome bugs and contributions!&lt;/p&gt;
&lt;p&gt;And now for the feature presentation, let&amp;rsquo;s get to dev&amp;rsquo;ing!&lt;/p&gt;
&lt;h4 id="whats-in-a-devops-day-0"&gt;What&amp;rsquo;s in a DevOps day 0?&lt;/h4&gt;
&lt;p&gt;Day 0 usually includes aspects of planning and preparing. For this exercise, we have just a few requirements to get started. Let&amp;rsquo;s knock these out and get to the fun stuff!&lt;/p&gt;
&lt;h4 id="prerequisites"&gt;Prerequisites&lt;/h4&gt;
&lt;p&gt;Now, even the fanciest push-to-start car still requires a fob, so let&amp;rsquo;s cover those bases super quick.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Web browser&lt;/li&gt;
&lt;li&gt;GitHub account&lt;/li&gt;
&lt;li&gt;10 minutes (approx.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next, let&amp;rsquo;s review the tools we will depend on for developing and deploying our project.&lt;/p&gt;
&lt;h4 id="commandline-utilities"&gt;Commandline Utilities:&lt;/h4&gt;
&lt;p&gt;*Dependencies supplied in the Pulumi devcontainer &lt;code&gt;ghcr.io/pulumi/devcontainer&lt;/code&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: center"&gt;Tool&lt;/th&gt;
&lt;th style="text-align: center"&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;A Programming Language&lt;/td&gt;
&lt;td style="text-align: center"&gt;The code part of IaC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Pulumi CLI&lt;/td&gt;
&lt;td style="text-align: center"&gt;Infrastructure as Code Tools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Pulumi ESC&lt;/td&gt;
&lt;td style="text-align: center"&gt;Secrets and Configuration Store&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Kubectl&lt;/td&gt;
&lt;td style="text-align: center"&gt;Kubernetes CLI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Direnv&lt;/td&gt;
&lt;td style="text-align: center"&gt;Automated Environment Variables&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;KinD&lt;/td&gt;
&lt;td style="text-align: center"&gt;Local Kubernetes Infrastructure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Github CLI&lt;/td&gt;
&lt;td style="text-align: center"&gt;Github &amp;amp; Git Repository Binaries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;curl, jq, act, awk, etc&lt;/td&gt;
&lt;td style="text-align: center"&gt;Other useful tools&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="cloud-native--cloud-developer-environment"&gt;Cloud-native &amp;hellip; cloud developer environment?&lt;/h3&gt;
&lt;p&gt;Besides our command line tools and the programming language of your choice, we need an editor to write our code with. Many practitioners are fluent with Vim or Emacs; others turn to editors like VSCode, IntelliJ, and others. We are going to choose the GitHub Codespaces VSCode IDE for its deep integration with GitHub, and its convenience of requiring nothing from the user other than a web browser to use.&lt;/p&gt;
&lt;p&gt;If you are already familiar with GitHub Codespaces, then you might know what to expect next. If not, you are in for a treat, and yes that is right, we are &lt;em&gt;developing for the cloud, in the cloud, with the cloud&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Alright, let&amp;rsquo;s jump in and get started by launching a new &lt;a href="https://github.com/features/codespaces"&gt;GitHub Codespaces&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;👇 Click this button to begin.👇
&lt;a href="https://bit.ly/pulumi-devcontainer"&gt;&lt;img src="https://github.com/codespaces/badge.svg" alt="Open in GitHub Codespaces"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you prefer a more informed approach you can launch the same codespaces by navigating to the &lt;a href="https://github.com/pulumi/devcontainer"&gt;Pulumi Devcontainer Repository&lt;/a&gt; or you can learn more about Codespaces at this &lt;a href="https://docs.github.com/en/codespaces/overview"&gt;Github Codespaces Link&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Clicking the &amp;lsquo;Open in GitHub Codespaces&amp;rsquo; button should take you directly into a new Codespaces session.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Note:
This demonstration is deeply integrated into the Web based Codespaces environment offered by Github. Alternatively, VSCode also supports running Devcontainers with Docker locally allowing you the benefit of &lt;a href="#pulumi-devcontainer"&gt;Pulumi Devcontainer&lt;/a&gt; on your own hardware.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;With a new codespaces session launched you should see the VSCode IDE in your browser. If you are not already familiar with VSCode, you can learn more about it in the &lt;a href="https://code.visualstudio.com/docs"&gt;VSCode Docs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Congratulations! Your developer environment is ready for some Pulumi action.&lt;/p&gt;
&lt;p&gt;&lt;img src="image-vscode-codespaces-blank.png" alt="Screenshot: Pulumi Devcontainer Codespaces session"&gt;&lt;/p&gt;
&lt;p&gt;For our final Day 0 step, we still need to decide what app to deploy with our Infrastructure-as-Code (IaC) program.&lt;/p&gt;
&lt;p&gt;Focusing on something fun, let&amp;rsquo;s deploy Minecraft as the app for our Kubernetes exercise. It&amp;rsquo;s a fun way to get started with Pulumi, a great way to show off your cloud skills to friends, and maybe even share with your favorite young future technologists! After all, Open Source DevOps is for everyone!&lt;/p&gt;
&lt;h3 id="devops-day-1"&gt;DevOps day 1&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;We have an environment! We have a plan!
Now we need to code &amp;hellip; or do we?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Don&amp;rsquo;t just take my word for it. The big brains of Pulumi&amp;rsquo;s AI Engineering team have delivered a brilliant Pulumi AI. Your Pulumi IaC developer sidekick makes learning and developing Pulumi just that much easier.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Q: What can Pulumi AI do?
A: Today&amp;rsquo;s AI is all experimental. As an industry, we are only just beginning to discover the possibilities, but you are invited to try it yourself with the &lt;a href="https://www.pulumi.com/product/neo/"&gt;Pulumi Neo WebUI&lt;/a&gt; or with the &lt;code&gt;pulumi new&lt;/code&gt; cli as demonstrated below.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id="-pulumi-new---ai"&gt;&lt;code&gt;~$ pulumi new --ai&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;&lt;a href="https://pulumi.com/product/neo/"&gt;Pulumi Neo&lt;/a&gt; is available via WebUI much like the ChatGPT console. Besides the familiar browser-based interface, Pulumi AI is also built into the &lt;code&gt;pulumi new&lt;/code&gt; CLI too! Now you can prompt Pulumi AI interactively from the convenience of the command line tools you will already be using, conveniently configured in your new Codespaces IDE.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s try it! (Reminder: Perform all these steps from within the Codespaces IDE.)&lt;/p&gt;
&lt;h4 id="step-1-login-to-pulumi-cloud"&gt;Step 1. Login to Pulumi Cloud&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# First Login to Pulumi Cloud for a few features we will use in upcoming GitOps content.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pulumi login
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="step-2-create-a-new-program"&gt;Step 2. Create a new program&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Let&amp;#39;s create a new pulumi with the Pulumi CLI&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pulumi new
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="step-3-yolo-for-fun-and-profit"&gt;Step 3. YOLO for fun and profit!&lt;/h4&gt;
&lt;p&gt;Let&amp;rsquo;s go all in on this one and try Pulumi AI. We can always enhance the prompt with additional dialog back and forth during the &lt;code&gt;pulumi new&lt;/code&gt; chat if it doesn&amp;rsquo;t meet our expectations right away.&lt;/p&gt;
&lt;p&gt;It is good to keep in mind that even as advanced as AI is today, the practice is still very much in its infancy. We will save more deep dives into the differences Traditional Ops (Imperative Ops), GitOps (Automated Declarative Ops), and AI Ops (Probability Augmented GitOps) in another post, for now let&amp;rsquo;s see how close the Pulumi AI can take us.&lt;/p&gt;
&lt;p&gt;&lt;img src="image-1.png" alt="Alt text"&gt;&lt;/p&gt;
&lt;p&gt;Woohoo! We selected the AI option on CLI, let&amp;rsquo;s follow the user prompts and feed the AI a simple prompt of what we want our Pulumi project to create.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s try something like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Write a pulumi infrastructure as code program which creates the namespce &lt;span class="s1"&gt;&amp;#39;minecraft&amp;#39;&lt;/span&gt; and using the pulumi_kubernetes.helm.v3.Release to deploy the https://itzg.github.io/minecraft-server-charts &lt;span class="s1"&gt;&amp;#39;minecraft-server&amp;#39;&lt;/span&gt; helm chart, sets EULA to true, deploys onto Kubernetes in the minecraft namespace.&lt;span class="s2"&gt;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;How did we do? Let&amp;rsquo;s see what the AI came up with.&lt;/p&gt;
&lt;p&gt;&lt;img src="image-2.png" alt="pulumi ai"&gt;&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s looking pretty good for a simple deployment. In DevOps, nothing works till the CI testing turns green. Since fortune favors the bold let&amp;rsquo;s proceed. For my developer workflow I ran &lt;code&gt;kind create cluster&lt;/code&gt; in the Codespaces terminal. You can do the same or add your own kubeconfig to deploy on your choice of cluster.&lt;/p&gt;
&lt;p&gt;Of course, proceed through the remaining prompts from the &lt;code&gt;pulumi new&lt;/code&gt; interactive CLI.&lt;/p&gt;
&lt;p&gt;&lt;img src="image-3.png" alt="pulumi configured a full python venv as its last stage of the pulumi new command function"&gt;&lt;/p&gt;
&lt;p&gt;I chose Python for this project, but you can choose any of the supported languages. We can see that &lt;code&gt;pulumi new&lt;/code&gt; creates a new Python virtual environment for us programmatically. In addition to the boilerplate supporting our new project, Pulumi AI wrote the first iteration of our Python Minecraft Deployment IaC! The next steps should be printed on the screen. Assuming your Kubernetes cluster kubeconfig is ready to roll we just have one step left.&lt;/p&gt;
&lt;p&gt;Hint, this is where we get the name for our annual &amp;ldquo;&lt;a href="https://youtu.be/J5BudoobwgY"&gt;Pulumi Up&lt;/a&gt; conference.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://youtu.be/J5BudoobwgY"&gt;Follow the link&lt;/a&gt; for the full playlist of 2023 Pulumi Up sessions&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pulumi up -y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="devops-day-2"&gt;DevOps day 2&lt;/h3&gt;
&lt;p&gt;Finally, it is day two. This is the beginning of a choose-your-own-adventure wonderland and the opportunities go almost as far as your imagination. This is where we commit our code and plan our next change requests and enhancements.&lt;/p&gt;
&lt;p&gt;We can commit this code to git. Build a Github Actions Workflow to automate the CI testing of our IaC with every git pr or commit. Once you have a production-ready IaC, you can add another to deploy to production clusters. If you run &lt;code&gt;make act&lt;/code&gt; you will see how comfortable testing new GitHub actions workflows can be in the convenience of your new enhanced IDE workflow. You can see the dev container workflow running yourself right away by executing &lt;code&gt;make act&lt;/code&gt; as a starting point.&lt;/p&gt;
&lt;p&gt;To conclude, Pulumi is not a single tool. Pulumi is a complete cloud developer ecosystem. Tools, SDKs, and cloud services come together forming the most accelerated way to create your own cloud success legends.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;h3 id="did-it-deploy"&gt;Did it deploy?&lt;/h3&gt;
&lt;p&gt;Let&amp;rsquo;s check on the status of our deployment.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Check for your new Minecraft pod&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get po
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With any luck, our &lt;a href="https://pulumi.com/product/neo/"&gt;Pulumi Neo&lt;/a&gt; gave you a working program right out of the gate. For references on Kubernetes Pulumi package resources to expand your infrastructure from here head to the &lt;a href="https://www.pulumi.com/registry/packages/kubernetes/"&gt;Pulumi Registry Kubernetes Provider&lt;/a&gt; page for more.&lt;/p&gt;
&lt;p&gt;Sharing Pulumi with people is a genuine passion found among Pulumians all around the globe but we all know evidence reigns king among engineers who, like any good practitioner, expect proof. Evolving your developer workflow with Pulumi gets even better than just easy, it&amp;rsquo;s remarkably powerful and ready for you to adopt in your daily workflows right away too.&lt;/p&gt;
&lt;p&gt;Follow &lt;a href="https://youtube.com/@PulumiTV"&gt;PulumiTV&lt;/a&gt; for upcoming examples built on this solution and to see how Pulumi ESC brings safety to your secrets and more.&lt;/p&gt;
&lt;h3 id="whats-in-the-recipe"&gt;What&amp;rsquo;s in the recipe?&lt;/h3&gt;
&lt;p&gt;Because no hero&amp;rsquo;s journey is complete without a gruesome account of what came before, I have included many of the manual steps required to reach this state one command at a time for the &lt;del&gt;morbidly&lt;/del&gt; curious as well.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;click &amp;lsquo;details&amp;rsquo; to expand&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;details&gt;
&lt;h3 id="git-code-repository"&gt;Git Code Repository&lt;/h3&gt;
&lt;p&gt;Now create a git code repository to version control this project infrastructure code in Github.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Authenticate with Github before proceeding.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh auth login --web --git-protocol https --scopes &lt;span class="s2"&gt;&amp;#34;repo,gist,read:packages,admin:org,delete_repo,codespace&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Create new Git Repository&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh repo create workshop --public &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --gitignore Python --license apache-2.0 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --description &lt;span class="s2"&gt;&amp;#34;pulumi iac developer workflow workshop&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Initialize the git repository&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone --recurse-submodules https://github.com/&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GITHUB_USER&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/workshop .
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Configure `git` cli to use the `gh` cli for authentication with Github&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh auth setup-git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Configure the username and email associated with your Github account.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --global user.email &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GIT_COMMITTER_EMAIL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --global user.name &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GITHUB_USER&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# List files being tracked by git and their current status.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git status
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="direnv-automatic-environment-variables"&gt;Direnv: Automatic Environment Variables&lt;/h3&gt;
&lt;p&gt;Various non-secret environment variables may be worth maintaining in code locally as well. There are many ways to do this, but here we are going to use Direnv to automatically load environment variables from a .envrc file.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Add environment variables useful during development to .envrc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF &amp;gt;&amp;gt; .envrc
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;export NO_COLOR=true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;export PULUMI_HOME=\${HOME}/.pulumi
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;export PULUMI_SKIP_UPDATE_CHECK=true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;export PULUMI_SKIP_CONFIRMATIONS=true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;export KUBECONFIG=\${PWD}/.kube/config
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;source venv/bin/activate 2&amp;gt;/dev/null || true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now you can enable &lt;code&gt;direnv&lt;/code&gt; on this directory.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Enable direnv in this directory.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;direnv allow
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Note:&lt;/p&gt;
&lt;p&gt;Env variables shown are for educational purposes only and should be used with care.
Read more about available Pulumi Environment variables here:
https://www.pulumi.com/docs/cli/environment-variables&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="pulumi-devcontainer"&gt;Pulumi Devcontainer&lt;/h3&gt;
&lt;p&gt;Now, to make sure we have all of our CLI dependencies, let&amp;rsquo;s grab the &lt;a href="https://github.com/pulumi/devcontainer"&gt;Pulumi Devcontainer&lt;/a&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Add the Pulumi Devcontainer git submodule&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git submodule add https://github.com/pulumi/devcontainer .devcontainer
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git submodule update --init --recursive .devcontainer
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Copy the devcontainer config of your choice into the top level of your project&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# so it will auto select by default when you open Codespaces in the future.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cp -f .devcontainer/devcontainer.json .devcontainer.json
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Rebuild the codespaces using the newly added Pulumi Devcontainer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh codespace rebuild --codespace &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CODESPACE_NAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="pulumi-cloud"&gt;Pulumi Cloud&lt;/h3&gt;
&lt;p&gt;Let&amp;rsquo;s login to Pulumi Cloud and initialize a new ESC environment to store our environment variables, secrets, and configuration which should be preserved and distributed securely from your Pulumi Cloud account.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Login to Pulumi Cloud&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pulumi login
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Create a new ESC Environment (optionally use another already existing environment)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pulumi env init workshop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="kind-kubernetes-in-docker"&gt;KinD: Kubernetes-in-docker&lt;/h3&gt;
&lt;p&gt;We are going to use Kubernetes to demonstrate our Pulumi IaC. Let&amp;rsquo;s go ahead and create a new cluster now.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Create the directory for your new kind kubeconfig&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir .kube
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Create a Kind Cluster&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kind create cluster
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Let&amp;#39;s make sure our kubeconfig works and pods are starting up&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get pods -A
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Load Kubeconfig into Pulumi ESC as an encrypted secret for safe keeping.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# This is an example use case for storing kubeconfig which would not usually be practical&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# for disposable kind kubernetes clusters like this however the approach is practical in many&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# other scenarios which you may come across.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pulumi env &lt;span class="nb"&gt;set&lt;/span&gt; workshop secrets.kubeconfig.kind --secret &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;jq . -R -s &amp;lt; &lt;span class="nv"&gt;$KUBECONFIG&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pulumi env &lt;span class="nb"&gt;set&lt;/span&gt; workshop files.KUBECONFIG --plaintext &lt;span class="se"&gt;\$&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;secrets.kubeconfig.kind&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In our environment, we maintain our secrets including API personal access tokens, kubeconfigs, and such all with Pulumi&amp;rsquo;s Environments, Secrets, and Configuration cloud service.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Load the newly updated Pulumi ESC Environment in the local shell&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="k"&gt;$(&lt;/span&gt;pulumi env open workshop --format shell&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="now-lets-create-the-deployment-code"&gt;Now let&amp;rsquo;s create the deployment code!&lt;/h3&gt;
&lt;p&gt;If fortune favors the bold, let&amp;rsquo;s be bold on this next step and let AI write our sample code on the fly!&lt;/p&gt;
&lt;p&gt;As this is a &amp;ldquo;hello world&amp;rdquo; style demonstration intended to showcase the developer workflow more than any specific cloud technologies, let&amp;rsquo;s deploy something fun like a Minecraft server! Be sure to watch the video demonstration of this exercise on Pulumi&amp;rsquo;s &lt;a href="https://youtube.com/@PulumiTV"&gt;PulumiTV&lt;/a&gt; YouTube channel for an extra easter egg bonus step!&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Write a new Pulumi Python IaC program to deploy Minecraft on Kubernetes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pulumi new &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --ai &lt;span class="s2"&gt;&amp;#34;Write a program using pulumi kubernetes helm v3 Release to deploy the itzg/minecraft-server helm chart on Kubernetes, and include a pulumi output to show the helm release status.&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --description &lt;span class="s2"&gt;&amp;#34;A pulumi infrastructure as code (iac) program for deploying and serving minecraft on kubernetes&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --name &lt;span class="s2"&gt;&amp;#34;minecraft-on-kubernetes&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --language python &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --stack &lt;span class="s2"&gt;&amp;#34;workshop&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --force &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --dir .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now let&amp;rsquo;s see if our new Infrastructure as Code Pulumi Python Codebase will deploy!&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Deploy your new Pulumi IaC on Kubernetes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pulumi stack &lt;span class="k"&gt;select&lt;/span&gt; workshop
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pulumi up
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="cleanup"&gt;Cleanup&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pulumi destroy -y --skip-preview
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pulumi stack rm workshop
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kind delete cluster --name kind
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh repo delete &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GITHUB_USER&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/workshop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;</description><author>Kat Morgan</author><category>pulumi</category><category>environments</category><category>secrets</category><category>configuration</category><category>infrastructure-as-code</category><category>developer</category><category>workflow</category><category>devcontainer</category><category>github</category><category>codespaces</category></item></channel></rss>