diff options
author | Matthew Pickering <matthewtpickering@gmail.com> | 2023-01-13 10:01:52 +0000 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2023-01-16 20:51:26 -0500 |
commit | eeea59bb3df6977ead66bf0b24976b03a6021f51 (patch) | |
tree | 99da1e78a6be2da002b64660978c99be32089434 /.gitlab-ci.yml | |
parent | 28cb2ed00cf261720a8db907f6ceb04266924ab7 (diff) | |
download | haskell-eeea59bb3df6977ead66bf0b24976b03a6021f51.tar.gz |
Add scripts to generate ghcup metadata on nightly and release pipelines
1. A python script in .gitlab/rel_eng/mk-ghcup-metadata which generates
suitable metadata for consumption by GHCUp for the relevant
pipelines.
- The script generates the metadata just as the ghcup maintainers
want, without taking into account platform/library combinations. It
is updated manually when the mapping changes.
- The script downloads the bindists which ghcup wants to distribute,
calculates the hash and generates the yaml in the correct structure.
- The script is documented in the .gitlab/rel_eng/mk-ghcup-metadata/README.mk file
1a. The script requires us to understand the mapping from platform ->
job. To choose the preferred bindist for each platform the
.gitlab/gen_ci.hs script is modified to allow outputting a metadata
file which answers the question about which job produces the
bindist which we want to distribute to users for a specific
platform.
2. Pipelines to run on nightly and release jobs to generate metadata
- ghcup-metadata-nightly: Generates metadata which points directly to
artifacts in the nightly job.
- ghcup-metadata-release: Generates metadata suitable for inclusion
directly in ghcup by pointing to the downloads folder where the
bindist will be uploaded to.
2a. Trigger jobs which test the generated metadata in the downstream
`ghccup-ci` repo. See that repo for documentation about what is
tested and how but essentially we test in a variety of clean images
that ghcup can download and install the bindists we say exist in our
metadata.
Diffstat (limited to '.gitlab-ci.yml')
-rw-r--r-- | .gitlab-ci.yml | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 059c36ca07..1304e4aa11 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -944,3 +944,138 @@ pages: artifacts: paths: - public + +############################################################# +# Generation of GHCUp metadata +############################################################# + + +# TODO: MP: This way of determining the project version is sadly very slow. +# It seems overkill to have to setup a complete environment, and build hadrian to get +# it to generate a single file containing the version information. +project-version: + stage: packaging + image: "registry.gitlab.haskell.org/ghc/ci-images/x86_64-linux-deb10:$DOCKER_REV" + tags: + - x86_64-linux + variables: + BUILD_FLAVOUR: default + script: + # Calculate the project version + - sudo chown ghc:ghc -R . + - .gitlab/ci.sh setup + - .gitlab/ci.sh configure + - .gitlab/ci.sh run_hadrian VERSION + - echo "ProjectVersion=$(cat VERSION)" > version.sh + + needs: [] + dependencies: [] + artifacts: + paths: + - version.sh + rules: + - if: '$NIGHTLY' + - if: '$RELEASE_JOB == "yes"' + +.ghcup-metadata: + stage: deploy + image: "nixos/nix:2.12.0" + dependencies: null + tags: + - x86_64-linux + variables: + BUILD_FLAVOUR: default + GIT_SUBMODULE_STRATEGY: "none" + before_script: + - echo "experimental-features = nix-command flakes" >> /etc/nix/nix.conf + - nix-channel --update + - cat version.sh + # Calculate the project version + - . ./version.sh + + # Download existing ghcup metadata + - nix shell --extra-experimental-features nix-command --extra-experimental-features flakes nixpkgs#wget -c wget "https://raw.githubusercontent.com/haskell/ghcup-metadata/develop/ghcup-0.0.7.yaml" + + - .gitlab/generate_job_metadata + + artifacts: + paths: + - metadata_test.yaml + - version.sh + +ghcup-metadata-nightly: + extends: .ghcup-metadata + # Explicit needs for validate pipeline because we only need certain bindists + needs: + - job: nightly-x86_64-linux-fedora33-release + artifacts: false + - job: nightly-x86_64-linux-centos7-validate + artifacts: false + - job: nightly-x86_64-darwin-validate + artifacts: false + - job: nightly-aarch64-darwin-validate + artifacts: false + - job: nightly-x86_64-windows-validate + artifacts: false + - job: nightly-x86_64-linux-alpine3_12-int_native-validate+fully_static + artifacts: false + - job: nightly-x86_64-linux-deb9-validate + artifacts: false + - job: nightly-i386-linux-deb9-validate + artifacts: false + - job: nightly-x86_64-linux-deb10-validate + artifacts: false + - job: nightly-aarch64-linux-deb10-validate + artifacts: false + - job: nightly-x86_64-linux-deb11-validate + artifacts: false + - job: source-tarball + artifacts: false + - job: project-version + script: + - nix shell --extra-experimental-features nix-command -f .gitlab/rel_eng -c ghcup-metadata --metadata ghcup-0.0.7.yaml --pipeline-id="$CI_PIPELINE_ID" --version="$ProjectVersion" > "metadata_test.yaml" + rules: + - if: $NIGHTLY + +ghcup-metadata-release: + # No explicit needs for release pipeline as we assume we need everything and everything will pass. + extends: .ghcup-metadata + script: + - nix shell --extra-experimental-features nix-command -f .gitlab/rel_eng -c ghcup-metadata --release-mode --metadata ghcup-0.0.7.yaml --pipeline-id="$CI_PIPELINE_ID" --version="$ProjectVersion" > "metadata_test.yaml" + rules: + - if: '$RELEASE_JOB == "yes"' + +.ghcup-metadata-testing: + stage: deploy + variables: + 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/ghcup-ci" + branch: "upstream-testing" + strategy: "depend" + +ghcup-metadata-testing-nightly: + needs: + - job: ghcup-metadata-nightly + artifacts: false + extends: .ghcup-metadata-testing + variables: + NIGHTLY: "$NIGHTLY" + UPSTREAM_JOB_NAME: "ghcup-metadata-nightly" + rules: + - if: '$NIGHTLY == "1"' + +ghcup-metadata-testing-release: + needs: + - job: ghcup-metadata-release + artifacts: false + extends: .ghcup-metadata-testing + variables: + UPSTREAM_JOB_NAME: "ghcup-metadata-release" + rules: + - if: '$RELEASE_JOB == "yes"' + when: manual + |