let pkgsUnstable = import { }; pkgsPinned = import (pkgsUnstable.fetchzip { url = "https://github.com/NixOS/nixpkgs/archive/18.03.zip"; sha256 = "0hk4y2vkgm1qadpsm4b0q1vxq889jhxzjx3ragybrlwwg54mzp4f"; }) { }; pkgs = pkgsUnstable; rootSrc = pkgs.nix-gitignore.gitignoreSource [ ] ./.; nixfmt = import (builtins.fetchTarball "https://github.com/serokell/nixfmt/archive/master.tar.gz") { }; baseTask = pkgs.stdenv.mkDerivation { name = "vps-task"; src = rootSrc; phases = "unpackPhase buildPhase"; buildInputs = [ ]; buildPhase = '' echo "ERROR: base task buildPhase not overriden." exit 1 ''; }; in with pkgs; with pkgs.stdenv; rec { subtasks = rec { shellCheck = baseTask.overrideAttrs (baseAttrs: { name = "${baseAttrs.name}-shellcheck"; buildInputs = baseAttrs.buildInputs ++ [ shellcheck ]; buildPhase = '' find . -type f -name '*.sh' | xargs shellcheck touch $out ''; }); fixme = baseTask.overrideAttrs (baseAttrs: { name = "${baseAttrs.name}-fixme"; buildInputs = baseAttrs.buildInputs ++ [ ag ]; buildPhase = '' ag FIXME --ignore default.nix || { touch $out exit 0 } echo "^^^^^^^^^^^^^^^^^" echo " Found dangling FIXME markers on the project xp" exit 1 ''; }); formatTerraform = baseTask.overrideAttrs (baseAttrs: { name = "${baseAttrs.name}-format-terraform"; buildInputs = baseAttrs.buildInputs ++ [ terraform ]; buildPhase = '' terraform fmt -check=true -diff=true || { echo "Terraform files are unformatted. To fix it, run:" echo " terraform fmt" exit 1 } touch $out ''; }); dockerComposeLint = baseTask.overrideAttrs (baseAttrs: { name = "${baseAttrs.name}-docker-compose-lint"; buildInputs = baseAttrs.buildInputs ++ [ docker-compose ]; buildPhase = '' source .envrc docker-compose config &> /dev/null || { echo "Invalid docker-compose.yml file." exit 1 } touch $out ''; }); formatNix = baseTask.overrideAttrs (baseAttrs: { name = "${baseAttrs.name}-nixfmt"; buildInputs = baseAttrs.buildInputs ++ [ nixfmt ]; buildPhase = '' diff <(nixfmt < default.nix) default.nix || { echo "The default.nix is unformatted. To fix it, run:" echo " nixfmt default.nix" exit 1 } touch $out ''; }); }; test = baseTask.overrideAttrs (baseAttrs: rec { name = "${baseAttrs.name}-test"; buildInputs = [ subtasks.shellCheck subtasks.fixme subtasks.formatTerraform subtasks.dockerComposeLint subtasks.formatNix ]; buildPhase = '' echo "Ran tests for:" for d in ${builtins.toString buildInputs}; do echo " $d" done echo "All tests passed!" touch $out ''; }); # Used in .build.yml to run Bash scripts shell = mkShell rec { name = "vps-shell"; buildInputs = [ gitMinimal git-crypt gettext terraform-providers.digitalocean terraform ]; }; }