diff --git a/README.md b/README.md index a6476dc..a603b4c 100644 --- a/README.md +++ b/README.md @@ -144,6 +144,21 @@ Find **Protocol Buffers Descriptions** at the [`./pb` directory](./pb). are seeing this, run `kubectl get service frontend-external -o=yaml | kubectl apply -f-` to trigger load balancer reconfiguration. +### Option 3: Using Static Images + +> 💡 Recommended for test-driving the application on an existing cluster. + +**Prerequisite**: a running Kubernetes cluster. + +1. Clone this repository. +1. Deploy the application: `kubectl apply -f ./release/kubernetes-manifests` +1. Run `kubectl get pods` to see pods are in a healthy and ready state. +1. Find the IP address of your application, then visit the application on your + browser to confirm installation. + + kubectl get service frontend-external + + ### (Optional) Deploying on a Istio-installed GKE cluster > **Note:** you followed GKE deployment steps above, run `skaffold delete` first @@ -205,4 +220,4 @@ Find **Protocol Buffers Descriptions** at the [`./pb` directory](./pb). --- -This is not an official Google project. +This is not an official Google project. \ No newline at end of file diff --git a/hack/README.md b/hack/README.md new file mode 100755 index 0000000..41d89df --- /dev/null +++ b/hack/README.md @@ -0,0 +1,18 @@ +## `hack/` + +This directory provides scripts for building and pushing Docker images, and tagging new demo +releases. + +### env variables + +- `TAG` - git release tag / Docker tag. +- `REPO_PREFIX` - Docker repo prefix to push images. Format: `$user/$project`. Resulting images will be of the + format `$user/$project/$svcname:$tag` (where `svcname` = `adservice`, `cartservice`, + etc.) + +### scripts + +1. `./make-docker-images.sh`: builds and pushes images to the specified Docker repository. +2. `./make-release-artifacts.sh`: generates a combined YAML file with image $TAG at: + `./release/kubernetes-manifests/demo.yaml`. +3. `./make-release.sh`: runs scripts 1 and 2, then runs `git tag` / pushes updated manifests to master. diff --git a/hack/make-docker-images.sh b/hack/make-docker-images.sh new file mode 100755 index 0000000..51a8e10 --- /dev/null +++ b/hack/make-docker-images.sh @@ -0,0 +1,39 @@ +# 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. + +# Builds and pushes docker image for each demo microservice. + +#!/usr/bin/env bash +set -euo pipefail + +log() { echo "$1" >&2; } +fail() { log "$1"; exit 1; } + +TAG="${TAG?TAG env variable must be specified}" +REPO_PREFIX="${REPO_PREFIX?REPO_PREFIX env variable must be specified}" + + +for dir in ./src/*/ +do + # build image + svcname="$(basename $dir)" + image="$REPO_PREFIX/$svcname:$TAG" + echo "Building and pushing $image..." + docker build -t $image -f $dir/Dockerfile $dir + + # push image + docker push $image +done + +log "Successfully built and pushed images." diff --git a/hack/make-release-artifacts.sh b/hack/make-release-artifacts.sh new file mode 100755 index 0000000..1479f8a --- /dev/null +++ b/hack/make-release-artifacts.sh @@ -0,0 +1,55 @@ +# 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. + +# injects new image/tag into the images in ./release/kubernetes-manifests/demo.yaml + +#!/usr/bin/env bash +set -euo pipefail + +log() { echo "$1" >&2; } +fail() { log "$1"; exit 1; } + +TAG="${TAG?TAG env variable must be specified}" +REPO_PREFIX="${REPO_PREFIX?REPO_PREFIX env variable must be specified}" + +# overwrite release/ with the latest manifests, adding "---" separator. +src="./kubernetes-manifests/*" +manifestfile="./release/kubernetes-manifests/demo.yaml" +tmp="./release/kubernetes-manifests/tmp.yaml" +[ -e $manifestfile ] && rm $manifestfile +for f in $src; do (cat "${f}"; echo "---") >> $tmp; done + +# remove extra google headers +gsed -i '/^#/d' $tmp + +# remove empty lines +gsed -r -i '/^\s*$/d' $tmp + +# add 1 google header to the top +cat "./release/.googleheader" $tmp > $manifestfile +rm $tmp + + +# replace image repo, tag for each deployment +for dir in ./src/*/ +do + svcname="$(basename $dir)" + image="$REPO_PREFIX/$svcname:$TAG" + + pattern="^(\s*)image:\s.*$svcname(.*)(\s*)" + replace="\1image: $image\3" + gsed -r -i "s|$pattern|$replace|g" $manifestfile +done + +log "Successfully added image tags > wrote to demo.yaml". diff --git a/hack/make-release.sh b/hack/make-release.sh new file mode 100755 index 0000000..1eb8bce --- /dev/null +++ b/hack/make-release.sh @@ -0,0 +1,41 @@ +# 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. + +# Creates a new release by 1) building/pushing images, 2) injecting tag into YAML, +# 3) creating a new git tag, and 4) pushing tags/updated YAML to $BRANCH. + +#!/usr/bin/env bash +set -euo pipefail + +log() { echo "$1" >&2; } +fail() { log "$1"; exit 1; } + +TAG="${TAG?TAG env variable must be specified}" +REPO_PREFIX="${REPO_PREFIX?REPO_PREFIX env variable must be specified}" + +# build and push images +./hack/make-docker-images.sh + +# update yaml +./hack/make-release-artifacts.sh + +# create git release / push to master +log "Pushing k8s manifests to master..." +git tag "$TAG" +git add release/ +git commit --allow-empty -m "Release $TAG" +git push --tags +git push origin master + +log "Successfully tagged release $TAG." diff --git a/release/.googleheader b/release/.googleheader new file mode 100644 index 0000000..ddd71c0 --- /dev/null +++ b/release/.googleheader @@ -0,0 +1,13 @@ +# 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.