Skip to content

Commit

Permalink
Overhaul Travis CI script
Browse files Browse the repository at this point in the history
  • Loading branch information
dra27 committed Mar 23, 2018
1 parent d961551 commit c914df9
Show file tree
Hide file tree
Showing 2 changed files with 177 additions and 138 deletions.
279 changes: 153 additions & 126 deletions .travis-ci.sh
Original file line number Diff line number Diff line change
@@ -1,66 +1,49 @@
#!/bin/bash -xue

OPAMBSVERSION=1.2.2
OPAMBSROOT=$HOME/.opam.bootstrap
OPAMBSVERSION=2.0.0-rc
OPAMBSROOT=$HOME/.opam.cached
OPAMBSSWITCH=opam-build
PATH=~/local/bin:$PATH; export PATH

TARGET="$1"; shift

rm -f ~/pins-required

pin_package () {
echo ${1%%.*} >> ~/pins-required
eval opam pin add $* --no-action --yes
}

check_pins () {
sort ~/pins-required > ~/sorted-pins
for removed in $(diff ~/pins-current ~/sorted-pins | sed -ne "s/^< //p") ; do
opam pin remove $removed --no-action --yes
done
}

# Install the build requirements into $OPAMBSROOT using the opam binary from the
# prepare step
install-bootstrap () {
export OPAMROOT="$OPAMBSROOT"
if [ -e $OPAMBSROOT/config ] ; then
CACHED_SWITCH=$(sed -ne 's/switch: .\(.*\)./\1/p' $OPAMBSROOT/config)
if [ "$CACHED_SWITCH" != "$OCAML_VERSION" ] ; then
echo "Cached switch is $CACHED_SWITCH not $OCAML_VERSION"
echo "Resetting bootstrap"
rm -rf $OPAMBSROOT
fi
fi
opam init --yes --no-setup --compiler=$OCAML_VERSION
eval $(opam config env)
if [ "$OPAM_TEST" = "1" ]; then
opam pin list
opam list
opam pin list --short | sort > ~/pins-current
# Packages to be pinned MUST be added using pin_package
# e.g. pin_package jbuilder --dev-repo
# If using --dev-repo, you may need to manually specify a version
# to force a recompile.
pin_package jbuilder --kind=version '1.0+beta18.1'
pin_package re --kind=version 1.7.2
check_pins
opam update --upgrade --yes
opam install cohttp-lwt-unix ssl cmdliner dose3 opam-file-format re 'jbuilder>=1.0+beta18' 'mccs>=1.1+5' --yes
# Allow use of ocamlfind packages in ~/local/lib
FINDCONF=$(ocamlfind printconf conf)
sed "s%^path=.*%path=\"$HOME/local/lib:$(opam config var lib)\"%" $FINDCONF >$FINDCONF.1
mv $FINDCONF.1 $FINDCONF
COLD=${COLD:-0}
OPAM_TEST=${OPAM_TEST:-0}
EXTERNAL_SOLVER=${EXTERNAL_SOLVER:-}

init-bootstrap () {
export OPAMROOT=$OPAMBSROOT
# The system compiler will be picked up
opam init --yes --no-setup
eval $(opam env)
opam update
CURRENT_SWITCH=$(opam config var switch)
if [[ $CURRENT_SWITCH != "default" ]] ; then
opam switch default
eval $(opam env)
opam switch remove $CURRENT_SWITCH --yes
fi

fi
rm -f "$OPAMBSROOT"/log/*
if [ "$OPAM_TEST" = "1" ]; then
opam switch create $OPAMBSSWITCH ocaml-system
eval $(opam env)
opam pin add jbuilder --kind=version '1.0+beta18.1' --no-action --yes
opam pin add re --kind=version 1.7.2 --no-action --yes
opam install cohttp-lwt-unix ssl cmdliner dose3 opam-file-format re 'jbuilder>=1.0+beta18' 'mccs>=1.1+5' --yes
fi
rm -f "$OPAMBSROOT"/log/*
}

case "$TARGET" in
prepare)
mkdir -p ~/local/bin
prepare)
mkdir -p ~/local/bin

# Git should be configured properly to run the tests
git config --global user.email "[email protected]"
git config --global user.name "Travis CI"

if [ "$COLD" = "1" ]; then
if [[ $COLD -eq 1 ]] ; then
if [ ! -x ~/local/bin/make ] ; then
wget http://ftpmirror.gnu.org/gnu/make/make-4.2.tar.gz
tar -xzf make-4.2.tar.gz
mkdir make-4.2-build
Expand All @@ -69,95 +52,139 @@ case "$TARGET" in
make
make install
cd ..
make compiler
else
wget -q -O ~/local/bin/opam \
"https://github.com/ocaml/opam/releases/download/$OPAMBSVERSION/opam-$OPAMBSVERSION-$(uname -m)-$(uname -s)"
chmod a+x ~/local/bin/opam
if [ "$TRAVIS_OS_NAME" = "osx" ] && [ -n "$EXTERNAL_SOLVER" ]; then
rvm install ruby-2.3.3
rvm --default use 2.3.3
brew install "$EXTERNAL_SOLVER"
fi
else
if [[ $TRAVIS_OS_NAME = "osx" && -n $EXTERNAL_SOLVER ]] ; then
rvm install ruby-2.3.3
rvm --default use 2.3.3
brew install "$EXTERNAL_SOLVER"
fi

if [[ -e ~/local/versions ]] ; then
. ~/local/versions
if [[ $LOCAL_OCAML_VERSION != $OCAML_VERSION ]] ; then
echo "Cached compiler is $LOCAL_OCAML_VERSION; requested $OCAML_VERSION"
echo "Resetting local cache"
rm -rf ~/local
elif [[ ${LOCAL_OPAMBSVERSION:-$OPAMBSVERSION} != $OPAMBSVERSION ]] ; then
echo "Cached opam is $LOCAL_OPAMBSVERSION; requested $OPAMBSVERSION"
echo "Replacement opam will be downloaded"
rm -f ~/local/bin/opam-bootstrap
fi
fi
exit 0
;;
install)
if [ "$COLD" = "1" ]; then
make lib-pkg
else
# Note: this part is cached, and must be idempotent
# Re-init opam from scratch if the install fails
if [ -d $OPAMBSROOT ]
then install-bootstrap || { rm -rf $OPAMBSROOT; install-bootstrap; }
else install-bootstrap
fi
exit 0
;;
install)
if [[ $COLD -eq 1 ]] ; then
make compiler
make lib-pkg
else
if [[ ! -x ~/local/bin/ocaml ]] ; then
echo -en "travis_fold:start:ocaml\r"
wget http://caml.inria.fr/pub/distrib/ocaml-${OCAML_VERSION%.*}/ocaml-$OCAML_VERSION.tar.gz
tar -xzf ocaml-$OCAML_VERSION.tar.gz
cd ocaml-$OCAML_VERSION
if [[ $OPAM_TEST -ne 1 ]] ; then
CONFIGURE_SWITCHES="-no-ocamldoc -no-ocamlbuild"
fi
./configure --prefix ~/local -no-graph -no-debugger ${CONFIGURE_SWITCHES:-}
if [[ $OPAM_TEST -eq 1 ]] ; then
make -j world.opt
else
make world.opt
fi
make install
echo "LOCAL_OCAML_VERSION=$OCAML_VERSION" > ~/local/versions
echo -en "travis_fold:end:ocaml\r"
fi

if [[ $OPAM_TEST -eq 1 ]] ; then
echo -en "travis_fold:start:opam\r"
if [[ ! -e ~/local/bin/opam-bootstrap ]] ; then
wget -q -O ~/local/bin/opam-bootstrap \
"https://github.com/ocaml/opam/releases/download/$OPAMBSVERSION/opam-$OPAMBSVERSION-$(uname -m)-$(uname -s)"
fi

cp -f ~/local/bin/opam-bootstrap ~/local/bin/opam
chmod a+x ~/local/bin/opam

if [[ -d $OPAMBSROOT ]] ; then
init-bootstrap || { rm -rf $OPAMBSROOT; init-bootstrap; }
else
init-bootstrap
fi
echo -en "travis_fold:end:opam\r"
fi
exit 0
;;
build)
;;
*)
echo "bad command $TARGET"; exit 1
fi
exit 0
;;
build)
;;
*)
echo "bad command $TARGET"; exit 1
esac

export OPAMYES=1
export OCAMLRUNPARAM=b

# Git should be configured properly to run the tests
git config --global user.email "[email protected]"
git config --global user.name "Travis CI"

( # Run subshell in bootstrap root env to build
if [ "$COLD" != "1" ]; then
export OPAMROOT="$OPAMBSROOT"
eval $(opam config env)

[ "$(ocaml -vnum)" = "$OCAML_VERSION" ] || exit 12
if [[ $OPAM_TEST -eq 1 ]] ; then
export OPAMROOT=$OPAMBSROOT
eval $(opam env)
fi

./configure --prefix ~/local --with-mccs
./configure --prefix ~/local --with-mccs

if [ "$OPAM_TEST" != "1" -a "$COLD" != "1" ]; then make lib-ext; fi
make all

rm -f ~/local/bin/opam
make install

if [ "$OPAM_TEST" = "1" ]; then
make libinstall LIBINSTALL_DIR=$HOME/local/lib
# Compile and run opam-rt
cd ~/build
wget https://github.com/ocaml/opam-rt/archive/$TRAVIS_PULL_REQUEST_BRANCH.tar.gz -O opam-rt.tar.gz || \
wget https://github.com/ocaml/opam-rt/archive/master.tar.gz -O opam-rt.tar.gz
tar xvfz opam-rt.tar.gz
cd opam-rt-*
make
else
# Note: these tests require a "system" compiler and will use the one in $OPAMBSROOT
OPAMEXTERNALSOLVER="$EXTERNAL_SOLVER" make tests ||
(tail -2000 _build/default/tests/fulltest-*.log; echo "-- TESTS FAILED --"; exit 1)
fi
if [[ $OPAM_TEST$COLD -eq 0 ]] ; then
make lib-ext
fi
make all

rm -f ~/local/bin/opam
make install

if [ "$OPAM_TEST" = "1" ]; then
make distclean
for pin in core format solver repository state client ; do
opam pin add --kind=path opam-$pin . --yes
done
# Compile and run opam-rt
cd ~/build
wget https://github.com/ocaml/opam-rt/archive/$TRAVIS_PULL_REQUEST_BRANCH.tar.gz -O opam-rt.tar.gz || \
wget https://github.com/ocaml/opam-rt/archive/master.tar.gz -O opam-rt.tar.gz
tar -xzf opam-rt.tar.gz
cd opam-rt-*
make

opam switch default
opam switch remove $OPAMBSSWITCH --yes
else
# Note: these tests require a "system" compiler and will use the one in $OPAMBSROOT
OPAMEXTERNALSOLVER="$EXTERNAL_SOLVER" make tests ||
(tail -2000 _build/default/tests/fulltest-*.log; echo "-- TESTS FAILED --"; exit 1)
fi
)

( # Finally run the tests, in a clean environment
export OPAMKEEPLOGS=1

if [ "$OPAM_TEST" = "1" ]; then
cd ~/build/opam-rt-*
OPAMEXTERNALSOLVER="$EXTERNAL_SOLVER" make KINDS="local git" run
else
if [ "$COLD" = "1" ]; then
export PATH=`pwd`/bootstrap/ocaml/bin:$PATH
else
export PATH="$OPAMBSROOT/$OCAML_VERSION/bin":$PATH
fi
# Test basic actions
opam init --bare
opam switch create default ocaml-system
# eval $(opam config env)
opam install lwt
opam list
opam config report
export OPAMKEEPLOGS=1

if [[ $OPAM_TEST -eq 1 ]] ; then
cd ~/build/opam-rt-*
OPAMEXTERNALSOLVER="$EXTERNAL_SOLVER" make KINDS="local git" run
else
if [[ $COLD -eq 1 ]] ; then
export PATH=$PWD/bootstrap/ocaml/bin:$PATH
fi

# Test basic actions
opam init --bare
opam switch create default ocaml-system
eval $(opam env)
opam install lwt
opam list
opam config report
fi
)

rm -f ~/local/bin/opam
36 changes: 24 additions & 12 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,32 +14,44 @@ install:

cache:
directories:
- $HOME/.opam.bootstrap
- $HOME/.opam.cached
- $HOME/local

script:
- bash -exu .travis-ci.sh build

matrix:
include:
- os: osx
env: OCAML_VERSION=4.06.0 OPAM_TEST=1 EXTERNAL_SOLVER=
- os: osx
env: OCAML_VERSION=4.03.0 OPAM_TEST=
- os: linux
env: OCAML_VERSION=4.06.0 OPAM_TEST=1 EXTERNAL_SOLVER=
env: OCAML_VERSION=4.02.3
stage: Build
- os: linux
env: OCAML_VERSION=4.03.0
stage: Build
- os: linux
env: OCAML_VERSION=4.06.0 OPAM_TEST=1 EXTERNAL_SOLVER=aspcud
env: OCAML_VERSION=4.04.2
stage: Build
- os: linux
env: OCAML_VERSION=4.02.3 OPAM_TEST=
env: OCAML_VERSION=4.05.0
stage: Build
- os: linux
env: OCAML_VERSION=4.03.0 OPAM_TEST=
env: OCAML_VERSION=4.06.1
stage: Build
- os: osx
env: OCAML_VERSION=4.06.1 OPAM_TEST=1
stage: Test
- os: osx
env: OCAML_VERSION=4.03.0
stage: Test
- os: linux
env: OCAML_VERSION=4.05.0 OPAM_TEST=
env: OCAML_VERSION=4.06.1 OPAM_TEST=1
stage: Test
- os: linux
env: OCAML_VERSION=4.06.0 OPAM_TEST=
env: OCAML_VERSION=4.06.1 OPAM_TEST=1 EXTERNAL_SOLVER=aspcud
stage: Test
- os: linux
env: COLD=1
fast_finish: true
stage: Test
notifications:
email:
- [email protected]
Expand Down

0 comments on commit c914df9

Please sign in to comment.