From 66c0cb6e17ee599e52b6b6fe8e6f56d6c1302bd2 Mon Sep 17 00:00:00 2001 From: Juan Cruz Viotti Date: Wed, 15 Mar 2017 10:43:20 -0400 Subject: [PATCH] chore: automatically enforce compatible angular core module versions (#1175) We've recently had an incident were the `angular-mocks` version we were running was incompatible with the `angular` version. Each AngularJS core module is versioned equally, therefore we can write a small script that automatically tests that they match, so we're guarded against forgetting to similarly upgrade different dependencies. See: https://github.com/resin-io/etcher/pull/1168 Signed-off-by: Juan Cruz Viotti --- .travis.yml | 5 +- Makefile | 5 ++ appveyor.yml | 2 +- package.json | 2 +- .../ensure-npm-dependencies-compatibility.sh | 59 +++++++++++++++++++ 5 files changed, 68 insertions(+), 5 deletions(-) create mode 100755 scripts/ci/ensure-npm-dependencies-compatibility.sh diff --git a/.travis.yml b/.travis.yml index e47ebf1a..80a91820 100644 --- a/.travis.yml +++ b/.travis.yml @@ -49,11 +49,10 @@ install: script: - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then - npm test; - ./scripts/ci/ensure-staged-sass.sh; + make sanity-checks && npm test; fi - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then - ./scripts/build/docker/run-command.sh -r ${TARGET_ARCH} -s ${PWD} -c "xvfb-run --server-args=$XVFB_ARGS npm test && ./scripts/ci/ensure-staged-sass.sh"; + ./scripts/build/docker/run-command.sh -r ${TARGET_ARCH} -s ${PWD} -c "make sanity-checks && xvfb-run --server-args=$XVFB_ARGS npm test"; fi notifications: diff --git a/Makefile b/Makefile index b35a1975..751e1827 100644 --- a/Makefile +++ b/Makefile @@ -329,6 +329,7 @@ endif TARGETS = \ help \ info \ + sanity-checks \ clean \ distclean \ package \ @@ -423,6 +424,10 @@ info: @echo "Target platform : $(TARGET_PLATFORM)" @echo "Target arch : $(TARGET_ARCH)" +sanity-checks: + ./scripts/ci/ensure-staged-sass.sh + ./scripts/ci/ensure-npm-dependencies-compatibility.sh + clean: rm -rf $(BUILD_DIRECTORY) diff --git a/appveyor.yml b/appveyor.yml index d1f3417a..2022e76b 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -41,7 +41,7 @@ build: off test_script: - node --version - npm --version - - bash .\scripts\ci\ensure-staged-sass.sh + - make sanity-checks - cmd: npm test notifications: diff --git a/package.json b/package.json index ea071058..3ed71fa8 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ "removedrive": "^1.1.1" }, "dependencies": { - "angular": "^1.6.3", + "angular": "1.6.3", "angular-if-state": "^1.0.0", "angular-middle-ellipses": "^1.0.0", "angular-moment": "^1.0.1", diff --git a/scripts/ci/ensure-npm-dependencies-compatibility.sh b/scripts/ci/ensure-npm-dependencies-compatibility.sh new file mode 100755 index 00000000..34854c35 --- /dev/null +++ b/scripts/ci/ensure-npm-dependencies-compatibility.sh @@ -0,0 +1,59 @@ +#!/bin/bash + +### +# Copyright 2017 resin.io +# +# Licensed 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. +### + +set -u +set -e + +HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +"$HERE/../build/check-dependency.sh" jq + +PACKAGE_JSON=package.json + +# Two pair-wise arrays, because associative arrays only work in Bash 4 +PRIMARY_VERSIONS=("dependencies[\"angular\"]") +SECONDARY_VERSIONS=("devDependencies[\"angular-mocks\"]") + +function check_locked { + name=$1 + version=$2 + if [[ "$version" =~ "^\^" ]]; then + echo "Dependency: $name must be version-locked in $PACKAGE_JSON" + exit 1 + fi +} + +if [[ ${#PRIMARY_VERSIONS[@]} -ne ${#SECONDARY_VERSIONS[@]} ]]; then + echo "Lengths of PRIMARY_VERSIONS and SECONDARY_VERSIONS arrays must match" + exit 1 +fi + +for i in ${!PRIMARY_VERSIONS[@]}; do + primary=${PRIMARY_VERSIONS[$i]} + primary_version=$(jq -r ".$primary" "$PACKAGE_JSON") + check_locked "$primary" "$primary_version" + secondary=${SECONDARY_VERSIONS[$i]} + secondary_version=$(jq -r ".$secondary" "$PACKAGE_JSON") + check_locked "$secondary" "$secondary_version" + if [[ "$primary_version" != "$secondary_version" ]]; then + echo "The following dependencies must have the exact same version in $PACKAGE_JSON:" + echo " $primary" + echo " $secondary" + exit 1 + fi +done