diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3f253fd1273a..9d2c4647a182 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,33 @@
+
+## 7.0.3 "lyrium-longboard" (2018-11-06)
+
+
+### Bug Fixes
+
+* **breakpoints:** set max-widths for breakpoints to non-integers to handle subpixel queries ([#13828](https://github.com/angular/material2/issues/13828)) ([b88b79d](https://github.com/angular/material2/commit/b88b79d))
+* **button:** stroked button crops applied badges ([#13912](https://github.com/angular/material2/issues/13912)) ([835dc9e](https://github.com/angular/material2/commit/835dc9e)), closes [#13909](https://github.com/angular/material2/issues/13909)
+* **button-toggle:** remove hover state on touch devices ([#13724](https://github.com/angular/material2/issues/13724)) ([f9d5fb4](https://github.com/angular/material2/commit/f9d5fb4))
+* **chips:** remove circular dependency between chip-list and chip-input ([#13994](https://github.com/angular/material2/issues/13994)) ([3da858d](https://github.com/angular/material2/commit/3da858d))
+* **dialog,bottom-sheet:** enter animation blocking child animations ([#13888](https://github.com/angular/material2/issues/13888)) ([e5afa48](https://github.com/angular/material2/commit/e5afa48)), closes [#13870](https://github.com/angular/material2/issues/13870)
+* **drag-drop:** drop list not toggling dragging class inside component with OnPush change detection ([#13703](https://github.com/angular/material2/issues/13703)) ([4e50d4a](https://github.com/angular/material2/commit/4e50d4a)), closes [#13680](https://github.com/angular/material2/issues/13680)
+* **drag-drop:** incorrectly laying out items with different height or margins ([#13849](https://github.com/angular/material2/issues/13849)) ([c509591](https://github.com/angular/material2/commit/c509591)), closes [#13483](https://github.com/angular/material2/issues/13483)
+* **drag-drop:** multiple parallel drag sequences when dragging nested drag items ([#13820](https://github.com/angular/material2/issues/13820)) ([cdc0c8b](https://github.com/angular/material2/commit/cdc0c8b))
+* **list:** add ripples to action list items ([#13799](https://github.com/angular/material2/issues/13799)) ([b293655](https://github.com/angular/material2/commit/b293655)), closes [#13795](https://github.com/angular/material2/issues/13795)
+* **list:** remove disabled selection list hover feedback on mobile ([#13850](https://github.com/angular/material2/issues/13850)) ([e975223](https://github.com/angular/material2/commit/e975223))
+* **menu:** unable to swap menu panel after first open ([#13819](https://github.com/angular/material2/issues/13819)) ([cbb76ec](https://github.com/angular/material2/commit/cbb76ec)), closes [#13812](https://github.com/angular/material2/issues/13812)
+* **ng-update:** do not fail if [@schematics](https://github.com/schematics)/angular version is outdated ([#13929](https://github.com/angular/material2/issues/13929)) ([f10f8b9](https://github.com/angular/material2/commit/f10f8b9))
+* **ng-update:** do not throw if typescript version is outdated ([#13927](https://github.com/angular/material2/issues/13927)) ([d44fcf8](https://github.com/angular/material2/commit/d44fcf8))
+* **portal:** use portal's ComponentFactoryResolver in portal outlet directive ([#13886](https://github.com/angular/material2/issues/13886)) ([d2af80b](https://github.com/angular/material2/commit/d2af80b)), closes [#12677](https://github.com/angular/material2/issues/12677) [#9712](https://github.com/angular/material2/issues/9712)
+* **snack-bar:** set appropriate role based on passed in politeness ([#13864](https://github.com/angular/material2/issues/13864)) ([33d3cb3](https://github.com/angular/material2/commit/33d3cb3)), closes [#13493](https://github.com/angular/material2/issues/13493)
+* **snackbar:** override min-width of snackbar on mobile ([#13880](https://github.com/angular/material2/issues/13880)) ([41cb8aa](https://github.com/angular/material2/commit/41cb8aa))
+* **stepper:** don't handle enter/space when modifier key is pressed ([#13827](https://github.com/angular/material2/issues/13827)) ([0bd3890](https://github.com/angular/material2/commit/0bd3890)), closes [#13790](https://github.com/angular/material2/issues/13790)
+* **tabs:** duplicate animation events on some browsers ([#13674](https://github.com/angular/material2/issues/13674)) ([7106681](https://github.com/angular/material2/commit/7106681))
+* **tabs:** mat-align-tabs not working on mat-tab-nav-bar ([#13818](https://github.com/angular/material2/issues/13818)) ([2289e43](https://github.com/angular/material2/commit/2289e43)), closes [#13798](https://github.com/angular/material2/issues/13798)
+* **virtual-scroll:** not removing view from container if it's outside the template cache ([#13916](https://github.com/angular/material2/issues/13916)) ([7c202ec](https://github.com/angular/material2/commit/7c202ec)), closes [#13901](https://github.com/angular/material2/issues/13901)
+* bazel support for downstream apps ([#13836](https://github.com/angular/material2/issues/13836)) ([61dbd26](https://github.com/angular/material2/commit/61dbd26))
+
+
+
## 7.0.2 limestone-linguine (2018-10-26)
diff --git a/package.json b/package.json
index 127086bba3fa..1d15f52010e2 100644
--- a/package.json
+++ b/package.json
@@ -26,7 +26,7 @@
"gulp": "gulp",
"stage-release": "bash ./tools/release/stage-release-bin.sh"
},
- "version": "7.0.2",
+ "version": "7.0.3",
"requiredAngularVersion": ">=7.0.0",
"dependencies": {
"@angular/animations": "^7.0.2",
diff --git a/scripts/browserstack/stop-tunnel.sh b/scripts/browserstack/stop-tunnel.sh
index f95970de9f63..2f19808b3b47 100755
--- a/scripts/browserstack/stop-tunnel.sh
+++ b/scripts/browserstack/stop-tunnel.sh
@@ -2,15 +2,27 @@
set -e -o pipefail
+tunnelTmpDir="/tmp/material-browserstack"
+tunnelReadyFile="${tunnelTmpDir}/readyfile"
-echo "Shutting down Browserstack tunnel"
+if [[ ! -f ${tunnelReadyFile} ]]; then
+ echo "BrowserStack tunnel has not been started. Cannot stop tunnel.."
+ exit 1
+fi
-killall BrowserStackLocal
+echo "Shutting down Browserstack tunnel.."
-while [[ -n `ps -ef | grep "BrowserStackLocal" | grep -v "grep"` ]]; do
+# The process id for the BrowserStack local instance is stored inside of the readyfile.
+tunnelProcessId=$(cat ${tunnelReadyFile})
+
+# Kill the process by using the PID that has been read from the readyfile. Note that
+# we cannot use killall because CircleCI base container images don't have it installed.
+kill ${tunnelProcessId}
+
+while (ps -p ${tunnelProcessId} &> /dev/null); do
printf "."
sleep .5
done
echo ""
-echo "Browserstack tunnel has been shut down"
\ No newline at end of file
+echo "Browserstack tunnel has been shut down"
diff --git a/scripts/browserstack/wait-tunnel.sh b/scripts/browserstack/wait-tunnel.sh
index 6b1aaa112bdc..6a7e845b31a1 100755
--- a/scripts/browserstack/wait-tunnel.sh
+++ b/scripts/browserstack/wait-tunnel.sh
@@ -1,13 +1,17 @@
#!/bin/bash
-TUNNEL_LOG="$LOGS_DIR/browserstack-tunnel.log"
+tunnelTmpDir="/tmp/material-browserstack"
+tunnelLogFile="${tunnelTmpDir}/browserstack-local.log"
+tunnelReadyFile="${tunnelTmpDir}/readyfile"
+tunnelErrorFile="${tunnelTmpDir}/errorfile"
+
WAIT_DELAY=30
# Method that prints the logfile output of the browserstack tunnel.
printLog() {
- echo "Logfile output of Browserstack tunnel (${TUNNEL_LOG}):"
+ echo "Logfile output of Browserstack tunnel (${tunnelLogFile}):"
echo ""
- cat ${TUNNEL_LOG}
+ cat ${tunnelLogFile}
}
# Wait for Connect to be ready before exiting
@@ -15,14 +19,14 @@ printLog() {
let "counter=0"
# Exit the process if there are errors reported. Print the tunnel log to the console.
-if [ -f $BROWSER_PROVIDER_ERROR_FILE ]; then
+if [ -f ${tunnelErrorFile} ]; then
echo
echo "An error occurred while starting the tunnel. See error:"
printLog
exit 5
fi
-while [ ! -f $BROWSER_PROVIDER_READY_FILE ]; do
+while [ ! -f ${tunnelReadyFile} ]; do
let "counter++"
# Counter needs to be multiplied by two because the while loop only sleeps a half second.
diff --git a/scripts/circleci/run-browserstack-tests.sh b/scripts/circleci/run-browserstack-tests.sh
new file mode 100755
index 000000000000..55f4309ef195
--- /dev/null
+++ b/scripts/circleci/run-browserstack-tests.sh
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+# In case any command failed, we want to immediately exit the script with the
+# proper exit code.
+set -e
+
+# Go to project directory.
+cd $(dirname ${0})/../..
+
+# Decode access token and make it accessible for child processes.
+export BROWSER_STACK_ACCESS_KEY=`echo ${BROWSER_STACK_ACCESS_KEY} | rev`
+
+# Start tunnel and wait for it being ready.
+./scripts/browserstack/start-tunnel.sh
+./scripts/browserstack/wait-tunnel.sh
+
+# Setup the test platform environment variable that will be read
+# by the Karma configuration script.
+export TEST_PLATFORM="browserstack"
+
+# Run the unit tests on Browserstack with Karma.
+yarn gulp ci:test
+
+# Kill the Browserstack tunnel. This is necessary in order to avoid rate-limit
+# errors that cause the unit tests to be flaky.
+./scripts/browserstack/stop-tunnel.sh