| #!/usr/bin/env bash |
| # |
| # Copyright 2015 The Bazel Authors. All rights reserved. |
| # |
| # 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. |
| |
| |
| # This script looks at the files changed in git against origin/master |
| # (actually a common ancestor of origin/master and the current commit) and |
| # queries for all build and test targets associated with those files. |
| # |
| # Running this script on a CI server should allow you to only test the targets |
| # that have changed since the last time your merged or fast forwarded. |
| # |
| # This script can be used to recreate the benefits that TAP provides to |
| # Google's developers as describe by Mike Bland on his article on Google's |
| # infrastructure. |
| # https://mike-bland.com/2012/10/01/tools.html#tools-tap-sponge |
| # |
| # "Every single change submitted to Google's Perforce depot is built and |
| # tested, and only those targets affected by a particular change are |
| # built and tested" |
| # |
| # When this script is triggered by Gerrit's patchset-updated hook (for example) |
| # you can replace origin/master in the COMMIT_RANGE variable initialization |
| # with the branch passed as argument to the hook. When using Jenkins with the |
| # Gerrit Trigger Plugin, use $GERRIT_BRANCH instead. This would make it |
| # possible to have the Verified label on Gerrit patchsets populated as fast |
| # as possible. |
| # For a ref-updated event, use "${GERRIT_OLDREV}..${GERRIT_NEWREV}" as the |
| # value for COMMIT_RANGE. |
| # When running in Travis-CI, you can directly use the $TRAVIS_COMMIT_RANGE |
| # environment variable. |
| |
| set -eu |
| |
| MAIN_BRANCH=$(git symbolic-ref --short refs/remotes/origin/HEAD) |
| |
| COMMIT_RANGE=${COMMIT_RANGE:-$(git merge-base ${MAIN_BRANCH} HEAD)".."} |
| |
| # Go to the root of the repo |
| cd "$(git rev-parse --show-toplevel)" |
| |
| # Get a list of the current files in package form by querying Bazel. |
| files=() |
| for file in $(git diff --name-only "${COMMIT_RANGE}" ); do |
| files+=("$(bazel query "$file")") |
| bazel query "$file" |
| done |
| |
| # Query for the associated buildables |
| buildables=$(bazel query \ |
| --keep_going \ |
| --noshow_progress \ |
| "kind(.*_binary, rdeps(//..., set(${files[*]})))") |
| # Run the tests if there were results |
| if [[ ! -z $buildables ]]; then |
| echo "Building binaries" |
| bazel build "$buildables" |
| fi |
| |
| tests=$(bazel query \ |
| --keep_going \ |
| --noshow_progress \ |
| "kind(test, rdeps(//..., set(${files[*]}))) except attr('tags', 'manual', //...)") |
| # Run the tests if there were results |
| if [[ ! -z $tests ]]; then |
| echo "Running tests" |
| bazel test "$tests" |
| fi |