Part 1: Spinnaker & GKE /w Canary Deployments
- Download a sample application, create a Git repository then upload it to a Google Cloud Source Repository.
- Build the container image.
- Create triggers to re-build container images on application changes.
- Configure a Spinnaker pipeline to reliably and continuously deploy the application to Kubernetes Engine.
- Deploy a code change, triggering the pipeline, and roll out to production.
Part 2: Github & Cloud Run /w Pull Requests
- Set up a Github source code repository.
- Create the service to run the application in Cloud Run
- Allow Github to Cloud Build communication
- Introduce a code change, perform a pull request and deploy a new version
Part 3: Cloud Deploy
Coming in the future!
Part 4: ???
Part 1: Spinnaker & GKE /w Canary Deployments
Task 1. Study the Spinnaker deployment
Your tools team have deployed Spinnaker for you on GKE in the us-central1 region, and us-central1-c zone. Perform the following command to set up port forwarding to the user interface from Cloud Shell:
Get the credentials for the GKE cluster with:
export PROJECT=$(gcloud config get-value project) gcloud container clusters get-credentials spinnaker-tutorial --zone us-central1-c
Copied!content_copy
export DECK_POD=$(kubectl get pods --namespace default -l "cluster=spin-deck" \ -o jsonpath="{.items[0].metadata.name}")
Copied!content_copy
kubectl port-forward --namespace default $DECK_POD 8080:9000 >> /dev/null &
Copied!content_copy
To open the Spinnaker user interface, click the Web Preview icon at the top of the Cloud Shell window and select Preview on port 8080.
Task 3. Create the source code repository
In this section, you create the repository for your code, configure Cloud Build to detect changes to it which then builds the container, and pushes it to Container Registry.
- In Cloud Shell tab, download the sample application source code:
gsutil -m cp -r gs://accelerate2022/tc003/sample-app.tar .
Copied!content_copy
- Unpack the source code:
mkdir sample-app tar xvf sample-app.tar -C ./sample-app
Copied!content_copy
- Change directories to the source code:
cd sample-app
Copied!content_copy
- Set the correct project ID in the code:
sed -i s/PROJECT/$PROJECT/g k8s/deployments/*
Copied!content_copy
- Set the username and email address for your Git commits in this repository. Replace
[USERNAME]
with a username you create:
git config --global user.email "$(gcloud config get-value core/account)"
Copied!content_copy
git config --global user.name "[USERNAME]"
Copied!content_copy
- Make the initial local commit to your source code:
git init
Copied!content_copy
git add .
Copied!content_copy
git commit -m "Initial commit"
Copied!content_copy
- Create the repository in Google Cloud:
gcloud source repos create sample-app
Copied!content_copy
git config credential.helper gcloud.sh
Copied!content_copy
- Add your newly created repository as remote:
git remote add origin https://source.developers.google.com/p/$PROJECT/r/sample-app
Copied!content_copy
- Push your code to the new repository’s master branch:
git push origin master
Copied!content_copy
Copy
- Check that you can see your source code in the Console by clicking Navigation Menu > Source Repositories.
In the Cloud Platform Console, click Navigation menu > Cloud Build > Triggers.
- Set the following trigger settings:
- Name:
sample-app-tags
- Event: Push new tag
- Select your newly created
sample-app
repository. - Tag:
v.*
- Configuration / Type:
Cloud Build configuration file (yaml or json)
- Configuration / Location:
Repository
- Configuration / Cloud Build configuration file location:
/cloudbuild.yaml
Task 5. Prepare the Kubernetes Manifests for use in Spinnaker
Spinnaker needs access to your Kubernetes manifests in order to deploy them to your clusters. This section creates a Cloud Storage bucket that will be populated with your manifests during the CI process in Cloud Build. After your manifests are in Cloud Storage, Spinnaker can download and apply them during your pipeline’s execution.
- Create the bucket:
gsutil mb -l us-central1 gs://$PROJECT-kubernetes-manifests
Copied!content_copy
- Enable versioning on the bucket so that you have a history of your manifests:
gsutil versioning set on gs://$PROJECT-kubernetes-manifests Task 6. Start a build Make a small code change Add a file to the directory to make a change to the application touch testfile.txt git add testfile.txt git commit -a -m "Make a feature change!" Copied! Push your first image using the following steps: In Cloud Shell, still in the sample-app directory, create a Git tag: git tag v1.0.0 Copied! Push the tag: git push --tags Task 7. Configure a pipeline in Spinnaker Install the spin CLI for managing Spinnaker spin is a command-line utility for managing Spinnaker's applications and pipelines. Download the 1.22.0 version of spin, make it executable, and place it in the bin directory: wget https://storage.googleapis.com/spinnaker-artifacts/spin/1.22.0/linux/amd64/spin -O ~/spin chmod +x ~/spin sudo mv ~/spin /usr/bin/spin Copied! Create the deployment pipeline Use spin to create an app called sample in Spinnaker. Note that this requires you run the previous port-forwarding command to reach the Spinnaker endpoint. Set up the app in Spinnaker: spin application save --application-name sample \ --owner-email "$(gcloud config get-value core/account)" \ --cloud-providers kubernetes \ --gate-endpoint http://localhost:8080/gate Copied! Next, you create the continuous delivery pipeline. In this tutorial, the pipeline is configured to detect when a Docker image with a tag prefixed with "v" has arrived in your Container Registry. From your sample-app source code directory, run the following command to upload an example pipeline to your Spinnaker instance: sed s/PROJECT/$PROJECT/g spinnaker/pipeline-deploy.json > pipeline.json spin pipeline save --gate-endpoint http://localhost:8080/gate -f pipeline.json Task 9. Triggering your pipeline from code changes Now test the pipeline end to end by making a code change, pushing a Git tag, and watching the pipeline run in response. By pushing a Git tag that starts with "v", you trigger Container Builder to build a new Docker image and push it to Container Registry. Spinnaker detects that the new image tag begins with "v" and triggers a pipeline to deploy the image to canaries, run tests, and roll out the same image to all pods in the deployment. From your sample-app directory, change the color of the app from orange to blue: sed -i 's/orange/blue/g' cmd/gke-info/common-service.go Copied! Tag your change and push it to the source code repository: git commit -a -m "Change color to blue" Copied! git tag v1.0.1 Copied! git push --tags Copied! In the Console, in Cloud Build > History, wait a couple of moments for the new build to appear. You may need to refresh your page. Wait for the new build to complete, before going to the next step. Return to the Spinnaker UI and click Pipelines to watch the pipeline start to deploy the image. The automatically triggered pipeline will take a few minutes to appear. You may need to refresh your page. Task 10. Observe the canary deployments When the deployment is paused, waiting to roll out to production, return to the web page displaying your running application and start refreshing the tab that contains your app. Four of your backends are running the previous version of your app, while only one backend is running the canary. You should see the new, blue version of your app appear about every fifth time you refresh. When the pipeline completes, your app looks like the following screenshot. Note that the color has changed to blue because of your code change, and that the Version field now reads canary. Optionally, you can rollback this change by reverting your previous commit. Rolling back adds a new tag (v1.0.2), and pushes the tag back through the same pipeline you used to deploy v1.0.1: git revert v1.0.1 Copied! Press CTRL+O, ENTER, CTRL+X. git tag v1.0.2 Copied! git push --tags Copied! When the build and then the pipeline completes, verify the rollback by clicking Load Balancers, then click the service sample-frontend-production Default and copy the Ingress IP address into a new tab.