| #!/usr/bin/env bash |
| |
| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you 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. |
| |
| function stop() { |
| echo "cleaning up docker image" |
| docker stop yunikorn-site-local &>/dev/null |
| docker rm -f yunikorn-site-local &>/dev/null |
| docker rmi yunikorn/yunikorn-website:latest &>/dev/null |
| } |
| |
| function clean() { |
| echo "removing build artifacts:" |
| echo " docusaurus install" && rm -rf .docusaurus |
| echo " node modules" && rm -rf node_modules |
| echo " yarn lock file" && rm -f yarn.lock |
| echo " build output" && rm -rf build |
| } |
| |
| function node_version() { |
| NV_FILE=.nvmrc |
| if [ -r ${NV_FILE} ]; then |
| NODE_VERSION=$(<"$NV_FILE") |
| fi |
| # docusausrus 2.0.0-beta.18 and later ony work with node 16.14 later, use it as the default |
| NODE_VERSION=${NODE_VERSION:-16.14} |
| } |
| |
| function image_build() { |
| # build local docker image |
| cat <<EOF >.dockerfile.tmp |
| FROM node:${NODE_VERSION} |
| ADD . /yunikorn-site |
| WORKDIR /yunikorn-site |
| EOF |
| |
| if ! docker build -t yunikorn/yunikorn-website:latest -f .dockerfile.tmp .; then |
| echo "docker image build failed" |
| rm -rf .dockerfile.tmp |
| exit 1 |
| fi |
| rm -rf .dockerfile.tmp |
| } |
| |
| function web() { |
| # start the web server |
| echo " Starting development server with locale $LOCALE" |
| docker exec -it yunikorn-site-local /bin/bash -c "yarn start --locale=$LOCALE --host 0.0.0.0" |
| RET=$? |
| [ ${RET} -eq 131 ] && echo " ctrl-\ caught, restarting" && return 2 |
| [ ${RET} -eq 130 ] && echo " ctrl-c caught, exiting build" && return 0 |
| [ ${RET} -ne 0 ] && echo "start web-server failed" && return 1 |
| } |
| |
| function run_base() { |
| # run docker container |
| # mount the repo root to the container working dir, |
| # so that changes made in the repo can trigger the web-server auto-update |
| if ! docker run -it --name yunikorn-site-local -d \ |
| -p 3000:3000 \ |
| -v "$PWD":/yunikorn-site \ |
| yunikorn/yunikorn-website:latest; then |
| |
| echo "run local docker image failed" |
| return 1 |
| fi |
| |
| # install dependency in docker container |
| if ! docker exec -it yunikorn-site-local /bin/bash -c "yarn install"; then |
| echo "yarn install failed" |
| return 1 |
| fi |
| |
| # install dependency in docker container |
| if ! docker exec -it yunikorn-site-local /bin/bash -c "yarn add @docusaurus/theme-search-algolia"; then |
| echo "yarn add failed" |
| return 1 |
| fi |
| return 0 |
| } |
| |
| function run_web() { |
| while true; do |
| web |
| RET=$? |
| [ ${RET} -ne 2 ] && return ${RET} |
| read -r -p "locale for website: " LOCALE |
| LOCALE="${LOCALE:-en}" |
| done |
| } |
| |
| function run_build() { |
| # run build inside the container |
| if ! docker exec -it yunikorn-site-local /bin/bash -c "yarn build"; then |
| echo "yarn build failed" |
| return 1 |
| fi |
| return 0 |
| } |
| |
| function print_usage() { |
| cat <<EOF |
| Usage: $(basename "$0") run [locale] | build | clean | help |
| run build the website, and launch the server in a docker image. |
| a locale can be specified, currently supported: "en", "zh-cn" |
| build create a production build, input for manual update of the website. |
| clean remove old build and cached files. |
| help print this message. |
| |
| Description: |
| This command builds and launches the website server inside a docker image, |
| the server is built with the latest content from this repo. When changes are |
| made in this directory, the site will be automatically rebuild. The server |
| will be automatically refreshed. Be aware that some of the changes require |
| the server to be restarted. |
| Use ctrl-\ to restart, allowing a locale change (SIGQUIT). |
| Use ctrl-c to exit (SIGINT). |
| |
| This script must be run from the top directory of the repository. |
| EOF |
| } |
| |
| if [ $# -eq 0 ] || [ $# -gt 2 ] || [ ! -f ./docusaurus.config.js ]; then |
| print_usage |
| exit 1 |
| fi |
| RUNOPT=$1 |
| if [ "${RUNOPT}" == "run" ]; then |
| LOCALE=en |
| if [ $# -eq 2 ]; then |
| LOCALE=$2 |
| fi |
| stop |
| node_version |
| image_build |
| [ $? -eq 1 ] && echo "image build failed" && exit 1 |
| run_base |
| [ $? -eq 1 ] && echo "base run failed, leaving docker image" && exit 1 |
| run_web |
| [ $? -eq 1 ] && echo "web run failed, leaving docker image" && exit 1 |
| stop |
| elif [ "${RUNOPT}" == "build" ]; then |
| stop |
| node_version |
| image_build |
| [ $? -eq 1 ] && echo "image build failed" && exit 1 |
| run_base |
| [ $? -eq 1 ] && echo "base run failed, leaving docker image" && exit 1 |
| run_build |
| [ $? -eq 1 ] && echo "build failed, leaving docker image" && exit 1 |
| stop |
| elif [ "${RUNOPT}" == "clean" ]; then |
| clean |
| else |
| print_usage |
| fi |