#!/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"