angular-cn/integration/run_tests.sh
George Kalpakas 3f68377c3d ci: check versions of non-local integration project dependencies (#33968)
In order to keep integration tests on CI as determinitstic as possible,
we need to ensure that the same dependencies (including transitive ones)
are installed each time. One way to ensure that is using a lockfile
(such as `yarn.lock`) to pin the dependencies to exact versions. This
works as long as the lockfile itself is in-sync with the corresponding
`package.json`, which specifies the dependencies.

Ideally, we would run `yarn install` with the `--frozen-lockfile` option
to verify that the lockfile is in-sync with `package.json`, but we
cannot do that for integration projects, because we want to be able to
install the locally built Angular packages). Therefore, we must manually
esnure that the integration project lockfiles remain in-sync, which is
error-prone.

This commit introduces a helper script that performs some checks on each
project's (non-local) dependencies:
- Ensure that exact versions (not version ranges) are specified in
  `package.json`. This reduces the probability of installing a breaking
  version of a direct or transitive dependency, in case of an
  out-of-sync lockfile.
- Ensure that the lockfile is in-sync with `package.json` wrt these
  dependencies.

While these checks are not full-proof, they provide yet another line of
defense against indeterminism.

PR Close #33968
2019-11-26 16:08:33 -08:00

83 lines
2.8 KiB
Bash
Executable File

#!/usr/bin/env bash
set -u -e -o pipefail
# see https://circleci.com/docs/2.0/env-vars/#circleci-built-in-environment-variables
CI=${CI:-false}
cd "$(dirname "$0")"
# basedir is the workspace root
readonly basedir=$(pwd)/..
readonly bazel_bin=$(yarn bin)/bazel
# When running on the CI, we track the payload size of various integration output files. Also
# we shard tests across multiple CI job instances. The script needs to be run with a shard index
# and the maximum amount of shards available for the integration tests on the CI.
# For example: "./run_tests.sh {SHARD_INDEX} {MAX_SHARDS}".
if $CI; then
source ${basedir}/scripts/ci/payload-size.sh
SHARD_INDEX=${1:?"No shard index has been specified."}
MAX_SHARDS=${2:?"The maximum amount of shards has not been specified."}
# Determines the tests that need to be run for this shard index.
TEST_DIRS=$(node ./get-sharded-tests.js --shardIndex ${SHARD_INDEX} --maxShards ${MAX_SHARDS})
# NB: we don't run build-packages-dist.js because we expect that it was done
# by an earlier job in the CircleCI workflow.
else
# Not on CircleCI so let's build the packages-dist directory.
# This should be fast on incremental re-build.
node ${basedir}/scripts/build-packages-dist.js
# If we aren't running on CircleCI, we do not shard tests because this would be the job of
# Bazel eventually. For now, we just run all tests sequentially when running locally.
TEST_DIRS=$(ls | grep -v node_modules)
fi
# Workaround https://github.com/yarnpkg/yarn/issues/2165
# Yarn will cache file://dist URIs and not update Angular code
readonly cache=.yarn_local_cache
function rm_cache {
rm -rf $cache
}
rm_cache
mkdir $cache
trap rm_cache EXIT
for testDir in ${TEST_DIRS}; do
[[ -d "$testDir" ]] || continue
echo "#################################"
echo "Running integration test $testDir"
echo "#################################"
(
cd $testDir
rm -rf dist
# Ensure the versions of (non-local) dependencies are exact versions (not version ranges) and
# in-sync between `package.json` and the lockfile.
# (NOTE: This must be run before `yarn install`, which updates the lockfile.)
node ../check-dependencies .
yarn install --cache-folder ../$cache
yarn test || exit 1
# Track payload size for cli-hello-world* tests, plus hello_world__closure
if $CI && ([[ $testDir =~ cli-hello-world ]] || [[ $testDir == hello_world__closure ]]); then
if ([[ $testDir =~ cli-hello-world ]]); then
yarn build
fi
trackPayloadSize "$testDir" "dist/*.js" true "${basedir}/integration/_payload-limits.json"
fi
# remove the temporary node modules directory to keep the source folder clean.
rm -rf node_modules
)
done
if $CI && [[ "$SHARD_INDEX" == "0" ]]; then
trackPayloadSize "umd" "../dist/packages-dist/*/bundles/*.umd.min.js" false
fi