Skip to content

Commit 5330330

Browse files
szedergitster
authored andcommitted
travis-ci: don't run the test suite as root in the 32 bit Linux build
Travis CI runs the 32 bit Linux build job in a Docker container, where all commands are executed as root by default. Therefore, ever since we added this build job in 88dedd5 (Travis: also test on 32-bit Linux, 2017-03-05), we have a bit of code to create a user in the container matching the ID of the host user and then to run the test suite as this user. Matching the host user ID is important, because otherwise the host user would have no access to any files written by processes running in the container, notably the logs of failed tests couldn't be included in the build job's trace log. Alas, this piece of code never worked, because it sets the variable holding the user name ($CI_USER) in a subshell, meaning it doesn't have any effect by the time we get to the point to actually use the variable to switch users with 'su'. So all this time we were running the test suite as root. Reorganize that piece of code in 'ci/run-linux32-build.sh' a bit to avoid that problematic subshell and to ensure that we switch to the right user. Furthermore, make the script's optional host user ID option mandatory, so running the build accidentally as root will become harder when debugging locally. If someone really wants to run the test suite as root, whatever the reasons might be, it'll still be possible to do so by explicitly passing '0' as host user ID. Finally, one last catch: since commit 7e72cfc (travis-ci: save prove state for the 32 bit Linux build, 2017-12-27) the 'prove' test harness has been writing its state to the Travis CI cache directory from within the Docker container while running as root. After this patch 'prove' will run as a regular user, so in future build jobs it won't be able overwrite a previously written, still root-owned state file, resulting in build job failures. To resolve this we should manually delete caches containing such root-owned files, but that would be a hassle. Instead, work this around by changing the owner of the whole contents of the cache directory to the host user ID. Signed-off-by: SZEDER Gábor <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent b2cbaa0 commit 5330330

File tree

2 files changed

+26
-6
lines changed

2 files changed

+26
-6
lines changed

ci/run-linux32-build.sh

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,17 @@
33
# Build and test Git in a 32-bit environment
44
#
55
# Usage:
6-
# run-linux32-build.sh [host-user-id]
6+
# run-linux32-build.sh <host-user-id>
77
#
88

99
set -ex
1010

11+
if test $# -ne 1 || test -z "$1"
12+
then
13+
echo >&2 "usage: run-linux32-build.sh <host-user-id>"
14+
exit 1
15+
fi
16+
1117
# Update packages to the latest available versions
1218
linux32 --32bit i386 sh -c '
1319
apt update >/dev/null &&
@@ -18,11 +24,25 @@ linux32 --32bit i386 sh -c '
1824
# If this script runs inside a docker container, then all commands are
1925
# usually executed as root. Consequently, the host user might not be
2026
# able to access the test output files.
21-
# If a host user id is given, then create a user "ci" with the host user
22-
# id to make everything accessible to the host user.
27+
# If a non 0 host user id is given, then create a user "ci" with that
28+
# user id to make everything accessible to the host user.
2329
HOST_UID=$1
24-
CI_USER=$USER
25-
test -z $HOST_UID || (CI_USER="ci" && useradd -u $HOST_UID $CI_USER)
30+
if test $HOST_UID -eq 0
31+
then
32+
# Just in case someone does want to run the test suite as root.
33+
CI_USER=root
34+
else
35+
CI_USER=ci
36+
useradd -u $HOST_UID $CI_USER
37+
# Due to a bug the test suite was run as root in the past, so
38+
# a prove state file created back then is only accessible by
39+
# root. Now that bug is fixed, the test suite is run as a
40+
# regular user, but the prove state file coming from Travis
41+
# CI's cache might still be owned by root.
42+
# Make sure that this user has rights to any cached files,
43+
# including an existing prove state file.
44+
test -n "$cache_dir" && chown -R $HOST_UID:$HOST_UID "$cache_dir"
45+
fi
2646

2747
# Build and test
2848
linux32 --32bit i386 su -m -l $CI_USER -c '

ci/run-linux32-docker.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ docker pull daald/ubuntu32:xenial
99

1010
# Use the following command to debug the docker build locally:
1111
# $ docker run -itv "${PWD}:/usr/src/git" --entrypoint /bin/bash daald/ubuntu32:xenial
12-
# root@container:/# /usr/src/git/ci/run-linux32-build.sh
12+
# root@container:/# /usr/src/git/ci/run-linux32-build.sh <host-user-id>
1313

1414
container_cache_dir=/tmp/travis-cache
1515

0 commit comments

Comments
 (0)