| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300 |
- {
- description = "Kilo is a multi-cloud network overlay built on WireGuard and designed for Kubernetes (k8s + wg = kg)";
- inputs = {
- nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
- flake-parts.url = "github:hercules-ci/flake-parts";
- git-hooks-nix = {
- url = "github:cachix/git-hooks.nix";
- inputs.nixpkgs.follows = "nixpkgs";
- };
- };
- outputs =
- { self, ... }@inputs:
- inputs.flake-parts.lib.mkFlake { inherit inputs; } {
- imports = [
- inputs.git-hooks-nix.flakeModule
- ];
- systems = [
- "x86_64-linux"
- "aarch64-linux"
- "aarch64-darwin"
- ];
- perSystem =
- {
- pkgs,
- system,
- config,
- ...
- }:
- {
- packages =
- let
- _version = builtins.getEnv "VERSION";
- homepage = "https://github.com/squat/kilo";
- base = pkgs.buildGoModule (finalAttrs: {
- pname = "kilo";
- version = if _version != "" then _version else toString (self.rev or self.dirtyRev or "unknown");
- src = ./.;
- vendorHash = null;
- env.CGO_ENABLED = 0;
- ldflags = [
- "-X github.com/squat/kilo/pkg/version.Version=${finalAttrs.version}"
- ];
- nativeBuildInputs = [ pkgs.installShellFiles ];
- meta = {
- inherit homepage;
- };
- });
- kg = base.overrideAttrs {
- pname = "kg";
- subPackages = [
- "cmd/kg"
- ];
- postInstall = ''
- installShellCompletion --cmd kg \
- --bash <($out/bin/kg completion bash) \
- --fish <($out/bin/kg completion fish) \
- --zsh <($out/bin/kg completion zsh)
- '';
- meta.mainProgram = "kg";
- meta.description = "kg is the Kilo agent that runs on every Kubernetes node in a Kilo mesh";
- };
- kgctl = base.overrideAttrs {
- pname = "kgctl";
- subPackages = [
- "cmd/kgctl"
- ];
- postInstall = ''
- installShellCompletion --cmd kgctl \
- --bash <($out/bin/kgctl completion bash) \
- --fish <($out/bin/kgctl completion fish) \
- --zsh <($out/bin/kgctl completion zsh)
- '';
- meta.mainProgram = "kgctl";
- meta.description = "kgctl is Kilo's command line tool for inspecting and interacting with clusters: kgctl. It can be used to understand a mesh's topology, get the WireGuard configuration for a peer, or graph a cluster";
- };
- kilo = pkgs.symlinkJoin {
- name = "kilo";
- paths = [
- kg
- kgctl
- ];
- meta = {
- inherit homepage;
- description = "Kilo is a multi-cloud network overlay built on WireGuard and designed for Kubernetes (k8s + wg = kg)";
- };
- };
- in
- {
- inherit kg kgctl kilo;
- default = kilo;
- }
- // (builtins.listToAttrs (
- map
- (target: {
- name = "kg-cross-${target.os}-${target.arch}";
- value = kg.overrideAttrs (
- _: oldAttrs: {
- env = oldAttrs.env // {
- GOOS = target.os;
- GOARCH = target.arch;
- CGO_ENABLED = 0;
- };
- checkPhase = false;
- postInstall = "";
- }
- );
- })
- [
- {
- os = "linux";
- arch = "amd64";
- }
- {
- os = "linux";
- arch = "arm64";
- }
- {
- os = "linux";
- arch = "arm";
- }
- ]
- ))
- // (builtins.listToAttrs (
- map
- (target: {
- name = "kgctl-cross-${target.os}-${target.arch}";
- value = kgctl.overrideAttrs (
- _: oldAttrs: {
- env = oldAttrs.env // {
- GOOS = target.os;
- GOARCH = target.arch;
- CGO_ENABLED = 0;
- };
- checkPhase = false;
- postInstall = "";
- }
- );
- })
- [
- {
- os = "linux";
- arch = "amd64";
- }
- {
- os = "linux";
- arch = "arm64";
- }
- {
- os = "linux";
- arch = "arm";
- }
- {
- os = "darwin";
- arch = "amd64";
- }
- {
- os = "darwin";
- arch = "arm64";
- }
- {
- os = "windows";
- arch = "amd64";
- }
- ]
- ))
- // (builtins.listToAttrs (
- map
- (target: {
- name = "kilo-cross-${target.os}-${target.arch}";
- value = kilo.overrideAttrs {
- paths = [
- config.packages."kg-cross-${target.os}-${target.arch}"
- config.packages."kgctl-cross-${target.os}-${target.arch}"
- ];
- };
- })
- [
- {
- os = "linux";
- arch = "amd64";
- }
- {
- os = "linux";
- arch = "arm64";
- }
- {
- os = "linux";
- arch = "arm";
- }
- ]
- ));
- pre-commit = {
- check.enable = true;
- settings = {
- src = ./.;
- hooks = {
- actionlint.enable = true;
- nixfmt.enable = true;
- nixfmt.excludes = [ "vendor" ];
- gofmt.enable = true;
- gofmt.excludes = [ "vendor" ];
- golangci-lint.enable = true;
- golangci-lint.excludes = [ "vendor" ];
- golangci-lint.extraPackages = [ pkgs.go ];
- govet.enable = true;
- govet.excludes = [ "vendor" ];
- shellcheck.enable = true;
- shellcheck.excludes = [
- ".envrc"
- "vendor"
- ];
- yamlfmt.enable = true;
- yamlfmt.args = [
- "--formatter"
- "indentless_arrays=true"
- ];
- yamlfmt.excludes = [
- ".github"
- "vendor"
- ];
- header = {
- enable = true;
- name = "Header";
- entry =
- let
- headerCheck = pkgs.writeShellApplication {
- name = "header-check";
- text = ''
- HEADER=$(cat ${./.header})
- HEADER_LEN=$(wc -l ${./.header} | awk '{print $1}')
- FILES=
- for f in "$@"; do
- for i in 0 1 2 3 4 5; do
- FILE=$(tail -n +$i "$f" | ( head -n "$HEADER_LEN"; cat > /dev/null ) | sed "s/[0-9]\{4\}/YEAR/")
- [ "$FILE" = "$HEADER" ] && continue 2
- done
- FILES="$FILES$f "
- done
- if [ -n "$FILES" ]; then \
- printf 'the following files are missing the license header: %s\n' "$FILES"; \
- exit 1
- fi
- '';
- };
- in
- pkgs.lib.getExe headerCheck;
- files = "\\.(go)$";
- excludes = [ "vendor" ];
- };
- kgMDGen = {
- enable = true;
- name = "kg.md";
- entry =
- let
- kgMDGen = pkgs.writeShellApplication {
- name = "kgmdgen";
- text = ''
- go run ./cmd/kg/... --help | head -n -2 > help.txt
- go tool embedmd -d docs/kg.md
- '';
- };
- in
- pkgs.lib.getExe kgMDGen;
- files = "^README\\.md$";
- extraPackages = [ pkgs.go ];
- };
- };
- };
- };
- devShells = {
- default = pkgs.mkShell {
- inherit (config.pre-commit.devShell) shellHook;
- packages =
- with pkgs;
- [
- bash_unit
- (config.packages.kgctl.overrideAttrs {
- version = "dev";
- __intentionallyOverridingVersion = true;
- })
- gettext # provides envsubst
- go
- kind
- kubectl
- yarn
- ]
- ++ config.pre-commit.settings.enabledPackages;
- };
- };
- };
- };
- }
|