Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 21 additions & 2 deletions .travis-docker.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,12 @@ echo -en "travis_fold:start:prepare.ci\r"
default_user=ocaml
default_branch=master
default_hub_user=ocaml
default_opam_version=2.0.0

fork_user=${FORK_USER:-$default_user}
fork_branch=${FORK_BRANCH:-$default_branch}
hub_user=${HUB_USER:-$default_hub_user}
opam_version=${OPAM_VERSION:-$default_opam_version}

# create env file
echo PACKAGE="$PACKAGE" > env.list
Expand All @@ -24,14 +26,22 @@ echo POST_INSTALL_HOOK="$POST_INSTALL_HOOK" >> env.list
echo $EXTRA_ENV >> env.list

# build a local image to trigger any ONBUILDs
echo FROM ${hub_user}/opam:${DISTRO}_ocaml-${OCAML_VERSION} > Dockerfile
case $opam_version in
2.0.0) from=${hub_user}/opam2:${DISTRO} ;;
*) from=${hub_user}/opam:${DISTRO}_ocaml-${OCAML_VERSION} ;;
esac

echo FROM $from > Dockerfile
echo WORKDIR /home/opam/opam-repository >> Dockerfile

if [ -n "$BASE_REMOTE" ]; then
echo "RUN git remote set-url origin ${BASE_REMOTE} &&\
git fetch origin && git reset --hard origin/master" >> Dockerfile
else
echo RUN git pull -q origin master >> Dockerfile
case $opam_version in
2.0.0) echo RUN git pull -q origin 2.0.0 >> Dockerfile ;;
*) echo RUN git pull -q origin master >> Dockerfile ;;
esac
fi


Expand All @@ -42,13 +52,22 @@ if [ $fork_user != $default_user -o $fork_branch != $default_branch ]; then
>> Dockerfile
fi

case $opam_version in
2.0.0)
echo ENV OPAMYES=1 >> Dockerfile
[[ ${DISTRO} = "fedora"* ]] &&
echo RUN sudo yum install rsync -y >> Dockerfile ;;
*) ;;
esac

echo RUN opam update -u -y >> Dockerfile
echo RUN opam depext -ui travis-opam >> Dockerfile
echo RUN cp '~/.opam/$(opam switch show)/bin/ci-opam' "~/" >> Dockerfile
echo RUN opam remove -a travis-opam >> Dockerfile
echo RUN mv "~/ci-opam" '~/.opam/$(opam switch show)/bin/ci-opam' >> Dockerfile
echo VOLUME /repo >> Dockerfile
echo WORKDIR /repo >> Dockerfile

docker build -t local-build .

echo Dockerfile:
Expand Down
152 changes: 110 additions & 42 deletions .travis-ocaml.sh
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,14 @@ fi

# the ocaml version to test
OCAML_VERSION=${OCAML_VERSION:-latest}
OPAM_VERSION=${OPAM_VERSION:-1.2.2}
OPAM_VERSION=${OPAM_VERSION:-2.0.0}
OPAM_INIT=${OPAM_INIT:-true}

# the base opam repository to use for bootstrapping and catch-all namespace
BASE_REMOTE=${BASE_REMOTE:-git://github.com/ocaml/opam-repository}
case $OPAM_VERSION in
2.0.0) BASE_REMOTE=${BASE_REMOTE:-git://github.com/ocaml/opam-repository#2.0.0} ;;
*) BASE_REMOTE=${BASE_REMOTE:-git://github.com/ocaml/opam-repository} ;;
esac

# whether we need a new gcc and binutils
UPDATE_GCC_BINUTILS=${UPDATE_GCC_BINUTILS:-"0"}
Expand All @@ -41,44 +44,24 @@ UPDATE_GCC_BINUTILS=${UPDATE_GCC_BINUTILS:-"0"}
UBUNTU_TRUSTY=${UBUNTU_TRUSTY:-"0"}

# Install XQuartz on OSX
INSTALL_XQUARTZ=${INSTALL_XQUARTZ:-"true"}

install_on_linux () {
case "$OCAML_VERSION,$OPAM_VERSION" in
3.12,1.2.2)
OCAML_VERSION=4.02; OCAML_FULL_VERSION=3.12.1
ppa=avsm/ocaml42+opam12 ;;
4.00,1.2.2)
OCAML_VERSION=4.02; OCAML_FULL_VERSION=4.00.1
ppa=avsm/ocaml42+opam12 ;;
4.01,1.2.2)
OCAML_VERSION=4.02; OCAML_FULL_VERSION=4.01.0
ppa=avsm/ocaml42+opam12 ;;
4.02,1.1.2) OCAML_FULL_VERSION=4.02.3; OPAM_SWITCH=${OPAM_SWITCH:-system}; ppa=avsm/ocaml42+opam11 ;;
4.02,1.2.0) OCAML_FULL_VERSION=4.02.3; OPAM_SWITCH=${OPAM_SWITCH:-system}; ppa=avsm/ocaml42+opam120 ;;
4.02,1.2.1) OCAML_FULL_VERSION=4.02.3; OPAM_SWITCH=${OPAM_SWITCH:-system}; ppa=avsm/ocaml42+opam121 ;;
4.02,1.2.2) OCAML_FULL_VERSION=4.02.3; OPAM_SWITCH=${OPAM_SWITCH:-system}; ppa=avsm/ocaml42+opam12 ;;
4.03,1.2.2)
OCAML_VERSION=4.02; OCAML_FULL_VERSION=4.03.0
ppa=avsm/ocaml42+opam12 ;;
4.04,1.2.2)
OCAML_VERSION=4.02; OCAML_FULL_VERSION=4.04.2
ppa=avsm/ocaml42+opam12 ;;
4.05,1.2.2)
OCAML_VERSION=4.02; OCAML_FULL_VERSION=4.05.0
ppa=avsm/ocaml42+opam12 ;;
4.06,1.2.2)
OCAML_VERSION=4.02; OCAML_FULL_VERSION=4.06.1
ppa=avsm/ocaml42+opam12 ;;
4.07,1.2.2)
OCAML_VERSION=4.02; OCAML_FULL_VERSION=4.07.0
ppa=avsm/ocaml42+opam12 ;;
*) echo "Unknown OCAML_VERSION=$OCAML_VERSION OPAM_VERSION=$OPAM_VERSION"
echo "(An unset OCAML_VERSION used to default to \"latest\", but you must now specify it."
echo "Try something like \"OCAML_VERSION=3.12\", \"OCAML_VERSION=4.07\", or see README-travis.md at https://github.com/ocaml/ocaml-ci-scripts )"
exit 1 ;;
esac
INSTALL_XQUARTZ=${INSTALL_XQUARTZ:-"false"}

install_opam2 () {
case $TRAVIS_OS_NAME in
linux)
sudo add-apt-repository --yes ppa:ansible/bubblewrap
sudo apt-get update -qq
sudo apt-get install -y bubblewrap
sudo wget https://github.com/ocaml/opam/releases/download/2.0.0-rc4/opam-2.0.0-rc4-x86_64-linux -O /usr/local/bin/opam
sudo chmod +x /usr/local/bin/opam ;;
osx)
sudo curl -sL https://github.com/ocaml/opam/releases/download/2.0.0-rc4/opam-2.0.0-rc4-x86_64-darwin -o /usr/local/bin/opam
sudo chmod +x /usr/local/bin/opam ;;
esac
}

install_ppa () {
ppa=$1
sudo add-apt-repository --yes ppa:${ppa}
sudo apt-get update -qq
if [ "${INSTALL_LOCAL:=0}" = 0 ] ; then
Expand All @@ -96,6 +79,78 @@ install_on_linux () {
else
sudo apt-get install -y opam
fi
}

install_on_linux () {
case "$OCAML_VERSION,$OPAM_VERSION" in
3.12,1.2.2)
install_ppa avsm/ocaml42+opam12
OCAML_VERSION=4.02; OCAML_FULL_VERSION=3.12.1 ;;
3.12,2.0.0)
install_opam2
OCAML_VERSION=4.01; OCAML_FULL_VERSION=3.12.1 ;;
4.00,1.2.2)
install_ppa avsm/ocaml42+opam12
OCAML_VERSION=4.02; OCAML_FULL_VERSION=4.00.1 ;;
4.00,2.0.0)
install_opam2
OCAML_VERSION=4.01; OCAML_FULL_VERSION=4.00.1 ;;
4.01,1.2.2)
install_ppa avsm/ocaml42+opam12
OCAML_VERSION=4.02; OCAML_FULL_VERSION=4.01.0 ;;
4.01,2.0.0)
install_opam2
OCAML_FULL_VERSION=4.01.0 OPAM_SWITCH=${OPAM_SWITCH:-ocaml-system} ;;
4.02,1.1.2)
install_ppa avsm/ocaml42+opam11
OCAML_FULL_VERSION=4.02.3; OPAM_SWITCH=${OPAM_SWITCH:-system} ;;
4.02,1.2.0)
install_ppa avsm/ocaml42+opam120
OCAML_FULL_VERSION=4.02.3; OPAM_SWITCH=${OPAM_SWITCH:-system} ;;
4.02,1.2.1)
install_ppa avsm/ocaml42+opam121
OCAML_FULL_VERSION=4.02.3; OPAM_SWITCH=${OPAM_SWITCH:-system} ;;
4.02,1.2.2)
install_ppa avsm/ocaml42+opam12
OCAML_FULL_VERSION=4.02.3; OPAM_SWITCH=${OPAM_SWITCH:-system} ;;
4.02,2.0.0)
install_opam2
OCAML_VERSION=4.01; OCAML_FULL_VERSION=4.02.3 ;;
4.03,1.2.2)
install_ppa avsm/ocaml42+opam12
OCAML_VERSION=4.02; OCAML_FULL_VERSION=4.03.0 ;;
4.03,2.0.0)
install_opam2
OCAML_VERSION=4.01; OCAML_FULL_VERSION=4.03.0 ;;
4.04,1.2.2)
install_ppa avsm/ocaml42+opam12
OCAML_VERSION=4.02; OCAML_FULL_VERSION=4.04.2 ;;
4.04,2.0.0)
install_opam2
OCAML_VERSION=4.01; OCAML_FULL_VERSION=4.04.2 ;;
4.05,1.2.2)
install_ppa avsm/ocaml42+opam12
OCAML_VERSION=4.02; OCAML_FULL_VERSION=4.05.0 ;;
4.05,2.0.0)
install_opam2
OCAML_VERSION=4.01; OCAML_FULL_VERSION=4.05.0 ;;
4.06,1.2.2)
install_ppa avsm/ocaml42+opam12
OCAML_VERSION=4.02; OCAML_FULL_VERSION=4.06.1 ;;
4.06,2.0.0)
install_opam2
OCAML_VERSION=4.01; OCAML_FULL_VERSION=4.06.1 ;;
4.07,1.2.2)
install_ppa avsm/ocaml42+opam12
OCAML_VERSION=4.02; OCAML_FULL_VERSION=4.07.0 ;;
4.07,2.0.0)
install_opam2
OCAML_VERSION=4.01; OCAML_FULL_VERSION=4.07.0 ;;
*) echo "Unknown OCAML_VERSION=$OCAML_VERSION OPAM_VERSION=$OPAM_VERSION"
echo "(An unset OCAML_VERSION used to default to \"latest\", but you must now specify it."
echo "Try something like \"OCAML_VERSION=3.12\", \"OCAML_VERSION=4.07\", or see README-travis.md at https://github.com/ocaml/ocaml-ci-scripts )"
exit 1 ;;
esac

TRUSTY="deb mirror://mirrors.ubuntu.com/mirrors.txt trusty main restricted universe"

Expand All @@ -115,7 +170,7 @@ install_on_linux () {
sudo apt-get -qq update
fi

if [ "$INSTALL_LOCAL" != 0 ] ; then
if [ "${INSTALL_LOCAL:=0}" != 0 ] ; then
echo -en "travis_fold:start:build.ocaml\r"
echo "Building a local OCaml; this may take a few minutes..."
wget "http://caml.inria.fr/pub/distrib/ocaml-${OCAML_FULL_VERSION%.*}/ocaml-$OCAML_FULL_VERSION.tar.gz"
Expand All @@ -141,15 +196,28 @@ install_on_osx () {
brew upgrade python || true
case "$OCAML_VERSION,$OPAM_VERSION" in
3.12,1.2.2) OCAML_FULL_VERSION=3.12.1; brew install opam ;;
3.12,2.0.0) OCAML_FULL_VERSION=3.12.1; install_opam2 ;;
4.00,1.2.2) OCAML_FULL_VERSION=4.00.1; brew install opam ;;
4.00,2.0.0) OCAML_FULL_VERSION=4.00.1; install_opam2 ;;
4.01,1.2.2) OCAML_FULL_VERSION=4.01.0; brew install opam ;;
4.01,2.0.0) OCAML_FULL_VERSION=4.01.0; install_opam2 ;;
4.02,1.2.2) OCAML_FULL_VERSION=4.02.3; brew install opam ;;
4.02,1.3.0) OCAML_FULL_VERSION=4.02.3; brew install opam --HEAD ;;
4.02,2.0.0) OCAML_FULL_VERSION=4.02.3; install_opam2 ;;
4.03,1.2.2) OCAML_FULL_VERSION=4.03.0; brew install opam ;;
4.03,2.0.0) OCAML_FULL_VERSION=4.03.0; install_opam2 ;;
4.04,1.2.2) OCAML_FULL_VERSION=4.04.2; brew install opam ;;
4.04,2.0.0) OCAML_FULL_VERSION=4.04.2; install_opam2 ;;
4.05,1.2.2) OCAML_FULL_VERSION=4.05.0; brew install opam ;;
4.05,2.0.0) OCAML_FULL_VERSION=4.05.0; install_opam2 ;;
4.06,1.2.2) OCAML_FULL_VERSION=4.06.1; brew install opam ;;
4.07,1.2.2) OCAML_FULL_VERSION=4.07.0; OPAM_SWITCH=${OPAM_SWITCH:-system}; brew install ocaml; brew install opam ;;
4.06,2.0.0) OCAML_FULL_VERSION=4.06.1; install_opam2 ;;
4.07,1.2.2) OCAML_FULL_VERSION=4.07.0;
OPAM_SWITCH=${OPAM_SWITCH:-system};
brew install ocaml; brew install opam ;;
4.07,2.0.0) OCAML_FULL_VERSION=4.07.0;
OPAM_SWITCH=${OPAM_SWITCH:-ocaml-system};
brew install ocaml;
install_opam2 ;;
*) echo "Unknown OCAML_VERSION=$OCAML_VERSION OPAM_VERSION=$OPAM_VERSION"
exit 1 ;;
esac
Expand Down
2 changes: 2 additions & 0 deletions .travis-opam.sh
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,9 @@ eval $(opam config env)
opam depext -y conf-m4
opam pin add travis-opam https://github.com/${fork_user}/ocaml-ci-scripts.git#${fork_branch}
cp ~/.opam/$(opam switch show)/bin/ci-opam ~/

opam remove -a travis-opam

mv ~/ci-opam ~/.opam/$(opam switch show)/bin/ci-opam

echo -en "travis_fold:end:prepare.ci\r"
Expand Down
21 changes: 12 additions & 9 deletions README-travis.md
Original file line number Diff line number Diff line change
Expand Up @@ -254,17 +254,14 @@ Configuration choices are passed to `mirage configure` via environment variables

### Changing the version of opam

```yaml
- [...] OPAM_VERSION="1.1.2"
```
By default, the CI scripts are using the latest RC release of opam *2.0.0*.
To use a different version of opam, use:

By default, the latest stable version of opam will be used. the scripts supports
these version:
```yaml
- [...] OPAM_VERSION="1.2.2"
```

- `OPAM_VERSION=1.1.2` only when the OS is `unix`
- `OPAM_VERSION=1.2.0` only when the OS is `unix`
- `OPAM_VERSION=1.2.2` when the OS is either `unix` or `osx` (default)
- `OPAM_VERSION=1.3.0` only when the OS is `osx`
Supported versions are `2.0.0`, `1.2.2`, `1.2.0 and `1.1.2`.

### Testing on different OS

Expand All @@ -278,6 +275,12 @@ os:
- osx
```

To enable XQuartz support on MacOS, use:

```yaml
- [...] INSTALL_XQUARTZ=true
```

## Pushing OCamldoc docs to Github page, `.travis-docgen.sh`

This relies on the existence of a `configure` script and `Makefile` such that
Expand Down
31 changes: 26 additions & 5 deletions src/ci_opam.ml
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,14 @@ let revdep_run = list (getenv_default "REVDEPS" "")
(* run opam lint *)
let opam_lint = fuzzy_bool_of_string (getenv_default "OPAM_LINT" "true")

(* opam version *)
let opam_version =
let raw = ?|> "opam --version" in
match if String.length raw <= 1 then '?' else raw.[0] with
| '2' -> `V2
| '1' -> `V1
| _ -> failwith (raw ^ ": invalid opam version")

(* other variables *)
let extra_deps = list (getenv_default "EXTRA_DEPS" "")
let pre_install_hook = getenv_default "PRE_INSTALL_HOOK" ""
Expand All @@ -74,9 +82,10 @@ let add_remote =
let layer = ref 0 in
fun remote -> ?|~ "opam remote add extra%d %s" !layer remote; incr layer

let pin pin = match pair pin with
| (pkg,None) -> ?|~ "opam pin add %s --dev-repo -n" pkg
| (pkg,Some url) -> ?|~ "opam pin add %s %s -n" pkg url
let pin = function
| pkg, None -> ?|~ "opam pin add %s --dev-repo -n" pkg
| pkg, Some "." -> ?|~ "opam pin add %s --kind=path . -n" pkg
| pkg, Some url -> ?|~ "opam pin add %s %s -n" pkg url

let is_base pkg =
match trim (?|> "opam show -f version %s" pkg) with
Expand Down Expand Up @@ -207,6 +216,16 @@ let max_version package =
in
next_version (trim (?|> "opam show -f version %s" package))

module Strings = Map.Make(String)

let lint_pins pkg pins =
let pins = List.map pair pins in
let pkgs =
List.fold_left (fun acc (k, v) -> Strings.add k v acc) Strings.empty pins
in
let pkgs = Strings.add pkg (Some ".") pkgs in
Strings.fold (fun k v acc -> (k, v) :: acc) pkgs []

;; (* Go go go *)

with_fold "Prepare" (fun () ->
Expand Down Expand Up @@ -237,9 +256,11 @@ with_fold "Prepare" (fun () ->
Format.ksprintf failwith "No opam file found for %s, aborting." pkg_name
in

(if opam_lint then match opam_version with
| `V2 -> ?|~ "opam lint %s --warn=-21-32-48" opam
| _ -> ?|~ "opam lint %s" opam);
let pins = lint_pins pkg pins in
List.iter pin pins;
(if opam_lint then ?|~ "opam lint %s" opam);
?|~ "opam pin add %s . -n" pkg;
?| "eval $(opam config env)";
?| "opam install depext";
(* Install the external dependencies *)
Expand Down