| #!/usr/bin/env bash | 
 | # Copyright lowRISC contributors. | 
 | # Licensed under the Apache License, Version 2.0, see LICENSE for details. | 
 | # SPDX-License-Identifier: Apache-2.0 | 
 | # | 
 | ########################################################## | 
 | # | 
 | # Script to automate site deployment tasks to Gcloud | 
 | # | 
 | # You will require authentication to perform Gcloud actions | 
 | # against the project id's specified. | 
 | # If you have been granted appropriate permissions, you can | 
 | # authenticate locally by running `gcloud auth login`, and | 
 | # after that the commands here should execute as-intended. | 
 | # | 
 | ########################################################## | 
 |  | 
 | set -e | 
 |  | 
 | # Get the project directory from the location of this script | 
 | this_dir=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) | 
 | proj_root=$( realpath "${this_dir}/../.." ) | 
 | build_dir="${proj_root}/build-site" | 
 |  | 
 | declare PROJECT           # Gcloud project | 
 | declare INSTANCE_GROUP    # Gcloud compute instance group | 
 |  | 
 | # docs.opentitan.org | 
 | DOCS_OPENTITAN_ORG_ID=active-premise-257318 | 
 |  | 
 | # opentitan.org | 
 | OPENTITAN_ORG_ID=gold-hybrid-255313 | 
 |  | 
 | ################ | 
 | # DEPENDENCIES # | 
 | ################ | 
 |  | 
 | # Check for gcloud-sdk | 
 | if ! command -v gcloud >/dev/null; then | 
 |     echo "E: gcloud not found." >&2 | 
 |     echo "E: See instructions at https://cloud.google.com/sdk/docs/install, or:" >&2 | 
 |     echo "E:   $ nix shell nixpkgs#google-cloud-sdk" >&2 | 
 |     exit 1 | 
 | fi | 
 |  | 
 | # Check for podman | 
 | if ! command -v podman >/dev/null; then | 
 |     echo "E: podman not found." >&2 | 
 |     echo "E: See instructions at https://podman.io/getting-started/installation" >&2 | 
 |     exit 1 | 
 | fi | 
 |  | 
 | ################# | 
 | # CONFIGURATION # | 
 | ################# | 
 |  | 
 | ############ | 
 | # BUILDING # | 
 | ############ | 
 |  | 
 | deploy_redirector () { | 
 |     # site/redirector/landing | 
 |     # "Build and deploy a new container image which is used to spawn Gcloud instances that handle redirects" | 
 |     # | 
 |     #   Note that it can take a while for the instance group to catch up with the update, and then up to twelve hours for the CDN cache to expire. | 
 |     #   If you need to do a faster push: wait until the rolling restart is complete and manually invalidate the CDN. | 
 |     # | 
 |     PROJECT="${OPENTITAN_ORG_ID}" | 
 |     INSTANCE_GROUP=opentitan-dot-org-redirector | 
 |     gcloud config set project ${PROJECT} | 
 |     gcloud builds submit --tag "gcr.io/${PROJECT}/redirector_v2" "${proj_root}/site/redirector/landing" | 
 |     gcloud compute instance-groups managed rolling-action replace --max-surge=3 --region=us-central1 "${INSTANCE_GROUP}" | 
 | } | 
 |  | 
 | deploy_docs_redirector () { | 
 |     # site/redirector/docs | 
 |     # Redirector but for the DOCS_OPENTITAN_ORG_ID project | 
 |     PROJECT="${DOCS_OPENTITAN_ORG_ID}" | 
 |     INSTANCE_GROUP=docs-redirector | 
 |     gcloud config set project ${PROJECT} | 
 |     gcloud builds submit --tag "gcr.io/${PROJECT}/redirector_v2" "${proj_root}/site/redirector/docs" | 
 |     gcloud compute instance-groups managed rolling-action replace --max-surge=3 --region=us-central1 "${INSTANCE_GROUP}" | 
 | } | 
 |  | 
 | deploy_site_builder () { | 
 |     # util/site/site-builder | 
 |     # "Build and deploy a new container image which is used by a Gcloud 'Cloud Build' job to automatically rebuild the site upon PRs being merged." | 
 |     PROJECT="${OPENTITAN_ORG_ID}" | 
 |     gcloud config set project ${PROJECT} | 
 |     # Build the image locally using podman for speed | 
 |     tag="gcr.io/${PROJECT}/builder" # https://cloud.google.com/container-registry/docs/pushing-and-pulling#tag | 
 |     pushd ${proj_root} | 
 |     podman build -t "${tag}" -f "${proj_root}/util/site/site-builder/builder.Dockerfile" . | 
 |     popd | 
 |     gcloud auth print-access-token | podman login -u oauth2accesstoken --password-stdin gcr.io && \ | 
 |         podman push "${tag}" | 
 | } | 
 |  | 
 | deploy_staging () { | 
 |     # "Build the site for staging and deploy it to the staging bucket hosted at staging.opentitan.org" | 
 |     PROJECT="${OPENTITAN_ORG_ID}" | 
 |     rm -rf ${build_dir} | 
 |     ${proj_root}/util/site/build-docs.sh build-staging | 
 |     remove_cruft | 
 |     gcloud storage cp -R --gzip-in-flight-all ${build_dir}/* gs://${PROJECT}-staging | 
 | } | 
 |  | 
 | deploy_prod () { | 
 |     # DO_NOT_USE | 
 |     # "Build the site for production and deploy it to the production bucket hosted at opentitan.org" | 
 |     PROJECT="${OPENTITAN_ORG_ID}" | 
 |     rm -rf ${build_dir} | 
 |     ${proj_root}/util/site/build-docs.sh build | 
 |     remove_cruft | 
 |     gcloud storage cp -R --gzip-in-flight-all ${build_dir}/* gs://${PROJECT}-prod | 
 | } | 
 |  | 
 | # Remove additional files from build directory that we don't need | 
 | # TODO remove this when we are ready for .mdbookignore (https://github.com/rust-lang/mdBook/pull/1908) | 
 | remove_cruft () { rm -rf ${build_dir}/book/.git ${build_dir}/book/.github ${build_dir}/book/build-site ${build_dir}/book/site ; } | 
 |  | 
 | ####### | 
 | # CLI # | 
 | ####### | 
 | case "$1" in | 
 |     "redirector") deploy_redirector ;; | 
 |     "redirector-docs") deploy_docs_redirector ;; | 
 |     "site-builder") deploy_site_builder ;; | 
 |     "staging") deploy_staging ;; | 
 |     "prod") deploy_prod ;; # DO NOT USE | 
 |     "help"|*) | 
 |         echo "USAGE: $0 <command>" | 
 |         echo "" | 
 |         echo "commands:" | 
 |         echo "  help             prints this message." | 
 |         echo "  site-builder     build and deploy the site-builder container image" | 
 |         echo "  staging          build and deploy the site to staging.opentitan.org" | 
 |         echo "  redirector       build and deploy the redirector instances for production" | 
 |         echo "  redirector-docs  build and deploy the redirector instances for docs.opentitan.org" | 
 |         exit 0 | 
 |         ;; | 
 | esac |