diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2022-07-04 11:26:04 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2022-07-04 11:26:04 -0400 |
commit | ed77fd198425b1afe783bc31d756f61b8ff9cc7a (patch) | |
tree | f1db77f8d11e66fb84611218b16f86f2798487e5 | |
parent | 136b1be7142df40f8f992135826ad12ec7199309 (diff) |
New CI system
Todo: documentation
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
-rw-r--r-- | ci/_test-git-branch.sh | 78 | ||||
-rwxr-xr-x | ci/get-test-job.sh | 16 | ||||
-rwxr-xr-x | ci/test-git-branch.sh | 5 | ||||
-rwxr-xr-x | ci/test-job-done.sh | 86 |
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" |