Skip to content

Commit

Permalink
travis-ci: build and test Git on Windows
Browse files Browse the repository at this point in the history
Most Git developers work on Linux and they have no way to know if their
changes would break the Git for Windows build. Let's fix that by adding
a job to TravisCI that builds and tests Git on Windows. Unfortunately,
TravisCI does not support Windows.

Therefore, we did the following:
* Johannes Schindelin set up a Visual Studio Team Services build
  sponsored by Microsoft and made it accessible via an Azure Function
  that speaks a super-simple API. We made TravisCI use this API to
  trigger a build, wait until its completion, and print the build and
  test results.
* A Windows build and test run takes up to 3h and TravisCI has a timeout
  after 50min for Open Source projects. Since the TravisCI job does not
  use heavy CPU/memory/etc. resources, the friendly TravisCI folks
  extended the job timeout for git/git to 3h.

Things, that would need to be done:
* Someone with write access to https://travis-ci.org/git/git would need
  to add the secret token as "GFW_CI_TOKEN" variable in the TravisCI
  repository setting [1]. Afterwards the build should just work.

Things, that might need to be done:
* The Windows box can only process a single build at a time. A second
  Windows build would need to wait until the first finishes. This
  waiting time and the build time after the wait could exceed the 3h
  threshold. If this is a problem, then it is likely to happen every day
  as usually multiple branches are pushed at the same time (pu/next/
  master/maint). I cannot test this as my TravisCI account has the 50min
  timeout. One solution could be to limit the number of concurrent
  TravisCI jobs [2].

[1] https://docs.travis-ci.com/user/environment-variables#Defining-Variables-in-Repository-Settings
[2] https://docs.travis-ci.com/user/customizing-the-build#Limiting-Concurrent-Builds

Signed-off-by: Lars Schneider <larsxschneider@gmail.com>
  • Loading branch information
larsxschneider committed Mar 22, 2017
1 parent afd6726 commit 322094c
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 0 deletions.
11 changes: 11 additions & 0 deletions .travis.yml
Expand Up @@ -39,6 +39,17 @@ env:

matrix:
include:
- env: Windows
os: linux
compiler:
addons:
before_install:
before_script:
script:
- >
test "$TRAVIS_REPO_SLUG" != "git/git" ||
ci/run-windows-build.sh $GFW_CI_TOKEN $TRAVIS_BRANCH $(git rev-parse HEAD)
after_failure:
- env: Linux32
os: linux
services:
Expand Down
55 changes: 55 additions & 0 deletions ci/run-windows-build.sh
@@ -0,0 +1,55 @@
#!/usr/bin/env bash
#
# Script to trigger the a Git for Windows build and test run.
# Pass a token, the branch (only branches on https://github.com/git/git)
# are supported), and a commit hash.
#

[ $# -eq 3 ] || (echo "Unexpected number of parameters" && exit 1)

TOKEN=$1
BRANCH=$2
COMMIT=$3

gfwci () {
curl \
-H "Authentication: Bearer $TOKEN" \
--silent --retry 5 \
"https://git-for-windows-ci.azurewebsites.net/api/TestNow?$1" |
sed "$(printf '1s/^\xef\xbb\xbf//')" # Remove the Byte Order Mark
}

# Trigger build job
BUILD_ID=$(gfwci "action=trigger&branch=$BRANCH&commit=$COMMIT&skipTests=false")

# Check if the $BUILD_ID contains a number
case $BUILD_ID in
''|*[!0-9]*) echo $BUILD_ID && exit 1
esac

echo "Visual Studio Team Services Build #${BUILD_ID}"

# Wait until build job finished
STATUS=
RESULT=
while true
do
LAST_STATUS=$STATUS
STATUS=$(gfwci "action=status&buildId=$BUILD_ID")
[ "$STATUS" == "$LAST_STATUS" ] || printf "\nStatus: $STATUS "
printf "."

case $STATUS in
inProgress|postponed|notStarted) sleep 10 ;; # continue
"completed: succeeded") RESULT="success"; break;; # success
*) echo "Unknown: $STATUS"; break;; # failure
esac
done

# Print log
echo ""
echo ""
gfwci "action=log&buildId=$BUILD_ID" | cut -c 30-

# Set exit code for TravisCI
[ "$RESULT" == "success" ]

0 comments on commit 322094c

Please sign in to comment.