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"
|