12
12
type : string
13
13
14
14
jobs :
15
+ determine-affected :
16
+ runs-on : ubuntu-latest
17
+ outputs :
18
+ matrix : ${{ steps.set-matrix.outputs.matrix }}
19
+ all-hosts : ${{ steps.set-matrix.outputs.all-hosts }}
20
+ build-all : ${{ steps.set-matrix.outputs.build-all }}
21
+ steps :
22
+ - name : Checkout repository
23
+ uses : actions/checkout@v4
24
+ with :
25
+ ref : ${{ inputs.branch }}
26
+ fetch-depth : 0
27
+
28
+ - uses : ./.github/actions/setup-nix
29
+ with :
30
+ arch : x86_64-linux
31
+ TS_OAUTH_CLIENT_ID : ${{ secrets.TS_OAUTH_CLIENT_ID }}
32
+ TS_OAUTH_SECRET : ${{ secrets.TS_OAUTH_SECRET }}
33
+ ATTIC_ENDPOINT : ${{ secrets.ATTIC_ENDPOINT }}
34
+ ATTIC_CACHE : ${{ secrets.ATTIC_CACHE }}
35
+ ATTIC_TOKEN : ${{ secrets.ATTIC_TOKEN }}
36
+
37
+ - name : Get hosts from flake
38
+ id : get-hosts
39
+ run : |
40
+ ALL_HOSTS=$(nix flake show --impure --json | jq -r '.nixosConfigurations | keys | .[]' | jq -R . | jq -s .)
41
+ echo "All hosts from flake: $ALL_HOSTS"
42
+ echo "all-hosts=$ALL_HOSTS" >> "$GITHUB_OUTPUT"
43
+
44
+ # Special Properties
45
+ NO_BUILD=()
46
+ EXTRA_SPACE=("nixmi" "winix")
47
+
48
+ deviceTypes=$(find hosts -maxdepth 1 -type d -name '*' | grep -oP 'hosts/\K[^/]+' | grep -v shared)
49
+ echo "host-types=$(echo "$deviceTypes" | jq -R . | jq -s .)" >> "$GITHUB_OUTPUT"
50
+
51
+ users_imports="{}"
52
+ declare -a host_entries
53
+ for host in $(echo "$ALL_HOSTS" | jq -r '.[]'); do
54
+ noBuild=false
55
+ if [[ " ${NO_BUILD[*]} " = *" $host "* ]]; then
56
+ noBuild=true
57
+ fi
58
+ extraSpace=false
59
+ if [[ " ${EXTRA_SPACE[*]} " = *" $host "* ]]; then
60
+ extraSpace=true
61
+ fi
62
+
63
+ hostType="unknown"
64
+ for deviceType in $deviceTypes; do
65
+ if [ -d "hosts/$deviceType/$host" ]; then
66
+ hostType="$deviceType"
67
+ break
68
+ fi
69
+ done
70
+
71
+ imports=$(./utils/get-imports.nu "OS" "$host" | jq -c .)
72
+ users=$(nix eval --impure --json .#nixosConfigurations.nixmi.config.home-manager.users --apply builtins.attrNames | jq -c .)
73
+ for user in $(echo "$users" | jq -r '.[]'); do
74
+ if [[ "$(echo "$users_imports" | jq -r ".$user == null")" == "true" ]]; then
75
+ users_imports=$(echo "$users_imports" | jq \
76
+ --arg username "$user" \
77
+ --argjson user "$(./utils/get-imports.nu "HOME" "$user" | jq -c .)" \
78
+ '.[$username] = $user')
79
+ fi
80
+
81
+ imports=$(jq -s '.[0] + .[1]' <(echo "$imports") <(echo "$users_imports" | jq -c ".$user"))
82
+ done
83
+
84
+ entry=$(jq -n \
85
+ --arg host "$host" \
86
+ --arg system "x86_64-linux" \
87
+ --arg hostType "$hostType" \
88
+ --argjson users "$users" \
89
+ --argjson imports "$imports" \
90
+ --argjson extraSpace "$extraSpace" \
91
+ --argjson noBuild "$noBuild" \
92
+ '{host: $host, system: $system, hostType: $hostType, users: $users, imports: $imports, extraSpace: $extraSpace, noBuild: $noBuild}')
93
+
94
+ host_entries+=("$entry")
95
+ done
96
+
97
+ HOST_DETAILS=$(jq -s 'map({key: .host, value: .}) | from_entries' <<<"${host_entries[@]}")
98
+ echo "Host details: $HOST_DETAILS"
99
+ echo "host-details=$HOST_DETAILS" >> "$GITHUB_OUTPUT"
100
+
101
+ - name : Determine affected hosts
102
+ id : set-matrix
103
+ run : |
104
+ CHANGED_FILES=$(git diff --name-only ${{ github.event.before }} ${{ github.sha }} | grep -v '^D' || true)
105
+ echo "Changed files:"
106
+ echo "$CHANGED_FILES"
107
+
108
+ HOST_DETAILS=$(echo "${{steps.get-hosts.outputs.host-details}}" | jq -c .)
109
+
110
+ declare -a build_hosts
111
+ if echo "$CHANGED_FILES" | grep -qE '(^flake\.nix$|^flake\.lock$|^lib/|^overlays/|^pkgs/)'; then
112
+ echo "Found changes in core files. All hosts will be rebuilt."
113
+ build_hosts=("$(echo "$HOST_DETAILS" | jq -r 'keys[]')")
114
+ else
115
+ rebuild_json=$(jq --argjson changed "$(jq -R -s -c . <<<"$CHANGED_FILES")" '
116
+ . as $hosts |
117
+ to_entries
118
+ | map(select(.value.imports |
119
+ any( . as $imp | ($changed | index($imp)) )))
120
+ | map(.key)
121
+ ' <<<"$HOST_DETAILS")
122
+
123
+ mapfile -t build_hosts < <(jq -r '.[]' <<<"$rebuild_json")
124
+ fi
125
+
126
+ declare -a matrix_entries
127
+ for host in "${build_hosts[@]}"; do
128
+ entry=$(echo "$HOST_DETAILS" | jq -r ".$host")
129
+ matrix_entries+=("$entry")
130
+ done
131
+
132
+ MATRIX_JSON="$(printf '%s\n' "${matrix_entries[@]}" | jq -s .)"
133
+ echo "matrix=$MATRIX_JSON" >> "$GITHUB_OUTPUT"
134
+
15
135
checks :
16
136
runs-on : ubuntu-latest
17
137
steps :
@@ -24,34 +144,16 @@ jobs:
24
144
uses : DeterminateSystems/flake-checker-action@main
25
145
26
146
build :
147
+ needs : determine-affected
148
+ if : needs.determine-affected.outputs.matrix != '[]'
27
149
runs-on : ubuntu-latest
28
150
concurrency :
29
151
group : ${{ github.workflow }}-${{ github.ref }}-${{ matrix.host }}-${{ matrix.system }}
30
152
cancel-in-progress : true
31
153
strategy :
32
154
fail-fast : false
33
- # TODO - Use a step to determine the hosts dynamically from the flake
34
155
matrix :
35
- include :
36
- - host : nixmi
37
- system : x86_64-linux
38
- extraSpace : true
39
- - host : winix
40
- system : x86_64-linux
41
- - host : nixai
42
- system : x86_64-linux
43
- - host : nixarr
44
- system : x86_64-linux
45
- - host : nixcloud
46
- system : x86_64-linux
47
- - host : nixdev
48
- system : x86_64-linux
49
- - host : nixio
50
- system : x86_64-linux
51
- - host : nixmon
52
- system : x86_64-linux
53
- - host : nixserv
54
- system : x86_64-linux
156
+ include : ${{ fromJSON(needs.determine-affected.outputs.matrix) }}
55
157
56
158
name : ${{ matrix.host }} on ${{ matrix.system }}
57
159
@@ -62,16 +164,18 @@ jobs:
62
164
ref : ${{ inputs.branch }}
63
165
64
166
- name : Free Disk Space
65
- if : ${{ matrix.extraSpace == true && !env.ACT }}
167
+ if : ${{ matrix.extraSpace && !env.ACT }}
66
168
uses : jlumbroso/free-disk-space@main
67
169
with :
68
170
swap-storage : true
69
171
tool-cache : true
172
+
70
173
- name : Create Dir for Mounting more Disk Space ❄
71
- if : ${{ matrix.extraSpace == true && !env.ACT }}
174
+ if : ${{ matrix.extraSpace && !env.ACT }}
72
175
run : sudo mkdir /nix
176
+
73
177
- name : Maximize Disk Space
74
- if : ${{ matrix.extraSpace == true && !env.ACT }}
178
+ if : ${{ matrix.extraSpace && !env.ACT }}
75
179
uses : easimon/maximize-build-space@v10
76
180
with :
77
181
build-mount-path : /nix
83
187
temp-reserve-mb : 100
84
188
swap-size-mb : 4096
85
189
root-reserve-mb : 1024
190
+
86
191
- name : Ensure correct permissions for /nix
87
- if : ${{ matrix.extraSpace == true && !env.ACT }}
192
+ if : ${{ matrix.extraSpace && !env.ACT }}
88
193
run : sudo chown -R root:root /nix
89
194
90
195
- uses : ./.github/actions/setup-nix
@@ -102,7 +207,7 @@ jobs:
102
207
run : nix eval --impure --accept-flake-config .#nixosConfigurations.${{ matrix.host }}.config.system.build.toplevel
103
208
104
209
- name : Build ${{ matrix.host }}
105
- # if: matrix.noBuild != true
210
+ if : ${{ ! matrix.noBuild }}
106
211
env :
107
212
_system : ${{ matrix.system }}
108
213
run : nix build --impure --accept-flake-config .#nixosConfigurations.${{ matrix.host }}.config.system.build.toplevel
0 commit comments