GitHub Action
Docker-Coq Action
This GitHub action can be used together with coqorg/coq Docker images.
For more details about these images, see the docker-coq wiki.
Assuming the Git repository contains a folder/coq-proj.opam
file,
it will run (by default) the following commands:
opam config list; opam repo list; opam list
opam pin add -n -y -k path coq-proj folder
opam update -y
opam install -y -j 2 coq-proj --deps-only
opam list
opam install -y -v -j 2 coq-proj
opam list
opam remove coq-proj
See action.yml
runs-on: ubuntu-latest # container actions require GNU/Linux
strategy:
matrix:
coq_version:
- '8.11'
- dev
ocaml_version: ['4.07-flambda']
fail-fast: false # don't stop jobs if one fails
steps:
- uses: actions/checkout@v2
- uses: coq-community/docker-coq-action@v1
with:
opam_file: 'folder/coq-proj.opam'
coq_version: ${{ matrix.coq_version }}
ocaml_version: ${{ matrix.ocaml_version }}
See also the example repo.
Optional the path of the .opam
file (or a directory), relative to the repo root.
Default "."
(if the argument is omitted or an empty string).
Note-1: relying on the value of this INPUT_OPAM_FILE
variable, the
following two variables are exported when running the custom_script
:
if [ -z "$INPUT_OPAM_FILE" ] || [ -d "$INPUT_OPAM_FILE" ]; then
WORKDIR=""
PACKAGE=${INPUT_OPAM_FILE:-.}
else
WORKDIR=$(dirname "$INPUT_OPAM_FILE")
PACKAGE=$(basename "$INPUT_OPAM_FILE" .opam)
fi
Note-2: if this value is a directory (e.g., .
), relying on the
custom_script
default value, the action will
install all the *.opam
packages stored in this directory.
Optional The version of Coq. E.g., "8.10"
. Default
"latest"
(= latest stable version).
Optional The version of OCaml. Default "minimal"
.
Among "minimal"
, "4.07-flambda"
, "4.09-flambda"
.
Optional The bash snippet to run before install
Default:
opam config list; opam repo list; opam list
See custom_script
for more details.
Optional The bash snippet to install the opam
PACKAGE
dependencies.
Default:
opam pin add -n -y -k path $PACKAGE $WORKDIR
opam update -y
opam install -y -j 2 $PACKAGE --deps-only
See custom_script
for more details.
Optional The bash snippet to run after install
(if successful).
Default:
opam list
See custom_script
for more details.
Optional The bash snippet to run before script
. Default ""
(empty string).
See custom_script
for more details.
Optional The bash snippet to install the opam
PACKAGE
.
Default:
opam install -y -v -j 2 $PACKAGE
opam list
See custom_script
for more details.
Optional The bash snippet to run after script
(if successful). Default ""
(empty string).
See custom_script
for more details.
Optional The bash snippet to uninstall the opam
PACKAGE
.
Default:
opam remove $PACKAGE
See custom_script
for more details.
Optional The main script run in the container; may be overridden; but overriding more specific parts of the script is preferred.
Default:
startGroup before_install dependencies
{{before_install}}
endGroup
startGroup install dependencies
{{install}}
endGroup
startGroup after_install dependencies
{{after_install}}
endGroup
startGroup before_script
{{before_script}}
endGroup
startGroup script
{{script}}
endGroup
startGroup after_script
{{after_script}}
endGroup
startGroup uninstall
{{uninstall}}
endGroup
Note-1: the semantics of this variable is a standard Bash script,
that is evaluated within the workflow container after replacing the
"mustache" placeholders with the value of their variable counterpart.
For example, {{uninstall}}
will be replaced with the value of the
uninstall
variable (the default value of which being
the string opam remove $PACKAGE
).
Note-2: this option is named custom_script
rather than run
or so
to discourage changing its recommended, default value for building
a regular opam
project, while keeping the flexibility to be able to
change it.
Note-3: if you decide to override the custom_script
value anyway,
you can just as well rely on the "mustache interpolation" of
{{before_install}}
… {{uninstall}}
, and customize the underlying
values.
Optional The name of the Docker image to pull; unset by default.
If this variable is unset, its value is computed from the values of
keywords coq_version
and ocaml_version
.
If you use the standard
docker-coq
images, we
recommend to directly use keywords coq_version
and ocaml_version
.
If you use another registry such as that of
docker-mathcomp
images, you can benefit from that keyword by writing a configuration
such as:
runs-on: ubuntu-latest
strategy:
matrix:
image:
- mathcomp/mathcomp:1.10.0-coq-8.10
- mathcomp/mathcomp:1.10.0-coq-8.11
- mathcomp/mathcomp:1.11.0-coq-dev
- mathcomp/mathcomp-dev:coq-dev
fail-fast: false # don't stop jobs if one fails
steps:
- uses: actions/checkout@v2
- uses: coq-community/docker-coq-action@v1
with:
opam_file: 'folder/coq-proj.opam'
custom_image: ${{ matrix.image }}
Optional A space-separated list of env
variables to export to the custom_script
.
Note-1: The values of the variables to export may be defined by using the
env
keyword.
Note-2: Regarding the naming of these variables:
- Only use ASCII letters,
_
and digits, i.e., matching the[a-zA-Z_][a-zA-Z0-9_]*
regexp. - Avoid reserved identifiers (namely:
HOME
,CI
, and strings starting withGITHUB_
,ACTIONS_
,RUNNER_
, orINPUT_
).
Here is a minimal working example of this feature:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: coq-community/docker-coq-action@v1
with:
opam_file: 'folder/coq-proj.opam'
coq_version: 'dev'
ocaml_version: '4.07-flambda'
export: 'OPAMWITHTEST' # space-separated list of variables
env:
OPAMWITHTEST: 'true'
Here, setting the OPAMWITHTEST
environment variable is useful to run the unit tests
(specified using opam
's with-test
clause) after the package build.
If you use the
docker-coq
images,
the container user has UID=GID=1000 while the GitHub action workdir
has (UID=1001, GID=116).
This is not an issue when relying on opam
to build the Coq project.
Otherwise, you may want to use sudo
in the container to change the
permissions. You may also install additional Debian packages.
Typically, this would lead to a workflow specification like this:
runs-on: ubuntu-latest
strategy:
matrix:
image:
- 'coqorg/coq:dev'
steps:
- uses: actions/checkout@v2
- uses: coq-community/docker-coq-action@v1
with:
opam_file: 'coq-demo.opam'
custom_image: ${{ matrix.image }}
before_script: |
echo Workaround permission issue
sudo chown -R coq:coq . # <--
script: |
make -j2
uninstall: |
make clean
- name: Revert permissions
# to avoid a warning at cleanup time
if: ${{ always() }}
run: sudo chown -R 1001:116 . # <--
For more details, see the
CI setup / Remarks
section in the docker-coq
wiki.
The docker-coq-action
provides built-in support for opam
builds.
If your project does not already have a coq-….opam
file, you might
generate one such file by using the corresponding template gathered in
coq-community/templates.
This .opam
file can then serve as a basis for submitting releases in
coq/opam-coq-archive, and
related guidelines (including the required .opam
metadata) are
available in https://coq.inria.fr/opam-packaging.html.
More details can be found in the opam documentation.