Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/laminas/laminas-ci-matrix-action
GitHub Action for creating a CI job matrix.
https://github.com/laminas/laminas-ci-matrix-action
continuous-integration
Last synced: 3 days ago
JSON representation
GitHub Action for creating a CI job matrix.
- Host: GitHub
- URL: https://github.com/laminas/laminas-ci-matrix-action
- Owner: laminas
- License: bsd-3-clause
- Created: 2021-02-04T20:20:33.000Z (almost 4 years ago)
- Default Branch: 1.28.x
- Last Pushed: 2024-09-18T04:40:34.000Z (about 2 months ago)
- Last Synced: 2024-09-18T07:31:32.388Z (about 2 months ago)
- Topics: continuous-integration
- Language: TypeScript
- Homepage:
- Size: 1.5 MB
- Stars: 24
- Watchers: 16
- Forks: 15
- Open Issues: 38
-
Metadata Files:
- Readme: README.md
- License: LICENSE.md
Awesome Lists containing this project
README
# Create a CI matrix for use in a GitHub Action
> ## π·πΊ Π ΡΡΡΠΊΠΈΠΌ Π³ΡΠ°ΠΆΠ΄Π°Π½Π°ΠΌ
>
> ΠΡ, ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΈ Laminas, ΡΠΎΠ΄ΠΈΠ»ΠΈΡΡ ΠΈ ΠΆΠΈΠ²Π΅ΠΌ Π² ΡΠ°Π·Π½ΡΡ ΡΡΡΠ°Π½Π°Ρ . Π£ ΠΌΠ½ΠΎΠ³ΠΈΡ ΠΈΠ· Π½Π°Ρ Π΅ΡΡΡ Π΄ΡΡΠ·ΡΡ, ΡΠΎΠ΄ΡΡΠ²Π΅Π½Π½ΠΈΠΊΠΈ ΠΈ ΠΊΠΎΠ»Π»Π΅Π³ΠΈ ΠΊΠ°ΠΊ Π² Π ΠΎΡΡΠΈΠΈ, ΡΠ°ΠΊ ΠΈ Π² Π£ΠΊΡΠ°ΠΈΠ½Π΅. ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ· Π½Π°Ρ ΡΠΎΠ΄ΠΈΠ»ΠΈΡΡ Π² Π ΠΎΡΡΠΈΠΈ. ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ· Π½Π°Ρ ΠΆΠΈΠ²ΡΡ Π² Π ΠΎΡΡΠΈΠΈ. Π£ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ Π±Π°Π±ΡΡΠΊΠΈ ΠΈ Π΄Π΅Π΄ΡΡΠΊΠΈ ΡΡΠ°ΠΆΠ°Π»ΠΈΡΡ Ρ ΡΠ°ΡΠΈΡΡΠ°ΠΌΠΈ Π²ΠΎ ΠΡΠΎΡΠΎΠΉ ΠΌΠΈΡΠΎΠ²ΠΎΠΉ Π²ΠΎΠΉΠ½Π΅. ΠΠ΄Π΅ΡΡ Π½ΠΈΠΊΡΠΎ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΠ°ΡΠΈΠ·ΠΌ.
>
> Π£ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π½Π°Ρ Π΅ΡΡΡ ΡΠΊΡΠ°ΠΈΠ½ΡΠΊΠ°Ρ ΡΠΎΠ΄ΡΡΠ²Π΅Π½Π½ΠΈΡΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠΏΠ°ΡΠ»Π°ΡΡ ΠΈΠ· Π΄ΠΎΠΌΠ° Π²ΠΌΠ΅ΡΡΠ΅ Ρ ΡΡΠ½ΠΎΠΌ. ΠΠΎΠ΅Π·Π΄ Π·Π°Π΄Π΅ΡΠΆΠ°Π»ΡΡ ΠΈΠ·-Π·Π° Π±ΠΎΠΌΠ±Π΅ΠΆΠΊΠΈ Π½Π° Π΄ΠΎΡΠΎΠ³Π΅ Π²ΠΏΠ΅ΡΠ΅Π΄ΠΈ. Π£ Π½Π°Ρ Π΅ΡΡΡ Π΄ΡΡΠ·ΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΡΡΡΡΡΡ Π² Π±ΠΎΠΌΠ±ΠΎΡΠ±Π΅ΠΆΠΈΡΠ°Ρ . ΠΡ Ρ ΡΡΠ΅Π²ΠΎΠ³ΠΎΠΉ ΠΆΠ΄Π΅ΠΌ Π²Π΅ΡΡΠΎΡΠΊΠΈ ΠΎΡ Π½ΠΈΡ ΠΏΠΎΡΠ»Π΅ Π²ΠΎΠ·Π΄ΡΡΠ½ΡΡ Π½Π°Π»Π΅ΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π±Π΅ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ½ΠΎ Π½Π°Π½ΠΎΡΡΡ ΡΠ΄Π°ΡΡ ΠΈ ΠΏΠΎΠΏΠ°Π΄Π°ΡΡ ΠΏΠΎ Π±ΠΎΠ»ΡΠ½ΠΈΡΠ°ΠΌ, ΡΠΊΠΎΠ»Π°ΠΌ, Π΄Π΅ΡΡΠΊΠΈΠΌ ΡΠ°Π΄Π°ΠΌ ΠΈ Π΄ΠΎΠΌΠ°ΠΌ. ΠΡ Π½Π΅ Π±Π΅ΡΠ΅ΠΌ ΡΡΠΎ ΠΈΠ· ΠΊΠ°ΠΊΠΈΡ -Π»ΠΈΠ±ΠΎ Π‘ΠΠ. ΠΡ Π½Π°Π±Π»ΡΠ΄Π°Π΅ΠΌ ΡΡΠΎ Π½Π°ΠΏΡΡΠΌΡΡ.
>
> ΠΡ Π΄ΠΎΠ²Π΅ΡΡΠ΅ΡΠ΅ Π½Π°ΠΌ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ, ΡΡΠΎΠ± ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π°ΡΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΈ ΠΌΡ ΠΏΡΠΎΡΠΈΠΌ Π²Π°Ρ Π΄ΠΎΠ²Π΅ΡΠΈΡΡΡΡ Π½Π°ΠΌ Π²Π½ΠΎΠ²Ρ. ΠΡ Π½ΡΠΆΠ΄Π°Π΅ΠΌΡΡ Π² ΠΏΠΎΠΌΠΎΡΠΈ. ΠΡΡ ΠΎΠ΄ΠΈΡΠ΅ ΠΈ ΠΏΡΠΎΡΠ΅ΡΡΡΠΉΡΠ΅ ΠΏΡΠΎΡΠΈΠ² ΡΡΠΎΠΉ Π±Π΅ΡΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π²ΠΎΠΉΠ½Ρ. ΠΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ ΠΊΡΠΎΠ²ΠΎΠΏΡΠΎΠ»ΠΈΡΠΈΠ΅. Π‘ΠΊΠ°ΠΆΠΈΡΠ΅ "ΠΠ΅Ρ Π²ΠΎΠΉΠ½Π΅!"
>
> ## πΊπΈ To Citizens of Russia
>
> We at Laminas come from all over the world. Many of us have friends, family and colleagues in both Russia and Ukraine. Some of us were born in Russia. Some of us currently live in Russia. Some have grandparents who fought Nazis in World War II. Nobody here supports fascism.
>
> One team member has a Ukrainian relative who fled her home with her son. The train was delayed due to bombing on the road ahead. We have friends who are hiding in bomb shelters. We anxiously follow up on them after the air raids, which indiscriminately fire at hospitals, schools, kindergartens and houses. We're not taking this from any media. These are our actual experiences.
>
> You trust us enough to use our software. We ask that you trust us to say the truth on this. We need your help. Go out and protest this unnecessary war. Stop the bloodshed. Say "stop the war!"This repository represents a GitHub action that allows you to introspect a PHP project in order to build up a test matrix which can later be run by the [laminas/laminas-continuous-integration-action](https://github.com/laminas/laminas-continuous-integration-action).
It identifies jobs to run based on presence or absence of configuration files in the package.
Currently, it identifies the following:- PHP versions to run unit tests against based on the `php` constraint in the `composer.json` file.
- Whether to run against a "locked" set of dependencies based on the presence of a `composer.lock` file.
- PHPUnit tests based on the presence of `phpunit.xml.dist` or `phpunit.xml` files.
- phpcs checks based on the presence of `phpcs.xml.dist` or `phpcs.xml` files.
- Psalm checks based on the presence of `psalm.xml.dist` or `psalm.xml` files.
- ComposerRequireChecker checks based on the presence of `composer-require-checker.json` file.
- phpbench benchmarks based on the presence of a `phpbench.json`.
- Infection mutation tests based on the presence of `infection.json` or `infection.json.dist`. In case that `roave/infection-static-analysis-plugin` is installed, this will be used instead.
- Markdown documentation based on the presence of a `mkdocs.yml` and/or markdown files in the `doc/book/` or `doc/books/` trees.
- Codeception checks based on the presence of `codeception.yml.dist` or `codeception.yml` files.Further, when triggered by a `pull_request` event, it determines what checks are necessary based on which files were affected.
## Usage
```yaml
jobs:
matrix:
name: Generate job matrix
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.matrix.outputs.matrix }}
steps:
- name: Gather CI configuration
id: matrix
uses: laminas/laminas-ci-matrix-action@v1qa:
name: QA Checks
needs: [matrix]
runs-on: ${{ matrix.operatingSystem }}
strategy:
fail-fast: false
matrix: ${{ fromJSON(needs.matrix.outputs.matrix) }}
steps:
- name: ${{ matrix.name }}
uses: laminas/laminas-continuous-integration-action@v1
with:
job: ${{ matrix.job }}
```Generally, you will use this as a dependency of a job that uses [laminas/laminas-continuous-integration-action](https://github.com/laminas/laminas-continuous-integration-action), as demonstrated in the above configuration.
> ### actions/checkout not required
>
> An actions/checkout step prior to this action is not required, as it will perform a checkout into the WORKDIR on its own if none has been performed previously.
> We recommend using actions/checkout only if you need to access QA artifacts in a later step.## Outputs
It spits out a single output, "matrix", which is a JSON string in the following format:
```json
{
"include": [
{
"name": "(string) Name of the check being run",
"operatingSystem": "(string) Name of the OS the job should be run on (generally ubuntu-latest)",
"action": "(string) GHA to run the step on; currently ignored, as GHA does not support dynamic action selection",
"job": "(string) JSON object detailing the job (more on this later)"
}
],
"exclude": [
{
}
]
}
```The "exclude" element will only be present if the package using the action provides it via configuration.
Each item in the "exclude" array will be an object, with one or more of the keys listed in the "include" objects; when a job matches all elements specified in the "exclude" array, it will be excluded from runs.The "job" element is a string JSON object detailing the job to run.
Note: it is **not** an object; it is a JSON string but it MUST have the structure as shown [here](#job-element).### Job Element
The "job" element will have the following elements, but is not restricted to them:
```json
{
"php": "(optional) string PHP minor version to run against; @lowest and @latest aliases point to the minimum and maximum PHP versions which are supported by the project",
"extensions": [
"(optional) extension names to install; names are from the ondrej PHP repository, minus the php{VERSION}- prefix"
],
"ini": [
"(optional) php.ini directives, one per element; e.g. 'memory_limit=-1'"
],
"dependencies": "(optional) dependencies to test against; one of lowest, locked, latest. default: locked",
"command": "(required) command to run to perform the check",
"ignore_platform_reqs_8": "(optional; deprecated) boolean; whether to add `--ignore-platform-req=php` to Composer for PHP 8.0. default: true",
"ignore_php_platform_requirement": "(optional) boolean; whether to add `--ignore-platform-req=php` to Composer for this job.",
"additional_composer_arguments": [
"(optional) list of arguments to be passed to `composer install` and `composer update`"
]
}
```## Configuration
The package can include a configuration file in its root, `.laminas-ci.json`, which can provide the following:
```json
{
"extensions": [
"extension names to install"
],
"ini": [
"php.ini directives"
],
"checks": [
{
}
],
"additional_checks": [
{
}
],
"exclude": [
{
}
],
"ignore_php_platform_requirements": {
"8.0": true
},
"stablePHP": "8.0",
"additional_composer_arguments": [
]
}
```### Providing specific checks to run
If you do not want to autodiscover checks to run, you can provide the "checks" configuration.
Each element in that array should be in the same format as listed above for the outputs:```json
{
"name": "(string) Name of the check being run",
"operatingSystem": "(string) Name of the OS the job should be run on (generally ubuntu-latest)",
"action": "(string) GHA to run the step on; currently ignored, as GHA does not support dynamic action selection",
"job": "(object|string) JSON object detailing the job"
}
```The "job" element can either be a JSON string representing a job, or an object.
In each case, it MUST have the structure as shown [here](#job-element) **but** the "php" element is mandatory in here and MUST contain
the minor PHP version to run the check against.The action validates each check and its job to ensure it is structured correctly, and will provide warnings if not, omitting any check that is malformed from the output.
**If the `checks` element is populated, the matrix will not include any auto-detected checks, and will only output the jobs listed in that element.**
### Providing additional checks
The `additional_checks` key allows package authors to provide checks to run in addition to any discovered.
This allows providing checks for tools the matrix discovery tools do not know about, or providing one-off checks (such as benchmarks or mutation tests).The syntax for the `additional_checks` key is as follows:
```json
{
"additional_checks": [
{
"name": "(string; REQUIRED) name of the check to run",
"job": "(object) JSON object detailing the job"
}
]
}
```A job per PHP version per dependency set will be created, and the "name" will be appended with "on PHP {VERSION} with {DEPS} dependencies" during an actual run.
The "job" element MUST have the structure as shown [here](#job-element) **but** the "php" element is mandatory in here and MUST contain either the minor PHP version to run the check against or a wildcard `*` to run the against **all** supported PHP versions.
You can pass the wildcard, "*", for the "php" element; when you do, the `ignore_php_platform_requirement` element will be ignored. It is possible to provide per-version flags by adding the `ignore_php_platform_requirements` element instead.The tool discovers checks first, then appends any `additional_checks` are concatenated, and then any `exclude` rules are applied.
### Excluding specific jobs
You can exclude specific jobs by using their names:
```json
{
"exclude": [
{
"name": "PHPUnit"
}
]
}
```If you want to limit the exclusion to specific PHP versions, you can additionally add a PHP version:
```json
{
"exclude": [
{
"name": "PHPUnit",
"php": "8.0"
}
]
}
```In case you only want to exclude jobs for specific Composer dependency sets, add `dependencies` to the `exclude` configuration:
```json
{
"exclude": [
{
"name": "PHPUnit",
"php": "8.0",
"dependencies": "latest"
}
]
}
```## Testing matrix generation locally using Docker
To test matrix generation in a local checkout on your own machine, you can do the following:
```bash
$ docker run -v $(realpath .):/github/workspace -w=/github/workspace ghcr.io/laminas/laminas-ci-matrix:1
```This will run the action locally and detail what matrix will be produced; it can be particularly useful for debugging issues with your `.laminas-ci.json` configuration.
## Development
In case you want to contribute features, bugfixes, tests or JSONSchema enhancements, you might want to build the docker container locally.
To do so, you can follow these steps:
1. Build the docker container by executing `$ docker build -t laminas/laminas-ci-matrix-action:dev-local .`
2. Change to the `tests/` directory you want to create a matrix for
3. Run the docker container while overriding the `entrypoint.sh` to ensure the `diff` is being passed to the matrix generator
- `docker run -it --entrypoint "/action/main.js" -v $(realpath .):/github/workspace -w=/github/workspace docker.io/laminas/laminas-ci-matrix-action:dev-local $(test -r diff && cat diff || echo "")`