Deployment pipeline/Tutorial
There are many moving pieces in the deployment pipeline. To better understand how those pieces fit together, let's work through a concrete example.
In the walkthrough below we will show how to make an update to an application already setup for use with the Deployment Pipeline.
This example uses the HelloWorldOid repository. HelloWorldOid uses FIGlet and cowsay to say "Hello World!" to folks over HTTP.
Goal
Deploy a simple update for HelloWorldOid.
Steps
Update helloworldoid
The process of deployment starts with an idea for a change. I feel like HelloWorldOid could use some pop. Some pizzazz. That'll get the VC money to start rolling in, for sure! To that end, I propose we add a date to the output of HelloWorldOid — this way we'll know:
- The world is a welcoming place
- The world is a welcoming place full of cows
- The time at which the world was so welcoming and cow filled
I made the following patchset and submitted a change to gerrit:
From: Tyler Cipriani <tcipriani@wikimedia.org>
Date: Thu, 25 Jul 2019 10:20:03 -0600
Subject: [PATCH] Add Timestamp to output
To help better preserve the memory of the beautiful moment when the world was greeted and all was well.
---
lib/server.js | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/lib/server.js b/lib/server.js
index 99fecd9..5549430 100644
--- a/lib/server.js
+++ b/lib/server.js
@@ -38,12 +38,14 @@ function serve(message, port = 8001) {
+ var timestamp_text = '\n\nTimestamp: ' + new Date().toISOString();
+
res.end(cowsay.say({
text : text,
r : true,
- }));
+ }) + timestamp_text);
--
2.20.1
After pushing this diff up to Gerrit (because blubber-doc/example/helloworldoid
is setup in the integration/config
repo to use the service-pipeline
) CI builds and runs the image described by the test
Blubber variant, and reports the result in Gerrit:
Since all tests pass, I'll vote CR+2
on the patchset and the deployment pipeline will:
- Build my
production
variant - Deploy my production image to an integration environment
- Run any integration tests defined by
helm test
- If my integration tests pass:
- My production image is pushed to
docker-registry.wikimedia.org
- The pipeline comments on my patch with a pointer to the new image and tags it made:
- My production image is pushed to
Update the deployment chart
Using the information from PipelineBot, I can update the HelloWorldOid chart in the operations/deployment-charts repo used in production. I'll make a patchset to bump the image version in all production environments to use the new image.
From 0c5eda0f9cd19d5a14526335123a31963d090f91 Mon Sep 17 00:00:00 2001
From: Tyler Cipriani <tcipriani@wikimedia.org>
Date: Fri, 26 Jul 2019 15:09:38 -0600
Subject: [PATCH] helloworldoid: bump production image
Change-Id: I0d2e93d983b204534b5e7ba3273ff29c0a026991
---
helmfile.d/services/codfw/helloworldoid/values.yaml | 2 +-
helmfile.d/services/eqiad/helloworldoid/values.yaml | 2 +-
helmfile.d/services/staging/helloworldoid/values.yaml | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/helmfile.d/services/codfw/helloworldoid/values.yaml b/helmfile.d/services/codfw/helloworldoid/values.yaml
index bdfc6ed..6bb005f 100644
--- a/helmfile.d/services/codfw/helloworldoid/values.yaml
+++ b/helmfile.d/services/codfw/helloworldoid/values.yaml
@@ -30,7 +30,7 @@ main_app:
- version: 2019-07-23-155043-production
+ version: 2019-07-25-125909-production
diff --git a/helmfile.d/services/eqiad/helloworldoid/values.yaml b/helmfile.d/services/eqiad/helloworldoid/values.yaml
index bdfc6ed..6bb005f 100644
--- a/helmfile.d/services/eqiad/helloworldoid/values.yaml
+++ b/helmfile.d/services/eqiad/helloworldoid/values.yaml
@@ -30,7 +30,7 @@ main_app:
- version: 2019-07-23-155043-production
+ version: 2019-07-25-125909-production
diff --git a/helmfile.d/services/staging/helloworldoid/values.yaml b/helmfile.d/services/staging/helloworldoid/values.yaml
index eda1542..5e532a4 100644
--- a/helmfile.d/services/staging/helloworldoid/values.yaml
+++ b/helmfile.d/services/staging/helloworldoid/values.yaml
@@ -30,7 +30,7 @@ main_app:
- version: 2019-07-23-155043-production
+ version: 2019-07-25-125909-production
--
2.20.1
After merging this simple change, I'm ready to deploy!
Run a deployment
Deployment is accomplished via helmfile
and is a few short commands:
WARNING: The following commands are outdated, see Kubernetes/Deployments#Deploying_with_helmfile instead for more current information.
you@your-laptop:~ $ ssh deployment.eqiad.wmnet
you@deploy1001:~ $ cd /srv/deployment-charts/helmfile.d/services/staging/helloworldoid
you@deploy1001:helloworldoid $ source .hfenv
you@deploy1001:helloworldoid $ helmfile diff
you@deploy1001:helloworldoid $ helmfile apply
you@deploy1001:~ $ cd /srv/deployment-charts/helmfile.d/services/codfw/helloworldoid
you@deploy1001:helloworldoid $ source .hfenv
you@deploy1001:helloworldoid $ helmfile diff
you@deploy1001:helloworldoid $ helmfile apply
you@deploy1001:~ $ cd /srv/deployment-charts/helmfile.d/services/eqiad/helloworldoid
you@deploy1001:helloworldoid $ source .hfenv
you@deploy1001:helloworldoid $ helmfile diff
you@deploy1001:helloworldoid $ helmfile apply
And that's it! Our application is now deployed to all production environments using the values.yaml
from operations/deployment-charts
that points to the image that the pipeline created with our change.
Results
The results speak for themselves: we have a much more satisfying and remarkable user experience with so little effort:
__________________________________________________________________________________________________________________________ / ('-. .-. ('-. (`\ .-') /` _ .-') _ .-') _ ,---. \ | ( OO ) / _( OO) `.( OO ),' ( \( -O ) ( ( OO) ) | | | | ,--. ,--.(,------.,--. ,--. .-'),-----. ,--./ .--. .-'),-----. ,------. ,--. \ .'_ | | | | | | | | | .---'| |.-') | |.-') ( OO' .-. ' | | | ( OO' .-. '| /`. ' | |.-') ,`'--..._)| | | | | .| | | | | | OO ) | | OO )/ | | | | | | | |, / | | | || / | | | | OO )| | \ '| | | | | |(| '--. | |`-' | | |`-' |\_) | |\| | | |.'.| |_)\_) | |\| || |_.' | | |`-' || | ' || .' | | | .-. | | .--'(| '---.'(| '---.' \ | | | | | | \ | | | || . '.'(| '---.'| | / :`--' | | | | | | | `---.| | | | `' '-' '.-. | ,'. | `' '-' '| |\ \ | | | '--' /.--. | | `--' `--' `------'`------' `------' `-----' ',/ '--' '--' `-----' `--' '--' `------' `-------' '--' | \ Hi, I’d like to add you to my professional network on LinkedIn. / -------------------------------------------------------------------------------------------------------------------------- \ ___ \ .-' `'. / \ | ; | | ___.--, _.._ |0) ~ (0) | _.---'`__.-( (_. __.--'`_.. '.__.\ '--. \_.-' ,.--'` `""` ( ,.--'` ',__ /./; ;, '.__.'` __ _`) ) .---.__.' / | |\ \__..--"" """--.,_ `---' .'.''-._.-'`_./ /\ '. \ _.-~~~````~~~-._`-.__.' | | .' _.-' | | \ \ '. `~---` \ \/ .' \ \ '. '-._) \/ / \ \ `=.__`~-. jgs / /\ `) ) / / `"".`\ , _.-'.'\ \ / / ( ( / / `--~` ) ) .-'.' '.'. | ( (/` ( (` ) ) '-; ` '-; (-' Timestamp: 2019-07-26T21:24:01.353Z