<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Spinnaker – Codelabs</title>
    <link>https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/tutorials/codelabs/</link>
    <description>Recent content in Codelabs on Spinnaker</description>
    <generator>Hugo -- gohugo.io</generator>
    
	  <atom:link href="https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/tutorials/codelabs/index.xml" rel="self" type="application/rss+xml" />
    
    
      
        
      
    
    
    <item>
      <title>Docs: App Engine: Source to Prod</title>
      <link>https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/tutorials/codelabs/appengine-source-to-prod/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/tutorials/codelabs/appengine-source-to-prod/</guid>
      <description>
        
        
        &lt;h1 id=&#34;this-tutorial-is-deprecated-and-no-longer-supported-but-left-for-reference--halyard-is-no-longer-supported-or-maintained&#34;&gt;This tutorial is deprecated and no longer supported, but left for reference.  Halyard is no longer supported or maintained&lt;/h1&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;This codelab provides an overview of Spinnaker&amp;rsquo;s integration with App Engine.
You&amp;rsquo;ll build and run a simple App Engine deployment pipeline with the following steps:&lt;/p&gt;
&lt;img style=&#34;width: 60%;&#34; src=&#34;images/codelab_diagram.png&#34; alt=&#34;Codelab diagram&#34;/&gt;
&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Be sure you have your Google Cloud Platform project&amp;rsquo;s ID. This value will be referenced as &lt;code&gt;GCP-PROJECT-ID&lt;/code&gt; below.&lt;/li&gt;
&lt;li&gt;Be sure you have &lt;code&gt;gcloud&lt;/code&gt; installed, and that it is authenticated with your GCP project. In most cases, this should only require running &lt;code&gt;gcloud auth login &amp;lt;your@email.com&amp;gt;&lt;/code&gt;
and following the instructions in the prompt. If you don&amp;rsquo;t have &lt;code&gt;gcloud&lt;/code&gt; installed locally, you can always run &lt;code&gt;gcloud&lt;/code&gt; from inside Cloud Shell, which you can open from your GCP console.&lt;/li&gt;
&lt;li&gt;Be sure you have the App Engine Admin and Compute Engine APIs enabled for your GCP project:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gcloud services &lt;span style=&#34;color:#204a87&#34;&gt;enable&lt;/span&gt; appengine.googleapis.com
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gcloud services &lt;span style=&#34;color:#204a87&#34;&gt;enable&lt;/span&gt; compute.googleapis.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;If this is your first time deploying to App Engine in your project, execute the following command to create an App Engine application. You cannot change the region, so choose wisely:
&lt;code&gt;gcloud app create --region &amp;lt;e.g., us-central&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;configuration--installation&#34;&gt;Configuration &amp;amp; installation&lt;/h2&gt;
&lt;p&gt;We&amp;rsquo;re going to trigger our Spinnaker pipelines using Github webhooks. In order to do so,
we will have to expose Spinnaker&amp;rsquo;s API gateway to external traffic.
If you are going to use this installation beyond this codelab, you should follow the 
&lt;a href=&#34;https://deploy-preview-629--spinnaker-io.netlify.app/docs/setup/other_config/security/&#34;&gt;guides&lt;/a&gt;
 for securing Spinnaker.&lt;/p&gt;
&lt;p&gt;Create a new firewall rule for your GCP project.
Github sends webhooks from IPs in the 
&lt;a href=&#34;https://help.github.com/articles/github-s-ip-addresses/#service-hook-ip-addresses&#34; target=&#34;_blank&#34;&gt;CIDR ranges&lt;/a&gt;
 queried below.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gcloud compute firewall-rules create allow-github-webhook &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;    --allow&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;tcp:8084&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;    --source-ranges&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;$(&lt;/span&gt;curl -s https://api.github.com/meta &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt; python -c &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;import sys, json; print &amp;#39;,&amp;#39;.join(json.load(sys.stdin)[&amp;#39;hooks&amp;#39;])&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;    --target-tags&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;allow-github-webhook&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Provision a new virtual machine. We&amp;rsquo;ll install Spinnaker on this machine:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gcloud compute instances create &lt;span style=&#34;color:#000&#34;&gt;$USER&lt;/span&gt;-spinnaker &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;    --scopes&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;https://www.googleapis.com/auth/cloud-platform&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;    --machine-type&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;n1-highmem-4&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;    --image-family&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;ubuntu-1404-lts&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;    --image-project&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;ubuntu-os-cloud&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;    --zone&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;us-central1-f&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;    --tags&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;allow-github-webhook&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next, run the following command to SSH into the machine we’ve just provisioned. We’ll also pass flags to forward ports 9000 and 8084 - Spinnaker’s UI and API servers listen on these ports.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gcloud compute ssh &lt;span style=&#34;color:#000&#34;&gt;$USER&lt;/span&gt;-spinnaker --ssh-flag&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;-L 9000:localhost:9000&amp;#34;&lt;/span&gt; --ssh-flag&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;-L 8084:localhost:8084&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Download and install Halyard on this machine. Halyard is a tool for configuring, installing, and updating Spinnaker.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -O https://raw.githubusercontent.com/spinnaker/halyard/master/install/debian/InstallHalyard.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo bash InstallHalyard.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Once you’ve installed Halyard, run the following commands to configure Spinnaker for deploying to App Engine:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hal config version edit --version &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;$(&lt;/span&gt;hal version latest -q&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hal config provider appengine &lt;span style=&#34;color:#204a87&#34;&gt;enable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hal config provider appengine account add my-appengine-account --project &lt;span style=&#34;color:#000&#34;&gt;$GCP&lt;/span&gt;-PROJECT-ID
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hal config storage gcs edit --project &lt;span style=&#34;color:#000&#34;&gt;$GCP&lt;/span&gt;-PROJECT-ID
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hal config storage edit --type gcs
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then run the following command to allow Spinnaker&amp;rsquo;s API gateway to accept external requests:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir -p ~/.hal/default/service-settings
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;host: 0.0.0.0&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt; tee ~/.hal/default/service-settings/gate.yml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Run &lt;code&gt;sudo hal deploy apply&lt;/code&gt; to install and run Spinnaker.&lt;/p&gt;
&lt;p&gt;The installation process will take several minutes. While you’re waiting for Spinnaker to start, you can configure your Github webhook:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Determine your Spinnaker instance’s external IP: &lt;br&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;gcloud compute instances describe $USER-spinnaker | grep natIP
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;Fork this repository, which contains a sample App Engine application: 
&lt;a href=&#34;https://github.com/danielpeach/redblue&#34; target=&#34;_blank&#34;&gt;https://github.com/danielpeach/redblue&lt;/a&gt;
.&lt;/li&gt;
&lt;li&gt;Inside your fork, click &amp;ldquo;Settings&amp;rdquo;, then &amp;ldquo;Webhooks&amp;rdquo;, then &amp;ldquo;Add Webhook&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Under &amp;ldquo;Payload URL&amp;rdquo;, enter &lt;code&gt;http://{externalIP}:8084/webhooks/git/github&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Under &amp;ldquo;Content Type&amp;rdquo;, select &lt;code&gt;application/json&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At this point, Spinnaker should be up and running. Point your browser at 
&lt;a href=&#34;http://localhost:9000&#34; target=&#34;_blank&#34;&gt;localhost:9000&lt;/a&gt;
 to view Spinnaker’s UI.&lt;/p&gt;
&lt;h2 id=&#34;deploy-to-app-engine&#34;&gt;Deploy to App Engine&lt;/h2&gt;
&lt;p&gt;First, we’ll create a Spinnaker application.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the top-right corner of the UI, click &amp;ldquo;Actions&amp;rdquo;, then &lt;code&gt;Create Application&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Under &amp;ldquo;Name&amp;rdquo;, enter &lt;code&gt;codelab&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Under &amp;ldquo;Owner Email&amp;rdquo;, enter your email address.&lt;/li&gt;
&lt;li&gt;Under &amp;ldquo;Account(s)&amp;rdquo;, select &lt;code&gt;my-appengine-account&lt;/code&gt;. This is the account we configured with Halyard -
it is associated with a set of credentials that allows Spinnaker to deploy to App Engine within your project.
You can configure Spinnaker with multiple accounts to deploy to multiple GCP projects.&lt;/li&gt;
&lt;li&gt;Click &amp;ldquo;Create&amp;rdquo;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;images/create_codelab_application.png&#34; alt=&#34;Create_Codelab_Application&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Once your application has been created, you’ll be taken to the &amp;ldquo;Clusters&amp;rdquo; tab.
Click &amp;ldquo;Create Server Group&amp;rdquo;. A Spinnaker server group is an App Engine Version.
When creating server groups, Spinnaker applies its own naming conventions: all Versions created from the application &amp;ldquo;codelab&amp;rdquo; will be prefixed with &amp;ldquo;codelab-&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Under &amp;ldquo;Stack&amp;rdquo;, enter &lt;code&gt;default&lt;/code&gt;. Omit &amp;ldquo;Detail&amp;rdquo;. In a Spinnaker application, a Cluster is a logical grouping of server groups with the same Stack and Detail.
It can be helpful to use the name of an App Engine Service as the value for Stack - in our case, our Version will be deployed to the Service named &amp;ldquo;default&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Under &amp;ldquo;Git Repository URL&amp;rdquo;, enter &lt;code&gt;https://github.com/{YourGitHubUsername}/redblue.git&lt;/code&gt;; i.e., the URL to the repository you forked earlier.&lt;/li&gt;
&lt;li&gt;Under &amp;ldquo;Branch&amp;rdquo;, enter &lt;code&gt;master&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Under &amp;ldquo;Config Filepaths&amp;rdquo;, enter &lt;code&gt;app.yaml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Click &amp;ldquo;Create&amp;rdquo;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;images/ad_hoc_create_server_group.png&#34; alt=&#34;Ad_Hoc_Create_Server_Group&#34;&gt;&lt;/p&gt;
&lt;p&gt;Your server group will take a moment to deploy. Once it appears in the UI, click on the section labeled &amp;ldquo;V000&amp;rdquo;.
You should see a panel open on the right with details about the server group.
To view the app you just deployed, click one of the links under &amp;ldquo;DNS&amp;rdquo;.
It should be a &amp;ldquo;Hello World&amp;rdquo; page with a bright red background.&lt;/p&gt;
&lt;p&gt;Click on the tab labeled &amp;ldquo;Load Balancers&amp;rdquo;. You will see a panel labeled &amp;ldquo;default&amp;rdquo;. This is your default App Engine Service.
If you deploy Versions to different App Engine Services, those Services will also appear under this tab.&lt;/p&gt;
&lt;h2 id=&#34;deployment-pipeline&#34;&gt;Deployment pipeline&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;images/codelab_diagram.png&#34; alt=&#34;Codelab_Diagram&#34;&gt;&lt;/p&gt;
&lt;p&gt;Next, we’ll build a deployment pipeline. It will include the following stages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Trigger on a GitHub webhook - this will be triggered by a push to the forked repository.&lt;/li&gt;
&lt;li&gt;Deploy - we’ll deploy the updated app to App Engine.&lt;/li&gt;
&lt;li&gt;Edit Load Balancer - we’ll split traffic between our two server groups.&lt;/li&gt;
&lt;li&gt;Manual Judgment - we’ll verify that we’re ready to move all traffic to the new server group.
This stage could be a stand-in for integration tests or canary analysis.&lt;/li&gt;
&lt;li&gt;Enable - we’ll send 100% of traffic to the new server group.&lt;/li&gt;
&lt;li&gt;Wait - we’ll wait for two minutes to be sure everything is OK before destroying the old server group.
In a real deployment pipeline, it’s likely that this wait time would be longer - perhaps an hour or more.&lt;/li&gt;
&lt;li&gt;Destroy - we’ll destroy the old server group.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;pipeline-creation&#34;&gt;Pipeline creation&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Click on the &amp;ldquo;Pipelines&amp;rdquo; tab adjacent to the &amp;ldquo;Clusters&amp;rdquo; and &amp;ldquo;Tasks&amp;rdquo; tabs.&lt;/li&gt;
&lt;li&gt;Click &amp;ldquo;New&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Under &amp;ldquo;Pipeline Name&amp;rdquo;, enter &lt;code&gt;Deploy And Promote&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Click &amp;ldquo;Create&amp;rdquo;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;webhook-trigger&#34;&gt;Webhook trigger&lt;/h3&gt;
&lt;p&gt;Under &amp;ldquo;Automated Triggers&amp;rdquo;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Under &amp;ldquo;Type&amp;rdquo;, select &lt;code&gt;Git&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Under &amp;ldquo;Repo Type&amp;rdquo;, select &lt;code&gt;github&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Under &amp;ldquo;Organization or User&amp;rdquo;, enter your GitHub username.&lt;/li&gt;
&lt;li&gt;Under &amp;ldquo;Project&amp;rdquo;, enter &lt;code&gt;redblue&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Under &amp;ldquo;Branch&amp;rdquo;, enter &lt;code&gt;release&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;images/webhook_trigger_config.png&#34; alt=&#34;Webhook_Trigger_Config&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;deploy-stage&#34;&gt;Deploy stage&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Click &amp;ldquo;Add Stage&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Under &amp;ldquo;Type&amp;rdquo;, select &lt;code&gt;Deploy&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;images/deploy_stage_config.png&#34; alt=&#34;Deploy_Stage_Config&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Click &amp;ldquo;Add server group&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Under &amp;ldquo;Stack&amp;rdquo;, enter &lt;code&gt;default&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Under &amp;ldquo;Git Repository URL&amp;rdquo;, enter &lt;code&gt;https://github.com/{YourGithubUsername}/redblue.git&lt;/code&gt;; i.e., the URL to the repository you forked earlier.&lt;/li&gt;
&lt;li&gt;Under &amp;ldquo;Branch&amp;rdquo;, enter &lt;code&gt;release&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;When configuring your Git webhook trigger, you can specify a regex -
the pipeline will only be triggered if the commit to the repository occurs on a branch matching the regex.
We can dynamically deploy to App Engine from the branch matching the regex by clicking &amp;ldquo;Resolve via trigger&amp;rdquo; in this dialog.&lt;/li&gt;
&lt;li&gt;Under &amp;ldquo;Config Filepaths&amp;rdquo;, enter &lt;code&gt;app.yaml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Click &amp;ldquo;Add&amp;rdquo;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;edit-load-balancer-stage&#34;&gt;Edit Load Balancer stage&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Click &amp;ldquo;Add Stage&amp;rdquo;, then under &amp;ldquo;Type&amp;rdquo;, select &lt;code&gt;Edit Load Balancer&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Under &amp;ldquo;Stage Name&amp;rdquo;, enter &lt;code&gt;Split Traffic 5%/95%&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Click &amp;ldquo;Add Load Balancer&amp;rdquo;. In the dialog that pops up, select &lt;code&gt;default&lt;/code&gt; - this is your App Engine default Service.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;images/select_load_balancer.png&#34; alt=&#34;Select_Load_Balancer&#34;&gt;&lt;/p&gt;
&lt;p&gt;This next part is tricky. We’ll specify how much traffic each server group will receive.
We could specify their exact names - e.g., &lt;code&gt;codelab-default-v000&lt;/code&gt; and &lt;code&gt;codelab-default-v001&lt;/code&gt; - but we want to run
this pipeline over and over again as we make changes to our app. We will need to resolve the names of the server groups dynamically.&lt;/p&gt;
&lt;p&gt;These steps allow us to allocate traffic to the newest server group in the Cluster &lt;code&gt;codelab-default&lt;/code&gt; -
this will always be the server group we deploy in our &amp;ldquo;Deploy&amp;rdquo; stage:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Next to the percent symbol, enter &lt;code&gt;5&lt;/code&gt;. This is the percentage of traffic that this server group will receive.&lt;/li&gt;
&lt;li&gt;Under &amp;ldquo;Locator&amp;rdquo;, select &lt;code&gt;Coordinates&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Under &amp;ldquo;Cluster&amp;rdquo;, click &amp;ldquo;Toggle for list of existing clusters&amp;rdquo;, then select &lt;code&gt;codelab-default&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Under &amp;ldquo;Target&amp;rdquo;, select &lt;code&gt;Newest server group&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These steps to allocate traffic to the second-oldest server group in the Cluster &lt;code&gt;codelab-default&lt;/code&gt; -
when we run this pipeline for the first time, it will be the server group we deployed at the beginning of this codelab:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Click &amp;ldquo;Add allocation&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Next to the percent symbol, enter &lt;code&gt;95&lt;/code&gt;. This is the percentage of traffic that this server group will receive.&lt;/li&gt;
&lt;li&gt;Under &amp;ldquo;Locator&amp;rdquo;, select &lt;code&gt;Coordinates&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Under &amp;ldquo;Cluster&amp;rdquo;, click &amp;ldquo;Toggle for list of existing clusters&amp;rdquo;, then select &lt;code&gt;codelab-default&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Under &amp;ldquo;Target&amp;rdquo;, select &lt;code&gt;Previous server group&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Click &amp;ldquo;Done&amp;rdquo;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;images/edit_load_balancer_config.png&#34; alt=&#34;Edit_Load_Balancer_Config&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;manual-judgment-stage&#34;&gt;Manual Judgment stage&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Click &amp;ldquo;Add Stage&amp;rdquo;, then under &amp;ldquo;Type&amp;rdquo;, select &lt;code&gt;Manual Judgment&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Under &amp;ldquo;Stage Name&amp;rdquo;, enter &lt;code&gt;Validate Release&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Under &amp;ldquo;Instructions&amp;rdquo;, enter &lt;code&gt;Verify that the new release should receive 100% of traffic.&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;enable-stage&#34;&gt;Enable stage&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Click &amp;ldquo;Add Stage&amp;rdquo;, then under &amp;ldquo;Type&amp;rdquo;, select &lt;code&gt;Enable Server Group&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Under &amp;ldquo;Stage Name&amp;rdquo;, enter &lt;code&gt;Enable Release&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Under &amp;ldquo;Cluster&amp;rdquo;, click &amp;ldquo;Toggle for list of existing clusters&amp;rdquo;, then select &lt;code&gt;codelab-default&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Under &amp;ldquo;Target&amp;rdquo;, select &lt;code&gt;Newest server group&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When this stage runs, all traffic will be directed to the server group deployed in this pipeline.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/enable_stage_config.png&#34; alt=&#34;Enable_Stage_Config&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;wait-stage&#34;&gt;Wait stage&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Click &amp;ldquo;Add Stage&amp;rdquo;, then under &amp;ldquo;Type&amp;rdquo;, select &lt;code&gt;Wait&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Under &amp;ldquo;Wait time (seconds)&amp;rdquo;, enter &lt;code&gt;120&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;destroy-stage&#34;&gt;Destroy stage&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Click &amp;ldquo;Add Stage&amp;rdquo;, then under &amp;ldquo;Type&amp;rdquo;, select &lt;code&gt;Destroy Server Group&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Under &amp;ldquo;Stage Name&amp;rdquo;, enter &lt;code&gt;Destroy Previous Release&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Under &amp;ldquo;Cluster&amp;rdquo;, click &amp;ldquo;Toggle for list of existing clusters&amp;rdquo;, then select &lt;code&gt;codelab-default&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Under &amp;ldquo;Target&amp;rdquo;, select &lt;code&gt;Previous server group&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When we run this pipeline for the first time, this stage will destroy the first server group we deployed in this codelab.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/destroy_stage_config.png&#34; alt=&#34;Destroy_Stage_Config&#34;&gt;&lt;/p&gt;
&lt;p&gt;Once you’re finished configuring your stages, click &amp;ldquo;Save Changes&amp;rdquo; on the bottom right corner of the screen.&lt;/p&gt;
&lt;h2 id=&#34;pipeline-trigger&#34;&gt;Pipeline trigger&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;If you haven’t already done so, clone your forked repository to your local workstation.&lt;/li&gt;
&lt;li&gt;Check out a new branch named &amp;ldquo;release&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Open &amp;ldquo;main.py&amp;rdquo; in your favorite text editor.&lt;/li&gt;
&lt;li&gt;On the line that starts with &lt;code&gt;self.response.write&lt;/code&gt;, replace &lt;code&gt;background-color: red&lt;/code&gt; with &lt;code&gt;background-color: blue&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Using git, add and commit your changes. Push your changes to your remote repository; i.e., &lt;code&gt;git push origin release&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If we’ve configured everything correctly, you should see your pipeline start within Spinnaker.
If you haven’t configured a webhook, you can also click &amp;ldquo;Start Manual Execution&amp;rdquo; to start your pipeline.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;pipeline-execution&#34;&gt;Pipeline execution&lt;/h2&gt;
&lt;p&gt;Under the &amp;ldquo;Pipelines&amp;rdquo; tab, you should see your running pipeline.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/deploy_stage_execution.png&#34; alt=&#34;Deploy_Stage_Execution&#34;&gt;&lt;/p&gt;
&lt;p&gt;Once the &amp;ldquo;Split Traffic 5%/95%&amp;rdquo; stage completes, your pipeline will pause on the &amp;ldquo;Validate Release&amp;rdquo; stage.
Two points of interest:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Under the &amp;ldquo;Clusters&amp;rdquo; tab, you should see your new server group.
Click on the new server group; a panel should open on the right.
Click one of the links under &amp;ldquo;DNS&amp;rdquo; - your site’s background will have changed to blue.&lt;/li&gt;
&lt;li&gt;Under the &amp;ldquo;Load Balancers&amp;rdquo; tab, click on the load balancer labeled &amp;ldquo;Default&amp;rdquo;; a panel should open on the right.
Under &amp;ldquo;Traffic Split&amp;rdquo;, you should see the relative traffic allocations between your two server groups:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;images/traffic_split_details.png&#34; alt=&#34;Traffic_Split_Details&#34;&gt;&lt;/p&gt;
&lt;p&gt;Once you’re ready, go back to the &amp;ldquo;Pipelines&amp;rdquo; tab. Click &amp;ldquo;Continue&amp;rdquo; on the &amp;ldquo;Validate Release&amp;rdquo; stage. Your pipeline will continue:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Your new server group will receive 100% of traffic.&lt;/li&gt;
&lt;li&gt;Your pipeline will wait for two minutes.&lt;/li&gt;
&lt;li&gt;The first server group (the one we deployed at the beginning of this codelab) will be destroyed.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;clean-up&#34;&gt;Clean up&lt;/h2&gt;
&lt;p&gt;If you&amp;rsquo;re done with this codelab, run &lt;code&gt;gcloud compute instances delete $USER-spinnaker&lt;/code&gt; to destroy your Spinnaker installation.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Azure VM Scale Sets: Source to Prod</title>
      <link>https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/tutorials/codelabs/azure-vmss-source-to-prod/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/tutorials/codelabs/azure-vmss-source-to-prod/</guid>
      <description>
        
        
        &lt;p&gt;In this codelab, you will create a source-to-prod continuous delivery pipeline for a simple java based application targeting VM Scale Sets in Azure.&lt;/p&gt;
&lt;p&gt;After completing this lab the following workflow will happen:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A developer pushes a commit to Github&lt;/li&gt;
&lt;li&gt;Jenkins automatically builds a Debian package and pushes it to an Aptly repository&lt;/li&gt;
&lt;li&gt;Spinnaker bakes the new package into an image&lt;/li&gt;
&lt;li&gt;Spinnaker deploys to a test environment and disables the previous deployment&lt;/li&gt;
&lt;li&gt;Spinnaker waits for a manual judgement of the test environment&lt;/li&gt;
&lt;li&gt;Spinnaker deploys the image to the production environment and disables the previous deployment.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This codelab will walk through the following steps to implement this scenario:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href=&#34;#1-deploy-spinnaker-and-jenkins-on-azure&#34;&gt;Deploy Spinnaker and Jenkins on Azure&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href=&#34;#2-verify-jenkins&#34;&gt;Verify Jenkins&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href=&#34;#3-prepare-your-environments&#34;&gt;Prepare your environments&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href=&#34;#4-create-the-continuous-delivery-pipeline&#34;&gt;Create the Continuous Delivery pipeline&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href=&#34;#5-trigger-your-pipeline&#34;&gt;Trigger your pipeline&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href=&#34;#6-tear-down&#34;&gt;Clean up the environment&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;1-deploy-spinnaker-and-jenkins-on-azure&#34;&gt;1. Deploy Spinnaker and Jenkins on Azure&lt;/h2&gt;
&lt;p&gt;You need the following resources to perform the codelab:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Azure subscription&lt;/strong&gt;: You can create one for free using the 
&lt;a href=&#34;https://azure.microsoft.com/free/&#34; target=&#34;_blank&#34;&gt;Azure Free trial&lt;/a&gt;
.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spinnaker and Jenkins VM&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;From a shell run the following command that will walk you through all the steps necessary to deploy Jenkins and Spinnaker in Azure.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;NOTE: When running the following script, ensure that you type &lt;code&gt;vmss&lt;/code&gt; when asked to select the target.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bash &amp;lt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;curl -sL https://aka.ms/DeployDevOps&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In the output of the above script you will find the command to open an SSH tunnel to the DevOps VM that has just been deployed. The command should look like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh -L 8080:localhost:8080 -L 9000:localhost:9000 -L 8084:localhost:8084 -L 8087:localhost:8087 username@fqdn_of_your_devops_vm
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;NOTE: You will have to enter the password that you have specified in the previous step.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;2-verify-jenkins&#34;&gt;2. Verify Jenkins&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;After you have started your ssh tunnel, navigate to 
&lt;a href=&#34;http://localhost:8080&#34; target=&#34;_blank&#34;&gt;http://localhost:8080/&lt;/a&gt;
 on your local machine.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The instance should already be unlocked and your first account setup. Login with the credentials you specified when deploying the template.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click &lt;strong&gt;Install suggested plugins&lt;/strong&gt;:
&lt;img src=&#34;images/2-Install-Jenkins-plugins.png&#34; alt=&#34;Install Jenkins plugins&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Your Jenkins instance is now ready to use!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run the &lt;code&gt;Sample Aptly Job&lt;/code&gt; by clicking on the run button for the job. Verify that the job completes successfully.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/2-run-sample-aplty-job.png&#34; alt=&#34;Run Jenkins job&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;3-prepare-your-environments&#34;&gt;3. Prepare your environments&lt;/h2&gt;
&lt;h3 id=&#34;i-create-the-codelab-application&#34;&gt;I. Create the &amp;ldquo;codelab&amp;rdquo; application&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Navigate to your Spinnaker dashboard by using 
&lt;a href=&#34;http://localhost:9000&#34; target=&#34;_blank&#34;&gt;http://localhost:9000&lt;/a&gt;
 on your local machine.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click on the &lt;strong&gt;Actions&lt;/strong&gt; menu on the right&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/3-actions-create-applications.png&#34; alt=&#34;Actions&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In the &lt;em&gt;New Application&lt;/em&gt; window, enter the following values:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Name: codelab&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Owner Email: Enter your email&lt;/p&gt;
&lt;p&gt;And click &lt;strong&gt;Create&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/3-create-application.png&#34; alt=&#34;New Application&#34;&gt;&lt;/p&gt;
&lt;p&gt;You can read more how the Spinnaker application matches to Azure resources in the 
&lt;a href=&#34;https://deploy-preview-629--spinnaker-io.netlify.app/docs/reference/providers/azure/&#34;&gt;Azure reference for Spinnaker&lt;/a&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;ii-create-a-firewall&#34;&gt;II. Create a firewall&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Navigate to the 
&lt;a href=&#34;http://localhost:9000/#/applications/codelab/firewalls&#34; target=&#34;_blank&#34;&gt;FIREWALLS&lt;/a&gt;
 page and click on the &lt;strong&gt;Create Firewall&lt;/strong&gt; button.&lt;/li&gt;
&lt;li&gt;Provide the following values in the &lt;em&gt;Create New Firewall&lt;/em&gt; dialog:&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Detail: web&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Account: my-azure-account (should be selected by default)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Region: westus (select the region that is closest to your location)&lt;/p&gt;
&lt;p&gt;Ingress (click &lt;em&gt;Add new Firewall Rule&lt;/em&gt;):&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Protocol: TCP&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Start Port: 80&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;End Port: 80&lt;/p&gt;
&lt;p&gt;And click &lt;strong&gt;Create&lt;/strong&gt;, if the loadbalancer does not appear in the page once the creation is complete, refresh your browser.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/3-create-firewall.png&#34; alt=&#34;New Firewall&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: We are using westus for the region but you can select any other region that is closer to your location. Be careful to match the region in the following steps.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You can read more about the implementation of Network Security Groups in Azure in the 
&lt;a href=&#34;https://deploy-preview-629--spinnaker-io.netlify.app/docs/reference/providers/azure/&#34;&gt;Azure reference for Spinnaker&lt;/a&gt;
&lt;/p&gt;
&lt;h3 id=&#34;iii-create-a-load-balancer&#34;&gt;III. Create a load balancer&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Navigate to the 
&lt;a href=&#34;http://localhost:9000/#/applications/codelab/loadBalancers&#34; target=&#34;_blank&#34;&gt;LOAD BALANCERS&lt;/a&gt;
 page and click the &lt;strong&gt;Create Load Balancer&lt;/strong&gt; button.&lt;/li&gt;
&lt;li&gt;Provide the following values in the &amp;ldquo;Create New Load Balancer&amp;rdquo; dialog:&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Account: my-azure-account&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Region: westus (unless you have selected a different region previously)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Virtual Network: devopsVnet&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Subnet: devopsSubnet1&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Stack: test&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Detail: frontend&lt;/p&gt;
&lt;p&gt;Verify that the Listener is configured as follows:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Protocol: HTTP&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;External Port: 80&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Internal Port: 8080&lt;/p&gt;
&lt;p&gt;And click &lt;strong&gt;Create&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/3-create-test-load-balancer.png&#34; alt=&#34;Create test load balancer&#34;&gt;&lt;/p&gt;
&lt;p&gt;The virtual network &lt;em&gt;devopsVnet&lt;/em&gt; and the subnets &lt;em&gt;devopsSubnet#&lt;/em&gt; were created for you by the script that you ran in the 
&lt;a href=&#34;#1-deploy-spinnaker-and-jenkins-on-azure&#34;&gt;Deploy Spinnaker and Jenkins on Azure&lt;/a&gt;
 step.&lt;/p&gt;
&lt;p&gt;You can learn more about the implementation of the Spinnaler Load Balancer in the 
&lt;a href=&#34;https://deploy-preview-629--spinnaker-io.netlify.app/docs/reference/providers/azure/&#34;&gt;Azure reference for Spinnaker&lt;/a&gt;
.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;Repeat the above steps to create a second load balancer for production. Use the same parameters but the following change:&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Stack: prod&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/3-create-prod-load-balancer.png&#34; alt=&#34;Create prod load balancer&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;NOTE: It will take approximately 15 minutes to provision the two loadbalancers.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;4-create-the-continuous-delivery-pipeline&#34;&gt;4. Create the continuous delivery pipeline&lt;/h2&gt;
&lt;p&gt;In this section you will create a Spinnaker pipeline that will bake the image from a Jenkins build then deploy it to test.&lt;/p&gt;
&lt;h3 id=&#34;i-create-a-new-pipeline&#34;&gt;I. Create a new pipeline&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Navigate to the 
&lt;a href=&#34;http://localhost:9000/#/applications/codelab/executions&#34; target=&#34;_blank&#34;&gt;PIPELINES&lt;/a&gt;
 page and click on the &lt;em&gt;New&lt;/em&gt; button (+ sign) on the right to create a new pipeline.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Name your pipeline: &amp;ldquo;Deploy codelab&amp;rdquo; and click &lt;strong&gt;Create&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/4-create-new-pipeline.png&#34; alt=&#34;Bake and Deploy to Test&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;ii-add-a-trigger-for-the-pipeline&#34;&gt;II. Add a trigger for the pipeline&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Click &lt;em&gt;Add Trigger&lt;/em&gt; in the &lt;em&gt;Deploy codelab&lt;/em&gt; window.&lt;/li&gt;
&lt;li&gt;Select the following options:&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Type: &amp;ldquo;Jenkins&amp;rdquo;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Master:  &amp;ldquo;Jenkins&amp;rdquo;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Job: &amp;ldquo;hello-karyon-rxnetty&amp;rdquo;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Property File: leave empty&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/4-add-trigger.png&#34; alt=&#34;Add a trigger&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;iii-add-bake-stage&#34;&gt;III. Add &lt;em&gt;Bake&lt;/em&gt; stage&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Click &lt;em&gt;Add stage&lt;/em&gt; in the &lt;em&gt;Deploy codelab&lt;/em&gt; window.&lt;/li&gt;
&lt;li&gt;Enter the following values:&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Type: Bake&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Stage Name: Bake&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Regions: westus (or select the region that you have selected when creating the Firewall)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Package: &lt;code&gt;hello-karyon-rxnetty&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Base OS: ubuntu (v14.05)&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/4-add-bake-stage.png&#34; alt=&#34;Add Bake&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;iv-add-deploy-to-test-stage&#34;&gt;IV. Add &lt;em&gt;Deploy to test&lt;/em&gt; stage&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Click &lt;em&gt;Add stage&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Enter the following values:&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Type: Deploy&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Stage Name: Deploy to Test&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Depends On: Bake&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/4-add-deploy-to-test.png&#34; alt=&#34;Add Deploy to Test&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;v-create-test-deployment-configuration&#34;&gt;V. Create test deployment configuration&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Click &lt;em&gt;Add server group&lt;/em&gt; in the Deploy Configuration section.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/4-add-server-group.png&#34; alt=&#34;Add server group&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click &amp;ldquo;Continue without a template&amp;rdquo;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In the &amp;ldquo;Configure Deployment Cluster&amp;rdquo; enter the following values:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Account: my-azure-account&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Region: westus (or select the region that you have selected when creating the Firewall)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Stack: test&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Details: tutorial&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Load Balancers: codelab-test-frontend&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/4-configure-deployment-cluster-1.png&#34; alt=&#34;Configure Deployment Cluster - 1&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Subnets: devopsSubnet2&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Firewalls: codelab-web&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/4-configure-deployment-cluster-2.png&#34; alt=&#34;Configure Deployment Cluster - 2&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;ldquo;Advanced Settings&amp;rdquo;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Custom Data: TEST&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Custom Script: 
&lt;a href=&#34;https://raw.githubusercontent.com/azure-devops/hello-karyon-rxnetty/master/scripts/setcustomenv.sh&#34; target=&#34;_blank&#34;&gt;https://raw.githubusercontent.com/azure-devops/hello-karyon-rxnetty/master/scripts/setcustomenv.sh&lt;/a&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Command To Execute: sudo bash ./setcustomenv.sh&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/4-configure-deployment-cluster-3.png&#34; alt=&#34;Configure Deployment Cluster - 3&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click &lt;strong&gt;Add&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;NOTE: Record the name of the cluster. it will be used in the next step.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;vi-enable-test-deployment&#34;&gt;VI. Enable test deployment&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Click &lt;em&gt;Add stage&lt;/em&gt; in the &lt;em&gt;Deploy codelab&lt;/em&gt; section.&lt;/li&gt;
&lt;li&gt;Enter the following values:&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Type: Enable Server Group&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Stage Name: Enable Test Deployment&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Depends On: Deploy to Test&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Account: my-azure-account&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Regions: westus (or select the region that you have selected when creating the Firewall)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cluster: codelab-test-tutorial (or the name of your cluster if you have used different values)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Target: Newest Server Group&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/3-enable-test-deployment.png&#34; alt=&#34;Enable test Deployment&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;vii-manual-judgment&#34;&gt;VII. Manual judgment&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Click &lt;em&gt;Add stage&lt;/em&gt; in the &lt;em&gt;Deploy codelab&lt;/em&gt; section.&lt;/li&gt;
&lt;li&gt;Use the following values:&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Type: Manual Judgment&lt;/li&gt;
&lt;li&gt;Name: Manual Judgment&lt;/li&gt;
&lt;li&gt;Depends On: Enable Test Deployment&lt;/li&gt;
&lt;li&gt;Instructions: Validate test cluster&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;viii-add-deploy-to-prod-stage&#34;&gt;VIII. Add Deploy to Prod stage&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Click &lt;em&gt;Add stage&lt;/em&gt; in the &lt;em&gt;Promote to Prod&lt;/em&gt; section.&lt;/li&gt;
&lt;li&gt;Use the following values to configure the stage:&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Type: Deploy&lt;/li&gt;
&lt;li&gt;Stage Name: Deploy to Prod&lt;/li&gt;
&lt;li&gt;Depends On: Manual Judgment&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;ix-create-production-deployment-configuration&#34;&gt;IX. Create production deployment configuration&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Click &lt;em&gt;Add server group&lt;/em&gt; in the Deploy Configuration section.&lt;/li&gt;
&lt;li&gt;Click &lt;em&gt;Continue without a template&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;In the &lt;em&gt;Configure Deployment Cluster&lt;/em&gt; enter the following values:&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Account: my-azure-account&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Region: westus (or select the region that you have selected when creating the Firewall)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Stack: prod&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Details: tutorial&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Load Balancers: codelab-prod-frontend&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/4-configure-prod-cluster-1.png&#34; alt=&#34;Configure Prod Cluster - 1&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Subnets: devopsSubnet2&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Firewalls: codelab-web&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/4-configure-deployment-cluster-2.png&#34; alt=&#34;Configure Prod Cluster - 2&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;ldquo;Advanced Settings&amp;rdquo;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Custom Data: PROD&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Custom Script: 
&lt;a href=&#34;https://raw.githubusercontent.com/azure-devops/hello-karyon-rxnetty/master/scripts/setcustomenv.sh&#34; target=&#34;_blank&#34;&gt;https://raw.githubusercontent.com/azure-devops/hello-karyon-rxnetty/master/scripts/setcustomenv.sh&lt;/a&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Command To Execute: sudo bash ./setcustomenv.sh&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/4-configure-prod-cluster-2.png&#34; alt=&#34;Configure Deployment Cluster - 3&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click &lt;strong&gt;Add&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;NOTE: Record the name of the cluster. it will be used in the next step.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;x-enable-prod-deployment&#34;&gt;X. Enable prod deployment&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Click &lt;em&gt;Add stage&lt;/em&gt; in the &lt;em&gt;Deploy codelab&lt;/em&gt; section.&lt;/li&gt;
&lt;li&gt;Use the following values to configure this stage:&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Type: Enable Server Group&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Stage Name: Enable Prod Deployment&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Depends On: Deploy to Prod&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Account: my-azure-account&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Regions: westus (or select the region that you have selected when creating the Firewall)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cluster: codelab-prod-tutorial&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Target: Newest Server Group&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/4-enable-prod-deployment.png&#34; alt=&#34;Enable Prod deployment&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click &lt;strong&gt;Save Changes&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;5-trigger-your-pipeline&#34;&gt;5. Trigger your pipeline&lt;/h2&gt;
&lt;p&gt;In this step you will try out the pipeline that you have just built.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Go to 
&lt;a href=&#34;http://localhost:8080&#34; target=&#34;_blank&#34;&gt;Jenkins&lt;/a&gt;
 and start a new build of the &amp;ldquo;Sample Aptly Job&amp;rdquo; like you did in the section &amp;ldquo;
&lt;a href=&#34;#2-verify-jenkins&#34;&gt;Verify Jenkins&lt;/a&gt;
&amp;rdquo;. You should see your Spinnaker pipeline running soon after your Jenkins job finishes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Navigate to the 
&lt;a href=&#34;http://localhost:9000/#/applications/codelab/executions&#34; target=&#34;_blank&#34;&gt;PIPELINES&lt;/a&gt;
 tab&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click on &lt;em&gt;Details&lt;/em&gt; to get more information about the status of your deployment&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Connect to your application.
You can find the public name of your application by looking at the DNS Name that has been assigned to your load balancer.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/5-application-dns-name.png&#34; alt=&#34;DNS Name of your application&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;6-tear-down&#34;&gt;6. Tear Down&lt;/h2&gt;
&lt;h3 id=&#34;i-delete-your-pipeline&#34;&gt;I. Delete your pipeline&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;In the configuration of your pipeline, click on &lt;em&gt;Pipeline Actions&lt;/em&gt; then click on &lt;em&gt;Delete&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/6-delete-pipeline.png&#34; alt=&#34;Delete pipeline&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;ii-delete-your-server-groups&#34;&gt;II. Delete your server groups&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Navigate to the 
&lt;a href=&#34;http://localhost:9000/#/applications/codelab/clusters&#34; target=&#34;_blank&#34;&gt;CLUSTERS&lt;/a&gt;
 section.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select each Server Group in the list and select &lt;em&gt;Destroy&lt;/em&gt; for each of them.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/6-destroy-server-group.png&#34; alt=&#34;Destroy Server Group&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;iii-delete-your-load-balancers&#34;&gt;III. Delete your load balancers&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Navigate to the 
&lt;a href=&#34;http://localhost:9000/#/applications/codelab/loadBalancers&#34; target=&#34;_blank&#34;&gt;LOAD BALANCERS&lt;/a&gt;
 section.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select each Load Balancer in the list then in the &lt;em&gt;Load Balancer Actions&lt;/em&gt; select &lt;em&gt;Delete Load Balancer&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/6-delete-load-balancer.png&#34; alt=&#34;Delete Load Balancer&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;iv-delete-your-firewall&#34;&gt;IV. Delete your firewall&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Navigate to the 
&lt;a href=&#34;http://localhost:9000/#/applications/codelab/firewalls&#34; target=&#34;_blank&#34;&gt;FIREWALL&lt;/a&gt;
 section.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select each Firewall in the list then in the &lt;em&gt;Firewall Actions&lt;/em&gt; select &lt;em&gt;Delete Firewall&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/6-delete-firewall.png&#34; alt=&#34;Delete Firewall&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Bake and Deploy Pipeline</title>
      <link>https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/tutorials/codelabs/bake-and-deploy-pipeline/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/tutorials/codelabs/bake-and-deploy-pipeline/</guid>
      <description>
        
        
        &lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;VM only&lt;/strong&gt;: This codelab requires you have a VM (for example, on AWS or GCP)
on which to run it.&lt;/p&gt;
&lt;p&gt;For Kubernetes, try 
&lt;a href=&#34;https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/tutorials/codelabs/kubernetes-source-to-prod/&#34;&gt;Kubernetes
Source-to-Prod&lt;/a&gt;
,&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;To walk you through some of the basics with Spinnaker, you&amp;rsquo;re going to set up a Spinnaker pipeline that bakes a virtual machine (VM) image containing redis, then deploys that image to a test cluster.&lt;/p&gt;
&lt;p&gt;Note here that the us-east-1a availability zone is currently full, so it will need to be deselected in the corresponding &amp;lsquo;region&amp;rsquo; checkbox list for each of these steps.&lt;/p&gt;
&lt;h3 id=&#34;set-up-spinnaker&#34;&gt;Set up Spinnaker&lt;/h3&gt;
&lt;p&gt;If you don&amp;rsquo;t already have a running Spinnaker instance, you&amp;rsquo;ll need to set one
up before you continue. 
&lt;a href=&#34;https://deploy-preview-629--spinnaker-io.netlify.app/docs/setup/install&#34;&gt;Read the setup guide&lt;/a&gt;
 to install Spinnaker.&lt;/p&gt;
&lt;p&gt;Once you have deployed Spinnaker, navigate to 
&lt;a href=&#34;https://deploy-preview-629--spinnaker-io.netlify.app/docs/setup/install/deploy/#connect-to-the-spinnaker-ui&#34;&gt;the ui&lt;/a&gt;
.&lt;/p&gt;
&lt;h3 id=&#34;create-a-spinnaker-application&#34;&gt;Create a Spinnaker application&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;In Spinnaker, click &lt;strong&gt;Actions&lt;/strong&gt; &amp;gt; &lt;strong&gt;Create Application&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Input &lt;code&gt;example&lt;/code&gt; for the &lt;strong&gt;Name&lt;/strong&gt; field and your email address for
the &lt;strong&gt;Owner Email&lt;/strong&gt; field.&lt;/li&gt;
&lt;li&gt;Click on the &lt;strong&gt;Consider only cloud provider health when executing
tasks&lt;/strong&gt; button next to &lt;strong&gt;Instance Health&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;Create&lt;/strong&gt; button.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;create-and-configure-a-firewall&#34;&gt;Create and configure a firewall&lt;/h3&gt;
&lt;p&gt;Next, you&amp;rsquo;ll create a firewall that specifies traffic
rules for the cluster. You&amp;rsquo;ll configure the rules to allow
all incoming traffic on port 80, for clusters associated with this
firewall.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;FIREWALLS&lt;/strong&gt;, then click the &lt;strong&gt;+&lt;/strong&gt; button to create a firewall.&lt;/li&gt;
&lt;li&gt;Input &lt;code&gt;test&lt;/code&gt; for the &lt;strong&gt;Detail (optional)&lt;/strong&gt; field and
&lt;code&gt;Test environment&lt;/code&gt; for the &lt;strong&gt;Description&lt;/strong&gt; field.&lt;/li&gt;
&lt;li&gt;If running on AWS&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Select &lt;strong&gt;defaultvpc&lt;/strong&gt; as the &lt;strong&gt;VPC&lt;/strong&gt; field&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Add new Firewall Rule&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;default&lt;/strong&gt; on the &lt;strong&gt;Firewall&lt;/strong&gt; dropdown.&lt;/li&gt;
&lt;li&gt;Change &lt;strong&gt;Start Port&lt;/strong&gt; and &lt;strong&gt;End Port&lt;/strong&gt; to &lt;code&gt;80&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;If running on GCP&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Click &lt;strong&gt;Add New Source CIDR&lt;/strong&gt; and use the default
&lt;code&gt;0.0.0.0/0&lt;/code&gt; value for the &lt;strong&gt;Source Range&lt;/strong&gt; field.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Add New Protocol and Port Range&lt;/strong&gt;. Use the default
&lt;code&gt;TCP&lt;/code&gt; value for the &lt;strong&gt;Protocol&lt;/strong&gt; field. Change &lt;strong&gt;Start
Port&lt;/strong&gt; and &lt;strong&gt;End Port&lt;/strong&gt; to &lt;code&gt;80&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;Click the &lt;strong&gt;Create&lt;/strong&gt; button.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;create-a-load-balancer&#34;&gt;Create a load balancer&lt;/h3&gt;
&lt;p&gt;Next, you&amp;rsquo;ll create a load balancer in Spinnaker.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;LOAD BALANCERS&lt;/strong&gt;, then click the &lt;strong&gt;+&lt;/strong&gt; button to create a load balancer.&lt;/li&gt;
&lt;li&gt;Input &lt;code&gt;test&lt;/code&gt; for the &lt;strong&gt;Stack&lt;/strong&gt; field.&lt;/li&gt;
&lt;li&gt;If running on AWS, select &lt;strong&gt;internal (defaultvpc)&lt;/strong&gt; from the &lt;strong&gt;VPC
Subnet&lt;/strong&gt; dropdown.&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;Next&lt;/strong&gt; button.&lt;/li&gt;
&lt;li&gt;If running on AWS&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Select &lt;strong&gt;example-test&lt;/strong&gt; from the &lt;strong&gt;Firewalls&lt;/strong&gt; dropdown.&lt;/li&gt;
&lt;li&gt;Hit &lt;strong&gt;Next&lt;/strong&gt;, then &lt;strong&gt;Create&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;6&#34;&gt;
&lt;li&gt;If running on GCP&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Deselect the &lt;strong&gt;Enable health check?&lt;/strong&gt; checkbox.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;7&#34;&gt;
&lt;li&gt;Click the &lt;strong&gt;Create&lt;/strong&gt; button.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;create-a-deployment-pipeline&#34;&gt;Create a deployment pipeline&lt;/h3&gt;
&lt;p&gt;Your final task is to set up a Spinnaker pipeline. Let&amp;rsquo;s name it
&lt;strong&gt;Bake &amp;amp; Deploy to Test&lt;/strong&gt;. The pipeline will produce an image
containing the &lt;code&gt;redis-server&lt;/code&gt; package and then deploy
it. In this tutorial, you&amp;rsquo;ll trigger the pipeline manually.&lt;/p&gt;
&lt;p&gt;To create the pipeline:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;PIPELINES&lt;/strong&gt;, then click &lt;strong&gt;Configure&lt;/strong&gt; and select &lt;strong&gt;Create
New&amp;hellip;&lt;/strong&gt; from the dropdown.&lt;/li&gt;
&lt;li&gt;Input &lt;code&gt;Bake &amp;amp; Deploy to Test&lt;/code&gt; for the &lt;strong&gt;Pipeline Name&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;Create Pipeline&lt;/strong&gt; button.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;set-up-the-first-stage-of-the-pipeline&#34;&gt;Set up the first stage of the pipeline&lt;/h4&gt;
&lt;p&gt;You&amp;rsquo;re now going to create the first stage of the pipeline. It will
build an image from an existing redis-server package.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;Add stage&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Bake&lt;/strong&gt; from the &lt;strong&gt;Type&lt;/strong&gt; pulldown menu.&lt;/li&gt;
&lt;li&gt;Input &lt;code&gt;redis-server&lt;/code&gt; for the &lt;strong&gt;Package&lt;/strong&gt; field.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Save Changes&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;set-up-the-second-stage-of-the-pipeline&#34;&gt;Set up the second stage of the pipeline&lt;/h4&gt;
&lt;p&gt;You&amp;rsquo;re now going to set up the second stage of the pipeline. It takes
the image constructed in the &lt;em&gt;Bake&lt;/em&gt; stage and deploys it into a test
environment.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;Add stage&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Deploy&lt;/strong&gt; from the &lt;strong&gt;Type&lt;/strong&gt; dropdown.&lt;/li&gt;
&lt;li&gt;Under the &lt;strong&gt;Server Groups&lt;/strong&gt; heading, click &lt;strong&gt;Add server group&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;Continue without a template&lt;/strong&gt; button.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Next, In the &lt;strong&gt;Configure Deployment Cluster&lt;/strong&gt; window, input &amp;ldquo;test&amp;rdquo;
for the &lt;strong&gt;Stack&lt;/strong&gt; field.&lt;/p&gt;
&lt;ol start=&#34;6&#34;&gt;
&lt;li&gt;If running on AWS, select &lt;strong&gt;defaultvpc&lt;/strong&gt; under &lt;strong&gt;VPC Subnet&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;Next&lt;/strong&gt; button.&lt;/li&gt;
&lt;li&gt;Click the text area next to the &lt;strong&gt;Load Balancers&lt;/strong&gt; heading, then
select &lt;code&gt;example-test&lt;/code&gt;. Click the &lt;strong&gt;Next&lt;/strong&gt; button.&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;Firewalls&lt;/strong&gt; form field, then click
&lt;code&gt;example-test (example-test)&lt;/code&gt;. Click the &lt;strong&gt;Next&lt;/strong&gt;
button.&lt;/li&gt;
&lt;li&gt;If running on AWS&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Click on the &lt;strong&gt;Micro Utility&lt;/strong&gt; button to set the &lt;strong&gt;Instance
Profile&lt;/strong&gt;, then click &lt;strong&gt;Next&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select the &lt;strong&gt;Medium: m3&lt;/strong&gt; size, then click &lt;strong&gt;Next&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;11&#34;&gt;
&lt;li&gt;If running on GCP&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Click on the &lt;strong&gt;Micro Utility&lt;/strong&gt; button to set the &lt;strong&gt;Instance
Profile&lt;/strong&gt;, then click &lt;strong&gt;Next&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;If running on GCP, select the &lt;strong&gt;Micro&lt;/strong&gt; size, then click &lt;strong&gt;Next&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;12&#34;&gt;
&lt;li&gt;Input &lt;code&gt;2&lt;/code&gt; for the &lt;strong&gt;Number of Instances&lt;/strong&gt; field, then click the
&lt;strong&gt;Add&lt;/strong&gt; button.&lt;/li&gt;
&lt;li&gt;Save the pipeline configuration by clicking the &lt;strong&gt;Save Changes&lt;/strong&gt;
button.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;try-it-out&#34;&gt;Try it out!&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;PIPELINES&lt;/strong&gt; in the navigation bar.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Start Manual Execution&lt;/strong&gt; for the &lt;strong&gt;Bake &amp;amp; Deploy to Test&lt;/strong&gt;
pipeline.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Run&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now, watch Spinnaker in action. A &lt;strong&gt;MANUAL START&lt;/strong&gt; section will
appear, and will show progress as the pipeline executes. At any point
during pipeline execution, click on the horizontal bar to see detailed
status for any of the stages in the pipeline.&lt;/p&gt;
&lt;p&gt;Feel free to navigate around the Spinnaker menus, create new
pipelines, clusters, server groups, load balancers, and firewalls,
etc. and see what happens.&lt;/p&gt;
&lt;p&gt;When you&amp;rsquo;re ready to stop, don&amp;rsquo;t forget to cleanup your resources. An
easy way to do this is to visit the pipelines, clusters, load
balancers, and firewalls pages, click on the ones created and
select the appropriate &lt;strong&gt;Delete&lt;/strong&gt; command from the Actions pulldown on
the right.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Continuous Delivery to Kubernetes on Oracle</title>
      <link>https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/tutorials/codelabs/oracle-kubernetes-source-to-prod/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/tutorials/codelabs/oracle-kubernetes-source-to-prod/</guid>
      <description>
        
        
        &lt;p&gt;In this codelab you will configure a Spinnaker pipeline to deploy an application from Kubernetes manifest files targeting Kubernetes on Oracle Cloud Infrastructure Container Engine (OKE).&lt;/p&gt;
&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;Before we begin, we need to do the following:&lt;/p&gt;
&lt;h3 id=&#34;configure-kubernetes&#34;&gt;Configure Kubernetes&lt;/h3&gt;
&lt;p&gt;If you don&amp;rsquo;t already have a cluster for this purpose, you can follow 
&lt;a href=&#34;https://www.oracle.com/webfolder/technetwork/tutorials/obe/oci/oke-full/index.html&#34; target=&#34;_blank&#34;&gt;this tutorial&lt;/a&gt;
 until a Kubernetes cluster on OKE is created.&lt;/p&gt;
&lt;h3 id=&#34;create-a-compute-instance&#34;&gt;Create a compute instance&lt;/h3&gt;
&lt;p&gt;Create a compute instance on Oracle Cloud Infrastructure (OCI) to host Spinnaker by following 
&lt;a href=&#34;https://docs.cloud.oracle.com/iaas/Content/Compute/Tasks/launchinginstance.htm&#34; target=&#34;_blank&#34;&gt;these instructions&lt;/a&gt;
.  Spinnaker supports Ubuntu 18.04 or higher.&lt;/p&gt;
&lt;h3 id=&#34;install-and-configure-spinnaker&#34;&gt;Install and configure Spinnaker&lt;/h3&gt;
&lt;p&gt;SSH onto the compute instance you previously created.  &lt;code&gt;IP&lt;/code&gt; is its public ip address.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh ubuntu@IP
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Set up Oracle Object Storage as your Spinnaker storage by following these steps: 
&lt;a href=&#34;https://deploy-preview-629--spinnaker-io.netlify.app/docs/setup/install/storage/oracle/&#34;&gt;Adding Oracle Object Storage to Spinnaker&lt;/a&gt;
.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Set up your Kubernetes Cloud provider by following these steps: 
&lt;a href=&#34;https://deploy-preview-629--spinnaker-io.netlify.app/docs/setup/install/providers/kubernetes/oke/&#34;&gt;Setting up OKE&lt;/a&gt;
.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
&lt;a href=&#34;https://deploy-preview-629--spinnaker-io.netlify.app/docs/setup/install/&#34;&gt;Install spinnaker per&lt;/a&gt;
 using a debian installation&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;accessing-spinnaker&#34;&gt;Accessing Spinnaker&lt;/h3&gt;
&lt;p&gt;By default, the Spinnaker UI runs on port 9000. You can use an SSH tunnel to access this from your workstation.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh -A -L 9000:localhost:9000 -L 8084:localhost:8084 ubuntu@IP
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now Spinnaker UI is available at 
&lt;a href=&#34;http://localhost:9000&#34; target=&#34;_blank&#34;&gt;http://localhost:9000&lt;/a&gt;
.&lt;/p&gt;
&lt;h2 id=&#34;1-create-a-spinnaker-application&#34;&gt;1: Create a Spinnaker application&lt;/h2&gt;
&lt;p&gt;In this exercise, you’ll set up a pipeline to deploy a tomcat8 from Kubernetes manifest file to OKE.&lt;/p&gt;
&lt;p&gt;Navigate to Spinnaker at 
&lt;a href=&#34;http://localhost:9000&#34; target=&#34;_blank&#34;&gt;http://localhost:9000&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;From the Spinnaker home page, create a new Spinnaker Application by clicking on the &lt;em&gt;Actions&lt;/em&gt; drop down at the upper right and clicking on &lt;em&gt;Create Application&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;In the &lt;em&gt;New Application&lt;/em&gt; dialog:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enter &amp;ldquo;codelaboke&amp;rdquo; for &lt;em&gt;Name&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Enter your email for &lt;em&gt;Owner Email&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Add &amp;ldquo;kubernetes&amp;rdquo; to &lt;em&gt;Cloud Providers&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Click the &lt;em&gt;Create&lt;/em&gt; button.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;create-app.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;2-create-a-load-balancer&#34;&gt;2: Create a load balancer&lt;/h2&gt;
&lt;p&gt;Navigate to the &amp;ldquo;Load Balancers&amp;rdquo; tab and click the &lt;em&gt;Create Load Balancer&lt;/em&gt; button, enter the following yaml in the &lt;em&gt;Manifest&lt;/em&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;kind&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Service&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;v1&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;metadata&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;codelaboke-test-lb&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;annotations&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;service.beta.kubernetes.io/oci-load-balancer-shape&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;400Mbps&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;spec&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;LoadBalancer&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;selector&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;load-balancer-codelaboke-test-lb&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;true&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;ports&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;protocol&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;TCP&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;port&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;80&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;targetPort&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;8080&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The service annotation “service.beta.kubernetes.io/oci-load-balancer-shape” determines the load balancer&amp;rsquo;s total pre-provisioned maximum capacity (bandwidth) for ingress plus egress traffic. Available shapes include 100Mbps, 400Mbps, and 8000Mbps.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;create-lb.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Click &lt;em&gt;Create&lt;/em&gt;. This will create the load balancer shown below.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;lb.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;3-create-a-deploy-to-test-pipeline&#34;&gt;3: Create a &amp;ldquo;Deploy to Test&amp;rdquo; pipeline&lt;/h1&gt;
&lt;h3 id=&#34;create-the-pipeline&#34;&gt;Create the pipeline&lt;/h3&gt;
&lt;p&gt;Create a new pipeline by navigating to the PIPELINES tab and clicking the &lt;em&gt;New&lt;/em&gt; button&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Name the pipeline “Deploy to Test”.&lt;/li&gt;
&lt;li&gt;Click the &lt;em&gt;Create&lt;/em&gt; button.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;set-up-deploy-stage&#34;&gt;Set up Deploy stage&lt;/h3&gt;
&lt;p&gt;There are multiple ways to deploy Kubernetes manifests using the Kubernetes provider.  More details can be found in this 
&lt;a href=&#34;https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/user/kubernetes/deploy-manifest/&#34;&gt;Deploying Kubernetes Manifests&lt;/a&gt;
 guide.&lt;/p&gt;
&lt;p&gt;It is preferred to use artifacts as manifests.  However, in this tutorial, the manifest is supplied statically to a pipeline as text for simplicity.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Click &lt;em&gt;Add stage&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Select “Deploy (Manifest)” in the &lt;em&gt;Type&lt;/em&gt; drop down.&lt;/li&gt;
&lt;li&gt;In the &lt;em&gt;Deploy (Manifest) Configuration&lt;/em&gt; section, enter the following yaml as &lt;em&gt;Text&lt;/em&gt; for &lt;em&gt;Manifest Source&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;apps/v1&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;kind&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Deployment&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;metadata&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;codelaboke-test-cluster&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;spec&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;replicas&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;selector&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;matchLabels&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;codelaboke-test-cluster&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;true&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;template&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;metadata&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;labels&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;codelaboke-test-cluster&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;true&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;load-balancer-codelaboke-test-lb&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;true&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;spec&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;containers&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;        &lt;/span&gt;- &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;image&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;tomcat:8.0&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;tomcat8&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;ports&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;            &lt;/span&gt;- &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;containerPort&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;8080&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;readinessProbe&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;            &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;httpGet&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;              &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;path&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;              &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;port&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;8080&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;deploy.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Save the pipeline.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;4-deploy&#34;&gt;4. Deploy&lt;/h2&gt;
&lt;p&gt;Run a &amp;ldquo;Start Manual Execution&amp;rdquo; in &amp;ldquo;Deploy to Test&amp;rdquo; to Test pipeline.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;deployed.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Navigate to the Clusters tab, and you will see this.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;clusters.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;You can test the application by visiting the ingress ip address of the Load Balancer &amp;ldquo;codelaboke-test-lb&amp;rdquo;.  In this example, the Load Balancer listens to HTTP on port 80.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: DC/OS: Source to Prod</title>
      <link>https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/tutorials/codelabs/dcos-source-to-prod/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/tutorials/codelabs/dcos-source-to-prod/</guid>
      <description>
        
        
        &lt;h2 id=&#34;0-setup&#34;&gt;0. Setup&lt;/h2&gt;
&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Github repository with the source code to deploy&lt;/li&gt;
&lt;li&gt;Enterprise DC/OS cluster (1.8 or greater)
&lt;ul&gt;
&lt;li&gt;Marathon-lb is should be installed and running&lt;/li&gt;
&lt;li&gt;For the examples in this codelab we&amp;rsquo;ll say that it&amp;rsquo;s at &lt;code&gt;https://dcos.example.com&lt;/code&gt; so you should replace that with the URL to your cluster&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Jenkins instance
&lt;ul&gt;
&lt;li&gt;This can be installed on your DC/OS cluster as a 
&lt;a href=&#34;https://docs.mesosphere.com/service-docs/jenkins/&#34; target=&#34;_blank&#34;&gt;Mesosphere Universe package&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;configure-spinnaker&#34;&gt;Configure Spinnaker&lt;/h2&gt;
&lt;h4 id=&#34;clouddriver-localyml&#34;&gt;clouddriver-local.yml&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yml&#34; data-lang=&#34;yml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;dcos&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;enabled&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;clusters&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;- &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;codelab-cluster&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;dcosUrl&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;https://dcos.example.com&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;insecureSkipTlsVerify&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;accounts&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;- &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;codelab-dcos-account&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;dockerRegistries&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;        &lt;/span&gt;- &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;accountName&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;my-docker-registry&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;clusters&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;        &lt;/span&gt;- &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;codelab-cluster&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;uid&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;${DCOS_USER}&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;password&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;${DCOS_PASSWORD}&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;dockerRegistry&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;enabled&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;accounts&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;my-docker-registry&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;address&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;https://index.docker.io&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;repositories&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;- &lt;span style=&#34;color:#000&#34;&gt;lwander/spin-kub-demo&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;username&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;${DOCKER_USER}&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;password&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;${DOCKER_PASSWORD}&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;enable-docker&#34;&gt;Enable Docker&lt;/h4&gt;
&lt;p&gt;
&lt;a href=&#34;https://deploy-preview-629--spinnaker-io.netlify.app/docs/setup/install/providers/docker-registry/&#34;&gt;Configure a docker registry&lt;/a&gt;
&lt;/p&gt;
&lt;h4 id=&#34;set-up-the-dcos-provider&#34;&gt;Set up the DC/OS provider&lt;/h4&gt;
&lt;p&gt;First, enable the provider:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hal config provider dcos &lt;span style=&#34;color:#204a87&#34;&gt;enable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next we need to add our DC/OS cluster:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hal config provider dcos cluster add codelab-cluster &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;    --dcos-url &lt;span style=&#34;color:#000&#34;&gt;$CLUSTER_URL&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;    --skip-tls-verify &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# For simplicity we won&amp;#39;t worry about the&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# certificate for the cluster but this would not be recommended&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# for a real deployment&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Create a Spinnaker account that has credentials for the cluster.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hal config provider dcos account add codelab &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;    --cluster codelab-cluster &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;    --docker-registries my-docker-registry &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;    --uid &lt;span style=&#34;color:#000&#34;&gt;$DCOS_USER&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;    --password &lt;span style=&#34;color:#000&#34;&gt;$DCOS_PASSWORD&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Note: Make sure that your DC/OS user has permission to deploy applications under a &lt;code&gt;/codelab&lt;/code&gt; group in Marathon&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And deploy the config with &lt;code&gt;hal&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo hal deploy apply
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;1-create-a-spinnaker-application&#34;&gt;1. Create a Spinnaker application&lt;/h2&gt;
&lt;p&gt;Spinnaker applications are groups of resources managed by the underlying cloud provider, and are delineated by the naming convention &lt;code&gt;&amp;lt;app name&amp;gt;-&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Under the &lt;em&gt;Actions&lt;/em&gt; dropdown select &lt;em&gt;Create Application&lt;/em&gt; and fill out the following dialog:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/100-createapp.png&#34; alt=&#34;If you&amp;amp;rsquo;ve followed the Source to Prod tutorial for the VM based providers, you&amp;amp;rsquo;ll remember that you needed to select &amp;amp;ldquo;Consider only cloud provider health when executing tasks&amp;amp;rdquo;. Since DC/OS is the sole health provider by definition, selecting this here is redundant, and unnecessary.&#34;&gt;&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll notice that you were dropped in this &lt;em&gt;Clusters&lt;/em&gt; tab for your newly created application. In Spinnaker&amp;rsquo;s terminology a &lt;em&gt;Cluster&lt;/em&gt; is a collection of &lt;em&gt;Server Groups&lt;/em&gt; all running different versions of the same artifact (Docker Image). Furthermore, &lt;em&gt;Server Groups&lt;/em&gt; are DC/OS  
&lt;a href=&#34;https://docs.mesosphere.com/1.9/deploying-services/creating-services/&#34; target=&#34;_blank&#34;&gt;Services&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/101-clusters.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;2-create-a-demo-server-group&#34;&gt;2. Create a demo server group&lt;/h2&gt;
&lt;p&gt;Next we will create a &lt;em&gt;Server Group&lt;/em&gt; as a sanity check to make sure we have set up everything correctly so far. Before doing this, ensure you have at least 1 tag pushed to your Docker registry with the code you want to deploy. Now on the &lt;em&gt;Clusters&lt;/em&gt; screen, select &lt;em&gt;Create Server Group/Job&lt;/em&gt;, choose &lt;em&gt;Server Group&lt;/em&gt; from the drop down and hit &lt;em&gt;Next&lt;/em&gt; to see the following dialog:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/200-server-group-blank.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Fill out the basic settings and select your Docker image to use.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/201-basics.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Select the Bridge network type and the port that the process in the container will listen on.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/202-network.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Add the labels that marathon-lb will use to route traffic to your instance.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/203-labels.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Finally, add a health check and then click Create.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/204-healthcheck.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Test that you can reach your service with the following command (where &lt;code&gt;$VHOST&lt;/code&gt; is the &lt;code&gt;HAPROXY_0_VHOST&lt;/code&gt; value from your server group)&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl --header &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Host: dev.example.com&amp;#34;&lt;/span&gt; http://&lt;span style=&#34;color:#000&#34;&gt;$PUBLIC_AGENT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;3-git-to-_dev_-pipeline&#34;&gt;3. Git to &lt;em&gt;dev&lt;/em&gt; pipeline&lt;/h2&gt;
&lt;p&gt;Now let&amp;rsquo;s automate the process of creating server groups associated with the &lt;em&gt;dev&lt;/em&gt; stack. Navigate to the &lt;em&gt;Pipelines&lt;/em&gt; tab, select &lt;em&gt;Configure&lt;/em&gt; &amp;gt; &lt;em&gt;Create New&amp;hellip;&lt;/em&gt; and then fill out the resulting dialog as follows:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/300-new-pipeline.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;In the resulting page, select &lt;em&gt;Add Trigger&lt;/em&gt;, and fill the form out as follows:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/301-docker-trigger.png&#34; alt=&#34;The &amp;amp;ldquo;Organization&amp;amp;rdquo; and &amp;amp;ldquo;Image&amp;amp;rdquo; will likely be different, as you have set up your own Docker repository. The &amp;amp;ldquo;Tag&amp;amp;rdquo; can be a regex matching a tag name patterns for valid triggers. Leaving it blank serves as &amp;amp;ldquo;trigger on any new tag&amp;amp;rdquo;.&#34;&gt;&lt;/p&gt;
&lt;p&gt;Now select &lt;em&gt;Add Stage&lt;/em&gt; just below &lt;em&gt;Configuration&lt;/em&gt;, and fill out the form as follows:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/302-deploy-stage.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Next, in the &lt;em&gt;Server Groups&lt;/em&gt; box select &lt;em&gt;Add Server Group&lt;/em&gt;, where you will use the already deployed server group as a template like so:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/303-template.png&#34; alt=&#34;Any server group in this app can be used as a template, and vastly simplifies configuration (since most configuration is copied over).&#34;&gt;&lt;/p&gt;
&lt;p&gt;In the resulting dialog, we only need to make one change down in the &lt;em&gt;Container&lt;/em&gt; subsection. Select the image that will come from the Docker trigger as shown below:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/304-container-tag.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Lastly, we want to add a stage to destroy the previous server group in this &lt;em&gt;dev&lt;/em&gt; cluster. Select &lt;em&gt;Add Stage&lt;/em&gt;, and fill out the form as follows:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/305-destroy.png&#34; alt=&#34;Make sure to select &amp;amp;ldquo;codelab-cluster&amp;amp;rdquo; as the region, and &amp;amp;ldquo;toggle for list of clusters&amp;amp;rdquo; to make cluster selection easier. (For DC/OS in Spinnaker a &amp;amp;ldquo;region&amp;amp;rdquo; is a DC/OS cluster and a &amp;amp;ldquo;cluster&amp;amp;rdquo; is a Spinnaker concept for managing server groupp) &amp;amp;ldquo;Target&amp;amp;rdquo; needs to be &amp;amp;ldquo;Previous Server Group&amp;amp;rdquo;, so whatever was previously deployed is deleted after our newly deployed server group is &amp;amp;ldquo;Healthy&amp;amp;rdquo;.&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;4-verification-pipeline&#34;&gt;4. Verification pipeline&lt;/h2&gt;
&lt;p&gt;Back on the &lt;em&gt;Pipelines&lt;/em&gt; dialog, create a new pipeline as before, but call it &amp;ldquo;Manual Judgement&amp;rdquo;. On the first screen, add a Pipeline trigger as shown below:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/400-pipeline-trigger.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;We will only add a single stage, which will serve to gate access to the &lt;em&gt;prod&lt;/em&gt; environment down the line. The configuration is shown here:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/401-manual-judgment.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Keep in mind, more advanced types of verification can be done here, such as running a DC/OS batch job to verify that your app is healthy, or calling out to an external Jenkins server. For the sake of simplicity we will keep this as &amp;ldquo;manual judgement&amp;rdquo;.&lt;/p&gt;
&lt;h2 id=&#34;5-promote-to-_prod_&#34;&gt;5. Promote to &lt;em&gt;prod&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;Create a new pipeline titled &amp;ldquo;Deploy to Prod&amp;rdquo;, and configure a pipeline trigger as shown here:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/500-prod-trigger.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Now we need to find the deployed image in &lt;em&gt;dev&lt;/em&gt; that we previously verified. Add a new stage and configure it as follows:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/501-find-image.png&#34; alt=&#34;Select the &amp;amp;ldquo;codelab-cluster&amp;amp;rdquo; region, the &amp;quot;&amp;quot; cluster using &amp;amp;ldquo;Toggle for list of clusters&amp;amp;rdquo;, and make sure to select &amp;amp;ldquo;Newest&amp;amp;rdquo; as the &amp;amp;ldquo;Server Group Selection&amp;amp;rdquo;.&#34;&gt;&lt;/p&gt;
&lt;p&gt;Now, to deploy that resolved image, add a new stage and configure it as follows.&lt;/p&gt;
&lt;p&gt;Select &lt;em&gt;Add Server Group&lt;/em&gt;, and again use the &lt;em&gt;dev&lt;/em&gt; deployment as a template:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/502-template.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;This time we need to make three changes to the template. First, change the &amp;ldquo;stack&amp;rdquo; to represent our &lt;em&gt;prod&lt;/em&gt; cluster:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/503-prod-stack.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Next in the container section:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/504-prod-image.png&#34; alt=&#34;Select the image from the Find Image stage results&#34;&gt;&lt;/p&gt;
&lt;p&gt;Lastly in the labels section:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/505-prod-vhost.png&#34; alt=&#34;Change the label so that marathon-lb will route traffic from our prod vhost to instances in this server group&#34;&gt;&lt;/p&gt;
&lt;p&gt;Now to prevent all prior versions of this app in production from serving traffic once the deploy finishes, we will add a &amp;ldquo;Disable Cluster&amp;rdquo; stage like so:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/506-prod-disable.png&#34; alt=&#34;You will need to manualy enter &amp;amp;ldquo;codelab-prod&amp;amp;rdquo; as the cluster name since it doesn&amp;amp;rsquo;t exist yet.&#34;&gt;&lt;/p&gt;
&lt;p&gt;Save the pipeline, and we are ready to go!&lt;/p&gt;
&lt;h2 id=&#34;7-run-the-pipeline&#34;&gt;7. Run the pipeline&lt;/h2&gt;
&lt;p&gt;Push a new branch to your repo, and wait for the pipeline to run.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;NEW_VERSION=v1.0.0
git checkout -b $NEW_VERSION
git push origin $NEW_VERSION&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Once the Manual Judgement stage is hit, use &lt;code&gt;curl&lt;/code&gt; to &amp;ldquo;verify&amp;rdquo; your deployment.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl --header &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Host: dev.example.com&amp;#34;&lt;/span&gt; http://&lt;span style=&#34;color:#000&#34;&gt;$PUBLIC_AGENT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Hit &lt;em&gt;continue&lt;/em&gt; once you are ready to promote to &lt;em&gt;prod&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/700-continue.png&#34; alt=&#34;Selecting &amp;amp;ldquo;stop&amp;amp;rdquo; will cause the deployment to fail, and the next pipeline won&amp;amp;rsquo;t trigger.&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/701-image-found.png&#34; alt=&#34;Notice that the &amp;amp;ldquo;Find Image&amp;amp;rdquo; phase automatically finds the tag that we triggered the first pipeline, as it was the one we verified earlier.&#34;&gt;&lt;/p&gt;
&lt;p&gt;To verify, use &lt;code&gt;curl&lt;/code&gt; again:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl --header &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Host: prod.example.com&amp;#34;&lt;/span&gt; http://&lt;span style=&#34;color:#000&#34;&gt;$PUBLIC_AGENT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Once the pipelines are done, you can see the dev and prod stacks in the &lt;em&gt;Clusters&lt;/em&gt; tab:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/702-done.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Deploy Artifacts from Artifactory to CF</title>
      <link>https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/tutorials/codelabs/artifactory-to-cf/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/tutorials/codelabs/artifactory-to-cf/</guid>
      <description>
        
        
        &lt;p&gt;In this codelab, you will deploy an artifact to Cloud Foundry via a Spinnaker pipeline. The pipeline is triggered by an artifact published to a JFrog Artifactory Maven repository or by an app manifest stored in a GitHub repository.&lt;/p&gt;
&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;This codelab assumes you have the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Artifact support 
&lt;a href=&#34;https://deploy-preview-629--spinnaker-io.netlify.app/docs/reference/artifacts/#enabling-artifact-support&#34;&gt;enabled&lt;/a&gt;
.&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;li&gt;An Artifactory repository configured to accept a Maven artifact—the JAR for your application&lt;/li&gt;
&lt;li&gt;A GitHub repository containing a manifest with which to deploy your application&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;1-add-artifactory-search-to-spinnaker&#34;&gt;1. Add Artifactory Search to Spinnaker&lt;/h2&gt;
&lt;p&gt;a. Enable the Artifactory repository:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ hal config repository artifactory enable
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;b. Add a search for your repository:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ hal config repository artifactory search add spring-artifactory --base-url https://my.repo.example.com \
  	--repo my-example-repo --groupId com.example.mygroup --username example --password mypassword
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;2-add-maven-account-to-spinnaker&#34;&gt;2. Add Maven Account to Spinnaker&lt;/h2&gt;
&lt;p&gt;a. Enable the Maven artifact provider:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ hal config artifact maven enable
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;b. Add an artifact account for Maven:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ hal config artifact maven account add spring-artifactory-maven --repository-url https://my.repo.example.com
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;3-add-github-account-to-spinnaker&#34;&gt;3. Add GitHub Account to Spinnaker&lt;/h2&gt;
&lt;p&gt;See the documentation about how to 
&lt;a href=&#34;https://deploy-preview-629--spinnaker-io.netlify.app/docs/setup/other_config/artifacts/github/&#34;&gt;Configure a GitHub artifact account&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;a. After generating an access token with the &lt;code&gt;repo&lt;/code&gt; scope, store that token in a token file (&lt;code&gt;TOKEN_FILE&lt;/code&gt;).&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ TOKEN_FILE=&amp;lt;Insert Path to Token File&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;b. Enable the GitHub artifact provider:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ hal config artifact github enable
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;c. Add an artifact account (&lt;code&gt;GITHUB_ACCOUNT&lt;/code&gt;) for GitHub:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ GITHUB_ACCOUNT=&amp;lt;Insert GitHub Account Name&amp;gt;
$ hal config artifact github account add $GITHUB_ACCOUNT \
  --token-file $TOKEN_FILE
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;d. Apply your changes:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ hal deploy apply
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;4-configure-github-repository-webhook&#34;&gt;4. Configure GitHub Repository Webhook&lt;/h2&gt;
&lt;p&gt;a. Follow the documentation about 
&lt;a href=&#34;https://www.spinnaker.io/setup/triggers/github/&#34; target=&#34;_blank&#34;&gt;Configuring GitHub Webhooks&lt;/a&gt;
. Take note of the secret you provide to GitHub for the webhook.&lt;/p&gt;
&lt;h2 id=&#34;5-configure-the-application-and-pipeline&#34;&gt;5. Configure the Application and Pipeline&lt;/h2&gt;
&lt;p&gt;a. Create a new pipeline for your application. In the pipeline configuration, add an Artifactory trigger to the Automated Triggers, as shown below.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./artifactory-trigger.png&#34;/&gt;
  &lt;/figure&gt;

&lt;p&gt;b. In the Artifact Constraints dropdown for the Artifactory trigger, select &amp;ldquo;Define a new artifact&amp;hellip;&amp;rdquo; and populate the Expected Artifact form with the details of the artifact that will be published to the Artifactory repository.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./artifactory-expected-artifact.png&#34;/&gt;
  &lt;/figure&gt;

&lt;p&gt;c. Add a Git trigger to the Automated Triggers, as shown below. Supply the secret you used in Step 4a.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./git-trigger.png&#34;/&gt;
  &lt;/figure&gt;

&lt;p&gt;d. In the Artifact Constraints dropdown for the Git trigger, select &amp;ldquo;Define a new artifact&amp;hellip;&amp;rdquo; and populate the Expected Artifact form with the details of the manifest stored in the GitHub repository.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./git-expected-artifact.png&#34;/&gt;
  &lt;/figure&gt;

&lt;p&gt;e. Add a &amp;ldquo;Deploy&amp;rdquo; stage to the pipeline. This stage deploys to the test environment.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./pipeline-first-stage.png&#34;/&gt;
  &lt;/figure&gt;

&lt;p&gt;f. Add a new server group and provide details on deployment settings, the application artifact, and the manifest artifact:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./server-group.png&#34;/&gt;
  &lt;/figure&gt;

&lt;p&gt;g. Add a &amp;ldquo;Manual Judgment&amp;rdquo; stage. You can use this stage, or stages such as &amp;ldquo;Script&amp;rdquo; or &amp;ldquo;Canary Analysis&amp;rdquo;, to verify a deployment before promoting it from the test environment.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./pipeline-second-stage.png&#34;/&gt;
  &lt;/figure&gt;

&lt;p&gt;Add any desired configuration, such as notifications for when the stage is awaiting judgment or is manually judged to continue or stop.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./manual-judgment-configuration.png&#34;/&gt;
  &lt;/figure&gt;

&lt;p&gt;After you have validated and approved the deployment, the next stage (following this &amp;ldquo;Manual Judgment&amp;rdquo; stage) deploys to the production environment.&lt;/p&gt;
&lt;p&gt;h. Add a &amp;ldquo;Clone Server Group&amp;rdquo; stage to the pipeline. This stage promotes the deployed application to the production environment.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./pipeline-third-stage.png&#34;/&gt;
  &lt;/figure&gt;

&lt;p&gt;i. Add a clone configuration and provide details on deployment settings, the source server group, and the manifest:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./clone-configuration.png&#34;/&gt;
  &lt;/figure&gt;

&lt;p&gt;This clone configuration promotes the exact same application to the production environment as you deployed to the test environment with the &amp;ldquo;Deploy&amp;rdquo; stage in Step 5e.&lt;/p&gt;
&lt;p&gt;You may wish to provide a different manifest when deploying the application to the production environment. For this alternate manifest to trigger pipeline executions, you would need to create a separate pipeline that deploys to the production environment.&lt;/p&gt;
&lt;h2 id=&#34;6-publish-the-application-artifact-or-commit-configuration-changes&#34;&gt;6. Publish the Application Artifact or Commit Configuration Changes&lt;/h2&gt;
&lt;p&gt;a. Publish the application artifact to your Artifactory repository. You can also update the application manifest and push a new commit to its GitHub repository.&lt;/p&gt;
&lt;p&gt;b. The published artifact or Git repository push triggers your pipeline, and you should see it deploy a new server group for the application, then promote the application to staging.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Deploy GCS Pub/Sub Artifacts to Google App Engine</title>
      <link>https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/tutorials/codelabs/pubsub-to-appengine/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/tutorials/codelabs/pubsub-to-appengine/</guid>
      <description>
        
        
        &lt;p&gt;The goal of this codelab is to trigger a Spinnaker pipeline with a Pub/Sub message from GCS upon upload of a tarball.&lt;/p&gt;
&lt;p&gt;In this codelab, you will deploy artifacts to Google App Engine (GAE) via a Spinnaker pipeline.
The pipeline is configured to trigger on Pub/Sub messages from a GCS bucket serving as an artifact repository.
The Pub/Sub messages contain context that allows Spinnaker to parse and deploy the stored artifacts.&lt;/p&gt;
&lt;p&gt;This codelab takes about an hour.&lt;/p&gt;
&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;This codelab assumes you have a billing-enabled GCP project. Also, 
&lt;a href=&#34;https://cloud.google.com/sdk/downloads&#34; target=&#34;_blank&#34;&gt;install gcloud&lt;/a&gt;
 if you haven&amp;rsquo;t already.&lt;/p&gt;
&lt;h2 id=&#34;set-up-your-environment&#34;&gt;Set up your environment&lt;/h2&gt;
&lt;h3 id=&#34;create-a-gcs-bucket-to-store-artifacts&#34;&gt;Create a GCS bucket to store artifacts&lt;/h3&gt;
&lt;p&gt;In the environment where you have &lt;code&gt;gcloud&lt;/code&gt; installed, run the following commands:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ BUCKET_NAME=gs://&amp;lt;some_name&amp;gt; &amp;amp;&amp;amp; PROJECT_ID=&amp;lt;project_id&amp;gt;
$ gcloud auth login
$ gsutil mb -p $PROJECT_ID $BUCKET_NAME
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;set-up-google-cloud-pubsub-to-listen-to-bucket-object-changes&#34;&gt;Set up Google Cloud Pub/Sub to listen to bucket object changes&lt;/h3&gt;
&lt;p&gt;
&lt;a href=&#34;https://cloud.google.com/storage/docs/reporting-changes&#34; target=&#34;_blank&#34;&gt;GCP documentation includes the steps&lt;/a&gt;
 for configuring GCS to publish Pub/Sub messages, but here is a summary.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Enable the 
&lt;a href=&#34;https://console.cloud.google.com/apis/api/pubsub.googleapis.com/&#34; target=&#34;_blank&#34;&gt;Cloud Pub/Sub API&lt;/a&gt;
.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Name your topic and subscription:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;TOPIC_NAME=&amp;lt;topic&amp;gt;
SUBSCRIPTION_NAME=&amp;lt;subscription&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;
&lt;p&gt;Create the GCS Pub/Sub notification:
&lt;code&gt;gsutil notification create -t $TOPIC_NAME -f json $BUCKET_NAME&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Verify with &lt;code&gt;gsutil notification list $BUCKET_NAME&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a pull subscription:
&lt;code&gt;gcloud pubsub subscriptions create $SUBSCRIPTION_NAME --topic $TOPIC_NAME&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;configure-and-deploy-your-spinnaker-instance&#34;&gt;Configure and deploy your Spinnaker instance&lt;/h2&gt;
&lt;h3 id=&#34;configure-spinnaker-to-deploy-to-gae&#34;&gt;Configure Spinnaker to deploy to GAE&lt;/h3&gt;
&lt;p&gt;If Spinnaker is not yet configured, install it by following the 
&lt;a href=&#34;https://spinnaker.io/docs/setup/install/&#34; target=&#34;_blank&#34;&gt;installation instructions&lt;/a&gt;
 and then add/configure

&lt;a href=&#34;https://spinnaker.io/docs/setup/install/providers/appengine/&#34; target=&#34;_blank&#34;&gt;the app engine cloud provider&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;Note that while configuring the GAE cloud provider, you will create a service account with &lt;code&gt;roles/storage.admin&lt;/code&gt;
enabled and set two environment variables:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;SERVICE_ACCOUNT_NAME=spinnaker-appengine-account
SERVICE_ACCOUNT_DEST=~/.gcp/appengine-account.json
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In addition to the &lt;code&gt;roles/storage.admin&lt;/code&gt;, the service account also needs &lt;code&gt;roles/pubsub.subscriber&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Add the role to the service account:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;gcloud projects add-iam-policy-binding $PROJECT \
    --role roles/pubsub.subscriber \
    --member serviceAccount:$SA_EMAIL # service account email from GAE setup.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Optionally generate a new service account key:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;rm $SERVICE_ACCOUNT_DEST &amp;amp;&amp;amp; gcloud iam service-accounts keys create $SERVICE_ACCOUNT_DEST \
    --iam-account $SA_EMAIL
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;We&amp;rsquo;ll need this service account later, so keep these environment variables handy.&lt;/p&gt;
&lt;h3 id=&#34;configure-spinnaker-to-listen-to-the-google-cloud-pubsub-subscription&#34;&gt;Configure Spinnaker to listen to the Google Cloud Pub/Sub subscription&lt;/h3&gt;
&lt;p&gt;First, configure your GCS artifact provider.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Enable 
&lt;a href=&#34;https://deploy-preview-629--spinnaker-io.netlify.app/docs/reference/artifacts/#enabling-artifact-support&#34;&gt;artifact support&lt;/a&gt;
.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enable the GCS artifact provider by adding to &lt;code&gt;clouddriver-local.yml&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;artifacts&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;gcs&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;enabled&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;accounts&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;- &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;my-artifact-account&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;json-path&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;/mnt/some/path&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It&amp;rsquo;s recommended to use an 
&lt;a href=&#34;https://deploy-preview-629--spinnaker-io.netlify.app/docs/reference/secrets/&#34;&gt;external secrets manager&lt;/a&gt;
 instead of directly mounting secrets onto pods.&lt;/p&gt;
&lt;p&gt;Now configure Spinnaker to receive messages from your Google Cloud Pub/Sub subscription.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Enable Google Pub/Sub by adding to the &lt;code&gt;echo-local.yml&lt;/code&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;pubsub&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;enabled&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;google&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;enabled&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;Add your subscription to Google Pub/Sub:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;pubsub&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;enabled&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;google&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;enabled&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;subscriptions&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;- &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;my-gcs-subscription&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;project&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;project-id&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;json-path&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;lt;/mnt/secretorSecretManagerReference&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;message-format&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;GCS&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;deploy-spinnaker-with-these-changesdocssetupinstall&#34;&gt;
&lt;a href=&#34;https://deploy-preview-629--spinnaker-io.netlify.app/docs/setup/install&#34;&gt;Deploy Spinnaker with these changes&lt;/a&gt;
&lt;/h3&gt;
&lt;h2 id=&#34;configure-your-pipeline&#34;&gt;Configure your pipeline&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Create an application:&lt;/p&gt;
&lt;p&gt;a. Navigate to the Spinnaker UI by going to &lt;code&gt;localhost:9000&lt;/code&gt; in a browser.&lt;/p&gt;
&lt;p&gt;b. Create a new Spinnaker application by selecting &lt;code&gt;Actions&lt;/code&gt; &amp;gt; &lt;code&gt;Create Application&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;c. Give the application a name and an admin email. If you have more than one cloud provider configured, add &amp;lsquo;appengine&amp;rsquo; to the &lt;code&gt;Cloud Providers&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;d. Click the check box beside &amp;lsquo;Consider only cloud provider health when executing tasks&amp;rsquo; and create the application.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a new pipeline and add an expected artifact.&lt;/p&gt;
&lt;p&gt;a. Select the &lt;code&gt;Pipelines&lt;/code&gt; tab in the Spinnaker UI and click &lt;code&gt;Create&lt;/code&gt; to create a new pipeline.&lt;/p&gt;
&lt;p&gt;b. After naming the pipeline, you will be brought to the pipeline configuration screen.&lt;/p&gt;
&lt;p&gt;c. Add an artifact under the &lt;code&gt;Expected Artifacts&lt;/code&gt; section of the pipeline configuration.&lt;/p&gt;
&lt;p&gt;d. Select &lt;code&gt;GCS&lt;/code&gt; as the artifact type.&lt;/p&gt;
&lt;p&gt;e. In the &lt;code&gt;Object path&lt;/code&gt; text box, put &lt;code&gt;gs://$BUCKET_NAME/app.tar&lt;/code&gt; with the explicit value for the bucket name (Spinnaker won&amp;rsquo;t know about your environment variables).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configure a pipeline trigger.&lt;/p&gt;
&lt;p&gt;a. In the &lt;code&gt;Automated Triggers&lt;/code&gt; configuration section, add a new trigger.&lt;/p&gt;
&lt;p&gt;b. Select &amp;lsquo;Pub/Sub&amp;rsquo; as the trigger type.&lt;/p&gt;
&lt;p&gt;c. Select &amp;lsquo;google&amp;rsquo; as the &lt;code&gt;Pub/Sub System Type&lt;/code&gt; and select &amp;lsquo;my-gcs-subscription&amp;rsquo; as the &lt;code&gt;Subscription Name&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;d. Add an attribute constraint with key &amp;rsquo;eventType&amp;rsquo; and value &amp;lsquo;OBJECT_FINALIZE&amp;rsquo;. This prevents your pipeline from triggering twice from one GCS event.&lt;/p&gt;
&lt;p&gt;e. Select the &amp;lsquo;&amp;hellip;/app.tar&amp;rsquo; expected artifact in the &lt;code&gt;Expected Artifacts&lt;/code&gt; drop down.&lt;/p&gt;
&lt;p&gt;f. Save the pipeline with the &lt;code&gt;Save Changes&lt;/code&gt; button in the bottom right corner of the pipeline configuration screen.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create and configure a deploy stage in your pipeline.&lt;/p&gt;
&lt;p&gt;a. Click &lt;code&gt;Add stage&lt;/code&gt; near the top of the configuration screen to add a new stage.&lt;/p&gt;
&lt;p&gt;b. Select &amp;lsquo;Deploy&amp;rsquo; as the stage &lt;code&gt;Type&lt;/code&gt;. Click &lt;code&gt;Add server group&lt;/code&gt; to open the server group configuration modal.&lt;/p&gt;
&lt;p&gt;c. In &lt;code&gt;Basic Settings&lt;/code&gt;, select &amp;lsquo;GCS&amp;rsquo; as the &lt;code&gt;Source Type&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;d. Select &amp;lsquo;my-artifact-account&amp;rsquo; as the &lt;code&gt;Storage Account&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;e. Select &amp;lsquo;via pipeline artifact&amp;rsquo; in &lt;code&gt;Resolve URL&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;f. Select the &amp;lsquo;&amp;hellip;/app.tar&amp;rsquo; artifact in the &lt;code&gt;Expected Artifact&lt;/code&gt; drop down.&lt;/p&gt;
&lt;p&gt;g. In &lt;code&gt;Config Files&lt;/code&gt;, add &amp;lsquo;app.yaml&amp;rsquo; in the &lt;code&gt;Config Filepaths&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;package-and-upload-your-application-to-gcs&#34;&gt;Package and upload your application to GCS&lt;/h2&gt;
&lt;h3 id=&#34;acquire-a-hello-world-application-and-upload-to-gcs&#34;&gt;Acquire a &amp;ldquo;Hello World&amp;rdquo; application and upload to GCS&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Clone a sample GAE application:
&lt;code&gt;git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Package your application as a tarball:
&lt;code&gt;cd python-docs-samples/appengine/standard/hello_world; tar -cvf app.tar *&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Upload the tarball to the GCS bucket:
&lt;code&gt;gsutil cp app.tar $BUCKET_NAME&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Deploy GCS Pub/Sub Artifacts to Cloud Foundry</title>
      <link>https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/tutorials/codelabs/pubsub-to-cf/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/tutorials/codelabs/pubsub-to-cf/</guid>
      <description>
        
        
        &lt;p&gt;In this codelab, you will deploy an artifact to Cloud Foundry via a Spinnaker pipeline that is triggered by JAR uploads to a Google Cloud Storage (GCS) bucket.&lt;/p&gt;
&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;This codelab assumes you have the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A billing-enabled Google Cloud Platform (GCP) project.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;gcloud&lt;/code&gt; CLI tool (installed locally on your computer).&lt;/li&gt;
&lt;li&gt;Artifact support 
&lt;a href=&#34;https://deploy-preview-629--spinnaker-io.netlify.app/docs/reference/artifacts/#enabling-artifact-support&#34;&gt;enabled&lt;/a&gt;
.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;1-create-a-gcs-bucket-for-artifact-storage&#34;&gt;1. Create a GCS Bucket for Artifact Storage&lt;/h2&gt;
&lt;p&gt;a. Log in with &lt;code&gt;gcloud&lt;/code&gt;:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ gcloud auth login
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;b. Run the &lt;code&gt;gsutil mb&lt;/code&gt; command to create a bucket within your GCP project, giving your project’s ID (&lt;code&gt;PROJECT_ID&lt;/code&gt; below) and the name of the bucket to create (&lt;code&gt;BUCKET&lt;/code&gt;):&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ PROJECT_ID=&amp;lt;Insert Project ID&amp;gt;
$ BUCKET=gs://&amp;lt;Insert Bucket Name&amp;gt;
$ gsutil mb -p $PROJECT_ID $BUCKET
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;2-enable-google-cloud-pubsub&#34;&gt;2. Enable Google Cloud Pub/Sub&lt;/h2&gt;
&lt;p&gt;a. Enable the GCP Cloud Pub/Sub API, then use &lt;code&gt;gsutil&lt;/code&gt; to create a Pub/Sub notification, giving a topic name (&lt;code&gt;TOPIC&lt;/code&gt;) and your GCS bucket name (&lt;code&gt;BUCKET&lt;/code&gt;):&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ TOPIC=&amp;lt;Insert Topic Name&amp;gt;
$ gsutil notification create -t $TOPIC -f json $BUCKET
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;b. Now create a pull subscription, giving a subscription name (&lt;code&gt;GCP_SUB_NAME&lt;/code&gt;) and the topic name used in the last command (&lt;code&gt;TOPIC&lt;/code&gt;):&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ GCP_SUB_NAME=&amp;lt;Insert Subscription Name&amp;gt;
$ gcloud beta pubsub subscriptions create $GCP_SUB_NAME --topic $TOPIC
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;3-create-a-gcp-service-account&#34;&gt;3. Create a GCP Service Account&lt;/h2&gt;
&lt;p&gt;a. Following the GCP documentation on 
&lt;a href=&#34;https://cloud.google.com/iam/docs/creating-managing-service-accounts&#34; target=&#34;_blank&#34;&gt;Creating and Managing Service Accounts&lt;/a&gt;
, create a new service account, giving it the Storage Admin (&lt;code&gt;roles/storage.admin&lt;/code&gt;) and Pub/Sub Subscriber (&lt;code&gt;roles/pubsub.subscriber&lt;/code&gt;) roles.&lt;/p&gt;
&lt;p&gt;b. Create a key for the service account and download the key in JSON format to your computer. In this codelab, the path to the JSON key file will be referred to as &lt;code&gt;JSON_SA_KEY&lt;/code&gt;:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ JSON_SA_KEY=&amp;lt;Insert Path to Service Account Key JSON File&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;4-tell-spinnaker-to-use-the-pubsub-subscription&#34;&gt;4. Tell Spinnaker to Use the Pub/Sub Subscription&lt;/h2&gt;
&lt;p&gt;a. Enable the GCS artifact provider:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ hal config artifact gcs enable
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;b. Now add an artifact account for your GCS bucket, providing the path to the service account JSON key file and an account name (&lt;code&gt;ACCOUNT&lt;/code&gt; below):&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ ACCOUNT=&amp;lt;Insert Account Name&amp;gt;
$ hal config artifact gcs account add --json-path $JSON_SA_KEY $ACCOUNT
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;c. Enable GCP Cloud Pub/Sub support:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ hal config pubsub google enable
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;d. Finally, add the subscription you created in step 2, providing a subscription name (&lt;code&gt;SPIN_SUB_NAME&lt;/code&gt;), your GCP project’s name (&lt;code&gt;PROJECT_NAME&lt;/code&gt;), the GCP Cloud Pub/Sub subscription name (&lt;code&gt;GCP_SUB_NAME&lt;/code&gt;), and the path to the service account JSON key file:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ SPIN_SUB_NAME=&amp;lt;Insert Spinnaker Subscription Name&amp;gt;
$ PROJECT_NAME=&amp;lt;Insert GCP Project Name&amp;gt;
$ hal config pubsub google subscription add $SPIN_SUB_NAME \
--project $PROJECT_NAME \
--subscription-name $GCP_SUB_NAME \
--message-format GCS \
--json-path $JSON_SA_KEY
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;e. Apply your changes:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ hal deploy apply
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;5-configure-the-application-and-pipeline&#34;&gt;5. Configure the Application and Pipeline&lt;/h2&gt;
&lt;p&gt;a. Create a new pipeline for your application. In the pipeline configuration, under Automated Triggers, add a new trigger and configure it as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For &lt;strong&gt;Type&lt;/strong&gt;, select &amp;ldquo;Pub/Sub&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;For &lt;strong&gt;Pub/Sub System Type&lt;/strong&gt;, select &lt;strong&gt;GCP Cloud Pub/Sub&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;For &lt;strong&gt;Subscription Name&lt;/strong&gt;, select your GCP Cloud Pub/Sub Spinnaker subscription.&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Attribute Constraints&lt;/strong&gt;, add an entry with the key &lt;code&gt;eventType&lt;/code&gt; and value &lt;code&gt;OBJECT_FINALIZE &lt;/code&gt; (see the 
&lt;a href=&#34;https://cloud.google.com/storage/docs/pubsub-notifications&#34; target=&#34;_blank&#34;&gt;Google Cloud Storage documentation&lt;/a&gt;
).&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;&lt;img src=&#34;./add-a-trigger.png&#34;/&gt;
  &lt;/figure&gt;

&lt;p&gt;b. In the &lt;strong&gt;Artifact Constraints&lt;/strong&gt; dropdown, select &amp;ldquo;Define a new artifact&amp;hellip;&amp;rdquo; to bring up the &lt;strong&gt;Expected Artifact&lt;/strong&gt; form. Provide the artifact information:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For &lt;strong&gt;Display Name&lt;/strong&gt;, enter your own artifact display name or keep the auto-generated default.&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;Account&lt;/strong&gt; dropdown, select your GCS account.&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;Object path&lt;/strong&gt; field, enter the path to the artifact.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;&lt;img src=&#34;./expected-artifact.png&#34;/&gt;
  &lt;/figure&gt;

&lt;p&gt;c. Click &lt;strong&gt;Save Artifact&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;d. Add a Deploy stage to the pipeline. Create a new server group and provide details on deployment settings, the application artifact, and the manifest artifact:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./server-group.png&#34;/&gt;
  &lt;/figure&gt;

&lt;h2 id=&#34;6-upload-the-application-and-manifest-artifacts&#34;&gt;6. Upload the Application and Manifest Artifacts&lt;/h2&gt;
&lt;p&gt;a. Upload the application manifest and application archive to your GCS bucket. With the pipeline trigger for your GCP Cloud Pub/Sub subscription, the pipeline will run when you upload the application archive to the bucket. The below example uses the &lt;code&gt;gsutil cp&lt;/code&gt; command:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ gsutil cp application.jar $BUCKET
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;b. The GCS bucket upload will trigger a pipeline execution, and you should see the pipeline deploy a new server group for the application.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: GCE Source To Prod</title>
      <link>https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/tutorials/codelabs/gce-source-to-prod/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/tutorials/codelabs/gce-source-to-prod/</guid>
      <description>
        
        
        &lt;p&gt;In this codelab, you create a cohesive workflow which takes source code and builds, tests and promotes it to production. You can also watch a video of this codelab in this 
&lt;a href=&#34;https://www.youtube.com/watch?v=N9VnJlKn734&amp;amp;list=PL4yLrwUObNkttE526AAj_ykc5UlIPjz8m&amp;amp;index=1&#34; target=&#34;_blank&#34;&gt;Youtube playlist&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;This will be accomplished via 3 pipelines:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bake &amp;amp; Deploy to Test&lt;/li&gt;
&lt;li&gt;Validate Test&lt;/li&gt;
&lt;li&gt;Promote to Prod&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You will be using a custom-built image that includes sample application source code, a Jenkins instance, a Debian repository (aptly) and a Spinnaker instance.&lt;/p&gt;
&lt;p&gt;This codelab is an extension of the 
&lt;a href=&#34;../hello-deployment&#34;&gt;Hello World Deployment&lt;/a&gt;
 tutorial. It runs specifically on the Google Cloud Platform, and requires a billing-enabled GCP project.&lt;/p&gt;
&lt;h2 id=&#34;part-0-set-up-environment&#34;&gt;Part 0: Set up environment&lt;/h2&gt;
&lt;h3 id=&#34;install-gcloud&#34;&gt;Install gcloud&lt;/h3&gt;
&lt;p&gt;If you have &lt;code&gt;gcloud&lt;/code&gt; installed, skip to the next section, “
&lt;a href=&#34;#provision-an-instance-of-spinnaker-and-jenkins&#34;&gt;Provision an instance of Spinnaker&lt;/a&gt;
”.&lt;/p&gt;
&lt;p&gt;Install &lt;code&gt;gcloud&lt;/code&gt; by running the following command and following through the prompts:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl https://sdk.cloud.google.com &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt; bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Authenticate &lt;code&gt;gcloud&lt;/code&gt; to your account with your email address:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gcloud auth login &amp;lt;your email address&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;enable-the-compute-engine-api&#34;&gt;Enable the Compute Engine API&lt;/h3&gt;
&lt;p&gt;Navigate to the Google Cloud Console and enable the 
&lt;a href=&#34;https://pantheon.corp.google.com/apis/api/compute.googleapis.com/overview&#34; target=&#34;_blank&#34;&gt;Compute Engine
API&lt;/a&gt;
.&lt;/p&gt;
&lt;h3 id=&#34;provision-an-instance-of-spinnaker-and-jenkins&#34;&gt;Provision an instance of Spinnaker and Jenkins&lt;/h3&gt;
&lt;p&gt;We’ve created a single GCE image that includes Spinnaker, Jenkins, and aptly, along with embedded startup scripts that configure everything together for you. Create an instance of this image by running the following commands.&lt;/p&gt;
&lt;p&gt;Fill in your project for &lt;code&gt;$MY_PROJECT&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;MY_PROJECT&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&amp;lt;your project&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;INSTANCE_NAME&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;spinnaker-codelab
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;ZONE&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;us-east1-b
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gcloud compute instances create &lt;span style=&#34;color:#000&#34;&gt;$INSTANCE_NAME&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;    --project &lt;span style=&#34;color:#000&#34;&gt;$MY_PROJECT&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;    --zone &lt;span style=&#34;color:#000&#34;&gt;$ZONE&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;    --image spinnaker-codelab &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;    --image-project marketplace-spinnaker-release &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;    --machine-type n1-highmem-4 &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;    --scopes cloud-platform &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;    --metadata startup-script&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;/var/spinnaker/startup/first_codelab_boot.sh,gce_account&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;my-google-account
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Spinnaker will take a few minutes to auto configure and start up. Take 3 minutes to skim through Part 1 of this codelab below&amp;hellip;&lt;/p&gt;
&lt;p&gt;Open an SSH tunnel through which your local workstation will connect to Spinnaker:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gcloud compute ssh &lt;span style=&#34;color:#000&#34;&gt;$INSTANCE_NAME&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;    --project &lt;span style=&#34;color:#000&#34;&gt;$MY_PROJECT&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;    --zone &lt;span style=&#34;color:#000&#34;&gt;$ZONE&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;    --ssh-flag&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;-L 8084:localhost:8084&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;    --ssh-flag&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;-L 9000:localhost:9000&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;    --ssh-flag&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;-L 5656:localhost:5656&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;part-1-bake--deploy-to-test&#34;&gt;Part 1: Bake &amp;amp; deploy to test&lt;/h2&gt;
&lt;p&gt;In this first exercise, you’ll set up a pipeline, named Bake &amp;amp; Deploy to Test, which builds a GCE image, deploys it as a server group to a test cluster, then destroys the previous server group in that cluster (also called the &amp;ldquo;Highlander&amp;rdquo; strategy). The pipeline is triggered by a Jenkins continuous integration job.&lt;/p&gt;
&lt;p&gt;The workflow is shown in the figure below.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;1-workflow.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;create-a-spinnaker-application&#34;&gt;Create a Spinnaker application&lt;/h3&gt;
&lt;p&gt;Navigate to Spinnaker at 
&lt;a href=&#34;http://localhost:9000&#34; target=&#34;_blank&#34;&gt;http://localhost:9000&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;From the Spinnaker home page, create a new Spinnaker Application by clicking on the &lt;em&gt;Actions&lt;/em&gt; drop down at the upper right and clicking on &lt;em&gt;Create Application&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;In the &lt;em&gt;New Application&lt;/em&gt; dialog:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enter &amp;ldquo;codelab&amp;rdquo; for &lt;em&gt;Name&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Enter your email for &lt;em&gt;Owner Email&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Click the &lt;em&gt;Create&lt;/em&gt; button.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;1-new-application.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;create-a-load-balancer&#34;&gt;Create a load balancer&lt;/h3&gt;
&lt;p&gt;First we create a load balancer for your cluster. Navigate to the LOAD BALANCERS tab, click the &lt;em&gt;Create Load Balancer&lt;/em&gt; button, and select &lt;em&gt;Network&lt;/em&gt; as the type of load balancer.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enter “test” for &lt;em&gt;Stack&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;In the Listener section, set the &lt;em&gt;Port Range&lt;/em&gt; to be 8080, as that’s the port that our sample application listens on.&lt;/li&gt;
&lt;li&gt;In the Health Check section, enter “8080” for &lt;em&gt;Port&lt;/em&gt; and “/hello” for &lt;em&gt;Path&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Optionally, enter 1 for all advanced settings values so server groups report healthy much faster.&lt;/li&gt;
&lt;li&gt;Click the &lt;em&gt;Create&lt;/em&gt; button.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;1-create-lb.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;set-up-pipeline-bake--deploy-to-test-pipeline&#34;&gt;Set up pipeline: “Bake &amp;amp; Deploy to Test” pipeline&lt;/h3&gt;
&lt;p&gt;The purpose of this pipeline is to generate a GCE image from a package, and then deploy the image on server groups in the test cluster. We want this pipeline to be kicked off every time the Jenkins continuous integration job completes.&lt;/p&gt;
&lt;p&gt;Create a new pipeline by navigating to the PIPELINES tab and clicking the &lt;em&gt;Create&lt;/em&gt; button&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Name the pipeline “Bake &amp;amp; Deploy to Test”.&lt;/li&gt;
&lt;li&gt;Click the &lt;em&gt;Create&lt;/em&gt; button.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;1-new-pipeline.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;configure-the-pipeline&#34;&gt;Configure the pipeline&lt;/h4&gt;
&lt;p&gt;The first step in setting up a pipeline is to configure the pipeline. In particular, we need to specify an automated trigger that will kick off the pipeline.&lt;/p&gt;
&lt;p&gt;We want this pipeline to kick off every time our Jenkins job completes. In the Automated Triggers section of the pipelines form:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Click &lt;em&gt;Add Trigger&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Select “Jenkins” from the drop down menu for &lt;em&gt;Type&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Specify “CodelabJenkins” for the &lt;em&gt;Master&lt;/em&gt; Jenkins instance.&lt;/li&gt;
&lt;li&gt;Specify “Hello-Build” for &lt;em&gt;Job&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Refer to the figure below for an illustration of what the pipeline’s Configuration form looks like when we’re done.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;1-configuration.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;set-up-bake-stage&#34;&gt;Set up Bake stage&lt;/h4&gt;
&lt;p&gt;The purpose of our “Bake” stage is to create a GCE image with the package that was built by the Jenkins job that triggered this pipeline.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Click &lt;em&gt;Add stage&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Select “Bake” in the &lt;em&gt;Type&lt;/em&gt; drop down.&lt;/li&gt;
&lt;li&gt;Enter the Debian package you wish to include, “hello-karyon-rxnetty”, in the &lt;em&gt;Package&lt;/em&gt; field.&lt;/li&gt;
&lt;li&gt;Select &amp;ldquo;trusty&amp;rdquo; as the &lt;em&gt;Base OS&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;1-bake.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;set-up-deploy-stage&#34;&gt;Set up Deploy stage&lt;/h4&gt;
&lt;p&gt;The purpose of the “Deploy” stage is to take the GCE image constructed in the “Bake” stage and deploy it into a test environment.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Click &lt;em&gt;Add stage&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Select “Deploy” in the &lt;em&gt;Type&lt;/em&gt; drop down.&lt;/li&gt;
&lt;li&gt;In the &lt;em&gt;Deploy Configuration&lt;/em&gt; section, click &lt;em&gt;Add server group&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;In the dialog that appears, click &lt;em&gt;Continue without a template&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;In the Basic Settings section, enter “test” in the &lt;em&gt;Stack&lt;/em&gt; field.&lt;/li&gt;
&lt;li&gt;In the Load Balancers section, add your load balancer (&amp;ldquo;codelab-test&amp;rdquo;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;1-deploy-basic.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Security groups map to GCP firewall rules, along with the use of target tags to route traffic. There are default firewall rules in place which are sufficient for our use here.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Click on the &lt;em&gt;Instance Type&lt;/em&gt; tab on the left.&lt;/li&gt;
&lt;li&gt;In the Instance Type section, choose “f1-micro” in the drop down.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;1-deploy-instance.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the Capacity section, leave 1 as the number of instances and click &lt;em&gt;Add&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;set-up-destroy-previous-server-group-stage&#34;&gt;Set up Destroy Previous Server Group stage&lt;/h4&gt;
&lt;p&gt;In this tutorial use case, on successive deployments of new server groups to the test cluster, we don’t need the previous server group anymore.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Click &lt;em&gt;Add Stage&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Select “Destroy Server Group” for &lt;em&gt;Type&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Check &lt;em&gt;us-east1&lt;/em&gt;, the region of the previous test server group that you want to destroy.&lt;/li&gt;
&lt;li&gt;Enter codelab-test for the &lt;em&gt;Cluster&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Select “Previous Server Group” for &lt;em&gt;Target&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;em&gt;Save Changes&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;1-destroy.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;The pipeline is now complete. Take a moment to review the stages of this pipeline that you just built.&lt;/p&gt;
&lt;h3 id=&#34;try-it-out&#34;&gt;Try it out&lt;/h3&gt;
&lt;p&gt;Now let’s run this pipeline. We trigger it by manually running a Build of the Jenkins job.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Navigate to your Jenkins console at 
&lt;a href=&#34;http://localhost:5656&#34; target=&#34;_blank&#34;&gt;http://localhost:5656&lt;/a&gt;
.
&lt;ul&gt;
&lt;li&gt;Username: admin&lt;/li&gt;
&lt;li&gt;Password: admin&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Click on the &amp;ldquo;Hello-Build&amp;rdquo; job.&lt;/li&gt;
&lt;li&gt;Click &lt;em&gt;Build Now&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;1-jenkins.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;It may take a while for the polling to trigger the job, but soon in the PIPELINES tab you can see progress, status and details.&lt;/p&gt;
&lt;p&gt;The first time this pipeline is run, the Destroy Server Group stage will fail, because the selector for “Previous Server Group” will find nothing (no server groups presently in the test cluster). The Deploy stage, however, does succeed, so a test cluster will be created.&lt;/p&gt;
&lt;p&gt;Try running it again, either by running another Build of the Jenkins job, or by manually triggering from the PIPELINES tab (click &lt;em&gt;Start Manual Execution&lt;/em&gt;). It will succeed all the way, and your pipeline execution details will look like below:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;1-pipelines.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;You can now see in the CLUSTERS tab that a new server group has been deployed to the test cluster, and the previous server group is destroyed (i.e. does not exist).&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;1-clusters.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;You can also introspect server group details by clicking on a server group. In the details panel on the right, you can see under the PACKAGE section details about how we built this server group. Information like package name, build number, down to commit hash and link to the Jenkins job.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;1-cluster-info.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;part-2-validate-test&#34;&gt;Part 2: Validate test&lt;/h2&gt;
&lt;p&gt;The second pipeline, named “Validate Test”, is a simple one-stage placeholder to represent some gating function before pushing to prod.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;2-workflow.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Furthermore, we configure the prod deployment to implement the red/black strategy (a.k.a. blue/green), which means that upon verifying health of the new server group it will immediately disable the previous server group in the same cluster. Here we disable rather than destroy, so that rollbacks can be quickly accomplished simply by re-enabling the old server group.&lt;/p&gt;
&lt;h3 id=&#34;set-up-pipeline-validate-test-pipeline&#34;&gt;Set up pipeline: “Validate Test” pipeline&lt;/h3&gt;
&lt;p&gt;Create a new pipeline by navigating to the PIPELINES tab and clicking &lt;em&gt;Configure&lt;/em&gt;, then &lt;em&gt;Create New &amp;hellip;&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Name the pipeline “Validate Test”.&lt;/li&gt;
&lt;li&gt;Click the &lt;em&gt;Create&lt;/em&gt; button.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;2-new-pipeline-1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;configure-the-pipeline-1&#34;&gt;Configure the pipeline&lt;/h4&gt;
&lt;p&gt;We want this pipeline to kick off when the Bake &amp;amp; Deploy to Test pipeline completes.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Click &lt;em&gt;Add Trigger&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Select “Pipeline” from the drop down menu for &lt;em&gt;Type&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Select your application.&lt;/li&gt;
&lt;li&gt;Select the “Bake &amp;amp; Deploy to Test” pipeline.&lt;/li&gt;
&lt;li&gt;Check “successful”.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;2-configuration-1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;set-up-manual-judgment-stage&#34;&gt;Set up Manual Judgment stage&lt;/h4&gt;
&lt;p&gt;We stop and wait for human confirmation to continue:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Click &lt;em&gt;Add stage&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Select “Manual Judgment” in the &lt;em&gt;Type&lt;/em&gt; drop down.&lt;/li&gt;
&lt;li&gt;Specify &lt;em&gt;Instructions&lt;/em&gt;, for example “Validate the test cluster”.&lt;/li&gt;
&lt;li&gt;Click &lt;em&gt;Save Changes&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;2-manual-judgment.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;part-3-promote-to-prod&#34;&gt;Part 3: Promote to prod&lt;/h2&gt;
&lt;p&gt;The third pipeline, “Promote to Prod”, takes the image that was deployed in the test cluster, and deploys that image to the prod environment, thereby promoting it.&lt;/p&gt;
&lt;h3 id=&#34;create-a-load-balancer-1&#34;&gt;Create a load balancer&lt;/h3&gt;
&lt;p&gt;We create a load balancer for the prod cluster. Navigate to the LOAD BALANCERS tab and click the &lt;em&gt;Create Load Balancer&lt;/em&gt; button:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enter “prod” for &lt;em&gt;Stack&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;In the Listener section, set the &lt;em&gt;Port Range&lt;/em&gt; to 8080.&lt;/li&gt;
&lt;li&gt;In the Health Check section, enter “8080” for &lt;em&gt;Port&lt;/em&gt; and “/hello” for &lt;em&gt;Path&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Optionally, enter 1 for all health check values.&lt;/li&gt;
&lt;li&gt;Click the &lt;em&gt;Create&lt;/em&gt; button.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;2-create-lb.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;set-up-pipeline-promote-to-prod-pipeline&#34;&gt;Set up pipeline: “Promote to Prod” pipeline&lt;/h3&gt;
&lt;p&gt;Create a new pipeline by navigating to the PIPELINES tab and clicking &lt;em&gt;Configure&lt;/em&gt;, then &lt;em&gt;Create New &amp;hellip;&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Name the pipeline “Promote to Prod”.&lt;/li&gt;
&lt;li&gt;Click the &lt;em&gt;Create&lt;/em&gt; button.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;2-new-pipeline-2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;configure-the-pipeline-2&#34;&gt;Configure the pipeline&lt;/h4&gt;
&lt;p&gt;We want this pipeline to kick off when the Validate Test pipeline completes.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Click &lt;em&gt;Add Trigger&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Select “Pipeline” from the drop down menu for &lt;em&gt;Type&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Select your application.&lt;/li&gt;
&lt;li&gt;Select the “Validate Test” pipeline.&lt;/li&gt;
&lt;li&gt;Check “successful”.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;2-configuration-2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;set-up-find-image-stage&#34;&gt;Set up Find Image stage&lt;/h4&gt;
&lt;p&gt;In the “Find Image” stage, we select the image that was deployed in the test cluster.&lt;/p&gt;
&lt;p&gt;Click the &lt;em&gt;Add stage&lt;/em&gt; button:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Select “Find Image from Cluster” for the stage &lt;em&gt;Type&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Check the region of the test server group to pick the image from.&lt;/li&gt;
&lt;li&gt;Enter codelab-test for the &lt;em&gt;Cluster&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Choose “Newest” for the &lt;em&gt;Server Group Selection&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;2-find-image.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;set-up-the-deploy-stage&#34;&gt;Set up the Deploy stage&lt;/h4&gt;
&lt;p&gt;We deploy the image that was picked, to the prod cluster.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Click &lt;em&gt;Add stage&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Select “Deploy” in the &lt;em&gt;Type&lt;/em&gt; drop down.&lt;/li&gt;
&lt;li&gt;In the &lt;em&gt;Server group&lt;/em&gt; section, click &lt;em&gt;Add server group&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;In the dialog that appears, click &lt;em&gt;Continue without a template&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;In the Basic Settings section, enter &amp;ldquo;prod&amp;rdquo; in the &lt;em&gt;Stack&lt;/em&gt; field.&lt;/li&gt;
&lt;li&gt;For Strategy, select “Red/Black”. Note: Blue/Green replaces Red/Black in Spinnaker v1.30+.&lt;/li&gt;
&lt;li&gt;Enter &amp;ldquo;2&amp;rdquo; as the &lt;em&gt;Maximum number of server groups to leave&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;In the Load Balancers section, add your load balancer (&amp;ldquo;codelab-prod&amp;rdquo;).&lt;/li&gt;
&lt;li&gt;and click the &lt;em&gt;Instance Type&lt;/em&gt; tab on the left.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;2-deploy-basic.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the Instance Type section, choose “f1-micro” in the drop down.&lt;/li&gt;
&lt;li&gt;In the Capacity section, leave 1 as the number of instances and click &lt;em&gt;Add&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;em&gt;Save Changes&lt;/em&gt; to save your prod pipeline.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;2-deploy-type.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;trying-it-out&#34;&gt;Trying it out&lt;/h3&gt;
&lt;p&gt;Now let’s run through it all. Run a Build in Jenkins.&lt;/p&gt;
&lt;p&gt;When the Bake &amp;amp; Deploy to Test pipeline completes, the Validate Test pipeline will trigger and wait for user input.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;2-validation.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Click &lt;em&gt;Continue&lt;/em&gt;. This will trigger the Promote to Prod pipeline:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;2-pipelines-all.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;In the CLUSTERS tab, you can see that a server group has been deployed to the prod cluster.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;2-clusters.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Because we selected the red/black (blue/green) deployment strategy for the deployment, there should always be only one enabled/active server group resident in the prod cluster cluster, with previous ones disabled (grey), even after successive runs of this pipeline. Try it out by manually invoking the promotion pipeline again.&lt;/p&gt;
&lt;h2 id=&#34;extra-stuff&#34;&gt;Extra stuff&lt;/h2&gt;
&lt;h3 id=&#34;roll-back&#34;&gt;Roll back&lt;/h3&gt;
&lt;p&gt;Sometimes things go wrong and you need to roll prod back to the previous release. We employed the red/black (blue/green) strategy, which disables the previous server group. In practice, this is disassociating the server group from the load balancer so it takes no traffic, while keeping the nodes in the server group up, standing by.&lt;/p&gt;
&lt;p&gt;To roll back back to the previous server group, first kick off another instance of the Promote to Prod pipeline so that you have a previous disabled server group in the PROD cluster to roll back to. When this pipeline completes, navigate to the CLUSTERS tab and click the active server group.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the &lt;em&gt;Server Group Actions&lt;/em&gt; drop down on the right, click &lt;em&gt;Rollback&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;In the dialog that appears, select the server group you would like to restore (that is, the server group you would like to roll back to).&lt;/li&gt;
&lt;li&gt;Click &lt;em&gt;Submit&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;3-rollback.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;When the task completes (you can check progress in the TASKS tab), you will see that the specified server group is now the active one, while the previous one is disabled (grey).&lt;/p&gt;
&lt;h3 id=&#34;triggering-the-jenkins-job-by-changing-source&#34;&gt;Triggering the Jenkins job by changing source&lt;/h3&gt;
&lt;p&gt;So far you’ve been triggering the Jenkins job manually over unchanging source code. Consequently, you’ll notice that all server groups point back to the same Jenkins job. This is because Spinnaker can detect whether a re-bake is necessary, and because there were no changes, it simply returned the same image.&lt;/p&gt;
&lt;p&gt;The image you’re using does have Jenkins polling for updates to the local git repo. If you trigger the Jenkins job as a result of a code change, the image that’s built will be different, and you’ll see the build info change throughout the entire pipeline chain.&lt;/p&gt;
&lt;p&gt;You can update source by doing the following from your ssh terminal:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo su jenkins
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87&#34;&gt;cd&lt;/span&gt; /var/lib/jenkins/hello-karyon-rxnetty
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now change the number on the &amp;ldquo;release&amp;rdquo; line:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vi build.gradle
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Finally, commit your changes to trigger a new Jenkins build:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git commit -a -m &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Bump release number&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You’ll see the whole sequence again, but with a key difference: a new image will be baked, and the server groups deployed as a result will show different build info.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: An Introduction to Spinnaker: Hello Deployment</title>
      <link>https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/tutorials/codelabs/hello-deployment/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/tutorials/codelabs/hello-deployment/</guid>
      <description>
        
        
        &lt;p&gt;This guide will run through the workflow of setting up an example application deployment with
Spinnaker. It assumes you already have Spinnaker up and running on AWS or
GCE. A guide for installation can be found 
&lt;a href=&#34;https://deploy-preview-629--spinnaker-io.netlify.app/docs/setup/install/&#34;&gt;here&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;Below is a diagram of the workflow we will set up.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;flow.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;set-up-jenkins&#34;&gt;Set up Jenkins&lt;/h2&gt;
&lt;p&gt;Jenkins is a powerful continuous integration server that allows us to do several important things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Poll our Github repository for changes so Spinnaker knows when to run a pipeline.&lt;/li&gt;
&lt;li&gt;Compile and build our example application into a .deb package so Spinnaker can bake it on an
image. Spinnaker expects all applications to be deployed as deb packages.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;installing-jenkins&#34;&gt;Installing Jenkins&lt;/h3&gt;
&lt;p&gt;If you already have a Jenkins server, you can skip this step.&lt;/p&gt;
&lt;p&gt;In the event you run into issues with these example commands, refer to the instructions at 
&lt;a href=&#34;http://pkg.jenkins-ci.org/debian/&#34; target=&#34;_blank&#34;&gt;http://pkg.jenkins-ci.org/debian/&lt;/a&gt;
 for updated commands.&lt;/p&gt;
&lt;p&gt;SSH into your instance and run the following:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo apt-get update
sudo apt-get upgrade
sudo apt-get install openjdk-8-jdk
wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -
sudo sh -c &amp;#39;echo deb https://pkg.jenkins.io/debian binary/ &amp;gt; /etc/apt/sources.list.d/jenkins.list&amp;#39;
sudo apt-get update
sudo apt-get install jenkins git
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;configuring-jenkins&#34;&gt;Configuring Jenkins&lt;/h3&gt;
&lt;p&gt;By default, Jenkins listens on port 8080, which is the same port that Spinnaker&amp;rsquo;s front50
microservice uses. In order to have both installed on the same machine, you&amp;rsquo;ll need to configure
one of them to listen on a different port.  These instructions will configure Jenkins to listen
on port 5656.  You&amp;rsquo;ll need to ensure that this port is accessible by your Spinnaker instance.&lt;/p&gt;
&lt;p&gt;Edit your Jenkins configuration file at &lt;code&gt;/etc/default/jenkins&lt;/code&gt; and change the &lt;code&gt;HTTP_PORT&lt;/code&gt;
entry to:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;HTTP_PORT=5656
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now run &lt;code&gt;sudo service jenkins restart&lt;/code&gt; to restart Jenkins. Visit port :5656 on your instance and you
should see Jenkins start up and present the dashboard.&lt;/p&gt;
&lt;h3 id=&#34;enable-jenkins-api&#34;&gt;Enable Jenkins API&lt;/h3&gt;
&lt;p&gt;Spinnaker communicates with Jenkins by using its REST API. However the API is not enabled by
default. To enable it we first must enable global security (which is a good idea anyway). Click
&amp;ldquo;Manage Jenkins&amp;rdquo; then &amp;ldquo;Configure Global Security&amp;rdquo;. Under Access Control check &amp;ldquo;Jenkins own database&amp;rdquo;
and &amp;ldquo;allow users to sign up&amp;rdquo;. Under authorization check &amp;ldquo;Logged-in users can do anything&amp;rdquo; and save.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;jenkins1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;You will now be presented with a login screen. Click the &amp;ldquo;Create an account&amp;rdquo; link to register. Take
note of your username and password, Spinnaker will need them later. Now you can turn off allowing
users to register as you can add them manually from the control panel. The Jenkins API is now
enabled.&lt;/p&gt;
&lt;h3 id=&#34;set-up-deb-repo&#34;&gt;Set up deb repo&lt;/h3&gt;
&lt;p&gt;There are several options you can use to set up your private deb repo. This involves leveraging a
tool to create the file structure and format for your .deb packages. You will also need to serve
them publicly on the internet so they can be installed.&lt;/p&gt;
&lt;h5 id=&#34;deb-s3&#34;&gt;deb-s3&lt;/h5&gt;
&lt;p&gt;
&lt;a href=&#34;https://github.com/krobertson/deb-s3&#34; target=&#34;_blank&#34;&gt;deb-s3&lt;/a&gt;
 is a ruby gem that allows you to create a publish
your packages directly to an s3 bucket. The nice part about this is that you do not have to concern
yourself with setting up ports or configuring a web server. S3 handles everything for us.&lt;/p&gt;
&lt;p&gt;First create a new s3 bucket to hold your packages, take note of the name and region.&lt;/p&gt;
&lt;p&gt;Next edit the properties of your bucket and turn on static website hosting.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;s3.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;We will now install deb-s3 on our Jenkins server.&lt;/p&gt;
&lt;p&gt;Log in to your Jenkins user (you may need to add it to your sudoers file) and install Ruby and
bundler:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo apt-get install software-properties-common
sudo apt-add-repository ppa:brightbox/ruby-ng
sudo apt-get update
sudo apt-get install build-essential ruby2.2 ruby2.2-dev zlib1g-dev liblzma-dev
sudo gem install bundler
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;now install the deb-s3 gem globally&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo gem install deb-s3
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The address of your repo will now be &lt;code&gt;http://BUCKET-NAME.s3-website-REGION-NAME.amazonaws.com trusty main&lt;/code&gt;&lt;/p&gt;
&lt;h4 id=&#34;aptly&#34;&gt;Aptly&lt;/h4&gt;
&lt;p&gt;
&lt;a href=&#34;http://www.aptly.info/&#34; target=&#34;_blank&#34;&gt;Aptly&lt;/a&gt;
 is a tool that easily allows us to manage and publish the packages
to the local filesystem. After we install and configure the tool, nginx will host the repository on
our jenkins server so it can be consumed during the bake process. Since nginx will run on port 9999
it is important that this port on your Jenkins server will be accessible from the internet.&lt;/p&gt;
&lt;p&gt;The following will install aptly to the jenkins user home directory so our jobs can easily use it.
We will also create our repo so the jobs can easily add packages.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo su - jenkins
cd ~
wget https://dl.bintray.com/smira/aptly/0.9.5/debian-squeeze-x64/aptly
chmod +x aptly
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Create our repo named &amp;ldquo;hello&amp;rdquo;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;./aptly repo create hello
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;We will now publish our (currently empty) repo and set up nginx to host it on port 9999.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;./aptly publish repo -architectures=&amp;#34;amd64&amp;#34; -component=main -distribution=trusty -skip-signing=true hello
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;set-up-nginx-to-serve-aptly-deb-repo&#34;&gt;Set up Nginx to serve aptly deb repo&lt;/h3&gt;
&lt;p&gt;Install and configure nginx&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo apt-get install nginx
sudo vim /etc/nginx/sites-enabled/default
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Contents of /etc/nginx/sites-enabled/default:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;server {
        listen 9999 default_server;
        listen [::]:9999 default_server ipv6only=on;
        root /var/lib/jenkins/.aptly/public;
        index index.html index.htm;
        server_name localhost;
        location / {
                try_files $uri $uri/ =404;
        }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Start nginx &lt;code&gt;sudo service nginx start&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;the address of the repo will be &lt;code&gt;http://JENKINS-SERVER:9999 trusty main&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&#34;fork-example-application&#34;&gt;Fork example application&lt;/h3&gt;
&lt;p&gt;We have set up an example application with a gradle.build ready to package your app for spinnaker
deployment. Fork 
&lt;a href=&#34;https://github.com/kenzanlabs/hello-karyon-rxnetty&#34; target=&#34;_blank&#34;&gt;https://github.com/kenzanlabs/hello-karyon-rxnetty&lt;/a&gt;

via the github UI so you can make changes and see them flow through the Spinnaker pipeline.&lt;/p&gt;
&lt;h3 id=&#34;create-jenkins-jobs&#34;&gt;Create Jenkins jobs&lt;/h3&gt;
&lt;p&gt;We will now set up our Jenkins jobs for spinnaker to use.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Polling job&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The first is a simple job that polls our git repo for changes. Spinnaker has no knowledge of our
repo location, so it needs a way to trigger a pipeline automatically when code is pushed.
(A pipeline is a set of actions that handle the application delivery) Spinnaker will poll our
polling job and kick off a pipeline when it detects a fresh run.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ensure the Jenkins git plugin is enabled and create a new freesyle Project named &amp;ldquo;Hello Poll&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Add your app fork git address.&lt;/li&gt;
&lt;li&gt;Under build triggers check &amp;ldquo;Poll SCM&amp;rdquo; and enter &lt;code&gt;* * * * *&lt;/code&gt; for Jenkins to poll once a minute. You
can now save the job.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;jenkins2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;Build and publish job&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This job will be responsible for building and publishing our package, along with passing the package
and version name to Spinnaker.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create a new freestyle job named &amp;ldquo;HelloBuild&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Add the git url for your application fork&lt;/li&gt;
&lt;li&gt;Add a build step for &amp;ldquo;execute shell&amp;rdquo;&lt;/li&gt;
&lt;li&gt;In the textbox, cleanup prior builds and execute the packDeb task &lt;code&gt;./gradlew clean packDeb&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;If you used deb-s3 for your repo, add the following:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;deb-s3 upload --bucket BUCKETNAME --arch amd64 --codename trusty --preserve-versions true build/distributions/*.deb&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;If you used aptly for your repo, add the following:&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;~/aptly repo add -force-replace hello build/distributions/*.deb ~/aptly publish update -force-overwrite -architectures=&amp;quot;amd64&amp;quot; -skip-signing=true trusty&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Add a post-build action: &amp;ldquo;Archive the artifacts&amp;rdquo; with &lt;code&gt;build/distributions/*.deb&lt;/code&gt; as the
directory. This allows our deb package name to be passed to spinnaker.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;build.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;configure-spinnaker&#34;&gt;Configure Spinnaker&lt;/h2&gt;
&lt;p&gt;SSH to your Spinnaker instance by tunneling the needed ports. Tunneling ensures that Spinnaker is
not accessible from the internet outside of your ssh connection. This is &lt;strong&gt;very important&lt;/strong&gt; because
anyone who has access to Spinnaker can do anything your cloud account can do.&lt;/p&gt;
&lt;p&gt;The ports needed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;9000: html/js UI (Deck)&lt;/li&gt;
&lt;li&gt;8084: API entrypoint (Gate)&lt;/li&gt;
&lt;li&gt;8087: Image bakery (Rosco)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ssh -i yourkey.pem -L 9000:127.0.0.1:9000 -L 8084:127.0.0.1:8084 ubuntu@instanceip
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Spinnaker will be accessible on 
&lt;a href=&#34;http://localhost:9000&#34; target=&#34;_blank&#34;&gt;http://localhost:9000&lt;/a&gt;
.&lt;/p&gt;
&lt;h3 id=&#34;jenkins-integration&#34;&gt;Jenkins integration&lt;/h3&gt;
&lt;p&gt;Before we can begin setting up our workflow, we need to edit the Spinnaker configuration to allow
it to communicate with our Jenkins server.&lt;/p&gt;
&lt;p&gt;Begin by shutting down Spinnaker. Spinnaker configuration is stored in memory so we need to reload
it every time we make a change. You can now edit the master configuration file:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;vim /opt/spinnaker/config/spinnaker-local.yml
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Scroll down to jenkins section and add your url, username and password from above&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;  jenkins:
    defaultMaster:
      name: Jenkins # The display name for this server
      baseUrl: http://jenkins-server:5656
      username: jenkinsuser
      password: jenkinspassword
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You also need to enable igor, the service that communicates with the jenkins api.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;igor:
    enabled: true
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;deb-repository&#34;&gt;Deb repository&lt;/h3&gt;
&lt;p&gt;The last configuration step is to add our deb repository address to the Rosco config. When Spinnaker
is baking the application image, it will add this address to the sources list so it can
&lt;code&gt;apt-get install&lt;/code&gt; the deb package. For this reason it is important that port 9000 is open on our
Jenkins server which hosts the repo.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;vim /opt/rosco/config/rosco.yml
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Add your repo address from above. For example if we used deb-s3:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;debianRepository: http://BUCKET-NAME.s3-website-REGION-NAME.amazonaws.com trusty main
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;We can now start Spinnaker and start configuring our workflow. &lt;code&gt;# start spinnaker&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&#34;create-spinnaker-application-and-resources&#34;&gt;Create Spinnaker application and resources&lt;/h2&gt;
&lt;p&gt;The concept of an application allows us to group our resources and pipelines in a logical way. This
makes it easy to manage our app in a single place instead of searching for items buried in menus.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Visit http://localhost:9000 and click the actions button -&amp;gt; create application.&lt;/li&gt;
&lt;li&gt;Fill out the information, naming it &amp;ldquo;hello&amp;rdquo; and click save. We are now ready to add resources to
our app.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;create.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;create-firewall&#34;&gt;Create firewall&lt;/h3&gt;
&lt;p&gt;Now we will create a firewall to allow access to our application. Spinnaker only allows you to
attach ingress sources based on another firewall, so we first must create a base security
group via the aws console to allow traffic on port 5656 (AWS Security Groups map to Firewalls in
Spinnaker).&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;group1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Now we can use this group as an inbound rule for our application firewall. Click the firewalls
tab and add a new firewall.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;firewall1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Select our group as ingress source&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;firewall2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;create-load-balancer&#34;&gt;Create load balancer&lt;/h3&gt;
&lt;p&gt;The load balancer will be the entry-point to our application scaling group. Click the load balancers
tab and add it.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;lb1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;set-up-spinnaker-pipeline&#34;&gt;Set up Spinnaker pipeline&lt;/h2&gt;
&lt;p&gt;We now have the necessary resources to begin pipeline creation. A pipeline is a group of actions
that handle the complete lifecycle of our deployment. It is also a great centralized place to
monitor the status of each stage instead of hopping between jenkins or the aws console.&lt;/p&gt;
&lt;p&gt;Our pipeline is triggered by polling our Jenkins server to see if our code has updated. We then
create two stages.&lt;/p&gt;
&lt;p&gt;Click the pipelines tab and add a new pipeline.&lt;/p&gt;
&lt;h3 id=&#34;pipeline-trigger&#34;&gt;Pipeline trigger&lt;/h3&gt;
&lt;p&gt;Add a trigger and select &amp;ldquo;jenkins job&amp;rdquo; then we can select our jenkins server and choose the &amp;ldquo;hello
poll&amp;rdquo; job. Spinnaker will poll jenkins for a successful run of this job. We know that if it ran then
there is new code to deploy from github&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;pipe1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;build-and-package-stage&#34;&gt;Build and package stage&lt;/h3&gt;
&lt;p&gt;The first stage in our pipeline will be to build and package our app. This also published our deb to
our repository for baking. Choose Jenkins for type and select our &amp;ldquo;hellobuild&amp;rdquo; job.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;pipe2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;bake-stage&#34;&gt;Bake stage&lt;/h3&gt;
&lt;p&gt;The next stage will bake our application. &amp;ldquo;Baking&amp;rdquo; refers to booting up an instance, installing our
application package, and saving the os image for launching. All of this is handled by

&lt;a href=&#34;http://packer.io&#34; target=&#34;_blank&#34;&gt;packer&lt;/a&gt;
. Because our build stage returns the name of our deb artifact and knows
our repo address, we simply need to select the region(s) and add our application package name. We
can also take advantage of the async features of spinnaker and do a multi-region bake.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;bake.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;deploy-stage&#34;&gt;Deploy stage&lt;/h3&gt;
&lt;p&gt;Spinnaker will automatically pass our baked image id to the deploy stage. This is where we set up
our server group to be deployed to a cluster.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;pipe4.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Click &amp;ldquo;add server group&amp;rdquo; and configure the server group.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;pipe5.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Our app is fairly lightweight so t2.micro will be fine for instance type.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;pipe6.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Choose two instances so we can be sure they our load balanced correctly. Our application will
display the instance id so we can easily confirm this.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;pipe7.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;triggering-the-pipeline&#34;&gt;Triggering the pipeline&lt;/h2&gt;
&lt;p&gt;We can trigger our pipeline several ways. The first way is to simply push to our github repo.
Jenkins will detect this and run our polling job, which Spinnaker will detect and kick off our
pipeline.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;pipe8.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;We then can see our pipeline progress to the bake stage.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;pipe9.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Finally we reach our deploy stage where our server group is created.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;pipe10.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;We can also manually trigger the pipeline by clicking the &amp;ldquo;start manual execution&amp;rdquo; button. Then we
can select a specific build of our app from Jenkins for Spinnaker to use.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;pipe11.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Kubernetes Source to Prod</title>
      <link>https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/tutorials/codelabs/kubernetes-source-to-prod/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/tutorials/codelabs/kubernetes-source-to-prod/</guid>
      <description>
        
        
        &lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;In this codelab you will configure:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A GitHub repo containing both your code to be deployed, and the Kubernetes
manifests that will run your code.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A set of Spinnaker pipelines to deploy changes to your code, manifests, and
application configuration from source to production.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;0-prerequisites&#34;&gt;0: Prerequisites&lt;/h2&gt;
&lt;p&gt;Before we begin, we need to do the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
&lt;a href=&#34;#configure-github&#34;&gt;Configure GitHub&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;You need some source code and manifests to deploy stored in GitHub. We have a
repository you can fork to follow along easily.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
&lt;a href=&#34;#configure-dockerhub&#34;&gt;Configure DockerHub&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;The source code in GitHub will be configured to build automatically on tag
pushes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
&lt;a href=&#34;#configure-kubernetes&#34;&gt;Configure Kubernetes&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Two Kubernetes clusters, one for staging and one for prod.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
&lt;a href=&#34;#configure-spinnaker&#34;&gt;Configure Spinnaker&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;A running Spinnaker instance, able to deploy to Kubernetes and download
artifacts from GitHub.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
&lt;a href=&#34;#configure-webhooks&#34;&gt;Configure Webhooks&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;GitHub &amp;amp; DockerHub webhooks pointing at Spinnaker, alerting when commits and
docker images are pushed respectively.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;configure-github&#34;&gt;Configure GitHub&lt;/h2&gt;
&lt;p&gt;The code we&amp;rsquo;ll be deploying is stored

&lt;a href=&#34;https://github.com/lwander/spin-kub-v2-demo&#34; target=&#34;_blank&#34;&gt;here&lt;/a&gt;
. Feel free to fork this
into your own account, and make changes/deploy from there.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;☞ Note&lt;/strong&gt;: The manifests in this repository point to a 
&lt;a href=&#34;https://github.com/lwander/spin-kub-v2-demo/blob/master/manifests/demo.yml#L30-L37&#34; target=&#34;_blank&#34;&gt;specific docker
image&lt;/a&gt;
.
If you want to trigger off of changes made to your own docker image, change
the image name to reflect that.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;configure-dockerhub&#34;&gt;Configure DockerHub&lt;/h2&gt;
&lt;p&gt;If you&amp;rsquo;re completely unfamiliar with Docker, start

&lt;a href=&#34;https://docs.docker.com/engine/getstarted/&#34; target=&#34;_blank&#34;&gt;here&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;
&lt;a href=&#34;https://docs.docker.com/docker-hub/builds/&#34; target=&#34;_blank&#34;&gt;This guide&lt;/a&gt;
 covers how to get your
GitHub repository (from above) to trigger Docker builds in DockerHub. We&amp;rsquo;ll be
relying on this to automatically push code changes into your staging
environment.  In the end your repository should look something like

&lt;a href=&#34;https://hub.docker.com/r/lwander/spin-kub-v2-demo/&#34; target=&#34;_blank&#34;&gt;this&lt;/a&gt;
.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;☞ Note&lt;/strong&gt;: Before continuing, run the created trigger at least once to both
push a &lt;code&gt;:latest&lt;/code&gt; image, as well as validate that your configuration is
working. This can be done by pushing a commit to your GitHub repo to trigger
a Docker build.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;configure-kubernetes&#34;&gt;Configure Kubernetes&lt;/h2&gt;
&lt;p&gt;Create two clusters following one of the guides

&lt;a href=&#34;http://kubernetes.io/docs/getting-started-guides/&#34; target=&#34;_blank&#34;&gt;here&lt;/a&gt;
. Once you are
finished, make sure that you have an up-to-date &lt;code&gt;~/.kube/config&lt;/code&gt;
file that has entries for both clusters you want to deploy to. Details on
kubeconfig files 
&lt;a href=&#34;http://kubernetes.io/docs/user-guide/kubeconfig-file/&#34; target=&#34;_blank&#34;&gt;here&lt;/a&gt;
.&lt;/p&gt;
&lt;h2 id=&#34;configure-spinnaker&#34;&gt;Configure Spinnaker&lt;/h2&gt;
&lt;p&gt;We will be deploying Spinnaker to one of your Kubernetes clusters. To do so,
start by 
&lt;a href=&#34;https://deploy-preview-629--spinnaker-io.netlify.app/docs/setup/install/&#34;&gt;installing it here&lt;/a&gt;
.&lt;/p&gt;
&lt;h3 id=&#34;configure-storage&#34;&gt;Configure Storage&lt;/h3&gt;
&lt;p&gt;Setup storage as per 
&lt;a href=&#34;https://deploy-preview-629--spinnaker-io.netlify.app/docs/setup/install/storage&#34;&gt;here&lt;/a&gt;
&lt;/p&gt;
&lt;h3 id=&#34;add-your-kubernetes-accounts&#34;&gt;Add your Kubernetes accounts&lt;/h3&gt;
&lt;p&gt;You will need to configure two Kubernetes accounts. See the Kubernetes
contexts created in the prior step using:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl config get-contexts
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The output should look like (although the names may vary):&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;CURRENT   NAME                       CLUSTER        AUTHINFO       NAMESPACE
*         staging-demo-us-central1   staging-demo   staging-demo
          prod-demo-us-central1      prod-demo      prod-demo
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Record the names of the contexts as &lt;code&gt;$STAGING_CONTEXT&lt;/code&gt; and &lt;code&gt;$PROD_CONTEXT&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Now we will register both contexts with Spinnaker. See 
&lt;a href=&#34;https://spinnaker.io/docs/setup/install/providers/&#34; target=&#34;_blank&#34;&gt;https://spinnaker.io/docs/setup/install/providers/&lt;/a&gt;
&lt;/p&gt;
&lt;h3 id=&#34;configure-github-artifact-credentials&#34;&gt;Configure GitHub artifact credentials&lt;/h3&gt;
&lt;p&gt;Make sure to 
&lt;a href=&#34;https://deploy-preview-629--spinnaker-io.netlify.app/docs/setup/other_config/artifacts/github&#34;&gt;add GitHub as an artifact account&lt;/a&gt;
. This
will allow us to fetch the manifests later.&lt;/p&gt;
&lt;h3 id=&#34;configure-docker-registry-account&#34;&gt;Configure Docker Registry account&lt;/h3&gt;
&lt;p&gt;Make sure to 
&lt;a href=&#34;https://deploy-preview-629--spinnaker-io.netlify.app/docs/setup/install/providers/docker-registry&#34;&gt;add a Docker Registry provider account&lt;/a&gt;
.
This will allow us to configure a Spinnaker pipeline to trigger on a Docker
image update.&lt;/p&gt;
&lt;h3 id=&#34;deploy-spinnaker&#34;&gt;Deploy Spinnaker&lt;/h3&gt;
&lt;p&gt;Deploy spinnaker using kustomize and the 
&lt;a href=&#34;https://deploy-preview-629--spinnaker-io.netlify.app/docs/setup/install&#34;&gt;installation docs&lt;/a&gt;
&lt;/p&gt;
&lt;h2 id=&#34;configure-webhooks&#34;&gt;Configure webhooks&lt;/h2&gt;
&lt;p&gt;Now that Spinnaker is running, you need to point both Docker and GitHub
webhooks at Spinnaker to send events when Docker images and manifest changes
happen respectively.&lt;/p&gt;
&lt;h3 id=&#34;give-spinnaker-an-external-endpoint&#34;&gt;Give Spinnaker an external endpoint&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;:warning: &lt;strong&gt;This is for the codelab only! Do not do this in production&lt;/strong&gt;.
We&amp;rsquo;re giving an unsecured Spinnaker an external endpoint to easily do this
codelab, and are taking limited measures to ensure only GitHub and Docker can
trigger pipelines. &lt;strong&gt;Tear down Spinnaker once you&amp;rsquo;re done with this
codelab, or remove any firewall changes to your Kubernetes cluster&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;First, edit the 
&lt;a href=&#34;https://deploy-preview-629--spinnaker-io.netlify.app/docs/reference/architecture&#34;&gt;Gate&lt;/a&gt;
 service to bind a node port.
This means every node in your Kubernetes cluster will forward traffic from that
node port to your Spinnaker gate service. &lt;strong&gt;Your nodes should not be accepting
requests from external IPs&lt;/strong&gt; by default, so making this change doesn&amp;rsquo;t
immediately open Spinnaker to public access.&lt;/p&gt;
&lt;p&gt;To do this, first run (this will open the service manifest in your text
editor):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl edit svc spin-gate -n spinnaker --context &lt;span style=&#34;color:#000&#34;&gt;$STAGING_CONTEXT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;and then change the field&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;ClusterIP&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;to&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;NodePort&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next, get the port that &lt;code&gt;spin-gate&lt;/code&gt; has bound to. You can check this with&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl get svc spin-gate -n spinnaker --context &lt;span style=&#34;color:#000&#34;&gt;$STAGING_CONTEXT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In my case, I see the port is &lt;code&gt;31355&lt;/code&gt;, which I record into &lt;code&gt;$NODE_PORT&lt;/code&gt; (&lt;code&gt;8084&lt;/code&gt;
is the port gate is listening on inside the cluster):&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;NAME        TYPE       CLUSTER-IP    EXTERNAL-IP   PORT(S)          AGE
spin-gate   NodePort   10.7.255.85   &amp;lt;none&amp;gt;        8084:31355/TCP   32m
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now pick any node in the cluster and record its IP as &lt;code&gt;$NODE_IP&lt;/code&gt;. In order to
get the IP of a node, first get the nodes in the cluster and record one of the
names as &lt;code&gt;$NODE_NAME&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl get nodes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next run the following command to get information about the node and record the
ExternalIP as &lt;code&gt;$NODE_IP&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl describe node &lt;span style=&#34;color:#000&#34;&gt;$NODE_NAME&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For the purposes of this codelab, we&amp;rsquo;ll be sending external webhooks to
&lt;code&gt;$NODE_PORT&lt;/code&gt; on that node. In order for these webhooks to work, for this codelab
only, open your firewall on that node to all addresses for TCP connections on
&lt;code&gt;$NODE_PORT&lt;/code&gt;. If you were running Spinnaker in production with 
&lt;a href=&#34;https://deploy-preview-629--spinnaker-io.netlify.app/docs/setup/other_config/security&#34;&gt;authentication&lt;/a&gt;
,
only webhooks would be allowed, which you can reject by header or payload. See

&lt;a href=&#34;https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/user/pipeline/triggers/&#34;&gt;the webhook guide for more details&lt;/a&gt;
.&lt;/p&gt;
&lt;h3 id=&#34;allow-docker-to-post-build-events&#34;&gt;Allow Docker to post build events&lt;/h3&gt;
&lt;p&gt;These will be used to trigger pipelines based on new Docker images being
published. Follow the steps shown

&lt;a href=&#34;https://docs.docker.com/docker-hub/webhooks/&#34; target=&#34;_blank&#34;&gt;here&lt;/a&gt;
 for your repository. The
endpoint you configure must be
&lt;code&gt;http://${NODE_IP}:${NODE_PORT}/webhooks/webhook/dockerhub&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;allow-github-to-post-push-events&#34;&gt;Allow GitHub to post push events&lt;/h3&gt;
&lt;p&gt;Follow the steps shown

&lt;a href=&#34;https://deploy-preview-629--spinnaker-io.netlify.app/docs/setup/other_config/triggers/github/#configuring-your-github-webhook&#34;&gt;here&lt;/a&gt;
, where
&lt;code&gt;ENDPOINT=http://${NODE_IP}:${NODE_PORT}&lt;/code&gt;. Keep track of what you pick as the
&lt;code&gt;$SECRET&lt;/code&gt;!&lt;/p&gt;
&lt;h2 id=&#34;1-create-a-spinnaker-application&#34;&gt;1: Create a Spinnaker application&lt;/h2&gt;
&lt;p&gt;When you first open Spinnaker (if you&amp;rsquo;ve followed the above

&lt;a href=&#34;#0-prerequisites&#34;&gt;prerequisites&lt;/a&gt;
) it&amp;rsquo;ll be running on &lt;code&gt;localhost:9000&lt;/code&gt;) you&amp;rsquo;ll
be greeted with the following &lt;strong&gt;Applications&lt;/strong&gt; screen.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./app-screen.png&#34;
         alt=&#34;By default, Spinnaker indexes your entire cluster, which explains why the screen is prepopulated with unrelated infrastructure. This can be changed by omitting namespaces defined in kubernetes accounts documented here .&#34;/&gt;&lt;figcaption&gt;
            &lt;p&gt;By default, Spinnaker indexes your entire cluster, which explains why the screen is prepopulated with unrelated infrastructure. This can be changed by omitting namespaces defined in 
&lt;a href=&#34;https://spinnaker.io/docs/setup/install/providers/kubernetes/&#34; target=&#34;_blank&#34;&gt;kubernetes accounts documented here&lt;/a&gt;
.&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Select &lt;strong&gt;Actions&lt;/strong&gt; &amp;gt; &lt;strong&gt;Create Application&lt;/strong&gt;, and fill out the form as shown
(the owner email will of course be different):&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./create-app.png&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;After hitting &lt;strong&gt;Create&lt;/strong&gt;, you should be brought to an empty &lt;strong&gt;Clusters&lt;/strong&gt; tab:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./empty-clusters.png&#34;/&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;2-create-a-deploy-to-staging-pipeline&#34;&gt;2: Create a &amp;ldquo;Deploy to Staging&amp;rdquo; pipeline&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s deploy the manifests and code in our staging cluster by setting up
automated pipelines to do so. Start by navigating to &lt;strong&gt;Pipelines&lt;/strong&gt; &amp;gt;
&lt;strong&gt;Configure a new Pipeline&lt;/strong&gt;. Name the pipeline as shown and hit create:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./staging-pipeline-new.png&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;At this point we want to add the manifest from GitHub as an expected artifact
in this pipeline, meaning we expect each time that this pipeline executes,
either a GitHub event will supply us with a new manifest to deploy, or we will
use some default or prior manifest.&lt;/p&gt;
&lt;p&gt;Select &lt;strong&gt;Add Trigger&lt;/strong&gt;:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./add-github-trigger.png&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;Supply the following configuration values:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Type&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&amp;ldquo;Git&amp;rdquo;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Repo Type&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&amp;ldquo;GitHub&amp;rdquo;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Organization or User&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The user you forked the above code into.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Project&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&amp;ldquo;spin-kub-v2-demo&amp;rdquo;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Secret&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The &lt;code&gt;$SECRET&lt;/code&gt; chosen 
&lt;a href=&#34;#allow-github-to-post-push-events&#34;&gt;above&lt;/a&gt;
.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;figure&gt;&lt;img src=&#34;./configure-github-trigger.png&#34;
         alt=&#34;We supply the expected artifact to be sure that we only trigger the pipeline when that file changes.&#34;/&gt;&lt;figcaption&gt;
            &lt;p&gt;We supply the expected artifact to be sure that we only trigger the pipeline when that file changes.&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Next we will define a new artifact in the &lt;strong&gt;Artifact Constraints&lt;/strong&gt; field.
For &lt;strong&gt;Account&lt;/strong&gt;, select the GitHub artifact account created earlier and then set
the &lt;strong&gt;File Path&lt;/strong&gt; to &lt;code&gt;manifests/demo.yml&lt;/code&gt;. Lastly, select
&lt;strong&gt;Use Prior Execution&lt;/strong&gt;, to tell Spinnaker that if no matching artifact is
found, use the last execution&amp;rsquo;s value. (This will be useful later).&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./configure-github-artifact.png&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;Supply the following configuration values:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Type&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&amp;ldquo;Git&amp;rdquo;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Repo Type&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&amp;ldquo;GitHub&amp;rdquo;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Organization or User&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The user you forked the above code into.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Project&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&amp;ldquo;spin-kub-v2-demo&amp;rdquo;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Secret&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The &lt;code&gt;$SECRET&lt;/code&gt; chosen 
&lt;a href=&#34;#allow-github-to-post-push-events&#34;&gt;above&lt;/a&gt;
.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Expected Artifacts&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Must reference the &lt;code&gt;manifests/demo.yml&lt;/code&gt; artifact.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;figure&gt;&lt;img src=&#34;./configure-github-trigger.png&#34;
         alt=&#34;We supply the expected artifact to be sure that we only trigger the pipeline when that file changes.&#34;/&gt;&lt;figcaption&gt;
            &lt;p&gt;We supply the expected artifact to be sure that we only trigger the pipeline when that file changes.&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Next we will define a new artifact in the &lt;strong&gt;Artifact Constraints&lt;/strong&gt; field.
For &lt;strong&gt;Account&lt;/strong&gt;, select the GitHub artifact account created earlier and then set
the &lt;strong&gt;File Path&lt;/strong&gt; to &lt;code&gt;manifests/demo.yml&lt;/code&gt;. Lastly, select
&lt;strong&gt;Use Prior Execution&lt;/strong&gt;, to tell Spinnaker that if no matching artifact is
found, use the last execution&amp;rsquo;s value. (This will be useful later).&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./configure-github-artifact.png&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;With the trigger configuration in place, let&amp;rsquo;s configure a &amp;ldquo;Deploy manifest&amp;rdquo;
stage.&lt;/p&gt;
&lt;p&gt;First add a stage:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./first-stage.png&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;Then select the &amp;ldquo;Deploy (Manifest)&amp;rdquo; stage type:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./add-deploy-manifest-stage.png&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;Finally, configure the stage with the following values:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Account&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&amp;ldquo;staging-demo&amp;rdquo;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cluster&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&amp;ldquo;demo&amp;rdquo;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Manifest Source&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&amp;ldquo;Artifact&amp;rdquo;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Expected Artifact&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Must reference the &lt;code&gt;manifests/demo.yml&lt;/code&gt; artifact.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Artifact Account&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The GitHub artifact account configured above.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;figure&gt;&lt;img src=&#34;./configure-deploy-manifest-stage.png&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;Save the pipeline.&lt;/p&gt;
&lt;h2 id=&#34;3-deploy-manifests-to-staging&#34;&gt;3. Deploy manifests to staging&lt;/h2&gt;
&lt;p&gt;Trigger the pipeline by pushing a commit to the &lt;code&gt;manifests/demo.yml&lt;/code&gt; file in
your repository. The pipeline should start in a few seconds. When it completes,
click &lt;strong&gt;Details&lt;/strong&gt; to see information about the execution:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./staging-execution.png&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;There are a couple of things to notice here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;In the top left we get details about the commit that triggered this
pipeline.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In the &lt;strong&gt;Deploy Status&lt;/strong&gt; we can see what the YAML was that Spinnaker
deployed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We see that the ConfigMap that we deployed was assigned version
&lt;code&gt;-v000&lt;/code&gt;. This was done to ensure that you can statically reference this
ConfigMap, insulating any Pod that references it from accidental changes.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next, let&amp;rsquo;s see what this infrastructure looks like in Spinnaker. Navigate to
the &lt;strong&gt;Clusters&lt;/strong&gt; tab, and select the blue Deployment object attached to the
Replica Set shown below:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./staging-v001.png&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;We can see in the &lt;strong&gt;Artifact&lt;/strong&gt; section on the right that we have bound our
Docker image as well as our ConfigMap.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s see what our application is serving. Run:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl proxy --context &lt;span style=&#34;color:#000&#34;&gt;$STAGING_CONTEXT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And then visit 
&lt;a href=&#34;http://localhost:8001/api/v1/proxy/namespaces/default/services/spinnaker-demo:80/&#34; target=&#34;_blank&#34;&gt;the sample
service&lt;/a&gt;

in your browser. Let&amp;rsquo;s make a change to this service, and configure Spinnaker
to listen to Docker builds.&lt;/p&gt;
&lt;h1 id=&#34;4-configure-docker-triggers&#34;&gt;4. Configure Docker triggers&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Important&lt;/strong&gt;: We need to configure DockerHub to build on &lt;strong&gt;Tag&lt;/strong&gt; events only,
if we build on every commit, this particular setup will trigger both when
manifests &amp;amp; code are changed at once. This can be configured under your
Docker repository&amp;rsquo;s &lt;strong&gt;Build Settings&lt;/strong&gt; tab as shown here:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./docker-tag-only.png&#34;
         alt=&#34;This build rule will create a matching image tag each time you push a git tag.&#34;/&gt;&lt;figcaption&gt;
            &lt;p&gt;This build rule will create a matching image tag each time you push a git tag.&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Next, in Spinnaker, let&amp;rsquo;s edit our Pipeline to allow Docker images to trigger a
deployment:&lt;/p&gt;
&lt;p&gt;First, add another automated trigger next to our Git trigger. Select &lt;strong&gt;Type&lt;/strong&gt;
Webhook and input dockerhub for the &lt;strong&gt;Source&lt;/strong&gt;.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./configure-docker-webhook.png&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;Next, define a new artifact in the &lt;strong&gt;Artifact Constraints&lt;/strong&gt; field. For
&lt;strong&gt;Account&lt;/strong&gt;, select the Docker Registry account created earlier and input your
docker image under &lt;strong&gt;Docker image&lt;/strong&gt;.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./configure-docker-artifact.png&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;Finally, back in the &amp;ldquo;Deploy (Manifest)&amp;rdquo; stage configuration, select the
Docker artifact to bind in this deployment:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./bind-docker.png&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;Save the pipeline.&lt;/p&gt;
&lt;h2 id=&#34;5-deploy-docker-to-staging&#34;&gt;5. Deploy Docker to staging&lt;/h2&gt;
&lt;p&gt;You can push a tag to your repository by running:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git tag release-1.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git push origin release-1.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figure&gt;&lt;img src=&#34;./staging-webhook-execution.png&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;Notice that this time the trigger was a Webhook trigger, and we see details
about both types of artifacts that we deployed. Since the GitHub file artifact
was configured to &lt;strong&gt;Use Prior Execution&lt;/strong&gt;, we redeployed the same manifests as
last time, but with a new Docker image. Because of this, we did not deploy a
new ConfigMap, and kept the version at &lt;code&gt;-v000&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This deployment is a lot faster than the last one, since the docker image was
already pulled into our cluster, meaning it took less time for the images to
start running and appear as &amp;ldquo;Healthy&amp;rdquo;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Back on the &lt;strong&gt;Clusters&lt;/strong&gt; tab we can see the deployment has rolled out our new
image:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./staging-v002.png&#34;/&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;6-configure-a-validation-pipeline&#34;&gt;6. Configure a validation pipeline&lt;/h2&gt;
&lt;p&gt;For the sake of a simple codelab, we will control which deployments make it to
production by adding a &amp;ldquo;Manual Judgement&amp;rdquo; pipeline. In practice, this can be
replaced by a canary, integration test suite, or other mechanism for validating
staging; however, keeping the manual judgement stage is fine too.&lt;/p&gt;
&lt;p&gt;Start by creating a new pipeline, and call it &amp;ldquo;Validate Staging&amp;rdquo;:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./validate-staging-create.png&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;We only want this pipeline to run when we successfully deploy to our staging
environment, so create a Pipeline trigger in this new pipeline like shown:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./staging-trigger.png&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;Add a single stage with type &amp;ldquo;Manual judgement&amp;rdquo;:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./add-manual-judgement.png&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;If desired, you can add additional &amp;ldquo;Instructions&amp;rdquo; for how to validate the
cluster:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./configure-manual-judgement.png&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;Save the Pipeline.&lt;/p&gt;
&lt;h2 id=&#34;7-promote-to-production&#34;&gt;7. Promote to production&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s promote these artifacts into our production cluster. Create a new
pipeline, but instead of creating it from scratch, let&amp;rsquo;s copy the &amp;ldquo;Deploy to
Staging&amp;rdquo; pipeline like this:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./create-promote-copy.png&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;We need to make two changes to this pipeline:&lt;/p&gt;
&lt;p&gt;First, delete the webhook and Git triggers, and replace it with a pipeline
trigger that depends on the &amp;ldquo;Validate Staging&amp;rdquo; pipeline:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./validate-staging-trigger.png&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;Next, change the &lt;strong&gt;Account&lt;/strong&gt; the &amp;ldquo;Deploy (Manifest)&amp;rdquo; stage deploys to
point at &lt;strong&gt;prod-demo&lt;/strong&gt;:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./deploy-to-prod-account.png&#34;/&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;8-run-the-full-flow&#34;&gt;8. Run the full flow&lt;/h2&gt;
&lt;p&gt;Now our full flow is ready to go - let&amp;rsquo;s kick it off by changing the background
color of our application.&lt;/p&gt;
&lt;p&gt;Open &lt;code&gt;content/index.html&lt;/code&gt; in your text editor, and change the background color
attribute, and generate a new commit. We can safely push this commit to GitHub
without running our pipeline because we are only listening to change to the
&lt;code&gt;manifests/demo.yml&lt;/code&gt; file in our &amp;ldquo;Deploy to Staging&amp;rdquo; trigger. Tag and push this
commit to generate a new docker build:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git tag release-1.1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git push origin release-1.1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;When Spinnaker prompts you, accept (or reject) the manual judgement:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./continue.png&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;Keep in mind, if you reject the manual judgement, but later change your mind,
you can always trigger this pipeline again using the same context by selecting
&lt;strong&gt;Start manual execution&lt;/strong&gt;, and picking the latest parent execution:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./prior-execution.png&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;Once all three pipelines complete, you should have your docker image running in
both environments:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./both-accounts.png&#34;/&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;9-extra-credit&#34;&gt;9. Extra credit&lt;/h2&gt;
&lt;p&gt;At this point there are few things you can play with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Change the ConfigMap definition in the manifest file. In particular,
flip the single flag from &amp;ldquo;false&amp;rdquo; to &amp;ldquo;true&amp;rdquo;. See what happens to the
ConfigMap version.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Roll back a &amp;ldquo;broken&amp;rdquo; change either in prod or staging using the &amp;ldquo;Undo
Rollout&amp;rdquo; stage.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Insert 
&lt;a href=&#34;https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/user/pipeline/expressions&#34;&gt;pipeline expressions&lt;/a&gt;
 into
your manifest files.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;10-teardown&#34;&gt;10. Teardown&lt;/h2&gt;
&lt;p&gt;As referenced above, please teardown Spinnaker once you are done:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hal deploy clean
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
      </description>
    </item>
    
    <item>
      <title>Docs: Oracle Cloud Infrastructure Source to Prod</title>
      <link>https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/tutorials/codelabs/oci-source-to-prod/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/tutorials/codelabs/oci-source-to-prod/</guid>
      <description>
        
        
        &lt;p&gt;In this codelab, you will create a cohesive workflow which takes source code and builds, tests, and promotes it to production.&lt;/p&gt;
&lt;p&gt;Building the binary from the source code is done outside of Spinnaker, typically in a CI system such as Jenkins, Travis, etc. Spinnaker is integrated with three CI systems.  Workflows can be triggered by jobs in these CI systems.  The easiest binary form for Spinnaker to produce machine image is debian or rpm packages.&lt;/p&gt;
&lt;p&gt;To simplify this tutorial, we will use tomcat8 debian package as a starting point.  It is assumed your CI jobs build and publish packages such as tomcat8 and your CI jobs will be used to trigger the Spinnaker workflow.&lt;/p&gt;
&lt;p&gt;This tutorial covers the workflow which takes a package and bakes a machine image and then deploys, tests, and promotes it to production.&lt;/p&gt;
&lt;p&gt;This will be accomplished via 3 pipelines:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bake &amp;amp; Deploy to Test&lt;/li&gt;
&lt;li&gt;Validate Test&lt;/li&gt;
&lt;li&gt;Promote to Prod&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;part-0-set-up-environment&#34;&gt;Part 0: Set up environment&lt;/h2&gt;
&lt;h3 id=&#34;create-a-compute-instance&#34;&gt;Create a compute instance&lt;/h3&gt;
&lt;p&gt;Create a compute instance on Oracle Cloud Infrastructure (OCI) to host Spinnaker by following 
&lt;a href=&#34;https://docs.cloud.oracle.com/iaas/Content/Compute/Tasks/launchinginstance.htm&#34; target=&#34;_blank&#34;&gt;these instructions&lt;/a&gt;
.  Spinnaker supports Ubuntu 18.04 or higher.&lt;/p&gt;
&lt;h3 id=&#34;install-and-configure-spinnaker&#34;&gt;Install and configure Spinnaker&lt;/h3&gt;
&lt;p&gt;SSH onto the compute instance you previously created.  &lt;code&gt;IP&lt;/code&gt; is its public ip address.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh ubuntu@IP
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Set up Oracle Object Storage as your Spinnaker storage by following these steps: 
&lt;a href=&#34;https://deploy-preview-629--spinnaker-io.netlify.app/docs/setup/install/storage/oracle/&#34;&gt;Adding Oracle Object Storage to Spinnaker&lt;/a&gt;
.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Set up your Oracle Cloud provider account by following these 
&lt;a href=&#34;https://deploy-preview-629--spinnaker-io.netlify.app/docs/setup/install/providers/oracle/&#34;&gt;Adding Oracle Cloud Provider Account to Spinnaker&lt;/a&gt;
 steps.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Set up your Oracle Bakery by following these 
&lt;a href=&#34;https://deploy-preview-629--spinnaker-io.netlify.app/docs/setup/other_config/bakery/oracle/&#34;&gt;Configuring Oracle Cloud Infrastructure Bakery&lt;/a&gt;
 steps.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span class=&#34;begin-collapsible-section&#34;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Note that Oracle-provided images have a default set of firewall rules which allow only SSH access.  To bake an image that allows HTTP access like in this tutorial, you need a custom bake template like this one to place in ~/.hal/default/profiles/rosco/packer/codelab.json.&lt;/p&gt;
&lt;p&gt;{% raw %}&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;variables&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;oracle_availability_domain&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;null&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;oracle_region&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;null&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;oracle_base_image_id&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;null&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;oracle_compartment_id&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;null&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;oracle_image_name&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;null&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;oracle_instance_shape&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;null&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;oracle_ssh_user_name&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;null&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;oracle_subnet_id&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;null&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;oracle_tenancy_id&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;null&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;oracle_user_id&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;null&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;oracle_fingerprint&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;null&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;oracle_ssh_private_key_file_path&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;null&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;oracle_pass_phrase&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;appversion&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;build_host&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;build_info_url&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;repository&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;package_type&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;packages&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;upgrade&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;configDir&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;null&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;builders&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;oracle-oci&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;availability_domain&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;{{user `oracle_availability_domain`}}&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;region&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;{{user `oracle_region`}}&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;base_image_ocid&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;{{user `oracle_base_image_id`}}&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;compartment_ocid&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;{{user `oracle_compartment_id`}}&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;image_name&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;{{user `oracle_image_name`}}&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;shape&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;{{user `oracle_instance_shape`}}&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;ssh_username&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;{{user `oracle_ssh_user_name`}}&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;subnet_ocid&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;{{user `oracle_subnet_id`}}&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;tenancy_ocid&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;{{user `oracle_tenancy_id`}}&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;user_ocid&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;{{user `oracle_user_id`}}&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;fingerprint&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;{{user `oracle_fingerprint`}}&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;key_file&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;{{user `oracle_ssh_private_key_file_path`}}&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;pass_phrase&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;{{user `oracle_pass_phrase`}}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;provisioners&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;shell&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;script&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;{{user `configDir`}}/install_packages.sh&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;environment_vars&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;repository={{user `repository`}}&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;package_type={{user `package_type`}}&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;packages={{user `packages`}}&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;upgrade={{user `upgrade`}}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;pause_before&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;30s&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;shell&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;inline&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;sudo iptables -I INPUT 1 -p tcp -m state --state NEW -m tcp --dport 8080 -j ACCEPT&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;sudo netfilter-persistent save&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;sudo systemctl restart netfilter-persistent.service&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;{% endraw %}
&lt;span class=&#34;end-collapsible-section&#34;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href=&#34;https://deploy-preview-629--spinnaker-io.netlify.app/docs/setup/install/&#34;&gt;Install spinnaker per&lt;/a&gt;
 using a debian installation&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;accessing-spinnaker&#34;&gt;Accessing Spinnaker&lt;/h3&gt;
&lt;p&gt;By default, the Spinnaker UI runs on port 9000. You can use an SSH tunnel to access this from your workstation.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh -A -L 9000:localhost:9000 -L 8084:localhost:8084 ubuntu@IP
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now Spinnaker UI is available at 
&lt;a href=&#34;http://localhost:9000&#34; target=&#34;_blank&#34;&gt;http://localhost:9000&lt;/a&gt;
.&lt;/p&gt;
&lt;h2 id=&#34;part-1-bake--deploy-to-test&#34;&gt;Part 1: Bake &amp;amp; deploy to test&lt;/h2&gt;
&lt;p&gt;In this first exercise, you’ll set up a pipeline, named Bake &amp;amp; Deploy to Test, which builds an image, deploys it as a server group to a test cluster, then destroys the previous server group in that cluster (also called the &amp;ldquo;Highlander&amp;rdquo; strategy).&lt;/p&gt;
&lt;p&gt;The workflow is shown in the figure below.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;workflow.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;create-a-spinnaker-application&#34;&gt;Create a Spinnaker application&lt;/h3&gt;
&lt;p&gt;Navigate to Spinnaker at 
&lt;a href=&#34;http://localhost:9000&#34; target=&#34;_blank&#34;&gt;http://localhost:9000&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;From the Spinnaker home page, create a new Spinnaker Application by clicking on the &lt;em&gt;Actions&lt;/em&gt; drop down at the upper right and clicking on &lt;em&gt;Create Application&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;In the &lt;em&gt;New Application&lt;/em&gt; dialog:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enter &amp;ldquo;codelab&amp;rdquo; for &lt;em&gt;Name&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Enter your email for &lt;em&gt;Owner Email&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Add &amp;ldquo;oracle&amp;rdquo; to &lt;em&gt;Cloud Providers&lt;/em&gt;.  If &amp;ldquo;oracle&amp;rdquo; is the only provider configured, there is no &lt;em&gt;Cloud Providers&lt;/em&gt; field and &amp;ldquo;oracle&amp;rdquo; is the default provider.&lt;/li&gt;
&lt;li&gt;Click the &lt;em&gt;Create&lt;/em&gt; button.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;create-app.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;set-up-virtual-cloud-network&#34;&gt;Set up Virtual Cloud Network&lt;/h3&gt;
&lt;p&gt;Log into the OCI console and create a Virtual Cloud Network “codelabVCN” with &amp;ldquo;PLUS RELATED RESOURCES&amp;rdquo; option.&lt;/p&gt;
&lt;p&gt;Take all the defaults for “codelabVCN”, with a couple of additions to the Ingress Rules in the “Default Security List for codelabVCN”.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the instance to be deployed uses port 8080, add an Ingress Rule to allow TCP traffic for port 8080.&lt;/li&gt;
&lt;li&gt;the load balancer to be created in this tutorial listens on port 80, add an Ingress Rule to allow TCP traffic for port 80.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Oracle Cloud Infrastructure Documentation on 
&lt;a href=&#34;https://docs.cloud.oracle.com/iaas/Content/Network/Concepts/securitylists.htm&#34; target=&#34;_blank&#34;&gt;Security Lists&lt;/a&gt;
 has more details.&lt;/p&gt;
&lt;h3 id=&#34;create-a-load-balancer-for-test-cluster&#34;&gt;Create a load balancer for test cluster&lt;/h3&gt;
&lt;p&gt;Navigate to the &amp;ldquo;Load Balancers&amp;rdquo; tab in Spinnaker and click the &lt;em&gt;Create Load Balancer&lt;/em&gt; button:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enter “test” for &lt;em&gt;Stack&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Enter &amp;ldquo;lb&amp;rdquo; in the &lt;em&gt;Detail&lt;/em&gt; field.&lt;/li&gt;
&lt;li&gt;Select your preferred load balancer shape in the &lt;em&gt;Shape&lt;/em&gt; dropdown.&lt;/li&gt;
&lt;li&gt;Check &lt;em&gt;Private Load Balancer&lt;/em&gt; only if you want to isolate your load balancer from the internet.&lt;/li&gt;
&lt;li&gt;Select your preferred account in the &lt;em&gt;Account&lt;/em&gt; dropdown.&lt;/li&gt;
&lt;li&gt;Select your preferred region in the &lt;em&gt;Region&lt;/em&gt; dropdown.&lt;/li&gt;
&lt;li&gt;Select “codelabVCN” in the &lt;em&gt;Virtual Network&lt;/em&gt; dropdown.&lt;/li&gt;
&lt;li&gt;Add Subnets.  A public load balancer requires two subnets, each in a separate availability domain.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;load-1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Edit the &lt;em&gt;Backend Sets&lt;/em&gt; section with “8080” for port.&lt;/li&gt;
&lt;li&gt;Edit the &lt;em&gt;Listeners&lt;/em&gt; section to use the Backend Set just created on Listening Port “80”.&lt;/li&gt;
&lt;li&gt;Click the &lt;em&gt;Create&lt;/em&gt; button.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;load-2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;set-up-pipeline-bake--deploy-to-test-pipeline&#34;&gt;Set up pipeline: “Bake &amp;amp; Deploy to Test” pipeline&lt;/h3&gt;
&lt;p&gt;The purpose of this pipeline is to generate an image from a package, and then deploy the image on server groups in the test cluster. We want this pipeline to be kicked off every time the continuous integration job completes.&lt;/p&gt;
&lt;p&gt;Create a new pipeline by navigating to the PIPELINES tab and clicking the link &lt;em&gt;Configure a new pipeline&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Name the pipeline “Bake &amp;amp; Deploy to Test”.&lt;/li&gt;
&lt;li&gt;Click the &lt;em&gt;Create&lt;/em&gt; button.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;bakedeploy-1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;configure-the-pipeline&#34;&gt;Configure the pipeline&lt;/h4&gt;
&lt;p&gt;In reality, we would set up the pipeline with an automated trigger that will kick off the pipeline.  Assuming the package is built in CI (Jenkins/Travis/Etc), in the Automated Triggers section of the pipelines form, you would add Jenkins/Travis/Etc. Trigger for your job so that every time these job completes the pipeline would start automatically.&lt;/p&gt;
&lt;p&gt;To simplify this tutorial, we will skip the trigger and use tomcat8 package.&lt;/p&gt;
&lt;h4 id=&#34;set-up-bake-stage&#34;&gt;Set up Bake stage&lt;/h4&gt;
&lt;p&gt;The purpose of our “Bake” stage is to create an image with the package that was built by the CI job that triggered this pipeline.  It is tomcat8 in this tutorial.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Click &lt;em&gt;Add stage&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Select “Bake” in the &lt;em&gt;Type&lt;/em&gt; drop down.&lt;/li&gt;
&lt;li&gt;Select your preferred account in the &lt;em&gt;Oracle Account&lt;/em&gt; field.&lt;/li&gt;
&lt;li&gt;Select your preferred region in the &lt;em&gt;Regions&lt;/em&gt; field.&lt;/li&gt;
&lt;li&gt;Select your preferred base image as in the &lt;em&gt;Base Image&lt;/em&gt; field.&lt;/li&gt;
&lt;li&gt;Enter “codelab” in the &lt;em&gt;Image Name&lt;/em&gt; field.&lt;/li&gt;
&lt;li&gt;Enter “tomcat8” in the &lt;em&gt;Package&lt;/em&gt; field.&lt;/li&gt;
&lt;li&gt;Enter “codelab.json” in the &lt;em&gt;Template File Name&lt;/em&gt; field in the &lt;em&gt;Advanced Options&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Click the &amp;ldquo;Save Changes&amp;rdquo; button.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;bake.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;set-up-deploy-stage-for-test-cluster&#34;&gt;Set up Deploy stage for test cluster&lt;/h4&gt;
&lt;p&gt;The purpose of the “Deploy” stage is to take the image constructed in the “Bake” stage and deploy it into a test environment.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Click &lt;em&gt;Add stage&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Select “Deploy” in the &lt;em&gt;Type&lt;/em&gt; drop down.&lt;/li&gt;
&lt;li&gt;In the &lt;em&gt;Deploy Configuration&lt;/em&gt; section, click &lt;em&gt;Add server group&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;In the dialog that appears, click &lt;em&gt;Continue without a template&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;In the Basic Settings section, select “codelabVCN” in the &lt;em&gt;VCN&lt;/em&gt; drop down, select desired &lt;em&gt;Availability Domain&lt;/em&gt; and &lt;em&gt;Subnet&lt;/em&gt;, and enter “test” in the &lt;em&gt;Stack&lt;/em&gt; field.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;deploy-1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the Instance Type section, choose your preferred shape in the drop down.&lt;/li&gt;
&lt;li&gt;In the Capacity section, enter your preferred number of instances.&lt;/li&gt;
&lt;li&gt;In the Load Balancers section, select the load balancer and the Backend Set we created earlier.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;deploy-2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Click the &amp;ldquo;Add&amp;rdquo; button.&lt;/li&gt;
&lt;li&gt;Save this stage of the pipeline.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;destroy-previous-server-group&#34;&gt;Destroy previous server group&lt;/h4&gt;
&lt;p&gt;In this tutorial use case, on successive deployments of new server groups to the test cluster, we don’t need the previous server group anymore.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Click &lt;em&gt;Add Stage&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Select “Destroy Server Group” for &lt;em&gt;Type&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Check the region of the previous test server group that you want to destroy.&lt;/li&gt;
&lt;li&gt;Enter “codelab-test” for the &lt;em&gt;Cluster&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Select “Previous Server Group” for &lt;em&gt;Target&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;em&gt;Save Changes&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;destroy.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;The pipeline is now complete. Take a moment to review the stages of this pipeline that you just built.&lt;/p&gt;
&lt;h3 id=&#34;trying-it-out&#34;&gt;Trying it out&lt;/h3&gt;
&lt;p&gt;Now let’s run this pipeline. We trigger it by manually triggering from the PIPELINES tab (click &lt;em&gt;Start Manual Execution&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;The first time this pipeline is run, the Destroy Server Group stage will fail, because the selector for “Previous Server Group” will find nothing (no server groups presently in the test cluster). The Deploy stage, however, does succeed, so a test cluster will be created.&lt;/p&gt;
&lt;p&gt;Try running it again. It will succeed all the way, and your pipeline execution details will look like below:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;1-pipelines.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;You can now see in the CLUSTERS tab that a new server group (codelab-test-v001) has been deployed to the test cluster, and the previous server group (codelab-test-v000) is destroyed (i.e. does not exist).&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;clustersfixed.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;part-2-validate-test&#34;&gt;Part 2: Validate test&lt;/h2&gt;
&lt;p&gt;The second pipeline, named “Validate Test”, is a simple one-stage placeholder to represent some gating function before pushing to prod.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;2-workflow.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Furthermore, you configure the prod deployment to implement the red/black (blue/green) strategy, which means that upon verifying health of the new server group, Spinnaker immediately disables the previous server group in the same cluster. Here you disable rather than destroy, so that rollbacks can be quickly accomplished simply by re-enabling the old server group.&lt;/p&gt;
&lt;p&gt;Note: Blue/Green replaces Red/Black in Spinnaker v1.30+.&lt;/p&gt;
&lt;h3 id=&#34;set-up-pipeline-validate-test&#34;&gt;Set up pipeline: “Validate Test”&lt;/h3&gt;
&lt;p&gt;Create a new pipeline by navigating to the PIPELINES tab and clicking &lt;em&gt;Configure&lt;/em&gt;, then &lt;em&gt;Create Pipeline or Strategy&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Name the pipeline “Validate Test”.&lt;/li&gt;
&lt;li&gt;Click the &lt;em&gt;Create Pipeline&lt;/em&gt; button.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;validatetest.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;configure-the-pipeline-1&#34;&gt;Configure the pipeline&lt;/h4&gt;
&lt;p&gt;We want this pipeline to kick off when the Bake &amp;amp; Deploy to Test pipeline completes.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Click &lt;em&gt;Add Trigger&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Select “Pipeline” from the drop down menu for &lt;em&gt;Type&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Select your application.&lt;/li&gt;
&lt;li&gt;Select the “Bake &amp;amp; Deploy to Test” pipeline.&lt;/li&gt;
&lt;li&gt;Check “successful”.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;triggerpipe.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;set-up-manual-judgment-stage&#34;&gt;Set up Manual Judgment stage&lt;/h4&gt;
&lt;p&gt;We stop and wait for human confirmation to continue:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Click &lt;em&gt;Add stage&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Select “Manual Judgment” in the &lt;em&gt;Type&lt;/em&gt; drop down.&lt;/li&gt;
&lt;li&gt;Specify &lt;em&gt;Instructions&lt;/em&gt;, for example “Validate the test cluster”.&lt;/li&gt;
&lt;li&gt;Click &lt;em&gt;Save Changes&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;manualjudge.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;part-3-promote-to-prod&#34;&gt;Part 3: Promote to prod&lt;/h2&gt;
&lt;p&gt;The third pipeline, “Promote to Prod”, takes the image that was deployed in the test cluster, and deploys that image to the prod environment, thereby promoting it.&lt;/p&gt;
&lt;h3 id=&#34;create-a-load-balancer-for-prod-cluster&#34;&gt;Create a load balancer for prod cluster&lt;/h3&gt;
&lt;p&gt;We create a load balancer for the prod cluster. Navigate to the LOAD BALANCERS tab and click the &lt;em&gt;Create Load Balancer&lt;/em&gt; button.  Everything is the same as 
&lt;a href=&#34;#create-a-load-balancer-for-test-cluster&#34;&gt;the &amp;amp;ldquo;codelab-test-lb&amp;amp;rdquo; load balancer&lt;/a&gt;
 created before.  The only exception is to use “prod” instead of “test” for &lt;em&gt;Stack&lt;/em&gt;.&lt;/p&gt;
&lt;h3 id=&#34;set-up-pipeline-promote-to-prod-pipeline&#34;&gt;Set up pipeline: “Promote to Prod” pipeline&lt;/h3&gt;
&lt;p&gt;Create a new pipeline by navigating to the PIPELINES tab and clicking &lt;em&gt;Configure&lt;/em&gt;, then &lt;em&gt;Create New &amp;hellip;&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Name the pipeline “Promote to Prod”.&lt;/li&gt;
&lt;li&gt;Click the &lt;em&gt;Create Pipeline&lt;/em&gt; button.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;pipelineprod.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;configure-the-pipeline-2&#34;&gt;Configure the pipeline&lt;/h4&gt;
&lt;p&gt;We want this pipeline to kick off when the Validate Test pipeline completes.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Click &lt;em&gt;Add Trigger&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Select “Pipeline” from the drop down menu for &lt;em&gt;Type&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Select your application.&lt;/li&gt;
&lt;li&gt;Select the “Validate Test” pipeline.&lt;/li&gt;
&lt;li&gt;Check “successful”.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;2-configuration-2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;set-up-find-image-stage&#34;&gt;Set up Find Image stage&lt;/h4&gt;
&lt;p&gt;In this stage, we select the image that was deployed in the test cluster.&lt;/p&gt;
&lt;p&gt;Click the &lt;em&gt;Add stage&lt;/em&gt; button:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Select “Find Image from Cluster” for the stage &lt;em&gt;Type&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Check the region of the test server group to pick the image from.&lt;/li&gt;
&lt;li&gt;Enter “codelab-test” for the &lt;em&gt;Cluster&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Choose “Newest” for the &lt;em&gt;Server Group Selection&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;find-image.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;set-up-deploy-stage-for-prod-cluster&#34;&gt;Set up Deploy stage for prod cluster&lt;/h4&gt;
&lt;p&gt;We deploy the image that was picked, to the prod cluster.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Click &lt;em&gt;Add stage&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Select “Deploy” in the &lt;em&gt;Type&lt;/em&gt; drop down.&lt;/li&gt;
&lt;li&gt;In the &lt;em&gt;Server group&lt;/em&gt; section, click &lt;em&gt;Add server group&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;In the dialog that appears, click &lt;em&gt;Continue without a template&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;In the Basic Settings section, everything is the same as 
&lt;a href=&#34;#set-up-deploy-stage-for-test-cluster&#34;&gt;the “codelab-test” server group&lt;/a&gt;
 created before.  The only exception is to use “prod” instead of “test” for &lt;em&gt;Stack&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;In the Load Balancers section, add the “codelab-prod-lb” Load Balancer and the Backend Set previously created.&lt;/li&gt;
&lt;li&gt;Click the &lt;em&gt;Add&lt;/em&gt; button.&lt;/li&gt;
&lt;li&gt;Click &lt;em&gt;Save Changes&lt;/em&gt; to save your prod pipeline.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;trying-it-out-1&#34;&gt;Trying it out&lt;/h3&gt;
&lt;p&gt;Now let’s run through it all. Run a &amp;ldquo;Start Manual Execution&amp;rdquo; in Bake &amp;amp; Deploy to Test pipeline.&lt;/p&gt;
&lt;p&gt;When the Bake &amp;amp; Deploy to Test pipeline completes, the Validate Test pipeline will trigger and wait for user input.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;2-validation.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Click &lt;em&gt;Continue&lt;/em&gt;. This will trigger the Promote to Prod pipeline:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;2-pipelines-all.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;In the CLUSTERS tab, you can see that a server group has been deployed to the prod cluster.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;clusters2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Safe Deployments</title>
      <link>https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/tutorials/codelabs/safe-deployments/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/tutorials/codelabs/safe-deployments/</guid>
      <description>
        
        
        &lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;In this codelab, you will improve a deployment process by adding safeguards to your deployments.&lt;/p&gt;
&lt;p&gt;This codelab is a continuation of the 
&lt;a href=&#34;https://www.spinnaker.io/guides/tutorials/codelabs/kubernetes-source-to-prod/&#34; target=&#34;_blank&#34;&gt;Kubernetes: code to prod&lt;/a&gt;
 codelab. It assumes you have an application set up and ready to deploy.&lt;/p&gt;
&lt;h2 id=&#34;setup&#34;&gt;Setup&lt;/h2&gt;
&lt;p&gt;Please follow the steps in the Kubernetes Source to Prod guide to create a deployed Spinnaker cluster.&lt;/p&gt;
&lt;h2 id=&#34;making-manual-operations-safer&#34;&gt;Making manual operations safer&lt;/h2&gt;
&lt;h3 id=&#34;using-the-rollback-action&#34;&gt;Using the Rollback action&lt;/h3&gt;
&lt;p&gt;The rollback action automates the process of restoring to the previous good known server group. This feature enhances a traditionally manual operation by ensuring that the restored cluster is taking traffic before disabling the current server group.&lt;/p&gt;
&lt;p&gt;Go to the clusters screen for your application and make sure you have at least one cluster with one server group with an attached load balancer.&lt;/p&gt;
&lt;p&gt;If you don&amp;rsquo;t have an existing server group, click on &lt;em&gt;Create Server Group&lt;/em&gt;, select your deployment details (pick an image name and load balancer) and click on &lt;em&gt;CREATE&lt;/em&gt; .&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/rollback1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Clone this server group:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Select the server group&lt;/li&gt;
&lt;li&gt;Click on &lt;em&gt;actions&lt;/em&gt;, then select &lt;em&gt;clone server&lt;/em&gt; group in the dropdown.&lt;/li&gt;
&lt;li&gt;In the new dialog, select &lt;em&gt;Red/Black push&lt;/em&gt; (or Blue/Green push) as the strategy. (Note: Blue/Green replaces Red/Black in Spinnaker v1.30+.)&lt;/li&gt;
&lt;li&gt;Click &lt;em&gt;CREATE&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;images/rollback2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Wait for the task to finish. You should now have at least two server groups in your cluster, with the previous one disabled and the new one enabled.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/rollback25.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Rollback the deployment:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Select the new server group&lt;/li&gt;
&lt;li&gt;Click on &lt;em&gt;actions&lt;/em&gt;, then select &lt;em&gt;rollback&lt;/em&gt; in the dropdown.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;images/rollback3.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;In the new dialog, select the previous server group from the dropdown.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;images/rollback4.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;Click &lt;em&gt;OK&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You should see a task window and the deployment being rolled back safely and automatically. The previous server group should be eneabled and the current one disabled.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/rollback5.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;making-a-deployment-pipeline-safer&#34;&gt;Making a deployment pipeline safer&lt;/h2&gt;
&lt;h3 id=&#34;creating-your-deployment-pipeline&#34;&gt;Creating your deployment pipeline&lt;/h3&gt;
&lt;p&gt;Go to the Pipelines screen and select &lt;em&gt;Create New&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Select Pipeline as the type and name it &lt;em&gt;Safe Deployment&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/pipeline1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Under Configuration, add a &lt;em&gt;Docker Registry&lt;/em&gt; trigger&lt;/p&gt;
&lt;p&gt;Point it to your Docker registry and image&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/pipeline2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Add a new stage of type &lt;em&gt;Deploy&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Add a new cluster, select copy configuration from an existing template.&lt;/p&gt;
&lt;p&gt;Select your cluster.&lt;/p&gt;
&lt;p&gt;Click &lt;code&gt;Use this template&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/pipeline3.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;You should see the details for your cluster filled in.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/pipeline4.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Select &lt;code&gt;Add&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Save the pipeline&lt;/p&gt;
&lt;h3 id=&#34;adding-an-execution-window-to-deployment-pipelines&#34;&gt;Adding an execution window to deployment pipelines&lt;/h3&gt;
&lt;p&gt;Execution windows allow you to restrict the times of the day or week when deployments can happen. By using execution windows, you can ensure that deployments don&amp;rsquo;t interfere with times where your service is at peak demand. You can also use execution windows to make sure that there is always someone in the office ready to manually intervene or rollback your pipeline.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s modify our existing pipeline to add a deployment window.&lt;/p&gt;
&lt;p&gt;Navigate to the deploy stage of your pipeline.&lt;/p&gt;
&lt;p&gt;Check the &lt;code&gt;Restrict execution to specific time windows&lt;/code&gt; checkbox&lt;/p&gt;
&lt;p&gt;Click on &lt;code&gt;Add an execution window&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/window1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Enter a start time and end time that will block the deployment if deployed right now.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/window2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Save the pipeline&lt;/p&gt;
&lt;p&gt;Go to the pipeline screen by clicking on the back arrow next to the pipeline name&lt;/p&gt;
&lt;p&gt;Click on &lt;code&gt;Start Manual Execution&lt;/code&gt; for your pipeline.&lt;/p&gt;
&lt;p&gt;You will see a warning that your deploy stage is waiting for an execution window.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/window3.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;You can click on &lt;code&gt;Skip Execution Window&lt;/code&gt; to start the stage right away.&lt;/p&gt;
&lt;p&gt;Go back and modify the execution window so your stage falls within the current window.&lt;/p&gt;
&lt;p&gt;Execute your pipeline again. You should see your deployment continue without waiting.&lt;/p&gt;
&lt;h3 id=&#34;adding-a-manual-judgment-to-deployment-pipelines&#34;&gt;Adding a Manual Judgment to deployment pipelines&lt;/h3&gt;
&lt;p&gt;Manual Judgments serve as a gate for your pipeline. You can add manual judment stages to interrupt the pipeline execution to run a manual check. This is great for teams that have a manual or out-of-band QA process.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s modify our pipeline by adding a manual judgment stage.&lt;/p&gt;
&lt;p&gt;Click on Configuration and select &lt;em&gt;Add new stage&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Enter &amp;ldquo;please approve this pipeline&amp;rdquo; in the instructions&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/manual1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Click on &lt;em&gt;Add Notification Preference&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;In the popup dialog:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;select type &lt;em&gt;Email&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Enter your email address&lt;/li&gt;
&lt;li&gt;Select to notify when &lt;em&gt;This stage is awaiting judgment&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Click &lt;em&gt;Update&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/manual2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Go to your deploy stage&lt;/p&gt;
&lt;p&gt;Select &lt;em&gt;Manual Judgment&lt;/em&gt; in the &lt;em&gt;Depends On&lt;/em&gt; field&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/manual3.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Your pipeline view should look like this.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/manual4.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Save this pipeline and run it.&lt;/p&gt;
&lt;p&gt;Check your email. You should see one that says that your pipeline is awaiting judgment.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/manual5.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Click on the link in your email. You should see the manual judgment awaiting approval.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/manual6.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Click on &lt;em&gt;Continue&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Your pipeline should run now.&lt;/p&gt;
&lt;h3 id=&#34;changing-pipeline-behavior-based-on-selected-judgment&#34;&gt;Changing pipeline behavior based on selected judgment&lt;/h3&gt;
&lt;p&gt;Manual Judgments can also be used to run a rollback task based on some input.&lt;/p&gt;
&lt;p&gt;Go to your Manual Judgement stage and type in &amp;ldquo;continue&amp;rdquo; as an input option.&lt;/p&gt;
&lt;p&gt;Click on &lt;em&gt;Add Judgment Input&lt;/em&gt; and type in &amp;ldquo;rollback.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/manual7.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Add a new stage called &lt;em&gt;Rollback&lt;/em&gt; of type &lt;em&gt;Wait&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In the new stage, check the &lt;em&gt;Conditional on Expression&lt;/em&gt; checkbox and enter &lt;code&gt;${ #judgment(&amp;quot;Manual Judgment&amp;quot;).equals(&amp;quot;rollback&amp;quot;)}&lt;/code&gt;. In this step, we&amp;rsquo;re telling Spinnaker to only run this stage if the rollback option was selected.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/manual8.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Select the deploy stage, check the &lt;em&gt;Conditional on Expression&lt;/em&gt; checkbox and enter &lt;code&gt;${ #judgment(&amp;quot;Manual Judgment&amp;quot;).equals(&amp;quot;continue&amp;quot;)}&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Save your pipeline and run it.&lt;/p&gt;
&lt;p&gt;In the manual judgment stage, select &lt;code&gt;rollback&lt;/code&gt; as your input.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/manual9.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;You should see that the deploy stage is skipped while the rollback stage runs.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/manual10.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Run your pipeline again, this time selecting &lt;code&gt;continue&lt;/code&gt; as your input.&lt;/p&gt;
&lt;p&gt;The rollback stage should not run&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/manual11.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;creating-an-automatic-rollback-pipeline&#34;&gt;Creating an automatic rollback pipeline&lt;/h2&gt;
&lt;p&gt;You can also create a pipeline to run in case a deployment fails.&lt;/p&gt;
&lt;p&gt;For this exercise, we&amp;rsquo;re going to create a pipeline that will trigger if a deployment pipeline fails.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re going to make a parent pipeline that will allow us to decide its success status based on a parameter.&lt;/p&gt;
&lt;h3 id=&#34;create-a-new-pipeline-called-_parent-pipeline_&#34;&gt;Create a new pipeline called &lt;em&gt;Parent Pipeline&lt;/em&gt;&lt;/h3&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;Click &lt;code&gt;Show Options&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Enter &lt;code&gt;true&lt;/code&gt; as an option&lt;/li&gt;
&lt;li&gt;Click on &lt;em&gt;Add New Option&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Enter &lt;code&gt;false&lt;/code&gt; as another option.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;images/rollbackp1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Add a new stage of type &lt;em&gt;Check Preconditions&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Add a new Precondition:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Set &lt;em&gt;Check&lt;/em&gt; to &lt;em&gt;Expression&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Enter &lt;code&gt;${ parameters[&amp;quot;Pipeline Successful&amp;quot;].equals(&amp;quot;true&amp;quot;) }&lt;/code&gt; as the expression.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;images/rollbackp2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;Click &lt;em&gt;Update&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;images/rollbackp3.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Save your pipeline&lt;/p&gt;
&lt;h3 id=&#34;create-a-rollback-pipeline&#34;&gt;Create a rollback pipeline&lt;/h3&gt;
&lt;p&gt;Create a new pipeline called &amp;lsquo;Child Pipeline&amp;rsquo;&lt;/p&gt;
&lt;p&gt;Under &lt;em&gt;Configuration&lt;/em&gt;, add a new automated trigger of type &lt;code&gt;Pipeline&lt;/code&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Set your application to be the same as your parent pipeline&lt;/li&gt;
&lt;li&gt;Set pipeline name to be &lt;em&gt;Parent Pipeline&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Click on Pipeline Status &lt;code&gt;failed&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;images/rollbackp4.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Add a new stage of type &lt;em&gt;Wait&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/rollbackp5.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Save your child pipeline&lt;/p&gt;
&lt;h3 id=&#34;test-your-rollback-pipeline&#34;&gt;Test your rollback pipeline&lt;/h3&gt;
&lt;p&gt;Go to the pipelines screen and select &lt;code&gt;Start Manual Execution&lt;/code&gt; on your &lt;em&gt;Parent Pipeline&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In the popup dialog, select &lt;code&gt;false&lt;/code&gt; as the choice for &lt;em&gt;Pipeline Successful&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/rollbackp6.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;You should see the pipeline fail, and the Child Pipeline run the rollback&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/rollbackp7.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;If you click on the &lt;code&gt;Parent Pipeline&lt;/code&gt; link in the child pipeline, it should take you the the failed execution.&lt;/p&gt;
&lt;p&gt;Now run the Parent Pipeline again, this time selecting &lt;code&gt;true&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The child pipeline should not run&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;images/rollbackp8.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;learn-more&#34;&gt;Learn more&lt;/h2&gt;
&lt;p&gt;Hopefully this codelab has given you a taste of the built-in mechanisms for safe deployment in Spinnaker. An almost complete list of safe deployment features in Spinnaker can be found in this 
&lt;a href=&#34;https://blog.spinnaker.io/can-i-push-that-building-safer-low-risk-deployments-with-spinnaker-a27290847ac4&#34; target=&#34;_blank&#34;&gt;blog post&lt;/a&gt;
.&lt;/p&gt;

      </description>
    </item>
    
  </channel>
</rss>
