summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2022-07-04 11:26:04 -0400
committerKent Overstreet <kent.overstreet@gmail.com>2022-07-04 11:26:04 -0400
commited77fd198425b1afe783bc31d756f61b8ff9cc7a (patch)
treef1db77f8d11e66fb84611218b16f86f2798487e5
parent136b1be7142df40f8f992135826ad12ec7199309 (diff)
New CI system
Todo: documentation Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
-rw-r--r--ci/_test-git-branch.sh78
-rwxr-xr-xci/get-test-job.sh16
-rwxr-xr-xci/test-git-branch.sh5
-rwxr-xr-xci/test-job-done.sh86
4 files changed, 185 insertions, 0 deletions
diff --git a/ci/_test-git-branch.sh b/ci/_test-git-branch.sh
new file mode 100644
index 0000000..b210f0b
--- /dev/null
+++ b/ci/_test-git-branch.sh
@@ -0,0 +1,78 @@
+#!/bin/bash
+
+set -o nounset
+set -o errexit
+set -o errtrace
+
+JOBSERVER_LINUX_REPO=ssh://$JOBSERVER/$JOBSERVER_HOME/linux
+
+git_fetch()
+{
+ local repo=$1
+ shift
+
+ git fetch ssh://$JOBSERVER/$JOBSERVER_HOME/$repo $@
+}
+
+sync_git_repos()
+{
+ local repo
+
+ for repo in ${JOBSERVER_GIT_REPOS[@]}; do
+ (cd ~/$repo; git_fetch $repo; git checkout -f FETCH_HEAD) > /dev/null
+ done
+}
+
+while true; do
+ TEST_JOB=( $(ssh $JOBSERVER get-test-job.sh) )
+
+ BRANCH=${TEST_JOB[0]}
+ COMMIT=${TEST_JOB[1]}
+ TEST_PATH=${TEST_JOB[2]}
+ TEST_NAME=$(basename -s .ktest $TEST_PATH)
+
+ if [[ -z $BRANCH ]]; then
+ echo "Error getting test job: need git branch"
+ exit 1
+ fi
+
+ if [[ -z $COMMIT ]]; then
+ echo "Error getting test job: need git commit"
+ exit 1
+ fi
+
+ if [[ -z $TEST_PATH ]]; then
+ echo "Error getting test job: need test to run"
+ exit 1
+ fi
+
+ echo "Running test $TEST_PATH on commit $COMMIT from branch $BRANCH"
+
+ sync_git_repos
+ git_fetch linux $COMMIT
+ git checkout $COMMIT
+
+ mkdir -p ktest-out
+ rm -rf ktest-out/out
+
+ build-test-kernel run $TEST_PATH || true
+
+ if [[ -f ktest-out/out/$TEST_NAME ]]; then
+ echo "Test $TEST_NAME completed"
+ else
+ echo "Test $TEST_NAME failed to start"
+ echo "TEST FAILED" > "ktest-out/out/$TEST_NAME"
+ fi
+
+ for log in $(find ktest-out/out -name log); do
+ tail -n1 "$log" > $(dirname "$log")/status
+ brotli --rm -9 "$log"
+ done
+
+ OUTPUT=$JOBSERVER_OUTPUT_DIR/c/$COMMIT
+ ssh $JOBSERVER mkdir -p $OUTPUT
+ scp -r ktest-out/out/* $JOBSERVER:$OUTPUT
+
+ echo "Running test-job-done.sh"
+ ssh $JOBSERVER test-job-done.sh $BRANCH $COMMIT
+done
diff --git a/ci/get-test-job.sh b/ci/get-test-job.sh
new file mode 100755
index 0000000..65965aa
--- /dev/null
+++ b/ci/get-test-job.sh
@@ -0,0 +1,16 @@
+#!/bin/bash
+
+set -o nounset
+set -o errexit
+set -o errtrace
+
+[[ -f ~/.ktestrc ]] && . ~/.ktestrc
+
+# Clean stale test jobs:
+cd $JOBSERVER_OUTPUT_DIR
+find -size 0 -cmin +180 |xargs rm -f > /dev/null
+
+cd $JOBSERVER_HOME/linux
+flock --nonblock .git_fetch.lock git fetch --all > /dev/null
+
+~/ktest/lib/get-test-job -b ~/BRANCHES-TO-TEST -o ~/web/c
diff --git a/ci/test-git-branch.sh b/ci/test-git-branch.sh
new file mode 100755
index 0000000..1044343
--- /dev/null
+++ b/ci/test-git-branch.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+JOBSERVER=$1
+
+source <(ssh $JOBSERVER cat .ktestrc bin/_test-git-branch.sh)
diff --git a/ci/test-job-done.sh b/ci/test-job-done.sh
new file mode 100755
index 0000000..5bc3681
--- /dev/null
+++ b/ci/test-job-done.sh
@@ -0,0 +1,86 @@
+#!/bin/bash
+
+set -o nounset
+set -o errexit
+set -o errtrace
+
+[[ -f ~/.ktestrc ]] && . ~/.ktestrc
+
+cd /home/bcachefs/linux
+
+BRANCH=$1
+COMMIT=$2
+OUTPUT=$JOBSERVER_OUTPUT_DIR/c/$COMMIT
+COMMITTEXT=$(git log -n1 $COMMIT)
+
+echo "Generating summary for branch $BRANCH commit $COMMIT"
+
+set +e
+STATUSES=$(find "$OUTPUT" -name status)
+grep -c PASSED $STATUSES > $OUTPUT/nr_passed
+grep -c FAILED $STATUSES > $OUTPUT/nr_failed
+grep -c NOTRUN $STATUSES > $OUTPUT/nr_notrun
+grep -c "NOT STARTED" $STATUSES > $OUTPUT/nr_notstarted
+grep -cvE '(PASSED|FAILED|NOTRUN)' $STATUSES > $OUTPUT/nr_unknown
+echo $STATUSES|wc -w > $OUTPUT/nr_tests
+set -o errexit
+
+echo "Running test2web"
+#test2web "$COMMITTEXT" "$OUTPUT" > "$OUTPUT"/index.html
+
+git_log_html()
+{
+ echo '<!DOCTYPE HTML>'
+ echo "<html><head><title>$BRANCH</title></head>"
+ echo '<link href="bootstrap.min.css" rel="stylesheet">'
+
+ echo '<body>'
+ echo '<div class="container">'
+ echo '<table class="table">'
+
+ echo "<tr>"
+ echo "<th> Commit </th>"
+ echo "<th> Description </th>"
+ echo "<th> Passed </th>"
+ echo "<th> Failed </th>"
+ echo "<th> Not started </th>"
+ echo "<th> Not run </th>"
+ echo "<th> Unknown </th>"
+ echo "<th> Total </th>"
+ echo "</tr>"
+
+ git log --pretty=oneline $BRANCH|
+ while read LINE; do
+ COMMIT=$(echo $LINE|cut -d\ -f1)
+ COMMIT_SHORT=$(echo $LINE|cut -b1-14)
+ DESCRIPTION=$(echo $LINE|cut -d\ -f2-)
+ RESULTS=$JOBSERVER_OUTPUT_DIR/c/$COMMIT
+
+ [[ ! -d $RESULTS ]] && break
+
+ echo "<tr>"
+ echo "<td> <a href=\"c/$COMMIT\">$COMMIT_SHORT</a> </td>"
+ echo "<td> $DESCRIPTION </td>"
+ echo "<td> $(<$RESULTS/nr_passed) </td>"
+ echo "<td> $(<$RESULTS/nr_failed) </td>"
+ echo "<td> $(<$RESULTS/nr_notstarted) </td>"
+ echo "<td> $(<$RESULTS/nr_notrun) </td>"
+ echo "<td> $(<$RESULTS/nr_unknown) </td>"
+ echo "<td> $(<$RESULTS/nr_tests) </td>"
+ echo "</tr>"
+ done
+
+ echo "</table>"
+ echo "</div>"
+ echo "</body>"
+ echo "</html>"
+}
+
+echo "Creating log for $BRANCH"
+BRANCH_LOG=$(echo "$BRANCH"|tr / _).html
+git_log_html > "$JOBSERVER_OUTPUT_DIR/$BRANCH_LOG"
+
+echo "Running rsync"
+flock --nonblock .rsync.lock rsync -r --delete $JOBSERVER_OUTPUT_DIR/ testdashboard@evilpiepirate.org:public_html || true
+
+echo "Success"