image: "$IMAGE" stages: - docker - stage-1 # No dependencies - stage-2 # Only dependencies in stage 1 - stage-3 # Only dependencies in stage 1 and 2 - stage-4 # Only dependencies in stage 1, 2 and 3 - stage-5 # Only dependencies in stage 1, 2, 3, and 4 - deploy # When a job has no dependencies, it goes to stage 1. Otherwise, we # set "needs" to contain all transitive dependencies (with "artifacts: # false" when we don't want the artifacts). We include the transitive # dependencies due to gitlab bugs sometimes starting the job even if a # transitive dep failed, see #10699 / 7b59d8c9d9b2104de7162ec0e40f6182a6830046. # some default values variables: # Format: $IMAGE-V$DATE-$hash # The $hash is the first 10 characters of the md5 of the Dockerfile. e.g. # echo $(md5sum dev/ci/docker/bionic_coq/Dockerfile | head -c 10) CACHEKEY: "bionic_coq-V2021-02-11-b601de5a7b" IMAGE: "$CI_REGISTRY_IMAGE:$CACHEKEY" # By default, jobs run in the base switch; override to select another switch OPAM_SWITCH: "base" # Used to select special compiler switches such as flambda, 32bits, etc... OPAM_VARIANT: "" GIT_DEPTH: "10" include: - local: '/dev/bench/gitlab-bench.yml' docker-boot: stage: docker image: docker:stable services: - docker:dind before_script: [] script: - docker login -u gitlab-ci-token -p "$CI_JOB_TOKEN" "$CI_REGISTRY" - cd dev/ci/docker/bionic_coq/ - if docker pull "$IMAGE"; then echo "Image prebuilt!"; exit 0; fi - docker build -t "$IMAGE" . - docker push "$IMAGE" except: variables: - $SKIP_DOCKER == "true" - $ONLY_WINDOWS == "true" tags: - docker before_script: - cat /proc/{cpu,mem}info || true - ls -a # figure out if artifacts are around - printenv -0 | sort -z | tr '\0' '\n' - declare -A switch_table - switch_table=( ["base"]="$COMPILER" ["edge"]="$COMPILER_EDGE" ) - opam switch set -y "${switch_table[$OPAM_SWITCH]}$OPAM_VARIANT" - eval $(opam env) - opam list - opam config list - dev/tools/check-cachekey.sh ################ GITLAB CACHING ###################### # - use artifacts between jobs # ###################################################### # TODO figure out how to build doc for installed Coq .build-template: stage: stage-1 except: variables: - $ONLY_WINDOWS == "true" interruptible: true artifacts: name: "$CI_JOB_NAME" paths: - _install_ci - config/Makefile - config/coq_config.py - config/coq_config.ml - dmesg.txt expire_in: 1 week script: - set -e - echo 'start:coq.clean' - make clean # ensure that `make clean` works on a fresh clone - echo 'end:coq.clean' - echo 'start:coq.config' - ./configure -warn-error yes -prefix "$(pwd)/_install_ci" ${COQ_EXTRA_CONF}"$COQ_EXTRA_CONF_QUOTE" - echo 'end:coq.config' - echo 'start:coq.build' - make -j "$NJOBS" byte - make -j "$NJOBS" world $EXTRA_TARGET - echo 'end:coq:build' - echo 'start:coq.install' - make install install-byte $EXTRA_INSTALL - make install-byte - cp bin/fake_ide _install_ci/bin/ - echo 'end:coq.install' - set +e # Template for building Coq + stdlib, typical use: overload the switch .dune-template: stage: stage-1 except: variables: - $ONLY_WINDOWS == "true" interruptible: true script: # flambda can be pretty stack hungry, specially with -O3 # See also https://github.com/ocaml/ocaml/issues/7842#issuecomment-596863244 # and https://github.com/coq/coq/pull/11916#issuecomment-609977375 - ulimit -s 16384 - set -e - make -f Makefile.dune world - set +e - tar cfj _build.tar.bz2 _build variables: OPAM_SWITCH: edge OPAM_VARIANT: "+flambda" artifacts: name: "$CI_JOB_NAME" when: always paths: - _build/log - _build.tar.bz2 expire_in: 1 week .dune-ci-template: stage: stage-2 except: variables: - $ONLY_WINDOWS == "true" interruptible: true needs: - build:edge+flambda:dune:dev script: - tar xfj _build.tar.bz2 - set -e - echo 'start:coq.test' - make -f Makefile.dune "$DUNE_TARGET" - echo 'end:coq.test' - set +e variables: OPAM_SWITCH: edge OPAM_VARIANT: "+flambda" artifacts: when: always name: "$CI_JOB_NAME" expire_in: 2 months # every non build job must set "needs" otherwise all build # artifacts are used together and we may get some random Coq. To that # purpose, we add a spurious dependency `not-a-real-job` that must be # overridden otherwise the CI will fail. .doc-template: stage: stage-2 except: variables: - $ONLY_WINDOWS == "true" interruptible: true needs: - not-a-real-job script: - SPHINXENV='COQBIN="'"$PWD"'/_install_ci/bin/"' - make -j "$NJOBS" SPHINXENV="$SPHINXENV" SPHINX_DEPS= refman - make install-doc-sphinx artifacts: name: "$CI_JOB_NAME" paths: - _install_ci/share/doc/coq/ expire_in: 2 months # set "needs" when using .test-suite-template: stage: stage-2 except: variables: - $ONLY_WINDOWS == "true" interruptible: true needs: - not-a-real-job script: - cd test-suite - make clean # careful with the ending / - BIN=$(readlink -f ../_install_ci/bin)/ - LIB=$(readlink -f ../_install_ci/lib/coq)/ - export OCAMLPATH=$(readlink -f ../_install_ci/lib/):"$OCAMLPATH" - COQEXTRAFLAGS="${COQEXTRAFLAGS}" make -j "$NJOBS" BIN="$BIN" COQLIB="$LIB" all artifacts: name: "$CI_JOB_NAME.logs" when: on_failure paths: - test-suite/logs # Gitlab doesn't support yet "expire_in: never" so we use the instance default # expire_in: never # set "needs" when using .validate-template: stage: stage-2 except: variables: - $ONLY_WINDOWS == "true" interruptible: true needs: - not-a-real-job script: # exit 0: workaround for https://gitlab.com/gitlab-org/gitlab/issues/202505 # the validate:quick job is sometimes started before build:quick, without artifacts # we ignore these spurious errors so if the job fails it's a real error - cd _install_ci || exit 0 - find lib/coq/ -name '*.vo' -fprint0 vofiles - xargs -0 --arg-file=vofiles bin/coqchk -o -m -coqlib lib/coq/ > ../coqchk.log 2>&1 || touch coqchk.failed - tail -n 1000 ../coqchk.log # the log is too big for gitlab so pipe to a file and display the tail - "[ ! -f coqchk.failed ]" # needs quoting for yml syntax reasons artifacts: name: "$CI_JOB_NAME.logs" paths: - coqchk.log expire_in: 2 months .ci-template: stage: stage-2 except: variables: - $ONLY_WINDOWS == "true" interruptible: true script: - set -e - echo 'start:coq.test' - make -f Makefile.ci -j "$NJOBS" "${CI_JOB_NAME#*:}" - echo 'end:coq.test' - set +e artifacts: name: "$CI_JOB_NAME" paths: - _build_ci when: always needs: - build:base .ci-template-flambda: extends: .ci-template needs: - build:edge+flambda variables: OPAM_SWITCH: "edge" OPAM_VARIANT: "+flambda" .platform-template: stage: stage-1 interruptible: true variables: PLATFORM: "https://github.com/coq/platform/archive/dev-ci.zip" artifacts: name: "$CI_JOB_NAME" paths: - artifacts when: always expire_in: 1 week before_script: [] # We don't want to use the shared 'before_script' .deploy-template: stage: deploy except: variables: - $ONLY_WINDOWS == "true" before_script: - which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y ) - eval $(ssh-agent -s) - mkdir -p ~/.ssh - chmod 700 ~/.ssh - ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts - git config --global user.name "coqbot" - git config --global user.email "coqbot@users.noreply.github.com" build:base: extends: .build-template variables: COQ_EXTRA_CONF: "-native-compiler yes -coqide opt" # coqdoc for stdlib, until we know how to build it from installed Coq EXTRA_TARGET: "doc-stdlib" EXTRA_INSTALL: "install-doc-stdlib-html install-doc-printable" # no coqide for 32bit: libgtk installation problems build:base+32bit: extends: .build-template variables: OPAM_VARIANT: "+32bit" COQ_EXTRA_CONF: "-native-compiler yes" only: &full-ci variables: - $FULL_CI == "true" build:edge+flambda: extends: .build-template variables: OPAM_SWITCH: edge OPAM_VARIANT: "+flambda" COQ_EXTRA_CONF: "-native-compiler yes -coqide opt -flambda-opts " COQ_EXTRA_CONF_QUOTE: "-O3 -unbox-closures" build:edge+flambda:dune:dev: extends: .dune-template build:base+async: extends: .build-template stage: stage-1 variables: COQ_EXTRA_CONF: "-native-compiler yes -coqide opt" COQUSERFLAGS: "-async-proofs on" after_script: - dmesg > dmesg.txt timeout: 100m allow_failure: true # See https://github.com/coq/coq/issues/9658 only: variables: - $UNRELIABLE =~ /enabled/ artifacts: when: always build:quick: extends: .build-template variables: COQ_EXTRA_CONF: "-native-compiler no" QUICK: "1" after_script: - dmesg > dmesg.txt timeout: 100m allow_failure: true # See https://github.com/coq/coq/issues/9637 only: variables: - $UNRELIABLE =~ /enabled/ artifacts: when: always windows64: extends: .platform-template variables: ARCH: "64" script: - call dev/ci/platform-windows.bat tags: - windows-inria only: variables: - $WINDOWS =~ /enabled/ lint: stage: stage-1 except: variables: - $ONLY_WINDOWS == "true" script: dev/lint-repository.sh variables: GIT_DEPTH: "" # we need an unknown amount of history for per-commit linting OPAM_SWITCH: "edge" OPAM_VARIANT: "+flambda" pkg:opam: stage: stage-1 except: variables: - $ONLY_WINDOWS == "true" interruptible: true # OPAM will build out-of-tree so no point in importing artifacts script: - set -e - opam pin add --kind=path coq-core.dev . - opam pin add --kind=path coq-stdlib.dev . - opam pin add --kind=path coqide-server.dev . - opam pin add --kind=path coqide.dev . - set +e variables: OPAM_SWITCH: "edge" OPAM_VARIANT: "+flambda" only: *full-ci .nix-template: image: nixorg/nix:latest # Minimal NixOS image which doesn't even contain git interruptible: true stage: stage-1 variables: # By default we use coq.cachix.org as an extra substituter but this can be overridden EXTRA_SUBSTITUTERS: https://coq.cachix.org EXTRA_PUBLIC_KEYS: coq.cachix.org-1:5QW/wwEnD+l2jvN6QRbRRsa4hBHG3QiQQ26cxu1F5tI= # The following variables should not be overridden GIT_STRATEGY: none NIXOS_PUBLIC_KEY: cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY= before_script: [] # We don't want to use the shared 'before_script' script: - cat /proc/{cpu,mem}info || true # Use current worktree as tmpdir to allow exporting artifacts in case of failure - export TMPDIR=$PWD # We build an expression rather than a direct URL to not be dependent on # the URL location; we are forced to put the public key of cache.nixos.org # because there is no --extra-trusted-public-key option. - nix-build -E "import (fetchTarball $CI_PROJECT_URL/-/archive/$CI_COMMIT_SHA.tar.gz) {}" -K --extra-substituters "$EXTRA_SUBSTITUTERS" --trusted-public-keys "$NIXOS_PUBLIC_KEY $EXTRA_PUBLIC_KEYS" | if [ ! -z "$CACHIX_SIGNING_KEY" ]; then cachix push coq; fi artifacts: name: "$CI_JOB_NAME.logs" when: on_failure paths: - nix-build-coq.drv-0/*/test-suite/logs # Gitlab doesn't support yet "expire_in: never" so we use the instance default # expire_in: never pkg:nix:deploy: extends: .nix-template environment: name: cachix url: https://coq.cachix.org before_script: # Install Cachix as documented at https://github.com/cachix/cachix - nix-env -iA cachix --prebuilt-only -f https://cachix.org/api/v1/install only: - master - /^v.*\..*$/ except: variables: - $ONLY_WINDOWS == "true" pkg:nix:deploy:channel: extends: .deploy-template environment: name: cachix url: https://coq.cachix.org only: refs: # Repeat conditions from pkg:nix:deploy - master - /^v.*\..*$/ variables: - $CACHIX_DEPLOYMENT_KEY needs: - pkg:nix:deploy script: - echo "$CACHIX_DEPLOYMENT_KEY" | tr -d '\r' | ssh-add - > /dev/null # Remove all pr branches because they could be missing when we run git fetch --unshallow - git branch --list 'pr-*' | xargs -r git branch -D - git fetch --unshallow - git branch -v - git push git@github.com:coq/coq-on-cachix "${CI_COMMIT_SHA}":"refs/heads/${CI_COMMIT_REF_NAME}" pkg:nix: extends: .nix-template except: refs: - master - /^v.*\..*$/ variables: - $ONLY_WINDOWS == "true" doc:refman: extends: .doc-template needs: - build:base doc:refman:dune: extends: .dune-ci-template variables: DUNE_TARGET: refman-html artifacts: paths: - _build/log - _build/default/doc/refman-html doc:refman-pdf:dune: extends: .dune-ci-template variables: DUNE_TARGET: refman-pdf artifacts: paths: - _build/log - _build/default/doc/refman-pdf # currently bugged: dune cleans up the glob files so no links # see #12699 doc:stdlib:dune: extends: .dune-ci-template variables: DUNE_TARGET: stdlib-html artifacts: paths: - _build/log - _build/default/doc/stdlib/html doc:refman:deploy: extends: .deploy-template environment: name: deployment url: https://coq.github.io/ only: variables: - $DOCUMENTATION_DEPLOY_KEY needs: - doc:ml-api:odoc - doc:refman:dune - build:base script: - echo "$DOCUMENTATION_DEPLOY_KEY" | tr -d '\r' | ssh-add - > /dev/null - git clone git@github.com:coq/doc.git _deploy - rm -rf _deploy/$CI_COMMIT_REF_NAME/api - rm -rf _deploy/$CI_COMMIT_REF_NAME/refman - rm -rf _deploy/$CI_COMMIT_REF_NAME/stdlib - mkdir -p _deploy/$CI_COMMIT_REF_NAME - cp -rv _build/default/_doc/_html _deploy/$CI_COMMIT_REF_NAME/api - cp -rv _build/default/doc/refman-html _deploy/$CI_COMMIT_REF_NAME/refman - cp -rv _install_ci/share/doc/coq/html/stdlib _deploy/$CI_COMMIT_REF_NAME/stdlib - cd _deploy/$CI_COMMIT_REF_NAME/ - git add api refman stdlib - git commit -m "Documentation of branch “$CI_COMMIT_REF_NAME” at $CI_COMMIT_SHORT_SHA" - git push # TODO: rebase and retry on failure doc:ml-api:odoc: extends: .dune-ci-template variables: DUNE_TARGET: apidoc artifacts: paths: - _build/log - _build/default/_doc/ test-suite:base: extends: .test-suite-template needs: - build:base test-suite:base+32bit: extends: .test-suite-template needs: - build:base+32bit variables: OPAM_VARIANT: "+32bit" only: *full-ci test-suite:edge+flambda: extends: .test-suite-template needs: - build:edge+flambda variables: OPAM_SWITCH: edge OPAM_VARIANT: "+flambda" only: *full-ci test-suite:edge:dune:dev: stage: stage-2 except: variables: - $ONLY_WINDOWS == "true" interruptible: true needs: - build:edge+flambda:dune:dev script: - tar xfj _build.tar.bz2 - make -f Makefile.dune test-suite variables: OPAM_SWITCH: edge OPAM_VARIANT: "+flambda" artifacts: name: "$CI_JOB_NAME.logs" when: on_failure paths: - _build/default/test-suite/logs # Gitlab doesn't support yet "expire_in: never" so we use the instance default # expire_in: never .test-suite:ocaml+beta+dune-template: stage: stage-1 except: variables: - $ONLY_WINDOWS == "true" interruptible: true script: - opam switch create $OCAMLVER --empty - eval $(opam env) - opam repo add ocaml-beta https://github.com/ocaml/ocaml-beta-repository.git - opam update - opam install ocaml-variants=$OCAMLVER - opam install dune zarith - eval $(opam env) - export COQ_UNIT_TEST=noop - make -f Makefile.dune test-suite variables: OPAM_SWITCH: base artifacts: name: "$CI_JOB_NAME.logs" when: always paths: - _build/log - _build/default/test-suite/logs expire_in: 2 week allow_failure: true # test-suite:4.12+trunk+dune: # extends: .test-suite:ocaml+beta+dune-template # variables: # OCAMLVER: 4.12.0+trunk test-suite:base+async: extends: .test-suite-template needs: - build:base variables: COQEXTRAFLAGS: "-async-proofs on -async-proofs-cache force" timeout: 100m allow_failure: true only: variables: - $UNRELIABLE =~ /enabled/ validate:base: extends: .validate-template needs: - build:base validate:base+32bit: extends: .validate-template needs: - build:base+32bit variables: OPAM_VARIANT: "+32bit" only: *full-ci validate:edge+flambda: extends: .validate-template needs: - build:edge+flambda variables: OPAM_SWITCH: edge OPAM_VARIANT: "+flambda" only: *full-ci validate:quick: extends: .validate-template needs: - build:quick only: variables: - $UNRELIABLE =~ /enabled/ # Libraries are by convention the projects that depend on Coq # but not on its ML API library:ci-argosy: extends: .ci-template library:ci-bbv: extends: .ci-template library:ci-bedrock2: extends: .ci-template-flambda variables: NJOBS: "1" library:ci-color: extends: .ci-template-flambda stage: stage-3 needs: - build:edge+flambda - plugin:ci-bignums library:ci-compcert: stage: stage-3 extends: .ci-template-flambda needs: - build:edge+flambda - library:ci-flocq - library:ci-menhir library:ci-coq_performance_tests: extends: .ci-template library:ci-coq_tools: extends: .ci-template library:ci-coqprime: stage: stage-3 extends: .ci-template-flambda needs: - build:edge+flambda - plugin:ci-bignums library:ci-coqtail: extends: .ci-template library:ci-coquelicot: stage: stage-3 extends: .ci-template-flambda needs: - build:edge+flambda - library:ci-mathcomp library:ci-cross_crypto: extends: .ci-template library:ci-engine_bench: extends: .ci-template library:ci-fcsl_pcm: extends: .ci-template-flambda stage: stage-3 needs: - build:edge+flambda - library:ci-mathcomp library:ci-fiat_crypto: extends: .ci-template-flambda stage: stage-4 needs: - build:edge+flambda - library:ci-coqprime - plugin:ci-bignums - plugin:ci-rewriter library:ci-fiat_crypto_legacy: extends: .ci-template-flambda allow_failure: true # See https://github.com/coq/coq/wiki/Coq-Call-2020-06-24#adding-back-fiat-crypto-legacy # We cannot use flambda due to # https://github.com/ocaml/ocaml/issues/7842, see # https://github.com/coq/coq/pull/11916#issuecomment-609977375 library:ci-fiat_crypto_ocaml: extends: .ci-template stage: stage-5 needs: - build:edge+flambda - library:ci-coqprime - plugin:ci-bignums - plugin:ci-rewriter - library:ci-fiat_crypto library:ci-flocq: extends: .ci-template-flambda library:ci-menhir: extends: .ci-template-flambda library:ci-interval: extends: .ci-template-flambda stage: stage-4 needs: - build:edge+flambda - library:ci-coquelicot - library:ci-flocq - library:ci-mathcomp - plugin:ci-bignums library:ci-oddorder: extends: .ci-template-flambda stage: stage-3 needs: - build:edge+flambda - library:ci-mathcomp library:ci-fourcolor: extends: .ci-template-flambda stage: stage-3 needs: - build:edge+flambda - library:ci-mathcomp library:ci-corn: extends: .ci-template-flambda stage: stage-4 needs: - build:edge+flambda - plugin:ci-bignums - library:ci-math_classes plugin:ci-gappa: extends: .ci-template-flambda stage: stage-3 needs: - build:edge+flambda - library:ci-flocq library:ci-geocoq: extends: .ci-template-flambda stage: stage-3 needs: - build:edge+flambda - library:ci-mathcomp library:ci-hott: extends: .ci-template library:ci-iris: extends: .ci-template-flambda library:ci-math_classes: extends: .ci-template-flambda stage: stage-3 needs: - build:edge+flambda - plugin:ci-bignums library:ci-mathcomp: extends: .ci-template-flambda library:ci-sf: extends: .ci-template library:ci-stdlib2: extends: .ci-template-flambda library:ci-tlc: extends: .ci-template library:ci-unimath: extends: .ci-template-flambda library:ci-verdi_raft: extends: .ci-template-flambda library:ci-vst: extends: .ci-template-flambda stage: stage-3 needs: - build:edge+flambda - library:ci-flocq library:ci-deriving: extends: .ci-template-flambda stage: stage-3 needs: - build:edge+flambda - library:ci-mathcomp # Plugins are by definition the projects that depend on Coq's ML API plugin:ci-aac_tactics: extends: .ci-template plugin:ci-bignums: extends: .ci-template-flambda plugin:ci-coq_dpdgraph: extends: .ci-template plugin:ci-coqhammer: extends: .ci-template-flambda plugin:ci-elpi: extends: .ci-template plugin:ci-equations: extends: .ci-template plugin:ci-fiat_parsers: extends: .ci-template plugin:ci-metacoq: extends: .ci-template stage: stage-3 needs: - build:base - plugin:ci-equations plugin:ci-mtac2: extends: .ci-template plugin:ci-paramcoq: extends: .ci-template plugin:ci-perennial: extends: .ci-template-flambda plugin:plugin-tutorial: stage: stage-1 except: variables: - $ONLY_WINDOWS == "true" interruptible: true script: - ./configure -local -warn-error yes - make -j "$NJOBS" plugin-tutorial plugin:ci-quickchick: extends: .ci-template-flambda stage: stage-3 needs: - build:edge+flambda - library:ci-mathcomp plugin:ci-reduction_effects: extends: .ci-template plugin:ci-relation_algebra: extends: .ci-template plugin:ci-rewriter: extends: .ci-template-flambda