aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--default.nix103
-rw-r--r--utils.nix96
2 files changed, 120 insertions, 79 deletions
diff --git a/default.nix b/default.nix
index 9ed4049..4ea1ec0 100644
--- a/default.nix
+++ b/default.nix
@@ -1,51 +1,14 @@
-let
- pkgsUnstable = import <nixpkgs> { };
- pkgsPinned = import (pkgsUnstable.fetchzip {
- url = "https://github.com/NixOS/nixpkgs/archive/18.03.zip";
- sha256 = "0hk4y2vkgm1qadpsm4b0q1vxq889jhxzjx3ragybrlwwg54mzp4f";
- }) { };
- pkgs = pkgsUnstable;
-
- nixfmt = import (builtins.fetchTarball
- "https://github.com/serokell/nixfmt/archive/master.tar.gz") { };
-
- baseTask = pkgs.stdenv.mkDerivation {
- name = "vps-task";
+let pkgs = import <nixpkgs> { };
+in rec {
+ utils = import ./utils.nix {
+ pkgs = pkgs;
src = pkgs.nix-gitignore.gitignoreSource [ ] ./.;
- phases = "unpackPhase buildPhase";
- buildInputs = [ ];
- buildPhase = ''
- echo "ERROR: base task buildPhase not overriden."
- exit 1
- '';
+ baseName = "dotfiles";
};
-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: {
+ formatTerraform = utils.baseTask.overrideAttrs (baseAttrs: {
name = "${baseAttrs.name}-format-terraform";
- buildInputs = baseAttrs.buildInputs ++ [ terraform ];
+ buildInputs = baseAttrs.buildInputs ++ [ pkgs.terraform ];
buildPhase = ''
terraform fmt -check=true -diff=true || {
echo "Terraform files are unformatted. To fix it, run:"
@@ -55,9 +18,9 @@ with pkgs.stdenv; rec {
touch $out
'';
});
- dockerComposeLint = baseTask.overrideAttrs (baseAttrs: {
+ dockerComposeLint = utils.baseTask.overrideAttrs (baseAttrs: {
name = "${baseAttrs.name}-docker-compose-lint";
- buildInputs = baseAttrs.buildInputs ++ [ docker-compose ];
+ buildInputs = baseAttrs.buildInputs ++ [ pkgs.docker-compose ];
buildPhase = ''
source .envrc
docker-compose config &> /dev/null || {
@@ -67,41 +30,23 @@ with pkgs.stdenv; rec {
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
- '';
- });
+ test = utils.test [
+ (utils.shellcheck null)
+ (utils.fixme null)
+ utils.formatNix
+ subtasks.formatTerraform
+ subtasks.dockerComposeLint
+ ];
# Used in .build.yml to run Bash scripts
- shell = mkShell rec {
+ shell = pkgs.mkShell rec {
name = "vps-shell";
- buildInputs =
- [ gitMinimal git-crypt gettext terraform-providers.digitalocean terraform ];
+ buildInputs = with pkgs; [
+ gitMinimal
+ git-crypt
+ gettext
+ terraform-providers.digitalocean
+ terraform
+ ];
};
}
diff --git a/utils.nix b/utils.nix
new file mode 100644
index 0000000..3167399
--- /dev/null
+++ b/utils.nix
@@ -0,0 +1,96 @@
+{ pkgs, src, baseName }:
+let
+ nixfmt = import (builtins.fetchTarball
+ "https://github.com/serokell/nixfmt/archive/master.tar.gz") { };
+in rec {
+ baseTask = pkgs.stdenv.mkDerivation {
+ name = "${baseName}-task";
+ src = src;
+ buildInputs = [ ];
+ phases = "unpackPhase buildPhase";
+ buildPhase = ''
+ echo "ERROR: base task buildPhase not overriden."
+ exit 1
+ '';
+ };
+ shellcheck = ignoredFindPattern:
+ baseTask.overrideAttrs (baseAttrs: rec {
+ name = "${baseAttrs.name}-shellcheck";
+ buildInputs = baseAttrs.buildInputs ++ [ pkgs.shellcheck ];
+ ignoredPattern =
+ if ignoredFindPattern == null then "" else ignoredFindPattern;
+ buildPhase = ''
+ find . -type f \( -name '*.sh' -and -regextype egrep ! -regex '${ignoredPattern}' \) -print0 | xargs -0 shellcheck -x
+ touch $out
+ '';
+ });
+ formatNix = baseTask.overrideAttrs (baseAttrs: {
+ name = "${baseAttrs.name}-nixfmt";
+ buildInputs = baseAttrs.buildInputs ++ [ nixfmt ];
+ buildPhase = ''
+ format() {
+ nix_file="$1"
+ diff <(nixfmt < "$nix_file") "$nix_file" || {
+ echo "The $nix_file is unformatted. To fix it, run:"
+ echo " nixfmt $nix_file"
+ exit 1
+ }
+ }
+ export -f format
+ find . -type f -name '*.nix' -print0 | xargs -0 -I{} bash -c "format {}" \;
+ touch $out
+ '';
+ });
+ fixme = ignoredFiles:
+ baseTask.overrideAttrs (baseAttrs: rec {
+ name = "${baseAttrs.name}-fixme";
+ buildInputs = baseAttrs.buildInputs ++ [ pkgs.ag ];
+ ignoredPattern = pkgs.lib.fold (a: b: " --ignore ${a} ${b}") ""
+ (if ignoredFiles == null then [
+ "utils.nix"
+ "TODOs.org"
+ ] else
+ ignoredFiles);
+ buildPhase = ''
+ ag FIXME ${ignoredPattern} || {
+ touch $out
+ exit 0
+ }
+ echo " Found dangling FIXME markers on the project."
+ echo " You should write them down properly on TODOs.org."
+ exit 1
+ '';
+ });
+ readmeOrg = title:
+ baseTask.overrideAttrs (baseAttrs: {
+ name = "${baseAttrs.name}-readme-docs";
+ buildInputs = [ pkgs.pandoc ];
+ buildPhase = ''
+ pandoc README.org -o $out --css docs/README.css --to=html5 --self-contained --metadata title="${title}"
+ '';
+ });
+ test = testDerivations:
+ baseTask.overrideAttrs (baseAttrs: {
+ name = "${baseAttrs.name}-test";
+ buildPhase = ''
+ echo "Ran tests for:"
+ for d in ${builtins.toString testDerivations}; do
+ echo " $d"
+ done
+ echo "All tests passed!"
+ touch $out
+ '';
+ });
+ overwritingPublishScript = { docsDerivation, overwrite ? true }:
+ pkgs.writeShellScriptBin "publish.sh" ''
+ set -euo pipefail
+ OUT_DOCS="${docsDerivation}"
+ ${
+ if overwrite then "" else "# "
+ }${pkgs.openssh}/bin/ssh -o StrictHostKeyChecking=no "$SERVER_URL" rm -rf "$DOCS_SERVER_PATH/*"
+ ${pkgs.rsync}/bin/rsync -avzP \
+ --rsh="ssh -o StrictHostKeyChecking=no" \
+ "$OUT_DOCS/" \
+ "$SERVER_URL:$DOCS_SERVER_PATH"
+ '';
+}