spiegel-keyman/web/ci.sh
Eberhard Beilharz 07e62e9fe2
chore(android): upload webview source map during android and ios build
Previously we uploaded the webview source map during a web build. This
can lead to problems because that is not the actual artifact used for
Android and iOS.

This change therefore moves uploading the webview source map to Sentry
to the android and ios builds.

Build-bot: skip build:web,android,ios
Test-bot: skip
2026-08-27 18:57:18 +02:00

180 lines
6.7 KiB
Bash
Executable file

#!/usr/bin/env bash
#
# Provides a platform-independent implementation of the build steps used for CI when
# building the Keyman Engine for Web.
#
# TODO: merge this with resources/teamcity/web scripts
## START STANDARD BUILD SCRIPT INCLUDE
# adjust relative paths as necessary
THIS_SCRIPT="$(readlink -f "${BASH_SOURCE[0]}")"
. "${THIS_SCRIPT%/*}/../resources/build/builder-basic.inc.sh"
## END STANDARD BUILD SCRIPT INCLUDE
. "${KEYMAN_ROOT}/resources/build/utils.inc.sh"
. "${KEYMAN_ROOT}/resources/build/zip.inc.sh"
. "${KEYMAN_ROOT}/resources/build/ci/pull-requests.inc.sh"
. "${KEYMAN_ROOT}/resources/build/ci/sentry-control.inc.sh"
# This script runs from its own folder
cd "${THIS_SCRIPT_PATH}"
# ################################ Main script ################################
S_KEYMAN_COM=
builder_describe "CI processes for Keyman Engine for Web releases (KMW)." \
"@/common/web/sentry-manager" \
"@/web/src/tools/building/sourcemap-root prepare:s.keyman.com" \
"build" \
"test Runs all unit tests" \
"post-test Runs post-test cleanup. Should be run even if a prior step fails" \
"validate-size Runs the build-size comparison check" \
"prepare Prepare upload artifacts for specified target(s)" \
":s.keyman.com Builds artifacts for s.keyman.com" \
":downloads.keyman.com Builds artifacts for downloads.keyman.com" \
"--s.keyman.com=S_KEYMAN_COM Sets the root location of a checked-out s.keyman.com repo"
builder_parse "$@"
####
KEYMAN_TIER=$(cat ../TIER.md)
BUILD_NUMBER=$(cat ../VERSION.md)
function build_action() {
# Build step: since CI builds start (and should start) from scratch, run the following
# three actions:
# - configure: retrieve all NPM dependencies
# - clean: make extra-sure that no prior build products exist.
# - also useful when validating this script on a local dev machine!
# - build: then do the ACTUAL build.
# one option:
builder_launch /web/build.sh configure clean build
if builder_is_ci_build && builder_is_ci_build_level_release; then
# Upload the sentry-configuration engine used by the mobile apps to sentry
# Also, clean 'em first.
for sourcemap in "${KEYMAN_ROOT}/common/web/sentry-manager/build/lib/"*.map; do
node "${KEYMAN_ROOT}/web/build/tools/building/sourcemap-root/index.js" null "${sourcemap}" --clean
done
sentry_upload_web "${KEYMAN_ROOT}/common/web/sentry-manager/build/lib/"
# And, of course, the main build-products too
sentry_upload_web "${KEYMAN_ROOT}/web/build/publish/release/"
fi
}
function test_action() {
builder_launch /web/build.sh test
}
function post_test_action() {
# Always make sure BrowserStack stuff is terminated after the test step.
# Even if it fails and/or hangs.
# No matter what. Otherwise, it may leave a lock-file that breaks a later build!
../common/test/resources/test_kill_browserstack.sh
}
function validate_size_action() {
# Performs the web build product size check as reported on Web test PRs.
FLAGS=
if ! builder_is_debug_build; then
FLAGS=--write-status
fi
# Do not use --report when in --debug mode; it sets an error code that is VERY difficult to
# catch with our set -e & `trap` setup.
./src/tools/building/check-build-size.sh $FLAGS
}
function prepare_s_keyman_com_action() {
if ! builder_has_option --s.keyman.com; then
builder_die "--s.keyman.com is unset!"
fi
if builder_is_debug_build; then
# First phase: make sure the s.keyman.com repo is locally-available and up to date.
pushd "${S_KEYMAN_COM}"
# For testing on a local development machine / a machine with the repo already loaded.
git checkout master
git pull
popd
fi
# Second phase: copy the artifacts over
# The main build products are expected to reside at the root of this folder.
BASE_PUBLISH_FOLDER="${S_KEYMAN_COM}/kmw/engine/${KEYMAN_VERSION}"
echo "FOLDER: ${BASE_PUBLISH_FOLDER}"
mkdir -p "${BASE_PUBLISH_FOLDER}"
# s.keyman.com - release-config only. It's notably smaller, thus far more favorable
# for distribution via cloud service.
cp -Rf build/publish/release/* "${BASE_PUBLISH_FOLDER}"
# Third phase: tweak the sourcemaps
# We can use an alt-mode of Web's sourcemap-root tool for this.
for sourcemap in "${BASE_PUBLISH_FOLDER}/"*.map; do
node "${KEYMAN_ROOT}/web/build/tools/building/sourcemap-root/index.js" null "${sourcemap}" --sourceRoot "https://s.keyman.com/kmw/engine/${KEYMAN_VERSION}/src"
done
# Construct the PR
echo "Committing and pushing KeymanWeb release ${KEYMAN_VERSION} to s.keyman.com"
ci_add_files "${S_KEYMAN_COM}" "kmw/engine/${KEYMAN_VERSION}"
if ! ci_repo_has_cached_changes "${S_KEYMAN_COM}"; then
builder_die "No release was added to s.keyman.com, something went wrong"
fi
ci_open_pull_request "${S_KEYMAN_COM}" auto/keymanweb/release "auto: KeymanWeb release ${KEYMAN_VERSION}"
}
# Note: for now, this command is used to prepare the artifacts used by the download site, but
# NOT to actually UPLOAD them via rsync or to produce related .download_info files.
function prepare_downloads_keyman_com_action() {
UPLOAD_PATH="${KEYMAN_ROOT}/web/build/upload/${KEYMAN_VERSION}"
# --- First action artifact - the KMW zip file ---
ZIP="${UPLOAD_PATH}/keymanweb-${KEYMAN_VERSION}.zip"
mkdir -p "${UPLOAD_PATH}"
(
# shellcheck disable=2164
cd build/publish
# Zip both the 'debug' and 'release' configurations together.
add_zip_files -q -r "${ZIP}" ./*
)
# --- Second action artifact - the 'static' folder (hosted user testing on downloads.keyman.com) ---
echo ""
echo "Building \`static/\` folder for long-term hosting of testing resources..."
STATIC="${UPLOAD_PATH}/static"
mkdir -p "${STATIC}"
mkdir -p "${STATIC}/build"
cp -rf build/app "${STATIC}/build/app"
cp -rf build/engine "${STATIC}/build/engine"
cp -rf build/publish "${STATIC}/build/publish"
cp -rf build/tools "${STATIC}/build/tools"
# avoid build/upload, since that's the folder we're building!
cp -f index.html "${STATIC}/index.html"
mkdir -p "${STATIC}/src/tools"
cp -rf src/tools/testing "${STATIC}/src/tools/testing"
cp -rf src/test "${STATIC}/src/test"
cp -rf src/samples "${STATIC}/src/samples"
}
builder_run_action build build_action
builder_run_action test test_action
builder_run_action post-test post_test_action
builder_run_action validate-size validate_size_action
builder_run_action prepare:s.keyman.com prepare_s_keyman_com_action
builder_run_action prepare:downloads.keyman.com prepare_downloads_keyman_com_action