Skip to content

Commit c00c78b

Browse files
authored
Package Kubenix script (#62)
* Package Kubenix script * Update changelog * Fix hardcoded kubeconfig * Expose generated manifest with Kubenix CLI derivation passthru
1 parent 5692af2 commit c00c78b

File tree

3 files changed

+94
-75
lines changed

3 files changed

+94
-75
lines changed

CHANGELOG.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,13 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8-
## [Unreleased]
8+
## [0.3.0] - 2024-05-05
9+
10+
### Breaking
11+
12+
- removed generated Kubernetes manifest file (`manifest.json`) from default flake package
13+
14+
See the [documentation](https://kubenix.org/#usage) how to access the generated Kubernetes manifest file
915

1016
### Added
1117

@@ -14,6 +20,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1420
### Changed
1521

1622
- removed local `kubectl` and `kubernetes` packages in lieu of those from nixpkgs
23+
- pin Bash version of Kubenix CLI script
1724

1825
## [0.2.0] - 2023-07-07
1926

pkgs/kubenix.nix

Lines changed: 25 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -2,94 +2,45 @@
22
, vals
33
, colordiff
44
, evalModules
5-
, runCommand
65
, writeShellScript
6+
, writeScriptBin
7+
, makeWrapper
8+
, symlinkJoin
9+
, lib
710
, module ? { }
811
, specialArgs ? { }
912
}:
1013
let
1114
kubernetes = (evalModules {
1215
inherit module specialArgs;
1316
}).config.kubernetes or { };
14-
in
15-
runCommand "kubenix"
16-
{
17+
1718
kubeconfig = kubernetes.kubeconfig or "";
1819
result = kubernetes.result or "";
1920

2021
# kubectl does some parsing which removes the -I flag so
2122
# as workaround, we write to a script and call that
2223
# https://github.com/kubernetes/kubernetes/pull/108199#issuecomment-1058405404
2324
diff = writeShellScript "kubenix-diff" ''
24-
${colordiff}/bin/colordiff --nobanner -N -u -I ' kubenix/hash: ' -I ' generation: ' $@
25+
${lib.getExe colordiff} --nobanner -N -u -I ' kubenix/hash: ' -I ' generation: ' $@
2526
'';
26-
} ''
27-
set -euo pipefail
28-
mkdir -p $out/bin
29-
30-
# write the manifests for use with `nix build`
31-
ln -s $result $out/manifest.json
32-
33-
# create a script for `nix run`
34-
cat <<EOF> $out/bin/kubenix
35-
set -uo pipefail
36-
37-
export KUBECONFIG=$kubeconfig
38-
export KUBECTL_EXTERNAL_DIFF=$diff
39-
40-
function _help() {
41-
echo "
42-
kubenix - Kubernetes management with Nix
43-
44-
commands:
45-
"" - run diff, prompt for confirmation, then apply
46-
apply - create resources in target cluster
47-
diff - show a diff between configured and live resources
48-
render - print resource manifests to stdout
49-
50-
options:
51-
-h --help - show this menu
52-
"
53-
}
54-
55-
function _kubectl() {
56-
${vals}/bin/vals eval -fail-on-missing-key-in-map < $result | ${kubectl}/bin/kubectl \$@
57-
}
58-
59-
# if no args given, add empty string
60-
[ \$# -eq 0 ] && set -- ""
6127

62-
# parse arguments
63-
while test \$# -gt 0; do
64-
case "\$1" in
65-
66-
-h|--help)
67-
_help
68-
exit 0;;
69-
70-
"")
71-
_kubectl diff -f - --prune
72-
if [[ "\$?" -eq 1 ]]; then
73-
read -p 'apply? [y/N]: ' response
74-
[[ \$response == "y" ]] && _kubectl apply -f - --prune --all
75-
fi
76-
shift;;
77-
78-
render)
79-
${vals}/bin/vals eval < $result
80-
shift;;
81-
82-
apply|diff)
83-
_kubectl \$@ -f - --prune
84-
shift;;
85-
86-
*)
87-
_kubectl \$@
88-
shift;;
89-
90-
esac
91-
done
92-
93-
EOF
94-
chmod +x $out/bin/kubenix
95-
''
28+
script = (writeScriptBin "kubenix" (builtins.readFile ./kubenix.sh)).overrideAttrs (old: {
29+
buildCommand = "${old.buildCommand}\npatchShebangs $out";
30+
});
31+
in
32+
symlinkJoin {
33+
name = "kubenix";
34+
paths = [ script vals kubectl ];
35+
buildInputs = [ makeWrapper ];
36+
passthru.manifest = result;
37+
38+
postBuild = ''
39+
export DIFF="${diff}"
40+
wrapProgram $out/bin/kubenix \
41+
--set PATH "$out/bin" \
42+
--set KUBECONFIG "${kubeconfig}" \
43+
--set KUBECTL_EXTERNAL_DIFF "''${DIFF}" \
44+
--set MANIFEST "${result}"
45+
'';
46+
}

pkgs/kubenix.sh

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
#!/usr/bin/env bash
2+
3+
set -uo pipefail
4+
5+
function _help() {
6+
echo "
7+
kubenix - Kubernetes management with Nix
8+
9+
commands:
10+
"" - run diff, prompt for confirmation, then apply
11+
apply - create resources in target cluster
12+
diff - show a diff between configured and live resources
13+
render - print resource manifests to stdout
14+
15+
options:
16+
-h --help - show this menu
17+
"
18+
}
19+
20+
function _kubectl() {
21+
vals eval -fail-on-missing-key-in-map <$MANIFEST | kubectl $@
22+
}
23+
24+
# if no args given, add empty string
25+
[ $# -eq 0 ] && set -- ""
26+
27+
# parse arguments
28+
while test $# -gt 0; do
29+
case "$1" in
30+
31+
-h | --help)
32+
_help
33+
exit 0
34+
;;
35+
36+
"")
37+
_kubectl diff -f - --prune
38+
if [[ $? -eq 1 ]]; then
39+
read -p 'apply? [y/N]: ' response
40+
[[ $response == "y" ]] && _kubectl apply -f - --prune --all
41+
fi
42+
shift
43+
;;
44+
45+
render)
46+
vals eval <$MANIFEST
47+
shift
48+
;;
49+
50+
apply | diff)
51+
_kubectl $@ -f - --prune
52+
shift
53+
;;
54+
55+
*)
56+
_kubectl $@
57+
shift
58+
;;
59+
60+
esac
61+
done

0 commit comments

Comments
 (0)