summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Gamari <ben@smart-cactus.org>2019-02-27 23:33:12 -0500
committerBen Gamari <ben@smart-cactus.org>2019-03-17 23:17:36 -0400
commitacf2129d49989071e296634711e3f4d9ebed6ee0 (patch)
treeaa2a11f01b3bf015421508f579556a8720ad7aa2
parentb8326897251ebdbb896da2b28ad27a48ee8f2582 (diff)
downloadhaskell-acf2129d49989071e296634711e3f4d9ebed6ee0.tar.gz
gitlab-ci: Implement head.hackage jobs
-rw-r--r--.gitlab-ci.yml39
-rw-r--r--.gitlab/start-head.hackage.sh79
2 files changed, 118 insertions, 0 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index cca7551b0e..c135c457c3 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -17,6 +17,7 @@ stages:
- full-build
- cleanup # See Note [Cleanup on Windows]
- packaging
+ - hackage
############################################################
# Runner Tags
@@ -577,3 +578,41 @@ source-tarball:
- make sdist
- mv sdistprep/*.xz .
- make show VALUE=version > version
+
+
+############################################################
+# Testing via head.hackage
+############################################################
+
+# Triggering jobs in the ghc/head.hackage project requires that we have a job
+# token for that repository. Furthermore the head.hackage CI job must have
+# access to an unprivileged access token with the ability to query the ghc/ghc
+# project such that it can find the job ID of the fedora27 job for the current
+# pipeline.
+
+.hackage:
+ stage: hackage
+ image: ghcci/x86_64-linux-deb9:0.2
+ tags:
+ - x86_64-linux
+ dependencies: []
+ variables:
+ HEAD_HACKAGE_PROJECT_ID: "78"
+ script:
+ - bash .gitlab/start-head.hackage.sh
+
+hackage:
+ extends: .hackage
+ when: manual
+
+hackage-label:
+ extends: .hackage
+ only:
+ variables:
+ - $CI_MERGE_REQUEST_LABELS =~ /.*user-facing.*/
+
+nightly-hackage:
+ extends: .hackage
+ only:
+ variables:
+ - $NIGHTLY
diff --git a/.gitlab/start-head.hackage.sh b/.gitlab/start-head.hackage.sh
new file mode 100644
index 0000000000..d27045b4a2
--- /dev/null
+++ b/.gitlab/start-head.hackage.sh
@@ -0,0 +1,79 @@
+#!/usr/bin/env bash
+set -e
+
+# Start a head.hackage job and wait for completion. Expected to be called from
+# GitLab CI.
+
+if [ -z "$HEAD_HACKAGE_TRIGGER_TOKEN" ]; then
+ echo "Error: Expected head.hackage trigger token in HEAD_HACKAGE_TRIGGER_TOKEN"
+ exit 1
+fi
+
+if [ -z "$CI_PIPELINE_ID" ]; then
+ echo "Error: Expected pipeline id in CI_PIPELINE_ID"
+ exit 1
+fi
+
+if [ -z "$HEAD_HACKAGE_PROJECT_ID" ]; then
+ HEAD_HACKAGE_PROJECT_ID="78"
+fi
+
+# Start pipeline
+curl --silent --show-error \
+ --request POST \
+ -F "token=$HEAD_HACKAGE_TRIGGER_TOKEN" \
+ -F "ref=gitlab-ci-nix" \
+ -F "variables[GHC_PIPELINE_ID]=$CI_PIPELINE_ID" \
+ https://gitlab.haskell.org/api/v4/projects/$HEAD_HACKAGE_PROJECT_ID/trigger/pipeline \
+ | tee resp.json
+
+echo
+pipeline_id=$(jq .id < resp.json)
+url=$(jq .web_url < resp.json)
+echo
+echo "Started head.hackage pipeline $pipeline_id: $url"
+
+# Wait for completion
+running=
+echo "Waiting for build to complete..."
+while true; do
+ sleep 10
+ curl --silent --show-error \
+ --request GET \
+ -F "job_token=$CI_JOB_TOKEN" \
+ https://gitlab.haskell.org/api/v4/projects/$HEAD_HACKAGE_PROJECT_ID/pipelines/$pipeline_id \
+ > resp.json
+ status=$(jq .status < resp.json)
+
+ case $status in
+ "\"pending\"")
+ ;;
+ "\"running\"")
+ if [ -z "$running" ]; then
+ echo "Pipeline $pipeline_id is now running."
+ running=1
+ fi
+ ;;
+ "\"success\"")
+ echo "Pipeline $pipeline_id finished successfully."
+ exit 0
+ ;;
+ "\"failed\"")
+ echo "Pipeline $pipeline_id failed."
+ exit 1
+ ;;
+ "\"canceled\"")
+ echo "Pipeline $pipeline_id was canceled."
+ exit 1
+ ;;
+ "\"skipped\"")
+ echo "Pipeline $pipeline_id was skipped."
+ exit 1
+ ;;
+ *)
+ cat resp.json
+ echo "Error: Unknown pipeline status $status"
+ exit 2
+ ;;
+ esac
+done