Skip to content

Commit 029aeee

Browse files
larsxschneidergitster
authored andcommitted
travis-ci: build and test Git on Windows
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 <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent e0ef7fe commit 029aeee

File tree

2 files changed

+85
-0
lines changed

2 files changed

+85
-0
lines changed

.travis.yml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,17 @@ env:
3939

4040
matrix:
4141
include:
42+
- env: Windows
43+
os: linux
44+
compiler:
45+
addons:
46+
before_install:
47+
before_script:
48+
script:
49+
- >
50+
test "$TRAVIS_REPO_SLUG" != "git/git" ||
51+
ci/run-windows-build.sh $TRAVIS_BRANCH $(git rev-parse HEAD)
52+
after_failure:
4253
- env: Linux32
4354
os: linux
4455
services:

ci/run-windows-build.sh

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
#!/usr/bin/env bash
2+
#
3+
# Script to trigger the a Git for Windows build and test run.
4+
# Set the $GFW_CI_TOKEN as environment variable.
5+
# Pass the branch (only branches on https://github.com/git/git are
6+
# supported) and a commit hash.
7+
#
8+
9+
test $# -ne 2 && echo "Unexpected number of parameters" && exit 1
10+
test -z "$GFW_CI_TOKEN" && echo "GFW_CI_TOKEN not defined" && exit
11+
12+
BRANCH=$1
13+
COMMIT=$2
14+
15+
gfwci () {
16+
local CURL_ERROR_CODE HTTP_CODE
17+
exec 3>&1
18+
HTTP_CODE=$(curl \
19+
-H "Authentication: Bearer $GFW_CI_TOKEN" \
20+
--silent --retry 5 --write-out '%{HTTP_CODE}' \
21+
--output >(sed "$(printf '1s/^\xef\xbb\xbf//')" >cat >&3) \
22+
"https://git-for-windows-ci.azurewebsites.net/api/TestNow?$1" \
23+
)
24+
CURL_ERROR_CODE=$?
25+
if test $CURL_ERROR_CODE -ne 0
26+
then
27+
return $CURL_ERROR_CODE
28+
fi
29+
if test "$HTTP_CODE" -ge 400 && test "$HTTP_CODE" -lt 600
30+
then
31+
return 127
32+
fi
33+
}
34+
35+
# Trigger build job
36+
BUILD_ID=$(gfwci "action=trigger&branch=$BRANCH&commit=$COMMIT&skipTests=false")
37+
if test $? -ne 0
38+
then
39+
echo "Unable to trigger Visual Studio Team Services Build"
40+
echo "$BUILD_ID"
41+
exit 1
42+
fi
43+
44+
# Check if the $BUILD_ID contains a number
45+
case $BUILD_ID in
46+
''|*[!0-9]*) echo "Unexpected build number: $BUILD_ID" && exit 1
47+
esac
48+
49+
echo "Visual Studio Team Services Build #${BUILD_ID}"
50+
51+
# Wait until build job finished
52+
STATUS=
53+
RESULT=
54+
while true
55+
do
56+
LAST_STATUS=$STATUS
57+
STATUS=$(gfwci "action=status&buildId=$BUILD_ID")
58+
test "$STATUS" = "$LAST_STATUS" || printf "\nStatus: $STATUS "
59+
printf "."
60+
61+
case "$STATUS" in
62+
inProgress|postponed|notStarted) sleep 10 ;; # continue
63+
"completed: succeeded") RESULT="success"; break;; # success
64+
*) echo "Unhandled status: $STATUS"; break;; # failure
65+
esac
66+
done
67+
68+
# Print log
69+
echo ""
70+
echo ""
71+
gfwci "action=log&buildId=$BUILD_ID" | cut -c 30-
72+
73+
# Set exit code for TravisCI
74+
test "$RESULT" = "success"

0 commit comments

Comments
 (0)