| #!/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 |