flake.nix 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. {
  2. description = "Kilo is a multi-cloud network overlay built on WireGuard and designed for Kubernetes (k8s + wg = kg)";
  3. inputs = {
  4. nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
  5. flake-parts.url = "github:hercules-ci/flake-parts";
  6. git-hooks-nix = {
  7. url = "github:cachix/git-hooks.nix";
  8. inputs.nixpkgs.follows = "nixpkgs";
  9. };
  10. };
  11. outputs =
  12. { self, ... }@inputs:
  13. inputs.flake-parts.lib.mkFlake { inherit inputs; } {
  14. imports = [
  15. inputs.git-hooks-nix.flakeModule
  16. ];
  17. systems = [
  18. "x86_64-linux"
  19. "aarch64-linux"
  20. "aarch64-darwin"
  21. ];
  22. perSystem =
  23. {
  24. pkgs,
  25. system,
  26. config,
  27. ...
  28. }:
  29. {
  30. packages =
  31. let
  32. _version = builtins.getEnv "VERSION";
  33. homepage = "https://github.com/squat/kilo";
  34. base = pkgs.buildGoModule rec {
  35. pname = "kilo";
  36. version = if _version != "" then _version else toString (self.rev or self.dirtyRev or "unknown");
  37. src = ./.;
  38. vendorHash = null;
  39. env.CGO_ENABLED = 0;
  40. ldflags = [
  41. "-X github.com/squat/kilo/pkg/version.Version=${version}"
  42. ];
  43. nativeBuildInputs = [ pkgs.installShellFiles ];
  44. meta = {
  45. inherit homepage;
  46. };
  47. };
  48. kg = base.overrideAttrs {
  49. pname = "kg";
  50. subPackages = [
  51. "cmd/kg"
  52. ];
  53. postInstall = ''
  54. installShellCompletion --cmd kg \
  55. --bash <($out/bin/kg completion bash) \
  56. --fish <($out/bin/kg completion fish) \
  57. --zsh <($out/bin/kg completion zsh)
  58. '';
  59. meta.mainProgram = "kg";
  60. meta.description = "kg is the Kilo agent that runs on every Kubernetes node in a Kilo mesh";
  61. };
  62. kgctl = base.overrideAttrs {
  63. pname = "kgctl";
  64. subPackages = [
  65. "cmd/kgctl"
  66. ];
  67. postInstall = ''
  68. installShellCompletion --cmd kgctl \
  69. --bash <($out/bin/kgctl completion bash) \
  70. --fish <($out/bin/kgctl completion fish) \
  71. --zsh <($out/bin/kgctl completion zsh)
  72. '';
  73. meta.mainProgram = "kgctl";
  74. 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";
  75. };
  76. kilo = pkgs.symlinkJoin {
  77. name = "kilo";
  78. paths = [
  79. kg
  80. kgctl
  81. ];
  82. meta = {
  83. inherit homepage;
  84. description = "Kilo is a multi-cloud network overlay built on WireGuard and designed for Kubernetes (k8s + wg = kg)";
  85. };
  86. };
  87. in
  88. {
  89. inherit kg kgctl kilo;
  90. default = kilo;
  91. }
  92. // (builtins.listToAttrs (
  93. map
  94. (target: {
  95. name = "kg-cross-${target.os}-${target.arch}";
  96. value = kg.overrideAttrs {
  97. env.GOOS = target.os;
  98. env.GOARCH = target.arch;
  99. env.CGO_ENABLED = 0;
  100. checkPhase = false;
  101. postInstall = "";
  102. };
  103. })
  104. [
  105. {
  106. os = "linux";
  107. arch = "amd64";
  108. }
  109. {
  110. os = "linux";
  111. arch = "arm64";
  112. }
  113. {
  114. os = "linux";
  115. arch = "arm";
  116. }
  117. ]
  118. ))
  119. // (builtins.listToAttrs (
  120. map
  121. (target: {
  122. name = "kgctl-cross-${target.os}-${target.arch}";
  123. value = kgctl.overrideAttrs {
  124. env.GOOS = target.os;
  125. env.GOARCH = target.arch;
  126. env.CGO_ENABLED = 0;
  127. checkPhase = false;
  128. postInstall = "";
  129. };
  130. })
  131. [
  132. {
  133. os = "linux";
  134. arch = "amd64";
  135. }
  136. {
  137. os = "linux";
  138. arch = "arm64";
  139. }
  140. {
  141. os = "linux";
  142. arch = "arm";
  143. }
  144. {
  145. os = "darwin";
  146. arch = "amd64";
  147. }
  148. {
  149. os = "darwin";
  150. arch = "arm64";
  151. }
  152. {
  153. os = "windows";
  154. arch = "amd64";
  155. }
  156. ]
  157. ))
  158. // (builtins.listToAttrs (
  159. map
  160. (target: {
  161. name = "kilo-cross-${target.os}-${target.arch}";
  162. value = kilo.overrideAttrs {
  163. paths = [
  164. config.packages."kg-cross-${target.os}-${target.arch}"
  165. config.packages."kgctl-cross-${target.os}-${target.arch}"
  166. ];
  167. };
  168. })
  169. [
  170. {
  171. os = "linux";
  172. arch = "amd64";
  173. }
  174. {
  175. os = "linux";
  176. arch = "arm64";
  177. }
  178. {
  179. os = "linux";
  180. arch = "arm";
  181. }
  182. ]
  183. ));
  184. pre-commit = {
  185. check.enable = true;
  186. settings = {
  187. src = ./.;
  188. hooks = {
  189. actionlint.enable = true;
  190. nixfmt.enable = true;
  191. nixfmt.excludes = [ "vendor" ];
  192. gofmt.enable = true;
  193. gofmt.excludes = [ "vendor" ];
  194. golangci-lint.enable = true;
  195. golangci-lint.excludes = [ "vendor" ];
  196. golangci-lint.extraPackages = [ pkgs.go ];
  197. govet.enable = true;
  198. govet.excludes = [ "vendor" ];
  199. shellcheck.enable = true;
  200. shellcheck.excludes = [
  201. ".envrc"
  202. "vendor"
  203. ];
  204. yamlfmt.enable = true;
  205. yamlfmt.args = [
  206. "--formatter"
  207. "indentless_arrays=true"
  208. ];
  209. yamlfmt.excludes = [
  210. ".github"
  211. "vendor"
  212. ];
  213. header = {
  214. enable = true;
  215. name = "Header";
  216. entry =
  217. let
  218. headerCheck = pkgs.writeShellApplication {
  219. name = "header-check";
  220. text = ''
  221. HEADER=$(cat ${./.header})
  222. HEADER_LEN=$(wc -l ${./.header} | awk '{print $1}')
  223. FILES=
  224. for f in "$@"; do
  225. for i in 0 1 2 3 4 5; do
  226. FILE=$(tail -n +$i "$f" | ( head -n "$HEADER_LEN"; cat > /dev/null ) | sed "s/[0-9]\{4\}/YEAR/")
  227. [ "$FILE" = "$HEADER" ] && continue 2
  228. done
  229. FILES="$FILES$f "
  230. done
  231. if [ -n "$FILES" ]; then \
  232. printf 'the following files are missing the license header: %s\n' "$FILES"; \
  233. exit 1
  234. fi
  235. '';
  236. };
  237. in
  238. pkgs.lib.getExe headerCheck;
  239. files = "\\.(go)$";
  240. excludes = [ "vendor" ];
  241. };
  242. kgMDGen = {
  243. enable = true;
  244. name = "kg.md";
  245. entry =
  246. let
  247. kgMDGen = pkgs.writeShellApplication {
  248. name = "kgmdgen";
  249. text = ''
  250. go run ./cmd/kg/... --help | head -n -2 > help.txt
  251. go tool embedmd -d docs/kg.md
  252. '';
  253. };
  254. in
  255. pkgs.lib.getExe kgMDGen;
  256. files = "^README\\.md$";
  257. extraPackages = [ pkgs.go ];
  258. };
  259. };
  260. };
  261. };
  262. devShells = {
  263. default = pkgs.mkShell {
  264. inherit (config.pre-commit.devShell) shellHook;
  265. packages =
  266. with pkgs;
  267. [
  268. bash_unit
  269. (config.packages.kgctl.overrideAttrs rec {
  270. version = "dev";
  271. __intentionallyOverridingVersion = true;
  272. ldflags = [
  273. "-X github.com/squat/kilo/pkg/version.Version=${version}"
  274. ];
  275. })
  276. gettext # provides envsubst
  277. go
  278. kind
  279. kubectl
  280. yarn
  281. ]
  282. ++ config.pre-commit.settings.enabledPackages;
  283. };
  284. };
  285. };
  286. };
  287. }