#!/bin/bash # This script runs 'buildtest' on each of several distros # via Docker. # shellcheck disable=SC2016 set -o pipefail exec 3>&1 4>&2 die() { echo "$*" >&4; exit 1; } [ -e "ShellCheck.cabal" ] || die "ShellCheck.cabal not in this dir" [ "$1" = "--run" ] || { cat << EOF This script pulls multiple distros via Docker and compiles ShellCheck and dependencies for each one. It takes hours, and is still highly experimental. Make sure you're plugged in and have screen/tmux in place, then re-run with $0 --run to continue. Also note that dist* will be deleted. EOF exit 0 } echo "Deleting 'dist' and 'dist-newstyle'..." rm -rf dist dist-newstyle log=$(mktemp) || die "Can't create temp file" date >> "$log" || die "Can't write to log" echo "Logging to $log" >&3 exec >> "$log" 2>&1 final=0 echo "Trying to build pre-commit docker image" if ! docker build --tag precommit . then final=1 echo "pre-commit image failed to build" else if printf '%s\n' '#!/bin/sh' 'echo $1' | docker run -i precommit - then final=1 echo "pre-commit image succeeds with incorrect example" fi if ! printf '%s\n' '#!/bin/sh' 'echo "$1"' | docker run -i precommit - then final=1 echo "pre-commit image fails with correct example" fi fi if [[ $final -ne 0 ]] then echo >&3 "pre-commit image failure, see log" else echo >&3 "pre-commit image succeeded" fi while read -r distro setup do [[ "$distro" = "#"* || -z "$distro" ]] && continue printf '%s ' "$distro" >&3 docker pull "$distro" || die "Can't pull $distro" printf 'pulled. ' >&3 tmp=$(mktemp -d) || die "Can't make temp dir" cp -r . "$tmp/" || die "Can't populate test dir" printf 'Result: ' >&3 < /dev/null docker run -v "$tmp:/mnt" "$distro" sh -c " $setup cd /mnt || exit 1 test/buildtest " ret=$? if [ "$ret" = 0 ] then echo "OK" >&3 else echo "FAIL with $ret. See $log" >&3 final=1 fi rm -rf "$tmp" done << EOF # Docker tag Setup command debian:stable apt-get update && apt-get install -y cabal-install debian:testing apt-get update && apt-get install -y cabal-install ubuntu:latest apt-get update && apt-get install -y cabal-install haskell:latest true opensuse/leap:latest zypper install -y cabal-install ghc fedora:latest dnf install -y cabal-install ghc-template-haskell-devel findutils archlinux/base:latest pacman -S -y --noconfirm cabal-install ghc-static base-devel # Other versions we want to support ubuntu:18.04 apt-get update && apt-get install -y cabal-install # Misc Haskell including current and latest Stack build ubuntu:18.04 set -e; apt-get update && apt-get install -y curl && curl -sSL https://get.haskellstack.org/ | sh -s - -f && cd /mnt && exec test/stacktest EOF exit "$final"