dashboard/shell/scripts/test-plugins-build.sh

245 lines
7.0 KiB
Bash
Executable File

#!/usr/bin/env bash
set -e
echo "Checking plugin build"
SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
BASE_DIR="$( cd $SCRIPT_DIR && cd ../.. & pwd)"
SHELL_DIR=$BASE_DIR/shell/
SHELL_VERSION="99.99.99"
DEFAULT_NPM_REGISTRY="https://registry.npmjs.org/"
VERDACCIO_NPM_REGISTRY="http://localhost:4873"
echo ${SCRIPT_DIR}
SKIP_SETUP="false"
SKIP_STANDALONE="false"
if [ "$1" == "-s" ]; then
SKIP_SETUP="true"
fi
if [ $SKIP_SETUP == "false" ]; then
set +e
which verdaccio > /dev/null
RET=$?
set -e
if [ $RET -ne 0 ]; then
echo "Verdaccio not installed"
npm install -g verdaccio
fi
set +e
RUNNING=$(pgrep Verdaccio | wc -l | xargs)
set -e
if [ $RUNNING -eq 0 ]; then
verdaccio > verdaccio.log &
PID=$!
echo "Verdaccio: $PID"
sleep 10
echo "Configuring Verdaccio user"
# Remove existing admin if already there
if [ -f ~/.config/verdaccio/htpasswd ]; then
sed -i.bak -e '/^admin:/d' ~/.config/verdaccio/htpasswd
fi
curl -XPUT -H "Content-type: application/json" -d '{ "name": "admin", "password": "admin" }' 'http://localhost:4873/-/user/admin' > login.json
TOKEN=$(jq -r .token login.json)
rm login.json
cat > ~/.npmrc << EOF
//127.0.0.1:4873/:_authToken="$TOKEN"
//localhost:4873/:_authToken="$TOKEN"
EOF
else
echo "Verdaccio is already running"
fi
fi
if [ -d ~/.local/share/verdaccio/storage/@rancher ]; then
rm -rf ~/.local/share/verdaccio/storage/@rancher/*
else
rm -rf ~/.config/verdaccio/storage/@rancher/*
fi
export NPM_REGISTRY=$VERDACCIO_NPM_REGISTRY
export NUXT_TELEMETRY_DISABLED=1
# Remove test package from previous run, if present
if [ "${TEST_PERSIST_BUILD}" != "true" ]; then
echo "Removing folder ${BASE_DIR}/pkg/test-pkg"
rm -rf ${BASE_DIR}/pkg/test-pkg
fi
# We need to patch the version number of the shell, otherwise if we are running
# with the currently published version, things will fail as those versions
# are already published and Verdaccio will check, since it is a read-through cache
update_version_in_package_json() {
local package_json_path="$1"
local version="$2"
sed -i.bak -e "s/\"version\": \"[0-9]*.[0-9]*.[0-9]*\(-alpha\.[0-9]*\|-release[0-9]*.[0-9]*.[0-9]*\|-rc\.[0-9]*\)\{0,1\}\",/\"version\": \"${version}\",/g" "$package_json_path"
rm "${package_json_path}.bak"
}
update_version_in_package_json "${SHELL_DIR}/package.json" "${SHELL_VERSION}"
update_version_in_package_json "${BASE_DIR}/pkg/rancher-components/package.json" "${SHELL_VERSION}"
update_version_in_package_json "${BASE_DIR}/creators/extension/package.json" "${SHELL_VERSION}"
createTestComponent() {
# Add test list component to the test package
# Validates rancher-components imports
# Basic list instead
cp ${SHELL_DIR}/list/namespace.vue pkg/test-pkg/list
# More complex list
cp ${SHELL_DIR}/list/catalog.cattle.io.clusterrepo.vue pkg/test-pkg/list
}
# Publish shell pkg (tag is needed as publish-shell is optimized to work with release-shell-pkg workflow)
echo "Publishing Shell package to local registry"
yarn install
export TAG="shell-pkg-v${SHELL_VERSION}"
${SHELL_DIR}/scripts/publish-shell.sh
# Publish creators pkg (tag is needed as publish-shell is optimized to work with release-shell-pkg workflow)
echo "Publishing Creators package to local registry"
export TAG="creators-pkg-v${SHELL_VERSION}"
${SHELL_DIR}/scripts/publish-shell.sh
# Publish rancher components
yarn build:lib
npm set registry ${VERDACCIO_NPM_REGISTRY}
yarn config set registry ${VERDACCIO_NPM_REGISTRY}
yarn publish:lib
# We pipe into cat for cleaner logging - we need to set pipefail
# to ensure the build fails in these cases
set -o pipefail
if [ "${SKIP_STANDALONE}" == "false" ]; then
DIR=$(mktemp -d)
pushd $DIR > /dev/null
echo "Using temporary directory ${DIR}"
echo "Verifying extension creator"
FORCE_COLOR=true yarn create @rancher/extension test-pkg --app-name test-app | cat
pushd test-app > /dev/null
yarn install
# this is the "same" as doing a yarn dev (in a build sense)
# it's to make sure the dev environment is running properly
FORCE_COLOR=true yarn build | cat
# Add test list component to the test package
# Validates rancher-components imports
mkdir -p pkg/test-pkg/list
createTestComponent
FORCE_COLOR=true yarn build-pkg test-pkg | cat
echo "Cleaning temporary dir"
popd > /dev/null
if [ "${TEST_PERSIST_BUILD}" != "true" ]; then
echo "Removing folder ${DIR}"
rm -rf ${DIR}
fi
fi
pushd $BASE_DIR
# Now try a plugin within the dashboard codebase
echo "Validating in-tree package"
yarn install
if [ "${TEST_PERSIST_BUILD}" != "true" ]; then
echo "Removing folder ./pkg/test-pkg"
rm -rf ./pkg/test-pkg
fi
yarn create @rancher/extension test-pkg -i
createTestComponent
FORCE_COLOR=true yarn build-pkg test-pkg | cat
if [ "${TEST_PERSIST_BUILD}" != "true" ]; then
echo "Removing folder ./pkg/test-pkg"
rm -rf ./pkg/test-pkg
fi
# function to clone repos and install dependencies (including the newly published shell version)
function clone_repo_test_extension_build() {
REPO_ORG=$1
REPO_NAME=$2
PKG_NAME=$3
echo -e "\nSetting up $REPO_NAME repository locally\n"
# set registry to default (to install all of the other dependencies)
yarn config set registry ${DEFAULT_NPM_REGISTRY}
if [ "${TEST_PERSIST_BUILD}" != "true" ]; then
echo "Removing folder ${BASE_DIR}/$REPO_NAME"
rm -rf ${BASE_DIR}/$REPO_NAME
fi
# cloning repo
git clone https://github.com/$REPO_ORG/$REPO_NAME.git
pushd ${BASE_DIR}/$REPO_NAME
echo -e "\nInstalling dependencies for $REPO_NAME\n"
yarn install
# set registry to local verdaccio (to install new shell)
yarn config set registry ${VERDACCIO_NPM_REGISTRY}
# update package.json to use a specific version of shell
sed -i.bak -e "s/\"\@rancher\/shell\": \"[0-9]*.[0-9]*.[0-9]*\",/\"\@rancher\/shell\": \"${SHELL_VERSION}\",/g" package.json
rm package.json.bak
echo -e "\nInstalling newly built shell version\n"
# installing new version of shell
yarn add @rancher/shell@${SHELL_VERSION} -W
# test build-pkg
FORCE_COLOR=true yarn build-pkg $PKG_NAME | cat
# # kubewarden has some unit tests and they should be quick to run... Let's check them as well
# if [ "${REPO_NAME}" == "kubewarden-ui" ]; then
# yarn test:ci
# fi
# return back to the base path
popd
# delete folder
echo "Removing folder ${BASE_DIR}/$REPO_NAME"
rm -rf ${BASE_DIR}/$REPO_NAME
yarn config set registry ${DEFAULT_NPM_REGISTRY}
}
# Here we just add the extension that we want to include as a check (all our official extensions should be included here)
# Don't forget to add the unit tests exception to clone_repo_test_extension_build function if a new extension has those
clone_repo_test_extension_build "rancher" "kubewarden-ui" "kubewarden"
clone_repo_test_extension_build "rancher" "elemental-ui" "elemental"
clone_repo_test_extension_build "neuvector" "manager-ext" "neuvector-ui-ext"
clone_repo_test_extension_build "StackVista" "rancher-extension-stackstate" "observability"
clone_repo_test_extension_build "harvester" "harvester-ui-extension" "harvester"
echo "All done"