Skip to content
Snippets Groups Projects
.gitlab-ci.yml 26.3 KiB
Newer Older
variables:
  GIT_SSL_NO_VERIFY: "1"
  # Commit of ghc/ci-images repository from which to pull Docker images
Cheng Shao's avatar
Cheng Shao committed
  DOCKER_REV: 205afce5c7ebdb8666b96638f6758fe527f40a7f

  # Sequential version number of all cached things.
  # Bump to invalidate GitLab CI cache.
  # Disable shallow clones; they break our linting rules
  GIT_DEPTH: 0

  # Always start with a fresh clone to avoid non-hermetic builds
  GIT_STRATEGY: clone

  # Overridden by individual jobs
  CONFIGURE_ARGS: ""

Sylvain Henry's avatar
Sylvain Henry committed
  # Overridden by individual jobs
  CONFIGURE_WRAPPER: ""

  GIT_SUBMODULE_STRATEGY: "normal"
Ben Gamari's avatar
Ben Gamari committed
  # Makes ci.sh isolate CABAL_DIR
  HERMETIC: "YES"

  # Reduce XZ compression level for regular jobs (it is bumped to 9 for releases
  # and nightly jobs). In my experiments I've got the following bindist size in
  # the given time for each compression level (with the quick flavour):
  #
  #     XZ_OPT        Time    Size
  #     -9            4m06s   112 MB
  #     -8            4m00s   114 MB
  #     -7            3m50s   116 MB
  #     -6 (default)  3m40s   118 MB
  #     -5            2m47s   123 MB
  #     -4            1m57s   134 MB
  #     -3            1m03s   129 MB
  #     -2            49.73s  136 MB
  #     -1            37.72s  142 MB
  #     -0            34.40s  156 MB
  #
  XZ_OPT: "-1"
default:
  interruptible: true
Ben Gamari's avatar
Ben Gamari committed
stages:
  - tool-lint      # Source linting of the tools
  - quick-build    # A very quick smoke-test to weed out broken commits
  - full-build     # Build all the things
  - packaging      # Source distribution, etc.
  - testing        # head.hackage correctness and compiler performance testing
  - deploy         # push documentation
# Note [The CI Story]
# ~~~~~~~~~~~~~~~~~~~
#
# There are two different types of pipelines:
#
#  - marge-bot merges to `master`. Here we perform an exhaustive validation
#    across all of the platforms which we support. In addition, we push
#    performance metric notes upstream, providing a persistent record of the
#    performance characteristics of the compiler.
#
#  - merge requests. Here we perform a slightly less exhaustive battery of
#    testing. Namely we omit some configurations (e.g. the unregisterised job).
#    These use the merge request's base commit for performance metric
#    comparisons.
#

  # N.B. Don't run on wip/ branches, instead on run on merge requests.
  rules:
    - if: $CI_MERGE_REQUEST_ID
    - if: $CI_COMMIT_TAG
    - if: '$CI_COMMIT_BRANCH == "master"'
Ben Gamari's avatar
Ben Gamari committed
    - if: '$CI_COMMIT_BRANCH =~ /ghc-[0-9]+\.[0-9]+/'
    - if: '$CI_PIPELINE_SOURCE == "web"'
# which versions of GHC to allow bootstrap with
.bootstrap_matrix : &bootstrap_matrix
  matrix:
    - GHC_VERSION: 9.0.2
      DOCKER_IMAGE: "registry.gitlab.haskell.org/ghc/ci-images/x86_64-linux-deb10-ghc9_0:$DOCKER_REV"
    - GHC_VERSION: 9.2.2
      DOCKER_IMAGE: "registry.gitlab.haskell.org/ghc/ci-images/x86_64-linux-deb10:$DOCKER_REV"

# Allow linters to fail on draft MRs.
Ben Gamari's avatar
Ben Gamari committed
# This must be explicitly transcluded in lint jobs which
# override `rules:`
.drafts-can-fail-lint: &drafts-can-fail-lint
  if: "$CI_MERGE_REQUEST_TITLE =~ /^\\s*(Draft|wip|WIP):/"
  allow_failure: true

.lint:
Ben Gamari's avatar
Ben Gamari committed
  stage: tool-lint
Ben Gamari's avatar
Ben Gamari committed
  tags:
    - lint
Ben Gamari's avatar
Ben Gamari committed
    - *drafts-can-fail-lint
Ben Gamari's avatar
Ben Gamari committed
    - when: always
.nightly: &nightly
  artifacts:
    when: always
    expire_in: 8 weeks

  variables:
    BUILD_FLAVOUR: "release"
    IGNORE_PERF_FAILURES: "all"
    HADDOCK_HYPERLINKED_SOURCES: "YES"
  artifacts:
    when: always
    expire_in: 1 year
    - if: '$RELEASE_JOB == "yes"'
Ben Gamari's avatar
Ben Gamari committed
############################################################
Ben Gamari's avatar
Ben Gamari committed
############################################################
#
# * x86_64-linux: Any Docker-capable x86_64 Linux machine
# * aarch64-linux: Any Docker-capable AArch64 Linux machine
# * x86_64-windows: A x86_64 Windows machine
# * lint: Any Docker-capable x86_64 Linux machine; distinct from
#         x86_64-linux to ensure low-latency availability.
#

####
# HACK
###
#
# Since 58cfcc65 the default for jobs has been "interruptible", this means
# that when new commits are pushed to a branch which already has a running
# pipeline then the old pipelines for this branch are cancelled.
#
# This includes the master branch, and in particular, new commits merged
# to the master branch will cancel the nightly job.
#
# The semantics of pipeline cancelling are actually a bit more complicated
# though. The interruptible flag is *per job*, but once a pipeline has run
# *any* non-interruptible job, then the whole pipeline is considered
# non-interruptible (ref
# https://gitlab.com/gitlab-org/gitlab/-/issues/32837). This leads to the
# hack in this MR where by default all jobs are `interruptible: True`, but
# for pipelines we definitely want to run, there is a dummy job which
# happens first, which is `interreuptible: False`. This has the effect of
# dirtying the whole pipeline and
#
# For now, this patch solves the immediate problem of making sure nightly
# jobs are not cancelled.
# In the future, we may want to enable this job also for the master
# branch, making that change might mean we need more CI capacity than
# currently available.


not-interruptible:
  stage: not-interruptible
  script: "true"
  interruptible: false
  image: "registry.gitlab.haskell.org/ghc/ci-images/x86_64-linux-deb10:$DOCKER_REV"
  tags:
    - lint
  rules:
#   - if: '$CI_COMMIT_BRANCH == "master"'
#      when: always
    - if: $NIGHTLY
      when: always


############################################################
# Validate jobs
############################################################
# These jobs are generated by running the ./.gitlab/generate_jobs script
include: '.gitlab/jobs.yaml'
Ben Gamari's avatar
Ben Gamari committed
############################################################
# tool linting
Ben Gamari's avatar
Ben Gamari committed
############################################################

ghc-linters:
  stage: tool-lint
  image: "registry.gitlab.haskell.org/ghc/ci-images/x86_64-linux-deb10:$DOCKER_REV"
  extends: .lint-params
  variables:
    BUILD_FLAVOUR: default
  script:
    - .gitlab/ci.sh configure
    - timeout 10m .gitlab/ci.sh run_hadrian test --test-root-dirs="testsuite/tests/linters"
  dependencies: []
  rules:
    - if: $CI_MERGE_REQUEST_ID
    - *drafts-can-fail-lint
# Run mypy Python typechecker on linter scripts.
Ben Gamari's avatar
Ben Gamari committed
lint-linters:
  image: "registry.gitlab.haskell.org/ghc/ci-images/linters:$DOCKER_REV"
Ben Gamari's avatar
Ben Gamari committed
  script:
    - mypy testsuite/tests/linters/regex-linters/*.py
Ben Gamari's avatar
Ben Gamari committed
  dependencies: []

# Check that .T files all parse by listing broken tests.
lint-testsuite:
  image: "registry.gitlab.haskell.org/ghc/ci-images/x86_64-linux-deb9:$DOCKER_REV"
    - make -Ctestsuite list_broken TEST_HC=$GHC
# Run mypy Python typechecker on testsuite driver
typecheck-testsuite:
  image: "registry.gitlab.haskell.org/ghc/ci-images/linters:$DOCKER_REV"
  script:
    - mypy testsuite/driver/runtests.py
  dependencies: []

# We allow the submodule checker to fail when run on merge requests (to
Brian Wignall's avatar
Brian Wignall committed
# accommodate, e.g., haddock changes not yet upstream) but not on `master` or
# Marge jobs.
.lint-submods:
  image: "registry.gitlab.haskell.org/ghc/ci-images/x86_64-linux-deb10:$DOCKER_REV"
  extends: .lint-params
  variables:
    BUILD_FLAVOUR: default
    - .gitlab/ci.sh configure
    - .gitlab/ci.sh run_hadrian stage0:exe:lint-submodule-refs
    - git fetch "$CI_MERGE_REQUEST_PROJECT_URL" $CI_MERGE_REQUEST_TARGET_BRANCH_NAME
    - base="$(git merge-base FETCH_HEAD $CI_COMMIT_SHA)"
    - "echo Linting submodule changes between $base..$CI_COMMIT_SHA"
    - git submodule foreach git remote update
    - _build/stageBoot/bin/lint-submodule-refs . $(git rev-list $base..$CI_COMMIT_SHA)
  dependencies: []

# We allow the submodule checker to fail when run on merge requests (to
# accommodate, e.g., haddock changes not yet upstream) but not on `master` or
# Marge jobs.
lint-author:
  image: "registry.gitlab.haskell.org/ghc/ci-images/x86_64-linux-deb10:$DOCKER_REV"
  extends: .lint-params
  variables:
    BUILD_FLAVOUR: default
  script:
    - git fetch "$CI_MERGE_REQUEST_PROJECT_URL" $CI_MERGE_REQUEST_TARGET_BRANCH_NAME
    - base="$(git merge-base FETCH_HEAD $CI_COMMIT_SHA)"
    - "echo Linting authors between $base..$CI_COMMIT_SHA"
    - .gitlab/ci.sh lint_author $base $CI_COMMIT_SHA
  dependencies: []
  rules:
    - if: $CI_MERGE_REQUEST_ID
    - *drafts-can-fail-lint

lint-ci-config:
  image: "nixos/nix:2.8.0"
  extends: .lint
  variables:
    BUILD_FLAVOUR: default
  before_script:
    - mkdir -p ~/.cabal
    - cp -Rf cabal-cache/* ~/.cabal || true
  script:
    - nix shell --extra-experimental-features nix-command --extra-experimental-features flakes nixpkgs#cabal-install nixpkgs#ghc -c cabal update
    - .gitlab/generate_jobs
        # 1 if .gitlab/generate_jobs changed the output of the generated config
    - nix shell --extra-experimental-features nix-command --extra-experimental-features flakes nixpkgs#git -c git diff --exit-code
  after_script:
    - rm -Rf cabal-cache
    - cp -Rf ~/.cabal cabal-cache
  dependencies: []
  cache:
    key: lint-ci-$CACHE_REV
    paths:
      - cabal-cache

  extends: .lint-submods
  # Allow failure on merge requests since any necessary submodule patches may
  # not be upstreamed yet.
  rules:
    - if: '$CI_MERGE_REQUEST_LABELS =~ /.*marge_bot_batch_merge_job.*/'
      allow_failure: false
    # Don't run on nightly because the program needs a base commit to check.
    - if: $NIGHTLY
      when: never
    - allow_failure: true
lint-submods-branch:
  extends: .lint-submods
  variables:
    BUILD_FLAVOUR: default
    - .gitlab/ci.sh configure
    - .gitlab/ci.sh run_hadrian stage0:exe:lint-submodule-refs
    - "echo Linting submodule changes between $CI_COMMIT_BEFORE_SHA..$CI_COMMIT_SHA"
    - git submodule foreach git remote update
    - _build/stageBoot/bin/lint-submodule-refs . $(git rev-list $CI_COMMIT_BEFORE_SHA..$CI_COMMIT_SHA)
  rules:
    - if: '$CI_COMMIT_BRANCH == "master"'
    - if: '$CI_COMMIT_BRANCH =~ /ghc-[0.9]+\.[0-9]+/'
    - *drafts-can-fail-lint
############################################################
# GHC source code linting
############################################################

.lint-params:
  needs: []
  image: "registry.gitlab.haskell.org/ghc/ci-images/x86_64-linux-deb10:$DOCKER_REV"
  before_script:
    - export PATH="/opt/toolchain/bin:$PATH"
    # workaround for docker permissions
    - sudo chown ghc:ghc -R .
    - .gitlab/ci.sh setup
  after_script:
    - .gitlab/ci.sh save_cache
    - cat ci-timings
  variables:
    GHC_FLAGS: -Werror
  cache:
    key: lint-$CACHE_REV
    paths:
      - cabal-cache
hlint-ghc-and-base:
  extends: .lint-params
  image: "registry.gitlab.haskell.org/ghc/ci-images/linters:$DOCKER_REV"
  variables:
    BUILD_FLAVOUR: default
  script:
    - .gitlab/ci.sh setup
    - .gitlab/ci.sh configure
    - .gitlab/ci.sh run_hadrian lint:base
    - .gitlab/ci.sh run_hadrian lint:compiler
############################################################
# GHC-in-GHCi (Hadrian)
############################################################

hadrian-ghc-in-ghci:
  stage: quick-build
  needs:
    - job: lint-linters
    - job: lint-submods
      optional: true
  image: "registry.gitlab.haskell.org/ghc/ci-images/x86_64-linux-deb10:$DOCKER_REV"
  before_script:
    # workaround for docker permissions
    - sudo chown ghc:ghc -R .
  variables:
    GHC_FLAGS: -Werror
  tags:
    - x86_64-linux
  script:
    - git clean -xdf && git submodule foreach git clean -xdf
    - .gitlab/ci.sh configure
    # Load ghc-in-ghci then immediately exit and check the modules loaded
    - echo ":q" | hadrian/ghci -j`mk/detect-cpu-count.sh`| tail -n2 | grep "Ok,"
  after_script:
    - .gitlab/ci.sh save_cache
    - cat ci-timings
    key: hadrian-ghci-$CACHE_REV
    paths:
      - cabal-cache

############################################################
# stack-hadrian-build
############################################################

# Verify that Hadrian builds with stack. Note that we don't actually perform a
# build of GHC itself; we merely test that the Hadrian executable builds and
# works (by invoking `hadrian --version`).
stack-hadrian-build:
  extends: hadrian-ghc-in-ghci
  stage: quick-build
  script:
    - .gitlab/ci.sh setup
    - .gitlab/ci.sh configure
    - hadrian/build-stack --version

Zubin's avatar
Zubin committed
####################################
# Testing reinstallable ghc codepath
####################################

test-cabal-reinstall-x86_64-linux-deb10:
  extends: nightly-x86_64-linux-deb10-validate
Zubin's avatar
Zubin committed
  stage: full-build
  variables:
    REINSTALL_GHC: "yes"
    BUILD_FLAVOUR: validate
    TEST_ENV: "x86_64-linux-deb10-cabal-install"
Zubin's avatar
Zubin committed

############################################################
# Packaging
############################################################

doc-tarball:
  stage: packaging
  needs:
    - job: x86_64-linux-deb10-numa-slow-validate
      optional: true
    - job: nightly-x86_64-linux-deb10-validate
      optional: true
    - job: release-x86_64-linux-deb10-release
      optional: true

    - job: x86_64-windows-validate
      optional: true
    - job: nightly-x86_64-windows-validate
      optional: true
    - job: release-x86_64-windows-release
  tags:
    - x86_64-linux
  image: "registry.gitlab.haskell.org/ghc/ci-images/x86_64-linux-deb10:$DOCKER_REV"
    LINUX_BINDIST: "ghc-x86_64-linux-deb10.tar.xz"
    WINDOWS_BINDIST: "ghc-x86_64-windows.tar.xz"
  artifacts:
    paths:
      - haddock.html.tar.xz
      - libraries.html.tar.xz
      - users_guide.html.tar.xz
      - index.html
      - "*.pdf"
  script:
      mv "ghc-x86_64-linux-deb10-numa-slow-validate.tar.xz" "$LINUX_BINDIST" \
        || mv "ghc-x86_64-linux-deb10-validate.tar.xz" "$LINUX_BINDIST" \
        || mv "ghc-x86_64-linux-deb10-release.tar.xz" "$LINUX_BINDIST" \
        || true
      mv "ghc-x86_64-windows-validate.tar.xz" "$WINDOWS_BINDIST" \
        || mv "ghc-x86_64-windows-release.tar.xz" "$WINDOWS_BINDIST" \
      if [ ! -f "$LINUX_BINDIST" ]; then
        echo "Error: $LINUX_BINDIST does not exist. Did the Debian 9 job fail?"
        exit 1
      fi
      if [ ! -f "$WINDOWS_BINDIST" ]; then
        echo "Error: $WINDOWS_BINDIST does not exist. Did the 64-bit Windows job fail?"
        exit 1
      fi
    - rm -Rf docs
    - bash -ex distrib/mkDocs/mkDocs $LINUX_BINDIST $WINDOWS_BINDIST
    - mv docs/*.tar.xz docs/index.html .
hackage-doc-tarball:
  stage: packaging
  needs:
    - job: x86_64-linux-fedora33-release-hackage
    - job: nightly-x86_64-linux-fedora33-release-hackage
    - job: release-x86_64-linux-fedora33-release-hackage
      optional: true
    - job: source-tarball
  tags:
    - x86_64-linux
  image: "registry.gitlab.haskell.org/ghc/ci-images/x86_64-linux-deb10:$DOCKER_REV"
  dependencies: null
  variables:
    # Don't clone the git repo..
    GIT_STRATEGY: none
    # Don't attempt to boot a source tarball
    NO_BOOT: "1"
  artifacts:
    paths:
      - hackage_docs
  before_script:
    - tar -xf ghc-*[0-9]-src.tar.xz
    - tar -xf ghc-x86_64-linux-fedora33-release.tar.xz -C ghc*/
  script:
    - cd ghc*/
    - mv .gitlab/upload_ghc_libs.py .
    - .gitlab/ci.sh setup
    - .gitlab/ci.sh configure
    - ./upload_ghc_libs.py prepare --bindist ghc*linux/
    - mv .upload-libs/docs ../hackage_docs
  rules:
    - if: $NIGHTLY
    - if: '$RELEASE_JOB == "yes"'

source-tarball:
  tags:
    - x86_64-linux
  image: "registry.gitlab.haskell.org/ghc/ci-images/x86_64-linux-deb10:$DOCKER_REV"
  artifacts:
    paths:
      - ghc-*.tar.xz
  script:
    - ./boot
    - ./configure
    - ./hadrian/build source-dist
    - mv _build/source-dist/*.xz  .
  rules:
    - if: $NIGHTLY
    - if: '$RELEASE_JOB == "yes"'
    - if: '$CI_MERGE_REQUEST_LABELS =~ /.*test-bootstrap.*/'

generate-hadrian-bootstrap-sources:
  stage: full-build
  tags:
    - x86_64-linux
  image: "$DOCKER_IMAGE"
  dependencies: []
  parallel: *bootstrap_matrix
  artifacts:
    paths:
      - hadrian-bootstrap-sources-*.tar.gz
  script:
    - bash -c "[ $($GHC --numeric-version) = $GHC_VERSION ] || { echo $GHC_VERSION is not the same as the version of $GHC && exit 1; }"
    - python3 ./hadrian/bootstrap/bootstrap.py -w $GHC fetch -o hadrian-bootstrap-sources-$GHC_VERSION
    - if: '$RELEASE_JOB == "yes"'
    - if: '$CI_MERGE_REQUEST_LABELS =~ /.*test-bootstrap.*/'
package-hadrian-bootstrap-sources:
  needs: ["generate-hadrian-bootstrap-sources"]
  image: "registry.gitlab.haskell.org/ghc/ci-images/x86_64-linux-deb10:$DOCKER_REV"
  artifacts:
    paths:
      - hadrian-bootstrap-sources-all.tar.gz
  script:
    - tar -czvf hadrian-bootstrap-sources-all.tar.gz hadrian-bootstrap-sources-*.tar.gz
  rules:
    - if: $NIGHTLY
    - if: '$RELEASE_JOB == "yes"'
    - if: '$CI_MERGE_REQUEST_LABELS =~ /.*test-bootstrap.*/'

test-bootstrap:
  stage: full-build
  needs: [generate-hadrian-bootstrap-sources, source-tarball]
  tags:
    - x86_64-linux
  image: "$DOCKER_IMAGE"
  parallel: *bootstrap_matrix
  script:
    - mkdir test-bootstrap
    - tar -xf ghc-*[0-9]-src.tar.xz -C test-bootstrap
    - tar -xf ghc-*-testsuite.tar.xz -C test-bootstrap
    - cp hadrian-bootstrap-sources-$GHC_VERSION.tar.gz test-bootstrap/ghc-*
    - pushd test-bootstrap/ghc-*
    - python3 ./hadrian/bootstrap/bootstrap.py -w $GHC --bootstrap-sources hadrian-bootstrap-sources-$GHC_VERSION.tar.gz
    - export HADRIAN_PATH="$PWD/_build/bin/hadrian"
    - .gitlab/ci.sh setup
    # Bootstrapping should not depend on HAPPY or ALEX so set them to false
    # so the build fails if they are invoked.
    - export HAPPY=/bin/false; export ALEX=/bin/false
    - .gitlab/ci.sh configure
    - .gitlab/ci.sh build_hadrian
    - .gitlab/ci.sh test_hadrian
    - popd
    - rm -Rf test-bootstrap
  variables:
    # Don't record performance benchmarks
    TEST_ENV: ""
    BIN_DIST_NAME: "ghc-x86_64-deb10-linux"
    BUILD_FLAVOUR: "validate"
    - if: '$CI_MERGE_REQUEST_LABELS =~ /.*test-bootstrap.*/'
    - if: '$RELEASE_JOB == "yes"'
      when: always
      variables:
        BUILD_FLAVOUR: "release"


############################################################
# 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 fedora33 job for the current
# pipeline.

.hackage:
    - job: x86_64-linux-fedora33-release
      optional: true
      artifacts: false
    - job: nightly-x86_64-linux-fedora33-release
      optional: true
      artifacts: false
    - job: release-x86_64-linux-fedora33-release
      optional: true
      artifacts: false
    UPSTREAM_PROJECT_PATH: "$CI_PROJECT_PATH"
    UPSTREAM_PROJECT_ID: "$CI_PROJECT_ID"
    UPSTREAM_PIPELINE_ID: "$CI_PIPELINE_ID"
    RELEASE_JOB: "$RELEASE_JOB"
  trigger:
    project: "ghc/head.hackage"
    branch: "master"
    strategy: "depend"
  extends: .hackage
  extends: .hackage
  rules:
    - if: '$CI_MERGE_REQUEST_LABELS =~ /.*user-facing.*/'
# The head.hackage job is split into two jobs because enabling `-dcore-lint`
# affects the total allocation numbers for the simplifier portion significantly.
nightly-hackage-lint:
  rules:
    - if: $NIGHTLY
      variables:
        NIGHTLY: "$NIGHTLY"
  extends: .hackage
  variables:
    EXTRA_HC_OPTS: "-dcore-lint"

nightly-hackage-perf:
      variables:
        NIGHTLY: "$NIGHTLY"
  extends: .hackage
    # Generate logs for nightly builds which include timing information.
    EXTRA_HC_OPTS: "-ddump-timings"
    # Ask head.hackage to generate eventlogs
    EVENTLOGGING: 1
############################################################
# Nofib testing
# (Disabled: See #21859)
############################################################

perf-nofib:
  # Dependencies used by perf-nofib can't be built when some compiler changes
  # aren't (yet) supported by head.hackage.
  # Hence we allow this job to fail.
  allow_failure: true
    - job: x86_64-linux-fedora33-release
    - job: nightly-x86_64-linux-fedora33-release
    - job: release-x86_64-linux-fedora33-release
      optional: true
  image: "registry.gitlab.haskell.org/ghc/ci-images/x86_64-linux-fedora33:$DOCKER_REV"
    - when: never
    - if: $CI_MERGE_REQUEST_ID
    - if: '$CI_COMMIT_BRANCH == "master"'
    - if: '$CI_COMMIT_BRANCH =~ /ghc-[0.9]+\.[0-9]+/'
    - if: '$CI_MERGE_REQUEST_LABELS !~ /.*fast-ci.*/'
  tags:
    - x86_64-linux
    - cd nofib
    - "cabal update --index=$HACKAGE_INDEX_STATE --project-file=cabal.project.head-hackage"
  script:
    - root=$(pwd)/ghc
    - |
      mkdir tmp
      tar -xf ../ghc-x86_64-linux-fedora33-release.tar.xz -C tmp
      pushd tmp/ghc-*/
      ./configure --prefix=$root
      make install
      popd
      rm -Rf tmp
    - export PATH=$root/bin:$PATH
    - cabal install -w "$root/bin/ghc" --lib regex-compat unboxed-ref parallel random-1.2.1 --allow-newer --package-env local.env --project-file=cabal.project.head-hackage
    - export GHC_ENVIRONMENT="$(pwd)/local.env"
    - "make HC=$root/bin/ghc BOOT_HC=$root/bin/ghc boot mode=fast -j$CPUS"
    - "make HC=$root/bin/ghc BOOT_HC=$root/bin/ghc EXTRA_RUNTEST_OPTS='-cachegrind +RTS -V0 -RTS' NoFibRuns=1 mode=fast -j$CPUS 2>&1 | tee nofib.log"
  artifacts:
    expire_in: 12 week
    when: always
    paths:
      - nofib/nofib.log
############################################################
# Ad-hoc performance testing
############################################################

perf:
  stage: testing
    - job: x86_64-linux-fedora33-release
    - job: nightly-x86_64-linux-fedora33-release
    - job: release-x86_64-linux-fedora33-release
      optional: true
  dependencies: null
  image: "registry.gitlab.haskell.org/ghc/ci-images/x86_64-linux-fedora33:$DOCKER_REV"
  rules:
    - if: $CI_MERGE_REQUEST_ID
    - if: '$CI_COMMIT_BRANCH == "master"'
    - if: '$CI_COMMIT_BRANCH =~ /ghc-[0.9]+\.[0-9]+/'
  tags:
    - x86_64-linux-perf
  script:
    - root=$(pwd)/ghc
    - |
      mkdir tmp
      tar -xf ghc-x86_64-linux-fedora33-release.tar.xz -C tmp
      pushd tmp/ghc-*/
      ./configure --prefix=$root
      make install
      popd
      rm -Rf tmp
    - export BOOT_HC=$(which ghc)
    - export HC=$root/bin/ghc
    - .gitlab/ci.sh perf_test
  artifacts:
    when: always
    paths:
      - out
  rules:
    - if: '$CI_MERGE_REQUEST_LABELS !~ /.*fast-ci.*/'
############################################################
# Documentation deployment via GitLab Pages
############################################################

  needs: [doc-tarball]
  image: ghcci/x86_64-linux-deb9:0.2
  # See #18973
  allow_failure: true
  tags:
    - x86_64-linux
  script:
    - mkdir -p public/doc
Matthew Pickering's avatar
Matthew Pickering committed
    # haddock docs are not in the hadrian produce doc tarballs at the moment
    # - tar -xf haddock.html.tar.xz -C public/doc
    - tar -xf libraries.html.tar.xz -C public/doc
    - tar -xf users_guide.html.tar.xz -C public/doc
    - |
      cat >public/index.html <<EOF
      <!DOCTYPE HTML>
      <meta charset="UTF-8">
      <meta http-equiv="refresh" content="1; url=doc/">
      EOF
    - cp -f index.html public/doc
    # N.B. only run this on ghc/ghc since the deployed pages are quite large
    # and we only serve GitLab Pages for ghc/ghc.
    - if: '$CI_COMMIT_BRANCH == "master" && $CI_PROJECT_NAMESPACE == "ghc"'
Matthew Pickering's avatar
Matthew Pickering committed
    - if: '$CI_MERGE_REQUEST_LABELS =~ /.*publish-docs.*/'


.x86_64-linux-ubuntu20_04-cross_wasm32-wasi-release:
  stage: full-build
  rules:
    - when: always
  tags:
    - x86_64-linux
  image: registry.gitlab.haskell.org/ghc/ci-images/x86_64-linux-ubuntu20_04:$DOCKER_REV
  before_script:
    - sudo chown ghc:ghc -R .
  variables:
    BIN_DIST_NAME: ghc-x86_64-linux-ubuntu20_04-cross_wasm32-wasi-int_$BIGNUM_BACKEND-release
    BUILD_FLAVOUR: perf
    CONFIGURE_ARGS: --with-intree-gmp --with-system-libffi
    XZ_OPT: "-9"
    CONF_CC_OPTS_STAGE2: -Wno-int-conversion -Wno-strict-prototypes -mnontrapping-fptoint -msign-ext -mbulk-memory -mmutable-globals -mreference-types
    CONF_CXX_OPTS_STAGE2: -fno-exceptions -Wno-int-conversion -Wno-strict-prototypes -mnontrapping-fptoint -msign-ext -mbulk-memory -mmutable-globals -mreference-types
    CONF_GCC_LINKER_OPTS_STAGE2: -Wl,--error-limit=0,--growable-table,--stack-first -Wno-unused-command-line-argument
    CROSS_EMULATOR: wasmtime
    CROSS_TARGET: wasm32-wasi
    HADRIAN_ARGS: --docs=none
    TEST_ENV: x86_64-linux-ubuntu20_04-cross_wasm32-wasi-int_$BIGNUM_BACKEND-release
  script:
    - |
      pushd libraries/process
      curl https://patch-diff.githubusercontent.com/raw/haskell/process/pull/240.diff | git apply
      popd
      pushd utils/hsc2hs
      curl https://patch-diff.githubusercontent.com/raw/haskell/hsc2hs/pull/68.diff | git apply
      popd

      pushd "$(mktemp -d)"
      curl -L https://gitlab.haskell.org/ghc/ghc-wasm-meta/-/archive/master/ghc-wasm-meta-master.tar.gz | tar xz --strip-components=1
      PREFIX=/tmp/.ghc-wasm SKIP_GHC=1 ./setup.sh
      source /tmp/.ghc-wasm/env
      popd

      .gitlab/ci.sh setup
      .gitlab/ci.sh configure
      .gitlab/ci.sh build_hadrian
      .gitlab/ci.sh test_hadrian

  after_script:
    - cat ci-timings

  artifacts:
    expire_in: 1 year
    paths:
      - ghc-x86_64-linux-ubuntu20_04-cross_wasm32-wasi-int_$BIGNUM_BACKEND-release.tar.xz
    when: always

x86_64-linux-ubuntu20_04-cross_wasm32-wasi-int_gmp-release:
  extends: .x86_64-linux-ubuntu20_04-cross_wasm32-wasi-release
  variables:
    BIGNUM_BACKEND: gmp

x86_64-linux-ubuntu20_04-cross_wasm32-wasi-int_native-release:
  extends: .x86_64-linux-ubuntu20_04-cross_wasm32-wasi-release
  variables:
    BIGNUM_BACKEND: native