summaryrefslogtreecommitdiff
path: root/src/cicd-run
blob: 66e5f8c05a093542b9d6e4c2be12a0ebb64e75f3 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#!/bin/sh
set -eu


usage() {
	cat <<-'EOF'
		Usage: cicdd
	EOF
}


N=`nproc`

if [ ! -e "$CLONE" ]; then
	git clone "$REPO" "$CLONE"
fi

cd "$CLONE"
git fetch
git checkout "$VERSION"

MANIFEST_OPT=
if [ -f manifest.scm ]; then
	MANIFEST_OPT='-m manifest.scm'
fi
guix shell -Cv3 $MANIFEST_OPT -- make -j$N all check



NAME="$(basename "$PWD" .git)"
LOGS_DIR=/var/log/ci/"$NAME"/
TIMESTAMP="$(now)"
FILENAME="$TIMESTAMP-$SHA.log"
LOGFILE="$LOGS_DIR/$FILENAME"
mkdir -p "$LOGS_DIR"


info() {
	pre "$(color -c lightblueb 'CI')"
}



{
	cat <<-EOF | info
		Starting CI job at: $(now)
	EOF
	START="$(epoch)"

	duration() {
		if [ "$RUN_DURATION" -gt 60 ]; then
			cat <<-EOF
				$(yellow 'WARNING'): run took more than 1 minute! ($RUN_DURATION seconds)
			EOF
		else
			cat <<-EOF
				Run took $RUN_DURATION seconds.
			EOF
		fi
	}

	finish() {
		STATUS="$?"
		END="$(epoch)"
		RUN_DURATION=$((END - START))
		cat <<-EOF | info
			Finishing CI job at: $(now)
			Exit status was $STATUS
			Re-run with:
			  \$ $CMD
			$(duration)
		EOF

		NOTE="$(
			cat <<-EOF
				See CI logs with:
				  git notes --ref=refs/notes/ci-logs show $SHA
				  git notes --ref=refs/notes/ci-data show $SHA

				Exit status: $STATUS
				Duration: $RUN_DURATION
			EOF
		)"
		git notes --ref=refs/notes/ci-data add -f -m "$(
			cat <<-EOF
				status $STATUS
				sha $SHA
				filename $FILENAME
				duration $RUN_DURATION
				timestamp $TIMESTAMP
				to-prod $TO_PROD
				refname $REFNAME
			EOF
		)" "$SHA"
		git notes --ref=refs/notes/ci-logs add -f -F "$LOGFILE" "$SHA"
		git notes add -f -m "$NOTE" "$SHA"

		{
			printf 'Git CI HTML report for %s (%s) started.\n' "$NAME" "$SHA" >&2
			DIR="$(mkdtemp)"
			report -o "$DIR"
			sudo -u deployer rsync \
				--chmod=D775,F664         \
				--chown=deployer:deployer \
				--delete                  \
				-a                        \
				"$DIR"/ "$HTML_OUTDIR_CI"/
			rm -rf "$DIR"
			printf 'Git CI HTML report for %s (%s) finished.\n' "$NAME" "$SHA" >&2
		} 2>&1 | logger -i -p local0.warn -t git-ci 1>/dev/null 2>&1 &
	}
	trap finish EXIT

	unset GIT_DIR

	if [ "$REFNAME" = 'refs/heads/main' ] && [ "$SKIP_DEPLOY" = false ]; then
		cat <<-EOF | info
			In branch "main", running deploy for $SHA.
		EOF
		TO_PROD=true
		CMD="sudo reconfigure $SHA"
	else
		if [ "$SKIP_DEPLOY" = true ]; then
			cat <<-EOF | info
				"deploy.skip" option detected, skipping deploy for $SHA.
			EOF
		else
			cat <<-EOF | info
				Not on branch "main", skipping deploy for $SHA.
			EOF
		fi
		TO_PROD=false
		CMD="sudo reconfigure -n $SHA"
	fi
	$CMD
} 2>&1 | ts -s '%.s' | tee "$LOGFILE"