gitlab-ci: Implement head.hackage jobs
authorBen Gamari <ben@smart-cactus.org>
Thu, 28 Feb 2019 04:33:12 +0000 (23:33 -0500)
committerBen Gamari <ben@smart-cactus.org>
Mon, 18 Mar 2019 03:17:36 +0000 (23:17 -0400)
.gitlab-ci.yml
.gitlab/start-head.hackage.sh [new file with mode: 0644]

index cca7551..c135c45 100644 (file)
@@ -17,6 +17,7 @@ stages:
   - full-build
   - cleanup # See Note [Cleanup on Windows]
   - packaging
   - full-build
   - cleanup # See Note [Cleanup on Windows]
   - packaging
+  - hackage
 
 ############################################################
 # Runner Tags
 
 ############################################################
 # Runner Tags
@@ -577,3 +578,41 @@ source-tarball:
     - make sdist
     - mv sdistprep/*.xz  .
     - make show VALUE=version > version
     - 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 (file)
index 0000000..d27045b
--- /dev/null
@@ -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