aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xbuild-aux/ci/ci-build.sh53
-rwxr-xr-xbuild-aux/ci/git-post-receive.sh14
-rwxr-xr-xbuild-aux/ci/git-pre-push.sh19
3 files changed, 86 insertions, 0 deletions
diff --git a/build-aux/ci/ci-build.sh b/build-aux/ci/ci-build.sh
new file mode 100755
index 0000000..b7a4c38
--- /dev/null
+++ b/build-aux/ci/ci-build.sh
@@ -0,0 +1,53 @@
+#!/bin/sh
+set -eux
+
+PACKAGE="$1"
+LOGS_DIR="$2"
+read -r _ SHA _ # oldrev newrev refname
+FILENAME="$(date -Is)-$SHA.log"
+LOGFILE="$LOGS_DIR/$FILENAME"
+
+{
+ echo "Starting CI job at: $(date -Is)"
+
+ finish() {
+ STATUS="$?"
+ printf "\n\n>>> exit status was %s\n" "$STATUS"
+ echo "Finishing CI job at: $(date -Is)"
+ cd -
+ 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
+EOF
+ )
+ git notes --ref=refs/notes/ci-data add -f -m "$STATUS $FILENAME"
+ git notes --ref=refs/notes/ci-logs add -f -F "$LOGFILE"
+ git notes append -m "$NOTE"
+ printf "\n>>>\n>>> CI logs added as Git note.\n>>>\n>>> Run status was %s" "$STATUS"
+ }
+ trap finish EXIT
+
+ unset GIT_DIR
+ CLONE="$(mktemp -d)"
+ git clone . "$CLONE"
+ cd "$CLONE"
+ git config --global user.email git@euandre.org
+ git config --global user.name 'EuAndreh CI'
+
+ if [ -f build-aux/with-container.sh ]; then
+ RUNNER='./build-aux/with-container.sh'
+ else
+ RUNNER='sh -c'
+ fi
+
+ if [ -f ./bootstrap ]; then
+ COMMAND='./bootstrap && ./configure --enable-programmer-mode --enable-ci-mode && make clean all check distcheck public'
+ else
+ COMMAND='make clean check public'
+ fi
+
+ $RUNNER "$COMMAND"
+
+ rsync -avzzP public/ "/srv/http/$PACKAGE/" --delete
+} | tee "$LOGFILE" 2>&1
diff --git a/build-aux/ci/git-post-receive.sh b/build-aux/ci/git-post-receive.sh
new file mode 100755
index 0000000..2f6e3c0
--- /dev/null
+++ b/build-aux/ci/git-post-receive.sh
@@ -0,0 +1,14 @@
+#!/bin/sh
+set -eu
+
+for n in $(seq 0 $((GIT_PUSH_OPTION_COUNT - 1))); do
+ opt="$(eval "echo \$GIT_PUSH_OPTION_$n")"
+ if [ "$opt" = skip-ci ] || [ "$opt" = ci-skip ]; then
+ printf "\n'%s' option detected, not running ci-build.sh\n\n" "$opt"
+ exit 0
+ fi
+done
+
+PACKAGE="$(basename "$PWD" | cut -d. -f1)" # remove .git suffix
+LOGS_DIR="/data/ci/$PACKAGE/logs"
+"/data/ci/$PACKAGE/ci-build.sh" "$PACKAGE" "$LOGS_DIR"
diff --git a/build-aux/ci/git-pre-push.sh b/build-aux/ci/git-pre-push.sh
new file mode 100755
index 0000000..2d2bcb1
--- /dev/null
+++ b/build-aux/ci/git-pre-push.sh
@@ -0,0 +1,19 @@
+#!/bin/sh
+set -eux
+
+PACKAGE="$(basename "$PWD")"
+LOGS_DIR="/data/ci/$PACKAGE/logs"
+REMOTE_GIT_DIR="/data/git/$PACKAGE.git"
+
+DESCRIPTION="$(mktemp)"
+if [ -f description ]
+then
+ cp description "$DESCRIPTION"
+else
+ git config euandreh.description > "$DESCRIPTION"
+fi
+
+scp "$DESCRIPTION" "git.euandreh.xyz:$REMOTE_GIT_DIR/description"
+ssh git.euandreh.xyz mkdir -p "$LOGS_DIR"
+scp build-aux/ci/ci-build.sh "git.euandreh.xyz:$(dirname "$LOGS_DIR")/ci-build.sh"
+scp build-aux/ci/git-post-receive.sh "git.euandreh.xyz:$REMOTE_GIT_DIR/hooks/post-receive"