reproducible_html_nodes_info.sh 10.8 KB
Newer Older
1
#!/bin/bash
2
# vim: set noexpandtab:
3

4
# Copyright © 2015-2022 Holger Levsen <holger@layer-acht.org>
5
#           ©      2018 Mattia Rizzolo <mattia@debian.org>
Holger Levsen's avatar
Holger Levsen committed
6
# released under the GPLv2
7

8
9
set -e

10
11
12
13
DEBUG=false
. /srv/jenkins/bin/common-functions.sh
common_init "$@"

14
# common code for tests.reproducible-builds.org
15
16
. /srv/jenkins/bin/reproducible_common.sh

17
18
19
explain_nodes() {
	case $JENKINS_NODENAME in
		jenkins)	;;
20
		ionos3)		write_page "<br /><small>(twitterbot for irc:#reproducible-builds)</small>" ;;
21
		ionos7)		write_page "<br /><small>(buildinfos.debian.net)</small>" ;;
22
23
		ionos9)		write_page "<br /><small>(jenkins.d.n rebootstrap jobs)</small>" ;;
		ionos10)	write_page "<br /><small>(jenkins.d.n chroot-installation jobs and http-proxy)</small>" ;;
24
		osuosl167)	write_page "<br /><small>(Debian janitor jobs and fakeroot foreign jobs and http-proxy for osuosl nodes)</small>" ;;
25
		osuosl168)	write_page "<br /><small>(r-b F-Droid builds)</small>" ;;
26
		osuosl184)	write_page "<br /><small>(r-b Alpine, Archlinux builds)</small>" ;;
27
		osuosl170)	write_page "<br /><small>(r-b Alpine, Archlinux builds)</small>" ;;
28
		osuosl171)	write_page "<br /><small>(r-b OpenWrt, NetBSD, Coreboot builds)</small>" ;;
29
		osuosl172)	write_page "<br /><small>(r-b OpenWrt, Coreboot builds)</small>" ;;
30
		osuosl173)	write_page "<br /><small>(r-b Debian / Archlinux rebuilder)</small>" ;;
31
		osuosl174)	write_page "<br /><small>(r-b openSUSE)</small>" ;;
32
		ionos1)		write_page "<br /><small>(r-b Debian builds and http-proxy)</small>" ;;
33
		codethink16)	write_page "<br /><small>(r-b Debian builds and http-proxy)</small>" ;;
34
35
36
37
		*)		write_page "<br /><small>(r-b Debian builds)</small>" ;;
	esac
}

Holger Levsen's avatar
Holger Levsen committed
38
39
40
41
42
build_nodes_health_page() {
	#
	# build node health page
	#
	VIEW=nodes_health
43
44
45
46
	PAGE=index_${VIEW}.html
	ARCH=amd64
	SUITE=unstable
	echo "$(date -u) - starting to write $PAGE page."
Holger Levsen's avatar
Holger Levsen committed
47
	write_page_header $VIEW "Nodes health overview"
48
49
50
51
	write_page "<p style=\"clear:both;\">"
	for ARCH in ${ARCHS} ; do
		write_page "<h3>$ARCH nodes</h3>"
		write_page "<table>"
Holger Levsen's avatar
Holger Levsen committed
52
53
54
55
56
57
58
59
60
61
		write_page "<tr><th>Name</th><th>health check</th><th>maintenance</th><th>Debian worker.log links</th>"
			for SUITE in ${SUITES} ; do
				write_page "<th>pbuilder setup $SUITE</th>"
			done
			for SUITE in ${SUITES} ; do
				if [ "$SUITE" = "experimental" ]; then
					continue
				fi
				write_page "<th>schroot setup $SUITE</th>"
			done
62
		write_page "</tr>"
Holger Levsen's avatar
Holger Levsen committed
63
64
65
66
67
68
69
		# the following for-loop is a hack to insert nodes which are not part of the
		# Debian Reproducible Builds node network but are using for reproducible builds
		# tests of other projects…
		REPRODUCIBLE_NODES="jenkins"

		for NODE in $BUILD_NODES ; do
			REPRODUCIBLE_NODES="$REPRODUCIBLE_NODES $NODE"
70
			if [ "$NODE" = "ionos2-i386.debian.net" ] ; then
71
				# ionos3	twitterbot
72
73
				REPRODUCIBLE_NODES="$REPRODUCIBLE_NODES ionos3-amd64.debian.net"
			elif [ "$NODE" = "ionos6-i386.debian.net" ] ; then
74
75
76
				# ionos7	reproducible fdroid jobs
				# ionos9 	rebootstrap jobs
				# ionos10	chroot jobs
77
				REPRODUCIBLE_NODES="$REPRODUCIBLE_NODES ionos7-amd64.debian.net ionos9-amd64.debian.net ionos10-amd64.debian.net"
Holger Levsen's avatar
Holger Levsen committed
78
79
			fi
		done
80
		for NODE in $REPRODUCIBLE_NODES ; do
81
82
83
84
85
86
87
88
			if [ -z "$(echo $NODE | grep $ARCH || true)" ] && [ "$NODE" != "jenkins" ] ; then
				continue
			elif [ "$NODE" = "jenkins" ] && [ "$ARCH" != "amd64" ] ; then
				continue
			fi
			if [ "$NODE" = "jenkins" ] ; then
				JENKINS_NODENAME=jenkins
				NODE="jenkins.debian.net"
89
			else
Holger Levsen's avatar
Holger Levsen committed
90
				JENKINS_NODENAME=$(echo $NODE | cut -d "-" -f1)
91
			fi
Holger Levsen's avatar
Holger Levsen committed
92
			write_page "<tr><td>$JENKINS_NODENAME"
93
			explain_nodes
Holger Levsen's avatar
Holger Levsen committed
94
95
96
97
98
			write_page "</td>"
			# health check
			URL="https://jenkins.debian.net/view/reproducible/view/Node_maintenance/job/reproducible_node_health_check_${ARCH}_${JENKINS_NODENAME}"
			BADGE="$URL/badge/icon"
			write_page "<td><a href='$URL'><img src='$BADGE' /></a></td>"
99
100
101
102
			# maintenance
			URL="https://jenkins.debian.net/view/reproducible/view/Node_maintenance/job/reproducible_maintenance_${ARCH}_${JENKINS_NODENAME}"
			BADGE="$URL/badge/icon"
			write_page "<td><a href='$URL'><img src='$BADGE' /></a></td>"
Holger Levsen's avatar
Holger Levsen committed
103
			# mark offline nodes
104
105
			if [ -f "$JENKINS_OFFLINE_GIT_LIST" ] && ! grep -q "$NODE" "$JENKINS_OFFLINE_GIT_LIST" \
			 && ( [ -f "$JENKINS_OFFLINE_LIST" ] && grep -q "$NODE" "$JENKINS_OFFLINE_LIST" ) ; then
106
				write_page '</td><td colspan="10" style="text-align: center;"><span style="font-style: italic;">temporarily marked offline by jenkins</span></td>'
107
108
				continue
			elif [ -f "$JENKINS_OFFLINE_LIST" ] && grep -q "$NODE" "$JENKINS_OFFLINE_LIST"; then
109
				write_page '</td><td colspan="10" style="text-align: center;"><span style="font-style: italic;">offline</span></td>'
110
				continue
Holger Levsen's avatar
Holger Levsen committed
111
112
113
114
			fi
			# worker.log links
			case $JENKINS_NODENAME in
				jenkins)	write_page "<td></td>" ;;
115
116
117
118
				ionos3)		write_page "<td></td>" ;;
				ionos7)		write_page "<td></td>" ;;
				ionos9)		write_page "<td></td>" ;;
				ionos10)	write_page "<td></td>" ;;
119
				osuosl*)	write_page "<td></td>" ;;
Holger Levsen's avatar
Holger Levsen committed
120
121
122
123
124
125
126
127
128
129
130
131
132
				*)		write_page "<td>"
						SHORTNAME=$(echo $NODE | cut -d '.' -f1)
						for WORKER in $(grep "${ARCH}_" /srv/jenkins/bin/reproducible_build_service.sh | grep -v \# |grep $SHORTNAME | cut -d ')' -f1) ; do
							write_page "<a href='https://jenkins.debian.net/userContent/reproducible/debian/build_service/${WORKER}/worker.log'>"
							write_page "$(echo $WORKER |cut -d '_' -f2)</a> "
						done
						write_page "</td>"
						;;
			esac
			# pbuilder setup
			for SUITE in ${SUITES} ; do
				case $JENKINS_NODENAME in
					jenkins)	write_page "<td></td>" ;;
133
134
135
136
					ionos3)		write_page "<td></td>" ;;
					ionos7)		write_page "<td></td>" ;;
					ionos9)		write_page "<td></td>" ;;
					ionos10)	write_page "<td></td>" ;;
137
					osuosl*)	write_page "<td></td>" ;;
Holger Levsen's avatar
Holger Levsen committed
138
139
140
141
142
143
144
145
146
147
					*)		URL="https://jenkins.debian.net/view/reproducible/view/Debian_setup_${ARCH}/job/reproducible_setup_pbuilder_${SUITE}_${ARCH}_${JENKINS_NODENAME}"
							BADGE="$URL/badge/icon"
							write_page "<td><a href='$URL'><img src='$BADGE' /></a></td>"
							;;
				esac
			done
			# diffoscope schroot setup
			for SUITE in ${SUITES} ; do
				if [ "$SUITE" = "experimental" ]; then
					continue
148
				fi
Holger Levsen's avatar
Holger Levsen committed
149
150
151
				URL="https://jenkins.debian.net/view/reproducible/view/Debian_setup_${ARCH}/job/reproducible_setup_schroot_${SUITE}_diffoscope_${ARCH}_${JENKINS_NODENAME}"
				BADGE="$URL/badge/icon"
				case $JENKINS_NODENAME in
152
					osuosl171|osuosl172)
Holger Levsen's avatar
Holger Levsen committed
153
154
155
156
157
158
						if [ "$SUITE" = "unstable" ]; then
							write_page "<td><a href='$URL'><img src='$BADGE' /></a></td>"
						else
							write_page "<td></td>"
						fi
						;;
159
160
161
162
163
164
165
					osuosl173)
						if [ "$SUITE" = "buster" ]; then
							write_page "<td><a href='$URL'><img src='$BADGE' /></a></td>"
						else
							write_page "<td></td>"
						fi
						;;
Holger Levsen's avatar
Holger Levsen committed
166
167
168
169
170
					jenkins)
						write_page "<td><a href='$URL'><img src='$BADGE' /></a></td>"
						;;
					*) write_page "<td></td>" ;;
				esac
171
172
			done
			write_page "</tr>"
173
		done
174
		write_page "</table>"
175
	done
176
177
178
	write_page "</p>"
	write_page_footer
	publish_page debian
Holger Levsen's avatar
Holger Levsen committed
179
}
180

Holger Levsen's avatar
Holger Levsen committed
181
182
build_graph_overview_pages() {
	#
183
	# munin nodes daily/weekly/monthly/yearly pages
Holger Levsen's avatar
Holger Levsen committed
184
	#
185
	for TYPE in daily weekly monthly yearly ; do
Holger Levsen's avatar
Holger Levsen committed
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
		VIEW=nodes_${TYPE}_graphs
		PAGE=index_${VIEW}.html
		ARCH=amd64
		SUITE=unstable
		echo "$(date -u) - starting to write $PAGE page."
		write_page_header $VIEW "Nodes $TYPE graphs"
		write_page "<p style=\"clear:both;\">"
		for ARCH in ${ARCHS} ; do
			write_page "<h3>$ARCH nodes</h3>"
			write_page "<table>"
			write_page "<tr><th>Name</th><th colspan='6'></th>"
			write_page "</tr>"
			for NODE in $REPRODUCIBLE_NODES ; do
				if [ -z "$(echo $NODE | grep $ARCH || true)" ] && [ "$NODE" != "jenkins" ] ; then
					continue
				elif [ "$NODE" = "jenkins" ] && [ "$ARCH" != "amd64" ] ; then
					continue
				fi
				if [ "$NODE" = "jenkins" ] ; then
					JENKINS_NODENAME=jenkins
					NODE="jenkins.debian.net"
				else
Holger Levsen's avatar
Holger Levsen committed
208
					JENKINS_NODENAME=$(echo $NODE | cut -d "-" -f1)
Holger Levsen's avatar
Holger Levsen committed
209
				fi
210
211
212
				write_page "<tr><td>$JENKINS_NODENAME"
				explain_nodes
				write_page "</td>"
Holger Levsen's avatar
Holger Levsen committed
213
214
215
216
				for GRAPH in jenkins_reproducible_builds cpu memory df swap load ; do
					if [ "$GRAPH" = "jenkins_reproducible_builds" ] ; then
						case $JENKINS_NODENAME in
							jenkins)	write_page "<td></td>" ; continue ;;
217
218
219
220
							ionos3)		write_page "<td></td>" ; continue ;;
							ionos7)		write_page "<td></td>" ; continue ;;
							ionos9)		write_page "<td></td>" ; continue ;;
							ionos10)	write_page "<td></td>" ; continue ;;
221
222
							osuosl*)	write_page "<td></td>" ; continue ;;
							*)		;;
Holger Levsen's avatar
Holger Levsen committed
223
224
225
						esac
					fi
					write_page "<td><a href='https://jenkins.debian.net/munin/debian.net/$NODE/$GRAPH.html'>"
226
					case "$TYPE" in
Holger Levsen's avatar
Holger Levsen committed
227
228
229
						daily)		IMG=day.png ;;
						weekly)		IMG=week.png ;;
						monthly)	IMG=month.png ;;
230
						yearly)		IMG=year.png ;;
231
					esac
Holger Levsen's avatar
Holger Levsen committed
232
233
234
235
236
237
238
239
240
					write_page "<img src='https://jenkins.debian.net/munin/debian.net/$NODE/${GRAPH}-${IMG}' width='150' /></a></td>"
				done
				write_page "</tr>"
			done
			write_page "</table>"
		done
		write_page "</p>"
		write_page_footer
		publish_page debian
241
	done
Holger Levsen's avatar
Holger Levsen committed
242
243
244
245
246
247
248
249
250
251
}

build_job_health_page() {
	#
	# job health page
	#
	VIEW=job_health
	PAGE=index_${VIEW}.html
	ARCH=amd64
	SUITE=unstable
252
	# these are or-filters used with egrep
Holger Levsen's avatar
Holger Levsen committed
253
254
255
256
	FILTER=("(builds|spec|lfs)"
		"html_(all|break|dash|dd|index|live|node|pkg|repo)"
		"(reproducible_compare|pool)"
		"reproducible_diffoscope"
257
		"reproducible_(cdeboot|deboot|mmdeb)strap"
Holger Levsen's avatar
Holger Levsen committed
258
259
260
261
262
263
264
265
266
		"(reprotest|strip-nonderminism|disorderfs)"
		"(json|le_scheduler|meta|le_nodes|rsync|notes)"
		"archlinux"
		"coreboot"
		"(openwrt)"
		"(le_netbsd|le_freebsd)"
		"fdroid"
		"fedora"
		"alpine")
Holger Levsen's avatar
Holger Levsen committed
267
268
269
270
	echo "$(date -u) - starting to write $PAGE page."
	write_page_header $VIEW "Job health overview"
	write_page "<p style=\"clear:both;\">"
	write_page "<table>"
271
	for CATEGORY in $(seq 0 $(( ${#FILTER[@]} -1 )) ) ; do
Holger Levsen's avatar
Holger Levsen committed
272
		write_page "<tr>"
273
274
275
		for JOB in $(cd ~/jobs ; ls -1d reproducible_* | egrep "${FILTER[$CATEGORY]}" | cut -d '_' -f2- | sort ) ; do
			SHORTNAME="$(echo $JOB \
				| sed 's#archlinux_##' \
276
				| sed 's#alpine_##' \
277
				| sed 's#builder_fedora#builder#' \
278
				| sed 's#_x86_64##' \
279
280
				| sed 's#_from_git_master#_git#' \
				| sed 's#setup_schroot_##' \
281
				| sed 's#setup_mock_fedora-##' \
282
				| sed 's#create_##' \
283
284
				| sed 's#fdroid_build_##' \
				| sed 's#html_archlinux#html#' \
285
				| sed 's#html_alpine#html#' \
286
287
288
				| sed 's#html_##' \
				| sed 's#builds_##' \
				| sed 's#_diffoscope_amd64##' \
289
				| sed 's#compare_Debian_##' \
290
291
292
				| sed 's#_#-#g' \
				)"
			write_page "<th>$SHORTNAME</th>"
Holger Levsen's avatar
Holger Levsen committed
293
294
		done
		write_page "</tr><tr>"
295
		for JOB in $(cd ~/jobs ; ls -1d reproducible_* | egrep "${FILTER[$CATEGORY]}" | cut -d '_' -f2- | sort ) ; do
Holger Levsen's avatar
Holger Levsen committed
296
297
298
299
300
			URL="https://jenkins.debian.net/job/reproducible_$JOB"
			BADGE="$URL/badge/icon"
			write_page "<td><a href='$URL'><img src='$BADGE' /></a></td>"
		done
		write_page "</tr>"
301
	done
Holger Levsen's avatar
Holger Levsen committed
302
303
304
305
306
	write_page "</table>"
	write_page "</p>"
	write_page_footer
	publish_page debian
}
307

Holger Levsen's avatar
Holger Levsen committed
308
309
310
#
# main
#
311
312
PAGE=""
JENKINS_NODENAME=""
Holger Levsen's avatar
Holger Levsen committed
313
314
315
build_job_health_page
build_nodes_health_page
build_graph_overview_pages