flake.nix 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  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 (finalAttrs: {
  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=${finalAttrs.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. _: oldAttrs: {
  98. env = oldAttrs.env // {
  99. GOOS = target.os;
  100. GOARCH = target.arch;
  101. CGO_ENABLED = 0;
  102. };
  103. checkPhase = false;
  104. postInstall = "";
  105. }
  106. );
  107. })
  108. [
  109. {
  110. os = "linux";
  111. arch = "amd64";
  112. }
  113. {
  114. os = "linux";
  115. arch = "arm64";
  116. }
  117. {
  118. os = "linux";
  119. arch = "arm";
  120. }
  121. ]
  122. ))
  123. // (builtins.listToAttrs (
  124. map
  125. (target: {
  126. name = "kgctl-cross-${target.os}-${target.arch}";
  127. value = kgctl.overrideAttrs (
  128. _: oldAttrs: {
  129. env = oldAttrs.env // {
  130. GOOS = target.os;
  131. GOARCH = target.arch;
  132. CGO_ENABLED = 0;
  133. };
  134. checkPhase = false;
  135. postInstall = "";
  136. }
  137. );
  138. })
  139. [
  140. {
  141. os = "linux";
  142. arch = "amd64";
  143. }
  144. {
  145. os = "linux";
  146. arch = "arm64";
  147. }
  148. {
  149. os = "linux";
  150. arch = "arm";
  151. }
  152. {
  153. os = "darwin";
  154. arch = "amd64";
  155. }
  156. {
  157. os = "darwin";
  158. arch = "arm64";
  159. }
  160. {
  161. os = "windows";
  162. arch = "amd64";
  163. }
  164. ]
  165. ))
  166. // (builtins.listToAttrs (
  167. map
  168. (target: {
  169. name = "kilo-cross-${target.os}-${target.arch}";
  170. value = kilo.overrideAttrs {
  171. paths = [
  172. config.packages."kg-cross-${target.os}-${target.arch}"
  173. config.packages."kgctl-cross-${target.os}-${target.arch}"
  174. ];
  175. };
  176. })
  177. [
  178. {
  179. os = "linux";
  180. arch = "amd64";
  181. }
  182. {
  183. os = "linux";
  184. arch = "arm64";
  185. }
  186. {
  187. os = "linux";
  188. arch = "arm";
  189. }
  190. ]
  191. ));
  192. pre-commit = {
  193. check.enable = true;
  194. settings = {
  195. src = ./.;
  196. hooks = {
  197. actionlint.enable = true;
  198. nixfmt.enable = true;
  199. nixfmt.excludes = [ "vendor" ];
  200. gofmt.enable = true;
  201. gofmt.excludes = [ "vendor" ];
  202. golangci-lint.enable = true;
  203. golangci-lint.excludes = [ "vendor" ];
  204. golangci-lint.extraPackages = [ pkgs.go ];
  205. govet.enable = true;
  206. govet.excludes = [ "vendor" ];
  207. shellcheck.enable = true;
  208. shellcheck.excludes = [
  209. ".envrc"
  210. "vendor"
  211. ];
  212. yamlfmt.enable = true;
  213. yamlfmt.args = [
  214. "--formatter"
  215. "indentless_arrays=true"
  216. ];
  217. yamlfmt.excludes = [
  218. ".github"
  219. "vendor"
  220. ];
  221. header = {
  222. enable = true;
  223. name = "Header";
  224. entry =
  225. let
  226. headerCheck = pkgs.writeShellApplication {
  227. name = "header-check";
  228. text = ''
  229. HEADER=$(cat ${./.header})
  230. HEADER_LEN=$(wc -l ${./.header} | awk '{print $1}')
  231. FILES=
  232. for f in "$@"; do
  233. for i in 0 1 2 3 4 5; do
  234. FILE=$(tail -n +$i "$f" | ( head -n "$HEADER_LEN"; cat > /dev/null ) | sed "s/[0-9]\{4\}/YEAR/")
  235. [ "$FILE" = "$HEADER" ] && continue 2
  236. done
  237. FILES="$FILES$f "
  238. done
  239. if [ -n "$FILES" ]; then \
  240. printf 'the following files are missing the license header: %s\n' "$FILES"; \
  241. exit 1
  242. fi
  243. '';
  244. };
  245. in
  246. pkgs.lib.getExe headerCheck;
  247. files = "\\.(go)$";
  248. excludes = [ "vendor" ];
  249. };
  250. kgMDGen = {
  251. enable = true;
  252. name = "kg.md";
  253. entry =
  254. let
  255. kgMDGen = pkgs.writeShellApplication {
  256. name = "kgmdgen";
  257. text = ''
  258. go run ./cmd/kg/... --help | head -n -2 > help.txt
  259. go tool embedmd -d docs/kg.md
  260. '';
  261. };
  262. in
  263. pkgs.lib.getExe kgMDGen;
  264. files = "^README\\.md$";
  265. extraPackages = [ pkgs.go ];
  266. };
  267. };
  268. };
  269. };
  270. devShells = {
  271. default = pkgs.mkShell {
  272. inherit (config.pre-commit.devShell) shellHook;
  273. packages =
  274. with pkgs;
  275. [
  276. bash_unit
  277. (config.packages.kgctl.overrideAttrs {
  278. version = "dev";
  279. __intentionallyOverridingVersion = true;
  280. })
  281. gettext # provides envsubst
  282. go
  283. kind
  284. kubectl
  285. yarn
  286. ]
  287. ++ config.pre-commit.settings.enabledPackages;
  288. };
  289. };
  290. };
  291. };
  292. }