summaryrefslogtreecommitdiff
path: root/.gitlab/circle-ci-job.sh
diff options
context:
space:
mode:
Diffstat (limited to '.gitlab/circle-ci-job.sh')
-rwxr-xr-x.gitlab/circle-ci-job.sh110
1 files changed, 110 insertions, 0 deletions
diff --git a/.gitlab/circle-ci-job.sh b/.gitlab/circle-ci-job.sh
new file mode 100755
index 0000000000..bbb00e062a
--- /dev/null
+++ b/.gitlab/circle-ci-job.sh
@@ -0,0 +1,110 @@
+# Circle CI "backend" for Gitlab CI
+# =================================
+#
+# Usage example:
+# .gitlab/circle-ci-job.sh validate-x86_64-linux
+#
+# There are two things to configure to get artifacts to be
+# uploaded to gitlab properly:
+#
+# - At https://<gitlab host>/admin/application_settings, expand the
+# Continuous Integration and Deployment section and set the
+# "Maximum artifacts size (MB)" field to something large enough
+# to contain the bindists (the test reports are tiny in comparison).
+# 500MB seems to work fine, but 200MB might be sufficient.
+#
+# - If gitlab is exposed behind some form of proxy (e.g nginx), make sure
+# the maximum client request body size is large enough to contain all the
+# artifacts of a build. For nginx, this would be the following configuration
+# option: https://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size
+# (which can be set with services.nginx.clientMaxBodySize on nixos).
+
+#!/usr/bin/env sh
+
+set -e
+
+GHCCI_URL="localhost:8888"
+
+[ $# -gt 0 ] || (echo You need to pass the Circle CI job type as argument to this script; exit 1)
+[ ${CI_RUNNER_ID:-} ] || (echo "CI_RUNNER_ID is not set"; exit 1)
+[ ${CI_JOB_ID:-} ] || (echo "CI_JOB_ID is not set"; exit 1)
+[ ${CI_COMMIT_SHA:-} ] || (echo "CI_COMMIT_SHA is not set"; exit 1)
+[ ${CI_REPOSITORY_URL:-} ] || (echo "CI_REPOSITORY_URL is not set"; exit 1)
+[ ${CI_PIPELINE_ID:-} ] || (echo "CI_PIPELINE_ID is not set"; exit 1)
+# the first argument to this script is the Circle CI job type:
+# validate-x86_64-linux, validate-i386-linux, ...
+CIRCLE_JOB="circleci-$1"
+
+gitlab_user=$(echo $CI_REPOSITORY_URL | cut -d/ -f4)
+gitlab_repo=$(echo $CI_REPOSITORY_URL | cut -d/ -f5 | cut -d. -f1)
+
+BODY="{ \"jobType\": \"$CIRCLE_JOB\", \"source\": { \"user\": \"$gitlab_user\", \"project\":\"$gitlab_repo\", \"commit\":\"$CI_COMMIT_SHA\" }, \"pipelineID\": $CI_PIPELINE_ID, \"runnerID\": $CI_RUNNER_ID, \"jobID\": $CI_JOB_ID }"
+
+
+RESP=$(curl -s -XPOST -H "Content-Type: application/json" -d "$BODY" \
+ http://${GHCCI_URL}/job)
+
+if [ $? -eq 0 ]; then
+ build_num=$(echo $RESP | jq '.build_num')
+ circle_url=$(echo $RESP | jq '.url')
+else
+ echo "Couldn't submit job"
+ echo $RESP
+ exit 1
+fi
+
+echo Circle CI build number: $build_num
+echo Circle CI build page: $circle_url
+
+outcome="null"
+STATUS_URL="http://${GHCCI_URL}/job/${build_num}"
+STATUS_RESP=""
+
+while [ "$outcome" == "null" ]; do
+ sleep 30s
+ STATUS_RESP=$(curl -s $STATUS_URL)
+ if [ $? -eq 0 ]; then
+ new_outcome=$(echo $STATUS_RESP | jq '.outcome')
+ jq_exitcode=$?
+ if [ "$new_outcome" == "null" ] && [ $jq_exitcode -ne 0 ]; then
+ echo "Couldn't read 'outcome' field in JSON:"
+ echo $STATUS_RESP
+ echo "Skipping"
+ else
+ outcome="$new_outcome"
+ fi
+ else
+ echo "curl failed:"
+ echo $STATUS_RESP
+ echo "Skipping"
+ fi
+done
+
+if [ "$outcome" == "\"success\"" ]; then
+ echo The build passed
+ artifactsBody=$(curl -s http://${GHCCI_URL}/job/${build_num}/artifacts)
+ (echo $artifactsBody | jq '.[] | .url' | xargs wget -q) || echo "No artifacts"
+ exit 0
+else
+ echo The build failed
+
+ artifactsBody=$(curl -s http://${GHCCI_URL}/job/${build_num}/artifacts)
+ (echo $artifactsBody | jq '.[] | .url' | xargs wget -q) || echo "No artifacts"
+
+ failing_step=$(echo $STATUS_RESP | jq '.steps | .[] | .actions | .[] | select(.status != "success")')
+ failing_step_name=$(echo $failing_step | jq '.name' | sed -e 's/^"//' -e 's/"$//' -e 's/\\r\\n/\n/')
+ echo "Failing step: $failing_step_name"
+
+ failing_cmds=$(echo $failing_step | jq '.bash_command' | sed -e 's/^"//' -e 's/"$//' -e 's/\\r\\n/\n/')
+ echo "Failing command(s):"
+ echo $failing_cmds
+
+ log_url=$(echo $failing_step | jq '.output_url' | sed -e 's/^"//' -e 's/"$//' -e 's/\\r\\n/\n/')
+ echo "Log url: $log_url"
+
+ last_log_lines=$(curl -s $log_url | gunzip | jq '.[] | select(.type == "out") | .message' | sed -e 's/^"//' -e 's/"$//' -e 's/\\r\\n/\n/' | tail -50)
+ echo End of the build log:
+ echo $last_log_lines
+
+ exit 1
+fi