summaryrefslogtreecommitdiff
path: root/ci
diff options
context:
space:
mode:
Diffstat (limited to 'ci')
-rwxr-xr-xci/install-dependencies.sh8
-rwxr-xr-xci/lib-travisci.sh103
-rwxr-xr-xci/print-test-failures.sh9
-rwxr-xr-xci/run-linux32-build.sh3
-rwxr-xr-xci/run-linux32-docker.sh5
-rwxr-xr-xci/run-static-analysis.sh2
-rwxr-xr-xci/run-tests.sh5
-rwxr-xr-xci/run-windows-build.sh7
-rwxr-xr-xci/test-documentation.sh8
9 files changed, 137 insertions, 13 deletions
diff --git a/ci/install-dependencies.sh b/ci/install-dependencies.sh
index 5bd06fe900..75a9fd2475 100755
--- a/ci/install-dependencies.sh
+++ b/ci/install-dependencies.sh
@@ -8,10 +8,8 @@
P4WHENCE=http://filehost.perforce.com/perforce/r$LINUX_P4_VERSION
LFSWHENCE=https://github.com/github/git-lfs/releases/download/v$LINUX_GIT_LFS_VERSION
-case "${TRAVIS_OS_NAME:-linux}" in
-linux)
- export GIT_TEST_HTTPD=YesPlease
-
+case "$jobname" in
+linux-clang|linux-gcc)
mkdir --parents "$P4_PATH"
pushd "$P4_PATH"
wget --quiet "$P4WHENCE/bin.linux26x86_64/p4d"
@@ -26,7 +24,7 @@ linux)
cp git-lfs-$LINUX_GIT_LFS_VERSION/git-lfs .
popd
;;
-osx)
+osx-clang|osx-gcc)
brew update --quiet
# Uncomment this if you want to run perf tests:
# brew install gnu-time
diff --git a/ci/lib-travisci.sh b/ci/lib-travisci.sh
index ac05f1f469..07f27c7270 100755
--- a/ci/lib-travisci.sh
+++ b/ci/lib-travisci.sh
@@ -16,21 +16,110 @@ skip_branch_tip_with_tag () {
if TAG=$(git describe --exact-match "$TRAVIS_BRANCH" 2>/dev/null) &&
test "$TAG" != "$TRAVIS_BRANCH"
then
- echo "Tip of $TRAVIS_BRANCH is exactly at $TAG"
+ echo "$(tput setaf 2)Tip of $TRAVIS_BRANCH is exactly at $TAG$(tput sgr0)"
exit 0
fi
}
+good_trees_file="$HOME/travis-cache/good-trees"
+
+# Save some info about the current commit's tree, so we can skip the build
+# job if we encounter the same tree again and can provide a useful info
+# message.
+save_good_tree () {
+ echo "$(git rev-parse $TRAVIS_COMMIT^{tree}) $TRAVIS_COMMIT $TRAVIS_JOB_NUMBER $TRAVIS_JOB_ID" >>"$good_trees_file"
+ # limit the file size
+ tail -1000 "$good_trees_file" >"$good_trees_file".tmp
+ mv "$good_trees_file".tmp "$good_trees_file"
+}
+
+# Skip the build job if the same tree has already been built and tested
+# successfully before (e.g. because the branch got rebased, changing only
+# the commit messages).
+skip_good_tree () {
+ if ! good_tree_info="$(grep "^$(git rev-parse $TRAVIS_COMMIT^{tree}) " "$good_trees_file")"
+ then
+ # Haven't seen this tree yet, or no cached good trees file yet.
+ # Continue the build job.
+ return
+ fi
+
+ echo "$good_tree_info" | {
+ read tree prev_good_commit prev_good_job_number prev_good_job_id
+
+ if test "$TRAVIS_JOB_ID" = "$prev_good_job_id"
+ then
+ cat <<-EOF
+ $(tput setaf 2)Skipping build job for commit $TRAVIS_COMMIT.$(tput sgr0)
+ This commit has already been built and tested successfully by this build job.
+ To force a re-build delete the branch's cache and then hit 'Restart job'.
+ EOF
+ else
+ cat <<-EOF
+ $(tput setaf 2)Skipping build job for commit $TRAVIS_COMMIT.$(tput sgr0)
+ This commit's tree has already been built and tested successfully in build job $prev_good_job_number for commit $prev_good_commit.
+ The log of that build job is available at https://travis-ci.org/$TRAVIS_REPO_SLUG/jobs/$prev_good_job_id
+ To force a re-build delete the branch's cache and then hit 'Restart job'.
+ EOF
+ fi
+ }
+
+ exit 0
+}
+
+check_unignored_build_artifacts ()
+{
+ ! git ls-files --other --exclude-standard --error-unmatch \
+ -- ':/*' 2>/dev/null ||
+ {
+ echo "$(tput setaf 1)error: found unignored build artifacts$(tput sgr0)"
+ false
+ }
+}
+
# Set 'exit on error' for all CI scripts to let the caller know that
-# something went wrong
-set -e
+# something went wrong.
+# Set tracing executed commands, primarily setting environment variables
+# and installing dependencies.
+set -ex
+
+mkdir -p "$HOME/travis-cache"
skip_branch_tip_with_tag
+skip_good_tree
+
+if test -z "$jobname"
+then
+ jobname="$TRAVIS_OS_NAME-$CC"
+fi
+
+export DEVELOPER=1
+export DEFAULT_TEST_TARGET=prove
+export GIT_PROVE_OPTS="--timer --jobs 3 --state=failed,slow,save"
+export GIT_TEST_OPTS="--verbose-log"
+export GIT_TEST_CLONE_2GB=YesPlease
-case "${TRAVIS_OS_NAME:-linux}" in
-linux)
- P4_PATH="$(pwd)/custom/p4"
- GIT_LFS_PATH="$(pwd)/custom/git-lfs"
+case "$jobname" in
+linux-clang|linux-gcc)
+ export GIT_TEST_HTTPD=YesPlease
+
+ # The Linux build installs the defined dependency versions below.
+ # The OS X build installs the latest available versions. Keep that
+ # in mind when you encounter a broken OS X build!
+ export LINUX_P4_VERSION="16.2"
+ export LINUX_GIT_LFS_VERSION="1.5.2"
+
+ P4_PATH="$HOME/custom/p4"
+ GIT_LFS_PATH="$HOME/custom/git-lfs"
export PATH="$GIT_LFS_PATH:$P4_PATH:$PATH"
;;
+osx-clang|osx-gcc)
+ # t9810 occasionally fails on Travis CI OS X
+ # t9816 occasionally fails with "TAP out of sequence errors" on
+ # Travis CI OS X
+ export GIT_SKIP_TESTS="t9810 t9816"
+ ;;
+GETTEXT_POISON)
+ export GETTEXT_POISON=YesPlease
+ ;;
esac
diff --git a/ci/print-test-failures.sh b/ci/print-test-failures.sh
index 8c8973cbf3..4f261ddc01 100755
--- a/ci/print-test-failures.sh
+++ b/ci/print-test-failures.sh
@@ -5,6 +5,15 @@
. ${0%/*}/lib-travisci.sh
+# Tracing executed commands would produce too much noise in the loop below.
+set +x
+
+if ! ls t/test-results/*.exit >/dev/null 2>/dev/null
+then
+ echo "Build job failed before the tests could have been run"
+ exit
+fi
+
for TEST_EXIT in t/test-results/*.exit
do
if [ "$(cat "$TEST_EXIT")" != "0" ]
diff --git a/ci/run-linux32-build.sh b/ci/run-linux32-build.sh
index e30fb2cddc..c19c50c1c9 100755
--- a/ci/run-linux32-build.sh
+++ b/ci/run-linux32-build.sh
@@ -6,6 +6,8 @@
# run-linux32-build.sh [host-user-id]
#
+set -x
+
# Update packages to the latest available versions
linux32 --32bit i386 sh -c '
apt update >/dev/null &&
@@ -25,6 +27,7 @@ test -z $HOST_UID || (CI_USER="ci" && useradd -u $HOST_UID $CI_USER) &&
# Build and test
linux32 --32bit i386 su -m -l $CI_USER -c '
cd /usr/src/git &&
+ ln -s /tmp/travis-cache/.prove t/.prove &&
make --jobs=2 &&
make --quiet test
'
diff --git a/ci/run-linux32-docker.sh b/ci/run-linux32-docker.sh
index 0edf63acfa..4f191c5bb1 100755
--- a/ci/run-linux32-docker.sh
+++ b/ci/run-linux32-docker.sh
@@ -19,5 +19,10 @@ docker run \
--env GIT_TEST_OPTS \
--env GIT_TEST_CLONE_2GB \
--volume "${PWD}:/usr/src/git" \
+ --volume "${HOME}/travis-cache:/tmp/travis-cache" \
daald/ubuntu32:xenial \
/usr/src/git/ci/run-linux32-build.sh $(id -u $USER)
+
+check_unignored_build_artifacts
+
+save_good_tree
diff --git a/ci/run-static-analysis.sh b/ci/run-static-analysis.sh
index 68dd0f080e..fe4ee4e06b 100755
--- a/ci/run-static-analysis.sh
+++ b/ci/run-static-analysis.sh
@@ -6,3 +6,5 @@
. ${0%/*}/lib-travisci.sh
make coccicheck
+
+save_good_tree
diff --git a/ci/run-tests.sh b/ci/run-tests.sh
index f0c743de94..22355f0091 100755
--- a/ci/run-tests.sh
+++ b/ci/run-tests.sh
@@ -5,6 +5,9 @@
. ${0%/*}/lib-travisci.sh
-mkdir -p $HOME/travis-cache
ln -s $HOME/travis-cache/.prove t/.prove
make --quiet test
+
+check_unignored_build_artifacts
+
+save_good_tree
diff --git a/ci/run-windows-build.sh b/ci/run-windows-build.sh
index 8757b3a97c..d99a180e52 100755
--- a/ci/run-windows-build.sh
+++ b/ci/run-windows-build.sh
@@ -69,6 +69,10 @@ esac
echo "Visual Studio Team Services Build #${BUILD_ID}"
+# Tracing execued commands would produce too much noise in the waiting
+# loop below.
+set +x
+
# Wait until build job finished
STATUS=
RESULT=
@@ -90,7 +94,10 @@ done
# Print log
echo ""
echo ""
+set -x
gfwci "action=log&buildId=$BUILD_ID" | cut -c 30-
# Set exit code for TravisCI
test "$RESULT" = "success"
+
+save_good_tree
diff --git a/ci/test-documentation.sh b/ci/test-documentation.sh
index 7a0a848e83..a20de9ca12 100755
--- a/ci/test-documentation.sh
+++ b/ci/test-documentation.sh
@@ -18,6 +18,9 @@ test -s Documentation/git.xml
test -s Documentation/git.1
grep '<meta name="generator" content="AsciiDoc ' Documentation/git.html
+rm -f stdout.log stderr.log
+check_unignored_build_artifacts
+
# Build docs with AsciiDoctor
make clean
make --jobs=2 USE_ASCIIDOCTOR=1 doc > >(tee stdout.log) 2> >(tee stderr.log >&2)
@@ -25,3 +28,8 @@ sed '/^GIT_VERSION = / d' stderr.log
! test -s stderr.log
test -s Documentation/git.html
grep '<meta name="generator" content="Asciidoctor ' Documentation/git.html
+
+rm -f stdout.log stderr.log
+check_unignored_build_artifacts
+
+save_good_tree