From 0dbb71de453d40bc03d772102372fec083afaa47 Mon Sep 17 00:00:00 2001 From: Hendrik Tews Date: Wed, 27 Dec 2023 21:04:47 +0100 Subject: [PATCH] CI: prepare documentation and configuration for automatic updates Prepare ci/doc/README.md and .github/workflows/test.yml for automatic updates of the tested Coq and Emacs versions. --- .github/workflows/test.yml | 36 ++++++++++++++++++++++++++++++ ci/doc/README.md | 44 ++++++++++++++++++++++++++++++------- ci/doc/README.pdf | Bin 48766 -> 48999 bytes 3 files changed, 72 insertions(+), 8 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5c2de7b37..dce7395a4 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,3 +1,10 @@ +# See ../../ci/doc/README.{md,pdf} for documentation about continuous +# integration and testing of Proof General. +# +# The versions to be tested in between the CIPG markers are now and +# then automatically updated. Please consider this when changing this +# file. +# name: CI on: @@ -20,12 +27,16 @@ jobs: strategy: matrix: emacs_version: + # The content between the CIPG markers is automatically + # changed by the cipg program. Do not change these markers. + # CIPG change marker: build-emacs-versions - 26.3 - 27.1 - 27.2 - 28.1 - 28.2 - 29.1 + # CIPG change marker end # at most 20 concurrent jobs per free account # cf. https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions#usage-limit max-parallel: 4 @@ -65,8 +76,13 @@ jobs: # I don't think we need to check with all emacs # versions. The latest two should be enough, maybe even # only the latest one. + # + # The content between the CIPG markers is automatically + # changed by the cipg program. Do not change these markers. + # CIPG change marker: magic-emacs-version - 28.2 - 29.1 + # CIPG change marker end # don't cancel all in-progress jobs if one matrix job fails: fail-fast: false @@ -89,6 +105,9 @@ jobs: strategy: matrix: coq_emacs_version: + # The content between the CIPG markers is automatically + # changed by the cipg program. Do not change these markers. + # CIPG change marker: test-coq-emacs-versions - coq-8.11-emacs-26.3 - coq-8.11-emacs-29.1 - coq-8.12-emacs-27.1 @@ -122,6 +141,7 @@ jobs: - coq-8.19-rc-emacs-28.1 - coq-8.19-rc-emacs-28.2 - coq-8.19-rc-emacs-29.1 + # CIPG change marker end # at most 20 concurrent jobs per free account # cf. https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions#usage-limit max-parallel: 6 @@ -162,6 +182,9 @@ jobs: strategy: matrix: coq_emacs_version: + # The content between the CIPG markers is automatically + # changed by the cipg program. Do not change these markers. + # CIPG change marker: compile-coq-emacs-versions - coq-8.11-emacs-26.3 - coq-8.11-emacs-29.1 - coq-8.12-emacs-27.1 @@ -195,6 +218,7 @@ jobs: - coq-8.19-rc-emacs-28.1 - coq-8.19-rc-emacs-28.2 - coq-8.19-rc-emacs-29.1 + # CIPG change marker end # don't cancel all in-progress jobs if one matrix job fails: fail-fast: false steps: @@ -228,6 +252,9 @@ jobs: strategy: matrix: coq_emacs_version: + # The content between the CIPG markers is automatically + # changed by the cipg program. Do not change these markers. + # CIPG change marker: simple-coq-emacs-versions - coq-8.11-emacs-26.3 - coq-8.11-emacs-29.1 - coq-8.12-emacs-27.1 @@ -261,6 +288,7 @@ jobs: - coq-8.19-rc-emacs-28.1 - coq-8.19-rc-emacs-28.2 - coq-8.19-rc-emacs-29.1 + # CIPG change marker end # don't cancel all in-progress jobs if one matrix job fails: fail-fast: false @@ -298,12 +326,16 @@ jobs: strategy: matrix: emacs_version: + # The content between the CIPG markers is automatically + # changed by the cipg program. Do not change these markers. + # CIPG change marker: indent-emacs-versions - 26.3 - 27.1 - 27.2 - 28.1 - 28.2 - 29.1 + # CIPG change marker end max-parallel: 4 # don't cancel all in-progress jobs if one matrix job fails: fail-fast: false @@ -329,12 +361,16 @@ jobs: strategy: matrix: emacs_version: + # The content between the CIPG markers is automatically + # changed by the cipg program. Do not change these markers. + # CIPG change marker: qrhl-emacs-versions - 26.3 - 27.1 - 27.2 - 28.1 - 28.2 - 29.1 + # CIPG change marker end max-parallel: 4 # don't cancel all in-progress jobs if one matrix job fails: fail-fast: false diff --git a/ci/doc/README.md b/ci/doc/README.md index 071117820..d8ac640a6 100644 --- a/ci/doc/README.md +++ b/ci/doc/README.md @@ -10,6 +10,11 @@ linkcolor: blue This document describes the general strategy for testing Proof General with GitHub actions and for building the necessary containers. +**Note:** The portions in this file between the CIPG markers (which +are invisible in the PDF version) are now and then automatically +updated by the `cipg` program. Please consider this when changing this +file. + The file `.github/workflows/test.yml` defines 6 jobs. build @@ -78,9 +83,13 @@ standard support date is in the future. Currently, the first actively supported versions are -| Coq | 8.11 | -|-------+------| -| Emacs | 26.3 | + + +| Coq | 8.11 | +|-------+-------| +| Emacs | 26.3 | + The set of passively supported Coq/Emacs version pairs is work in progress. @@ -140,8 +149,17 @@ we build containers for the historic pairs of the last 6 years as passively supported versions. -This results in 48 containers. - +This results in + + +48 + +containers. + + + | | 26.1 | 26.2 | 26.3 | 27.1 | 27.2 | 28.1 | 28.2 | 29.1 | |---------+------+------+------+------+------+------+------+------| | 8.8 | H | | | | | | | | @@ -156,6 +174,7 @@ This results in 48 containers. | 8.17 | | | X | X | X | X | X | X | | 8.18 | | | X | X | X | X | X | X | | 8.19-rc | RC | RC | RC | RC | RC | RC | RC | RC | + In the table above, @@ -248,9 +267,17 @@ following points is true for *cv* and *ev*. Running Proof General interaction tests with Coq for passively supported versions is work in progress. -This results in 33 version pairs for the Proof General interaction -tests with Coq. - +This results in + + +33 + +version pairs for the Proof General interaction tests with Coq. + + + | | 26.1 | 26.2 | 26.3 | 27.1 | 27.2 | 28.1 | 28.2 | 29.1 | |---------+------+------+------+------+------+------+------+------| | 8.8 | | | | | | | | | @@ -265,6 +292,7 @@ tests with Coq. | 8.17 | | | X | X | | | X | SUP | | 8.18 | | | X | X | N | N | X | X | | 8.19-rc | RC | RC | RC | RC | RC | RC | RC | RC | + See [Container build strategy](#contbuild) for an explanation of the symbols in the table. diff --git a/ci/doc/README.pdf b/ci/doc/README.pdf index 5c5956dbf501d93d00e8a04c6d33f231a890e9be..988a22a28bf6fcac79d763a9d1fcd85348b3cf8b 100644 GIT binary patch delta 7256 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 gowBe{Buv@CV!Z delta 6985 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 b=-1!!4`+`@0Fytz9ttrqFbX9lMNdWwZ*FO{