2018-08-06 21:00:58 +03:00
#!/usr/bin/env bash
2018-05-14 00:25:41 +03:00
2020-05-27 17:42:58 +03:00
# NOTE: Script for the CI builds. CI comes here from `.travis.yml`
2020-05-31 19:34:39 +03:00
# NOTE: The most strict error checking requirements
set -Eexuo pipefail
# NOTE: If var not imported - set to the default value
2020-06-17 15:46:02 +03:00
GHCVERSION = ${ GHCVERSION :- 'ghc8101' }
2020-05-31 19:34:39 +03:00
rev = ${ rev :- 'nixpkgs-unstable' }
NIX_PATH = ${ NIX_PATH :- " nixpkgs=https://github.com/nixos/nixpkgs/archive/ $rev .tar.gz " }
export NIX_PATH
pkgName = ${ pkgName :- 'defaultPkgName' }
2020-06-17 15:48:13 +03:00
allowInconsistentDependencies = ${ allowInconsistentDependencies :- 'false' }
2020-05-31 19:34:39 +03:00
doJailbreak = ${ doJailbreak :- 'false' }
doCheck = ${ doCheck :- 'true' }
buildFromSdist = ${ buildFromSdist :- 'false' }
2020-06-17 15:48:13 +03:00
failOnAllWarnings = ${ failOnAllWarnings :- 'false' }
2020-05-31 19:34:39 +03:00
buildStrictly = ${ buildStrictly :- 'false' }
disableOptimization = ${ disableOptimization :- 'true' }
2020-06-17 15:48:13 +03:00
enableLibraryProfiling = ${ enableLibraryProfiling :- 'false' }
enableExecutableProfiling = ${ enableExecutableProfiling :- 'false' }
checkUnusedPackages = ${ checkUnusedPackages :- 'false' }
doHaddock = ${ doHaddock :- 'false' }
doCoverage = ${ doCoverage :- 'false' }
doBenchmark = ${ doBenchmark :- 'false' }
2020-05-31 19:34:39 +03:00
# NOTE: *Oprparse* key is redifined in the code further
generateOptparseApplicativeCompletions = ${ generateOptparseApplicativeCompletions :- 'false' }
2020-06-17 19:40:21 +03:00
executableNamesToShellComplete = ${ executableNamesToShellComplete :- '[ "defaultBinaryName" ]' }
2020-05-31 19:34:39 +03:00
ghcjsTmpLogFile = ${ ghcjsTmpLogFile :- '/tmp/ghcjsTmpLogFile.log' }
ghcjsLogTailLength = ${ ghcjsLogTailLength :- '10000' }
2020-05-31 22:30:24 +03:00
# NOTE: If key not provided (branch is not inside the central repo) - init CACHIX_SIGNING_KEY as empty
CACHIX_SIGNING_KEY = ${ CACHIX_SIGNING_KEY :- "" }
2020-05-31 19:34:39 +03:00
2020-05-27 17:50:11 +03:00
GHCJS_BUILD( ) {
# NOTE: Function for GHCJS build that outputs its huge log into a file
# NOTE: Run the build into Log (log is too long for Travis)
" $@ " & > " $ghcjsTmpLogFile "
}
2020-05-27 17:50:33 +03:00
SILENT( ) {
2020-05-28 17:42:01 +03:00
# NOTE: Function that silences the build process
2020-05-27 17:50:33 +03:00
# In normal mode outputs only the /nix/store paths
echo " Log: $ghcjsTmpLogFile "
# NOTE: Pass into the ghcjsbuild function the build command
if GHCJS_BUILD " $@ "
then
# NOTE: Output log lines for stdout -> cachix caching
grep '^/nix/store/' " $ghcjsTmpLogFile "
else
# NOTE: Output log lines for stdout -> cachix caching
grep '^/nix/store/' " $ghcjsTmpLogFile "
# NOTE: Propagate the error state, fail the CI build
exit 1
fi
}
2020-05-28 00:57:48 +03:00
BUILD_PROJECT( ) {
2020-05-27 17:44:49 +03:00
2020-05-27 20:13:32 +03:00
2020-05-31 19:34:39 +03:00
IFS = $'\n\t'
2020-05-27 20:13:32 +03:00
2020-05-28 01:01:12 +03:00
if [ " $GHCVERSION " = "ghcjs" ]
then
2020-05-28 17:45:29 +03:00
# NOTE: GHCJS build
# By itself, GHCJS creates >65000 lines of log that are >4MB in size, so Travis terminates due to log size quota.
2020-05-28 01:01:12 +03:00
# nixbuild --quiet (x5) does not work on GHC JS build
# So there was a need to make it build.
2020-05-28 17:45:29 +03:00
# The solution is to silence the stdout
2020-05-28 01:01:12 +03:00
# But Travis then terminates on 10 min no stdout timeout
# so HACK: SILENT wrapper allows to surpress the huge log, while still preserves the Cachix caching ability in any case of the build
# On build failure outputs the last 10000 lines of log (that should be more then enough), and terminates
SILENT nix-build \
--arg failOnAllWarnings " $failOnAllWarnings " \
--arg buildStrictly " $buildStrictly " \
--arg checkUnusedPackages " $checkUnusedPackages " \
--arg doCoverage " $doCoverage " \
--arg doHaddock " $doHaddock " \
--arg doJailbreak " $doJailbreak " \
--arg doCheck " $doCheck " \
--arg doBenchmark " $doBenchmark " \
--arg enableExecutableProfiling " $enableExecutableProfiling " \
--arg enableLibraryProfiling " $enableLibraryProfiling " \
--arg buildFromSdist " $buildFromSdist " \
--arg buildStrictly " $buildStrictly " \
--arg disableOptimization " $disableOptimization " \
--arg allowInconsistentDependencies " $allowInconsistentDependencies " \
2020-06-17 19:40:21 +03:00
--arg generateOptparseApplicativeCompletions " $generateOptparseApplicativeCompletions " \
--arg executableNamesToShellComplete " $executableNamesToShellComplete " \
2020-06-01 18:38:57 +03:00
ghcjs
2020-05-28 01:01:12 +03:00
2020-05-28 01:00:14 +03:00
else
# NOTE: Normal GHC build
# NOTE: GHC sometimes produces logs so big - that Travis terminates builds, so multiple --quiet
nix-build \
--quiet --quiet \
--argstr compiler " $GHCVERSION " \
--arg failOnAllWarnings " $failOnAllWarnings " \
--arg buildStrictly " $buildStrictly " \
--arg checkUnusedPackages " $checkUnusedPackages " \
--arg doCoverage " $doCoverage " \
--arg doHaddock " $doHaddock " \
--arg doJailbreak " $doJailbreak " \
--arg doCheck " $doCheck " \
--arg doBenchmark " $doBenchmark " \
--arg enableExecutableProfiling " $enableExecutableProfiling " \
--arg enableLibraryProfiling " $enableLibraryProfiling " \
--arg buildFromSdist " $buildFromSdist " \
--arg buildStrictly " $buildStrictly " \
--arg disableOptimization " $disableOptimization " \
2020-06-17 19:40:21 +03:00
--arg allowInconsistentDependencies " $allowInconsistentDependencies " \
--arg generateOptparseApplicativeCompletions " $generateOptparseApplicativeCompletions " \
--arg executableNamesToShellComplete " $executableNamesToShellComplete "
2020-05-28 01:00:14 +03:00
fi
2020-05-28 00:57:48 +03:00
}
2020-05-28 00:57:13 +03:00
MAIN( ) {
2020-06-01 18:43:26 +03:00
# 2020-06-01: NOTE: Nix installer installs old Nix version that has bugs that prevented importing Nixpks repository channels, updating to latest Nix since it does not have that bug
# NOTE: Overall it is useful to have in CI test builds the latest stable Nix
# NOTE: User-run update for Linux setup
nix upgrade-nix || true
# NOTE: Superuser update for macOS setup
sudo nix upgrade-nix || true
2020-06-01 19:08:37 +03:00
# NOTE: Make channels current
nix-channel --update || true
sudo nix-channel --update || true
2020-06-01 18:43:26 +03:00
2020-05-28 00:57:13 +03:00
# NOTE: Secrets are not shared to PRs from forks
# NOTE: nix-build | cachix push <name> - uploads binaries, runs&works only in the branches of the main repository, so for PRs - else case runs
if [ ! " $CACHIX_SIGNING_KEY " = "" ]
then
# NOTE: Build of the inside repo branch - enable push Cachix cache
BUILD_PROJECT | cachix push " $name "
else
# NOTE: Build of the side repo/PR - can not push Cachix cache
BUILD_PROJECT
fi
}
# NOTE: Run the entry function of the script
MAIN