[commit: ghc] master: gitlab-ci: Implement head.hackage jobs (acf2129)

git at git.haskell.org git at git.haskell.org
Wed Mar 20 05:10:35 UTC 2019


Repository : ssh://git@git.haskell.org/ghc

On branch  : master
Link       : http://ghc.haskell.org/trac/ghc/changeset/acf2129d49989071e296634711e3f4d9ebed6ee0/ghc

>---------------------------------------------------------------

commit acf2129d49989071e296634711e3f4d9ebed6ee0
Author: Ben Gamari <ben at smart-cactus.org>
Date:   Wed Feb 27 23:33:12 2019 -0500

    gitlab-ci: Implement head.hackage jobs


>---------------------------------------------------------------

acf2129d49989071e296634711e3f4d9ebed6ee0
 .gitlab-ci.yml                | 39 +++++++++++++++++++++
 .gitlab/start-head.hackage.sh | 79 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 118 insertions(+)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index cca7551..c135c45 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 0000000..d27045b
--- /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



More information about the ghc-commits mailing list