all repos — homestead @ 5b66286b3f86e4268e3af68ced4c63d410552b17

Code for my website

flake.nix (view raw)

{
  description = "My website, alanpearce.eu";
  inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
  inputs.utils.url = "github:numtide/flake-utils";
  inputs.gomod2nix.url = "github:nix-community/gomod2nix";
  inputs.gomod2nix.inputs.nixpkgs.follows = "nixpkgs";
  inputs.gomod2nix.inputs.flake-utils.follows = "utils";
  inputs.pre-commit-hooks.url = "github:cachix/pre-commit-hooks.nix";
  inputs.pre-commit-hooks.inputs.nixpkgs.follows = "nixpkgs";
  inputs.treefmt-nix.url = "github:numtide/treefmt-nix";

  outputs =
    {
      self,
      nixpkgs,
      utils,
      pre-commit-hooks,
      gomod2nix,
      treefmt-nix,
      ...
    }:
    utils.lib.eachDefaultSystem (
      system:
      let
        pkgs = import nixpkgs {
          inherit system;
          overlays = [
            gomod2nix.overlays.default
          ];
        };
        commonShellPackages = with pkgs; [
          go
          hyperlink
          just
          ko
          flyctl
          redis
        ];
        devPackages = with pkgs; [
          wgo
          gofumpt
          gopls
          gotools
          gomod2nix.legacyPackages.${system}.gomod2nix

          systemfd
          modd
        ];
        treefmtEval = treefmt-nix.lib.evalModule pkgs {
          projectRootFile = "flake.nix";
          programs = {
            nixfmt.enable = true;
            taplo.enable = true;
            mdformat.enable = true;
            gofumpt.enable = true;
            golines.enable = true;
            prettier.enable = true;
          };
          settings.formatter = {
            taplo.excludes = [ "gomod2nix.toml" ];
          };
        };
      in
      {
        devShells = {
          ci = pkgs.mkShell {
            packages = commonShellPackages;
          };
          default = pkgs.mkShell {
            inherit (self.checks.${system}.pre-commit-check) shellHook;
            packages = devPackages ++ commonShellPackages;
          };
        };
        formatter = treefmtEval.config.build.wrapper;
        checks = {
          pre-commit-check = pre-commit-hooks.lib.${system}.run {
            src = ./.;
            hooks = {
              go-mod-tidy = {
                enable = true;
                name = "go-mod-tidy";
                description = "Run `go mod tidy`";
                types_or = [
                  "go"
                  "go-mod"
                ];
                entry = "${pkgs.go}/bin/go mod tidy";
                pass_filenames = false;
              };
              golines.enable = true;
              golangci-lint = {
                enable = true;
                entry =
                  let
                    hookPkgs = pre-commit-hooks.packages.${system};
                    script = pkgs.writeShellScript "precommit-golangci-lint" ''
                      set -e
                      echo "$@" | xargs -n1 dirname | sort -u | xargs -n1 printf '"./%s" ' | \
                        xargs ${hookPkgs.golangci-lint}/bin/golangci-lint run --new --fix
                    '';
                  in
                  builtins.toString script;
              };
              gotest.enable = true;
              gomod2nix = {
                enable = true;
                name = "gomod2nix";
                description = "Import go.mod updates to nix";
                types_or = [ "go-sum" ];
                entry = "${pkgs.gomod2nix}/bin/gomod2nix";
                pass_filenames = false;
              };
            };
          };
        };
        packages = {
          build = pkgs.buildGoApplication {
            pname = "build";
            version = self.shortRev or self.dirtyShortRev;
            src = ./.;
            modules = ./gomod2nix.toml;
            subPackages = [ "domain/content/builder/build" ];
            nativeBuildInputs = with pkgs; [ makeWrapper ];

            postInstall = ''
              wrapProgram $out/bin/build --set KO_DATA_PATH ${./kodata}
            '';
          };
        };
      }
    );
}