cloudbuild.gke.yaml (94 lines of code) (raw):

# Copyright 2019 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. steps: - id: 'compile web app' name: 'gcr.io/cloud-builders/npm' dir: 'web' args: ['install'] waitFor: ['-'] - id: 'web app unit tests' name: 'gcr.io/cloud-builders/npm' dir: 'web' args: ['test'] waitFor: ['compile web app'] - id: 'build web' name: 'gcr.io/cloud-builders/docker' args: [ 'build', '--tag=web', '--tag=gcr.io/$PROJECT_ID/web', '--cache-from', 'gcr.io/$PROJECT_ID/web:latest', 'web/.', ] waitFor: ['web app unit tests'] # start immediately - id: 'build db' name: 'gcr.io/cloud-builders/docker' args: [ 'build', '--tag=mysql', '--tag=gcr.io/$PROJECT_ID/mysql', '--cache-from', 'gcr.io/$PROJECT_ID/mysql:latest', 'mysql/.', ] env: - "MYSQL_ROOT_PASSWORD=password" waitFor: ['-'] # start immediately - id: 'make namespace' name: 'gcr.io/cloud-builders/kubectl' args: ['create','namespace','test-$BUILD_ID'] waitFor: ['-'] # start immediately - id: 'push web' name: 'gcr.io/cloud-builders/docker' args: ['push', 'gcr.io/$PROJECT_ID/web'] waitFor: ['build web'] - id: 'push db' name: 'gcr.io/cloud-builders/docker' args: ['push', 'gcr.io/$PROJECT_ID/mysql'] waitFor: ['build db'] - id: 'patch k8s config' name: 'gcr.io/cloud-builders/gcloud' entrypoint: 'bash' args: ['-c','find k8s -type f | xargs sed -i "s/PROJECT_ID/$PROJECT_ID/g"'] waitFor: ['-'] - id: 'deploy to staging' name: 'gcr.io/cloud-builders/kubectl' args: ['apply', '-f', 'k8s/', '--namespace=test-$BUILD_ID'] waitFor: ['push web','push db','patch k8s config'] - id: 'get endpoint' name: 'gcr.io/cloud-builders/kubectl' entrypoint: 'bash' args: - '-c' - | # determine which node port the service was exposed on get_nodeport() { kubectl get service cookieshop-web --namespace=test-$BUILD_ID -o=jsonpath='{.spec.ports[0].nodePort}' } until [[ -n "$(get_nodeport)" ]]; do echo "querying for nodeport" sleep 3 done echo "$(get_nodeport)" > _nodeport # save port for use in next step # grab the public IP of a random node # (why do this instead of a load balancer? b/c it's faster to instantiate) # (and doesn't require additional billable resources) # (we can reasonably expect the node to be durable enough to last until the test completes) get_nodeip() { kubectl get nodes --output jsonpath='{.items[0].status.addresses[?(@.type=="ExternalIP")].address}' } until [[ -n "$(get_nodeip)" ]]; do echo "querying for nodeip" sleep 3 done echo $(get_nodeip) > _nodeip # save ip for use in next step waitFor: ['deploy to staging'] - id: 'integration tests' name: 'gcr.io/cloud-builders/curl' entrypoint: '/bin/bash' args: - '-c' - | ### -r = retries; -i = interval; -k = keyword to search for ### ./test/test-connection.sh -r 20 -i 3 -u http://$(cat _nodeip):$(cat _nodeport) ./test/test-content.sh -r 20 -i 3 -u http://$(cat _nodeip):$(cat _nodeport) -k 'Chocolate Chip' waitFor: ['get endpoint'] - id: 'delete namespace' name: 'gcr.io/cloud-builders/kubectl' args: ['delete', 'namespaces', 'test-$BUILD_ID'] waitFor: ['integration tests'] options: env: # location/name of GKE cluster (used by all kubectl commands) - CLOUDSDK_COMPUTE_ZONE=us-central1-a - CLOUDSDK_CONTAINER_CLUSTER=staging