git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
* [PATCH v3] Travis: also test on 32-bit Linux
@ 2017-03-05 18:25 Lars Schneider
  2017-03-06 19:21 ` Junio C Hamano
  0 siblings, 1 reply; 2+ messages in thread
From: Lars Schneider @ 2017-03-05 18:25 UTC (permalink / raw)
  To: git
  Cc: Johannes.Schindelin, gitster, ramsay, christian.couder,
	Johannes Schindelin

From: Johannes Schindelin <johannes.schindelin@gmx.de>

When Git v2.9.1 was released, it had a bug that showed only on Windows
and on 32-bit systems: our assumption that `unsigned long` can hold
64-bit values turned out to be wrong.

This could have been caught earlier if we had a Continuous Testing
set up that includes a build and test run on 32-bit Linux.

Let's do this (and take care of the Windows build later). This patch
asks Travis CI to install a Docker image with 32-bit libraries and then
goes on to build and test Git using this 32-bit setup.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Lars Schneider <larsxschneider@gmail.com>
---

Hi,

when I looked into the 32-bit/line-log issue [1], I realized that my
proposed docker setup is not ideal for local debugging. Here is an
approach that I think is better. I changed the following:
    - disable sudo as it is not required for the Travis job
    - keep all docker commands in the .travis.yml
    - add option to run commands inside docker with the same UID as the
      host user to make output files accessible
    - pass environment variables directly to the docker container

Sorry for the back and forth.

Cheers,
Lars


[1] http://public-inbox.org/git/2205F1A7-A694-4F40-B994-D68C3947F2BB@gmail.com/


Notes:
    Base Ref: master
    Web-Diff: https://github.com/larsxschneider/git/commit/a6fe1def16
    Checkout: git fetch https://github.com/larsxschneider/git travisci/linux32-v3 && git checkout a6fe1def16

    Interdiff (v2..v3):

    diff --git a/.travis.yml b/.travis.yml
    index fd60fd8328..591cc57b80 100644
    --- a/.travis.yml
    +++ b/.travis.yml
    @@ -41,13 +41,25 @@ matrix:
       include:
         - env: Linux32
           os: linux
    -      sudo: required
           services:
             - docker
           before_install:
             - docker pull daald/ubuntu32:xenial
           before_script:
    -      script: ci/run-linux32-build.sh daald/ubuntu32:xenial
    +      script:
    +        - >
    +          docker run
    +          --interactive
    +          --env DEFAULT_TEST_TARGET
    +          --env GIT_PROVE_OPTS
    +          --env GIT_TEST_OPTS
    +          --env GIT_TEST_CLONE_2GB
    +          --volume "${PWD}:/usr/src/git"
    +          daald/ubuntu32:xenial
    +          /usr/src/git/ci/run-linux32-build.sh $(id -u $USER)
    +        # Use the following command to debug the docker build locally:
    +        # $ docker run -itv "${PWD}:/usr/src/git" --entrypoint /bin/bash daald/ubuntu32:xenial
    +        # root@container:/# /usr/src/git/ci/run-linux32-build.sh
         - env: Documentation
           os: linux
           compiler: clang
    diff --git a/ci/run-linux32-build.sh b/ci/run-linux32-build.sh
    index 13c184d41c..f7a3434985 100755
    --- a/ci/run-linux32-build.sh
    +++ b/ci/run-linux32-build.sh
    @@ -1,31 +1,30 @@
     #!/bin/sh
     #
    -# Build and test Git in a docker container running a 32-bit Ubuntu Linux
    +# Build and test Git in a 32-bit environment
     #
     # Usage:
    -#   run-linux32-build.sh [container-image]
    +#   run-linux32-build.sh [host-user-id]
     #

    -CONTAINER="${1:-daald/ubuntu32:xenial}"
    -
    -sudo docker run --interactive --volume "${PWD}:/usr/src/git" "$CONTAINER" \
    -    /bin/bash -c 'linux32 --32bit i386 sh -c "
    -    : update packages &&
    +# Update packages to the latest available versions
    +linux32 --32bit i386 sh -c '
         apt update >/dev/null &&
         apt install -y build-essential libcurl4-openssl-dev libssl-dev \
    -        libexpat-dev gettext python >/dev/null &&
    +        libexpat-dev gettext python >/dev/null
    +' &&
    +
    +# If this script runs inside a docker container, then all commands are
    +# usually executed as root. Consequently, the host user might not be
    +# able to access the test output files.
    +# If a host user id is given, then create a user "ci" with the host user
    +# id to make everything accessible to the host user.
    +HOST_UID=$1 &&
    +CI_USER=$USER &&
    +test -z $HOST_UID || (CI_USER="ci" && useradd -u $HOST_UID $CI_USER) &&

    -    : build and test &&
    +# Build and test
    +linux32 --32bit i386 su -m -l $CI_USER -c '
         cd /usr/src/git &&
    -    export DEFAULT_TEST_TARGET='$DEFAULT_TEST_TARGET' &&
    -    export GIT_PROVE_OPTS=\"'"$GIT_PROVE_OPTS"'\" &&
    -    export GIT_TEST_OPTS=\"'"$GIT_TEST_OPTS"'\" &&
    -    export GIT_TEST_CLONE_2GB='$GIT_TEST_CLONE_2GB' &&
         make --jobs=2 &&
    -    make --quiet test || (
    -
    -    : make test-results readable to non-root user on TravisCI &&
    -    test '$TRAVIS' &&
    -    find t/test-results/ -type f -exec chmod o+r {} \; &&
    -    false )
    -"'
    +    make --quiet test
    +'

    \0

 .travis.yml             | 21 +++++++++++++++++++++
 ci/run-linux32-build.sh | 30 ++++++++++++++++++++++++++++++
 2 files changed, 51 insertions(+)
 create mode 100755 ci/run-linux32-build.sh

diff --git a/.travis.yml b/.travis.yml
index 9c63c8c3f6..591cc57b80 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -39,6 +39,27 @@ env:

 matrix:
   include:
+    - env: Linux32
+      os: linux
+      services:
+        - docker
+      before_install:
+        - docker pull daald/ubuntu32:xenial
+      before_script:
+      script:
+        - >
+          docker run
+          --interactive
+          --env DEFAULT_TEST_TARGET
+          --env GIT_PROVE_OPTS
+          --env GIT_TEST_OPTS
+          --env GIT_TEST_CLONE_2GB
+          --volume "${PWD}:/usr/src/git"
+          daald/ubuntu32:xenial
+          /usr/src/git/ci/run-linux32-build.sh $(id -u $USER)
+        # Use the following command to debug the docker build locally:
+        # $ docker run -itv "${PWD}:/usr/src/git" --entrypoint /bin/bash daald/ubuntu32:xenial
+        # root@container:/# /usr/src/git/ci/run-linux32-build.sh
     - env: Documentation
       os: linux
       compiler: clang
diff --git a/ci/run-linux32-build.sh b/ci/run-linux32-build.sh
new file mode 100755
index 0000000000..f7a3434985
--- /dev/null
+++ b/ci/run-linux32-build.sh
@@ -0,0 +1,30 @@
+#!/bin/sh
+#
+# Build and test Git in a 32-bit environment
+#
+# Usage:
+#   run-linux32-build.sh [host-user-id]
+#
+
+# Update packages to the latest available versions
+linux32 --32bit i386 sh -c '
+    apt update >/dev/null &&
+    apt install -y build-essential libcurl4-openssl-dev libssl-dev \
+        libexpat-dev gettext python >/dev/null
+' &&
+
+# If this script runs inside a docker container, then all commands are
+# usually executed as root. Consequently, the host user might not be
+# able to access the test output files.
+# If a host user id is given, then create a user "ci" with the host user
+# id to make everything accessible to the host user.
+HOST_UID=$1 &&
+CI_USER=$USER &&
+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 &&
+    make --jobs=2 &&
+    make --quiet test
+'

base-commit: 3bc53220cb2dcf709f7a027a3f526befd021d858
--
2.11.1


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH v3] Travis: also test on 32-bit Linux
  2017-03-05 18:25 [PATCH v3] Travis: also test on 32-bit Linux Lars Schneider
@ 2017-03-06 19:21 ` Junio C Hamano
  0 siblings, 0 replies; 2+ messages in thread
From: Junio C Hamano @ 2017-03-06 19:21 UTC (permalink / raw)
  To: Lars Schneider; +Cc: git, Johannes.Schindelin, ramsay, christian.couder

Lars Schneider <larsxschneider@gmail.com> writes:

> when I looked into the 32-bit/line-log issue [1], I realized that my
> proposed docker setup is not ideal for local debugging. Here is an
> approach that I think is better. I changed the following:
>     - disable sudo as it is not required for the Travis job
>     - keep all docker commands in the .travis.yml
>     - add option to run commands inside docker with the same UID as the
>       host user to make output files accessible
>     - pass environment variables directly to the docker container
>
> Sorry for the back and forth.

Anything that makes further diag easier when a problem is spotted by
the automated machinery is a very welcome change.

Will replace; let's see what others think.

Thanks.


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2017-03-06 19:22 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-03-05 18:25 [PATCH v3] Travis: also test on 32-bit Linux Lars Schneider
2017-03-06 19:21 ` Junio C Hamano

Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).