Compare commits

...

89 Commits

Author SHA1 Message Date
GrayBot 28f9e498aa chore: release 7.0.0-rc.0 (#228) 2026-04-28 09:52:54 -04:00
Damien Retzinger 4001e8118b chore: release 7.0.0-rc.0
Release-As: 7.0.0-rc.0
2026-04-28 09:51:46 -04:00
Damien Retzinger b90317db60 ci: merge release-pinback and release-please workflows 2026-04-28 09:49:40 -04:00
Damien Retzinger ef5e69859c ci: prevent running tests on release PR 2026-04-28 09:45:19 -04:00
Damien Retzinger 1f4db0036c ci: automate pinning of in-repo versions at release time 2026-04-27 19:10:34 -04:00
Damien Retzinger e1a8a81488 feat(coding-standard): skip composer install if the coding is already installed 2026-04-27 14:03:49 -04:00
Damien Retzinger 3fad3a8995 feat(coding-standard): add missing composer_auth to require of magento-coding-standard 2026-04-27 14:03:12 -04:00
Damien Retzinger f8eff3c183 ci: update release refs to specific versions 2026-04-27 13:36:56 -04:00
Damien Retzinger ac4d16919b ci: handle edgecases 2026-04-27 12:03:05 -04:00
Damien Retzinger 5009cbf6da ci: replace pinback PAT with custom PAT 2026-04-27 11:56:02 -04:00
Damien Retzinger 4a0dcce0c9 ci: remove unnecessary cat 2026-04-27 11:46:49 -04:00
Damien Retzinger 5989e53c34 ci: adjust to auto-open PR 2026-04-27 11:44:49 -04:00
Damien Retzinger 7a3a4fdb6d ci: only modify uses 2026-04-27 11:38:52 -04:00
Damien Retzinger d4f4f9f468 ci: show diff'd files on pinback 2026-04-27 11:36:27 -04:00
Damien Retzinger 702ab13a0a build: gitignore tmp 2026-04-27 11:33:14 -04:00
Damien Retzinger 070b7b9901 ci: add workflow to automate version pinback to main for repo HEAD 2026-04-27 11:32:53 -04:00
Damien Retzinger 7e828eef67 ci: adjust to use internal version 2026-04-27 10:20:50 -04:00
Damien Retzinger dd543ffdea ci: adjust to use internal version 2026-04-27 10:16:02 -04:00
Damien Retzinger a2a45eb2fe docs: revise status badges 2026-04-27 10:10:12 -04:00
Damien Retzinger fa5620fc05 docs: remove stale badges and add missing actions 2026-04-27 10:05:54 -04:00
Damien Retzinger d80befbe9b fix(check-extension): mirror path repos to prevent symlink errors with template files (#218)
Composer installs path repositories as symlinks by default, which causes Magento's template engine to fail when resolving .phtml files. Setting `COMPOSER_MIRROR_PATH_REPOS=1` on all composer install steps forces a copy instead, matching how the package would be installed from Packagist in production.

Adds a .phtml template and an integration test to the demo package that
renders it via Magento's template engine. Without COMPOSER_MIRROR_PATH_REPOS=1
the path repo is installed as a symlink and the test fails; with mirroring
it passes.

Closes #217
2026-04-26 23:05:21 -04:00
Damien Retzinger d5c744e155 feat(coding-standard)!: remove pr-diff feature and built-in php setup (#224)
BREAKING CHANGE: Much of the "setup" that's built-into the command is removed in favor of a leaner action. This also includes the "on PR, only diff PR contents" behavior. This can be restored, but it shouldn't be the default and should be done as an input.

Fix SEVERITY_FLAGS construction which exited 1 under bash -e when
severity inputs were empty, causing CI failures.
2026-04-26 22:51:44 -04:00
Damien Retzinger 953de845eb feat(coding-standard-baseline)!: remove coding-standard-baseline action (#223) 2026-04-26 21:49:48 -04:00
Damien Retzinger de415eaff5 feat(install-test)!: remove install test (#222)
BREAKING CHANGE: You should rely on [Check Extension](https://github.com/graycoreio/github-actions-magento2/blob/main/.github/workflows/check-extension-README.md) instead.
2026-04-26 21:40:01 -04:00
Damien Retzinger 8f3c6eb927 refactor(cache-magento): remove unused mode cache arg (#220) 2026-04-26 21:31:21 -04:00
Damien Retzinger 98923b24c5 feat(unit-test)!: remove unit-test action (#221) 2026-04-26 21:31:07 -04:00
Damien Retzinger a92fe04503 docs: add guidance on what things belong in actions and what things dont 2026-04-26 21:15:47 -04:00
David Lambauer b510ea21e3 fix(supported-version)!: default include_services to true (#215)
BREAKING CHANGE: `include_services` now defaults to `true`. Callers that strictly validate the matrix schema and do not expect a `services` key must explicitly pass `include_services: false`.

Closes #214
2026-04-23 18:42:44 -04:00
David Lambauer 7799f0f9bf fix(check-extension): probe vendor dir for MageOS/Magento standards when running phpcs (#216)
Closes #213
2026-04-23 18:41:45 -04:00
GrayBot 2ef157ef8a chore: release 6.0.0 (#212) 2026-03-11 11:14:17 -04:00
Damien Retzinger 7e40a62efa feat(supported-version): upgrade opensearch to 2.19.5 2026-03-11 11:08:55 -04:00
Damien Retzinger b4526dbb52 feat(supported-version): add support for MageOS 2.2.0 2026-03-10 13:47:46 -04:00
Damien Retzinger e6be791eed feat(supported-version)!: update for Magento v2.4.8-p4 release
BREAKING CHANGE: Adobe has dropped support for elasticsearch and redis in their latest releases of v2.4.8.
2026-03-10 13:37:20 -04:00
GrayBot 2855f468ef chore: release 5.1.0 (#211) 2026-02-19 12:58:06 -05:00
Damien Retzinger 7e70ee93ef feat(supported-version): upgrade to compsoer 2.9.5 2026-02-19 11:16:35 -05:00
Damien Retzinger d29e574475 feat(supported-versions): upgrade 2.4.8-p2/p3 to opensearch 3 2026-02-19 11:11:24 -05:00
Damien Retzinger c19912dc4b feat(supported-version): bump all nginx versions to latest supported version 2026-02-19 11:05:23 -05:00
Damien Retzinger c26e84f693 feat(supported-version): bump all composer versions to latest supported version 2026-02-19 11:00:38 -05:00
Ryan Hoerr 48902e8e6a feat(supported-version): backport composer 2.9.3 to older mage-os verisons 2026-02-19 10:54:30 -05:00
Ryan Hoerr 07f89530df feat(supported-version): updated matrix for Mage-OS 2.1.0 2026-02-19 10:54:29 -05:00
Ryan Hoerr 505179ce7b fix(supported-version): pin specific composer 2 versions for historic Magento releases 2026-02-19 10:54:20 -05:00
Damien Retzinger 34ddee6aef fix: using latest accidentally output two versions for Magento Open Source 2026-02-19 10:31:12 -05:00
GrayBot 462e60345e chore: release 5.0.0 (#210) 2026-02-18 14:56:18 -05:00
Damien Retzinger f45372b796 build: add CODEOWNERS 2026-02-18 14:55:12 -05:00
Damien Retzinger 7b5ccf7d9d feat!: remove unmaintained setup-di-compile action 2026-02-18 14:50:55 -05:00
Damien Retzinger dc2f775d75 ci: use googleapis/release-please-action@v4 2026-02-18 14:47:03 -05:00
Damien Retzinger 5f3ba73bc6 feat: use actions/upload-artifact@v6 2026-02-18 14:45:55 -05:00
Damien Retzinger 86b01b17fa feat: use actions/cache@v5 2026-02-18 14:44:18 -05:00
Damien Retzinger c2c3755729 feat: use actions/checkout@v6 2026-02-18 14:43:05 -05:00
Damien Retzinger 5d47cda771 docs: note include_services in integration.yaml 2026-02-18 14:41:37 -05:00
GrayBot dc750a9f2f chore: release 4.0.1 (#208) 2025-12-16 11:48:46 -05:00
Damien Retzinger 7c0bc65842 fix(supported-version): handle semver-ish values from old magento verisons 2025-12-16 11:38:44 -05:00
Damien Retzinger 89912779a9 ci: restore accidentally removed id from integration test 2025-12-16 11:28:08 -05:00
GrayBot 484dc14f62 chore: release 4.0.0 (#197) 2025-12-16 11:18:15 -05:00
Damien Retzinger 810a5705cf feat(check-extension): prefer phpcs conf if it exists 2025-12-15 16:33:09 -05:00
Damien Retzinger 389830f189 ci: retain extensions key in integration tests 2025-12-15 14:50:10 -05:00
Damien Retzinger 45e881414f chore: remove invalid schema property 2025-12-15 11:24:54 -05:00
Ryan Hoerr c05755261d fix: 'invalid kind provided' when defining usable type (#305) 2025-12-15 11:23:17 -05:00
Ryan Hoerr 5608271fe3 fix: allow matrix testing without EOL versions (#299)
* fix: remove versions dependent on EOL composer 1

* Restore composer 1 versions

* Add `usable` version type, filtered by code constraints

* Added code comment

* Rebuilt index.js with latest changes merged

* Updated documentation
2025-12-15 11:22:34 -05:00
Ryan Hoerr 5fd96b988e fix(supported-verison): upstream version for Mage-OS 2.0.0 (#302) 2025-12-15 11:20:41 -05:00
Ryan Hoerr b0a3bea8e4 feat(supported-version): update matrix for Mage-OS 2.0.0 (#298)
* chore: add supported-version matrix info for Mage-OS 1.3.1 and 2.0.0

* Updated release date; merged latest changes and rebuilt index.js
2025-12-15 11:18:50 -05:00
Ryan Hoerr e99b140104 feat(supported-versions): update matrix for Magento 2.4.8-p3, 2.4.7-p8, 2.4.6-p13 (#301) 2025-12-15 11:15:59 -05:00
Fabrizio Balliano a8e8db3572 feat(supported-versions): 1.3.1 (#297) 2025-12-15 11:14:34 -05:00
Fabrizio Balliano 2b6d19f691 Added Mage-OS 1.3.0 (#296) 2025-12-15 11:13:04 -05:00
Vinai Kopp 499eb24a13 feat(supported-version): Add 2.4.5-p14, 2.4.6-p12, 2.4.7-p7 and 2.4.8-p2 (#295) 2025-12-15 11:10:46 -05:00
Damien Retzinger e12d993761 fix(supported-version): adjust correct key for mage-os/project-community-edition:>=1.2 <1.3 2025-12-15 11:05:23 -05:00
Fabrizio Balliano 229f7a2684 Added 2.4.5-p13, 2.4.6-p11, 2.4.7-p6, 2.4.8-p1 (#292) 2025-12-15 11:02:23 -05:00
Damien Retzinger 5fb9523081 feat(integration)!: use services from supported-version (#207) 2025-12-15 10:52:31 -05:00
Damien Retzinger 178ec212f2 build: clarify that package.json is just placeholder for root 2025-12-15 10:24:44 -05:00
Damien Retzinger 87b8b80feb feat(check-extension): add integration tests (#205) 2025-12-15 10:19:17 -05:00
Damien Retzinger 9c1dbc7d07 feat(supported-version): add optional services output for each matrix entry (#206) 2025-12-15 10:13:50 -05:00
Ryan Hoerr ab5dc9fc95 Fix opensearch versions based on container support (#289)
* Fix opensearch versions based on wardenenv container support

* opensearchproject/opensearch:2.19.1

* Disable opensearch security

* spawn separate opensearch service when needed

* fix opensearch flags; fix PackageMatrixVersion type and test

* Try mysql:8.4 over mariadb:11.4

* updated dist/index.js

* Allow trigger creation during integration tests
2025-12-14 17:47:56 -05:00
Fabrizio Balliano 2dbed0d4a7 Added upstream version for every Mage-OS release (#294) 2025-12-14 17:38:57 -05:00
Ryan Hoerr f5460068b6 feat: updated supported-version matrix for Mage-OS release 1.2.0 2025-12-14 17:38:24 -05:00
Damien Retzinger 886bbbb9ba feat(extension-check): support composer auth (#204) 2025-12-14 17:11:21 -05:00
Damien Retzinger da59af27fa feat(check-extension): add coding standard (#203) 2025-12-14 16:47:25 -05:00
Damien Retzinger 0c244f2f28 feat(check-extension): add setup:di:compile test (#202) 2025-12-14 15:58:40 -05:00
Damien Retzinger 1ab0330f1f feat(check-extension): add new check-extension workflow (#201) 2025-12-14 15:50:36 -05:00
Damien Retzinger 8a95e723df feat(unit-test)!: set default unit-test php version to 8.4 2025-12-14 12:08:02 -05:00
Damien Retzinger d5e7876887 ci(unit-test): update @actions/cache@5 2025-12-14 12:07:25 -05:00
Damien Retzinger 611c336883 chore: use newer dep versions in demo package 2025-12-14 12:06:47 -05:00
Damien Retzinger ebd21042cd docs(setup-magento): document modes, inputs and outputs 2025-12-14 11:52:17 -05:00
Damien Retzinger dfb8be2ee7 feat!(setup-magento): update default to use Magento v2.4.8-p3 2025-12-14 11:49:44 -05:00
Damien Retzinger 6179ca545b ci: upgrade underlying actions for testing setup-magento 2025-12-14 11:48:55 -05:00
Damien Retzinger 962e52d426 ci: upgrade underlying actions for testing setup-magento 2025-12-14 11:46:40 -05:00
Damien Retzinger 6c31728af2 feat: upgrade setup-magento action test to v2.4.8-p3 (#198) 2025-12-14 11:36:22 -05:00
Damien Retzinger 3ef43188b2 feat(supported-version)!: upgrade to use node24 2025-12-14 11:13:42 -05:00
Damien Retzinger 91fe5d8ddf chore(supported-version): @actions/core@1.11.1 2025-12-14 11:12:42 -05:00
Damien Retzinger 3fc699af5c chore(deps): upgrade to node 24 2025-12-14 11:10:47 -05:00
69 changed files with 2841 additions and 9543 deletions
+49
View File
@@ -0,0 +1,49 @@
# $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
# $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
# $$ Code Owners $$
# $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
# $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
#
# The configuration for Code Owners for graycoreio/magento2-devcontainer.
#
# For more info see: https://help.github.com/articles/about-codeowners/
#
# ================================================
# Concepts
# ================================================
#
# A CodeOwner should only review what they are comfortable reviewing. If you're not comfortable, say something.
# It is a CodeOwners responsibility to only accept the changes that they understand and deem necessary.
# The CodeOwners have final say on whether or not code is accepted.
# If multiple CodeOwners are listed, ALL code owners must approve the PR prior to merge.
# CodeOwners work in conjunction with Github's "Number of Required Approvals (1)" requirement.
# ================================================
# GitHub username registry
# ================================================
# damienwebdev - Damien Retzinger
######################################################################################################
#
# CODEOWNERS rules
# -----------------
#
# All the following rules are applied in the order specified in this file.
# The last rule that matches wins!
#
# See https://git-scm.com/docs/gitignore#_pattern_format for pattern syntax docs.
#
######################################################################################################
# ================================================
# Default Owners
# ================================================
* @damienwebdev
@@ -32,11 +32,12 @@ on:
jobs:
compute_matrix:
if: "!startsWith(github.head_ref, 'release-please')"
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.supported-version.outputs.matrix }}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- uses: ./supported-version
with:
kind: currently-supported
@@ -50,10 +51,15 @@ jobs:
fail-fast: false
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
tools: composer:v${{ matrix.composer }}
coverage: none
- uses: './coding-standard'
with:
version: ${{ github.event.inputs.version || '*' }}
path: ${{ github.event.inputs.path || '_test/demo-package' }}
composer_version: ${{ matrix.composer }}
php_version: ${{ matrix.php }}
@@ -19,9 +19,10 @@ on:
jobs:
get-composer-version:
if: "!startsWith(github.head_ref, 'release-please')"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- name: Set PHP Version
uses: shivammathur/setup-php@v2
with:
@@ -18,9 +18,10 @@ on:
jobs:
get-magento-version:
if: "!startsWith(github.head_ref, 'release-please')"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- name: Set PHP Version
uses: shivammathur/setup-php@v2
with:
-56
View File
@@ -1,56 +0,0 @@
name: Installation Test
on:
workflow_dispatch: {}
push:
branches:
- main
paths:
- "_test/demo-package/**"
- "installation-test/**"
- ".github/workflows/_internal-install.yaml"
- "supported-version/**"
- "!(**/*.md)"
pull_request:
branches:
- main
paths:
- "_test/demo-package/**"
- "installation-test/**"
- ".github/workflows/_internal-install.yaml"
- "supported-version/**"
- "!(**/*.md)"
env:
MAGENTO_COMPOSER_REPO: "https://mirror.mage-os.org/"
jobs:
compute_matrix:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.supported-version.outputs.matrix }}
steps:
- uses: actions/checkout@v4
- uses: ./supported-version
with:
kind: currently-supported
id: supported-version
- run: echo ${{ steps.supported-version.outputs.matrix }}
install-test:
needs: compute_matrix
strategy:
matrix: ${{ fromJSON(needs.compute_matrix.outputs.matrix) }}
fail-fast: false
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: ./installation-test
with:
composer_version: ${{ matrix.composer }}
php_version: ${{ matrix.php }}
magento_version: ${{ matrix.magento }}
package_name: mage-os/magento2-demo-package
source_folder: $GITHUB_WORKSPACE/_test/demo-package
composer_auth: ${{ secrets.COMPOSER_AUTH }}
magento_repository: ${{ env.MAGENTO_COMPOSER_REPO }}
+3 -2
View File
@@ -23,16 +23,17 @@ on:
jobs:
compute_matrix:
if: "!startsWith(github.head_ref, 'release-please')"
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.supported-version.outputs.matrix }}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- uses: ./supported-version
with:
kind: currently-supported
include_services: true
id: supported-version
- run: echo ${{ steps.supported-version.outputs.matrix }}
integration-workflow:
needs: compute_matrix
uses: ./.github/workflows/integration.yaml
@@ -18,9 +18,10 @@ on:
jobs:
semver-compare:
if: "!startsWith(github.head_ref, 'release-please')"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- uses: ./semver-compare
id: version-compare-1
+11 -11
View File
@@ -26,11 +26,12 @@ env:
jobs:
compute_matrix:
if: "!startsWith(github.head_ref, 'release-please')"
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.supported-version.outputs.matrix }}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- uses: ./supported-version
with:
kind: currently-supported
@@ -44,7 +45,7 @@ jobs:
fail-fast: false
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- run: |
PSEUDO_STORE_FULL_PATH=$(realpath "${{ env.PSEUDO_REPO_FOLDER }}")
@@ -58,7 +59,7 @@ jobs:
php-version: ${{ matrix.php }}
tools: composer:v${{ matrix.composer }}
- uses: actions/cache@v4
- uses: actions/cache@v5
id: setup-magento-store-cache
with:
key: setup-magento-ci | ${{ runner.os }} | ${{ matrix.magento }}
@@ -101,9 +102,8 @@ jobs:
working-directory: ${{ env.magento_folder }}
composer_auth: ${{ secrets.COMPOSER_AUTH }}
- uses: graycoreio/github-actions-magento2/cache-magento@main
- uses: ./cache-magento
with:
mode: 'store'
composer_cache_key: '${{ matrix.magento }}'
- run: composer install
@@ -114,24 +114,24 @@ jobs:
COMPOSER_AUTH: ${{ secrets.COMPOSER_AUTH }}
setup-magento-extension:
if: "!startsWith(github.head_ref, 'release-please')"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- uses: ./setup-magento
id: setup-magento
with:
php-version: 8.4
tools: composer:v2
tools: composer:v2.8
mode: extension
magento_repository: ${{ env.MAGENTO_COMPOSER_REPO }}
composer_auth: ${{ secrets.COMPOSER_AUTH }}
magento_version: magento/project-community-edition:2.4.8
magento_version: magento/project-community-edition:2.4.8-p3
- uses: graycoreio/github-actions-magento2/cache-magento@main
- uses: ./cache-magento
with:
mode: 'extension'
composer_cache_key: 'magento/project-community-edition:2.4.8'
composer_cache_key: 'magento/project-community-edition:2.4.8-p3'
- run: composer install
name: Composer install
-34
View File
@@ -1,34 +0,0 @@
name: Unit Test
on:
push:
branches:
- main
paths:
- "_test/demo-package/**"
- ".github/workflows/_internal-unit.yaml"
- "unit-test/**"
- "!(**/*.md)"
pull_request:
branches:
- main
paths:
- "_test/demo-package/**"
- ".github/workflows/_internal-unit.yaml"
- "unit-test/**"
- "!(**/*.md)"
jobs:
unit-test:
strategy:
matrix:
php_version:
- 7.4
- 8.1
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: ./unit-test
with:
source_folder: _test/demo-package
php_version: ${{ matrix.php_version }}
@@ -0,0 +1,41 @@
name: Check Extension Test
on:
workflow_dispatch: {}
push:
branches:
- main
paths:
- "_test/demo-package/**"
- ".github/workflows/_internal_check_extension.yaml"
- ".github/workflows/check-extension.yaml"
- "supported-version/**"
- "!(**/*.md)"
pull_request:
branches:
- main
paths:
- "_test/demo-package/**"
- ".github/workflows/_internal_check_extension.yaml"
- ".github/workflows/check-extension.yaml"
- "supported-version/**"
- "!(**/*.md)"
jobs:
compute_matrix:
if: "!startsWith(github.head_ref, 'release-please')"
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.supported-version.outputs.matrix }}
steps:
- uses: actions/checkout@v6
- uses: ./supported-version
with:
kind: currently-supported
include_services: true
id: supported-version
check-workflow:
needs: compute_matrix
uses: ./.github/workflows/check-extension.yaml
with:
path: _test/demo-package
matrix: ${{ needs.compute_matrix.outputs.matrix }}
@@ -20,9 +20,10 @@ on:
jobs:
unit-test:
if: "!startsWith(github.head_ref, 'release-please')"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- run: npm ci
shell: bash
@@ -0,0 +1,49 @@
# MageCheck Extension
A Github Workflow that runs various kinds of quality checks for a Magento Extension.
## Inputs
See the [check-extension.yaml](./check-extension.yaml)
| Input | Description | Required | Default |
| ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------- | -------- | --------------------------- |
| matrix | JSON string of [version matrix for Magento](./#matrix-format) | true | NULL |
| fail-fast | Same as Github's [fail-fast](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstrategyfail-fast) | false | true |
| path | The folder of the Magento store or extension that you are testing | false | . |
| magento_repository | Where to install Magento from | false | https://mirror.mage-os.org/ |
| composer_cache_key | A key to version the composer cache. Can be incremented if you need to bust the cache. | false | \_mageos |
### Matrix Format
The Magento matrix format outlined by the [supported versions action.](https://github.com/graycoreio/github-actions-magento2/tree/main/supported-version/supported.json)
## Usage
```yml
name: Unit Test
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
compute_matrix:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.supported-version.outputs.matrix }}
steps:
- uses: actions/checkout@v6
- uses: graycoreio/github-actions-magento2/supported-version@main
id: supported-version
- run: echo ${{ steps.supported-version.outputs.matrix }}
check-extension:
needs: compute_matrix
uses: graycoreio/github-actions-magento2/.github/workflows/check-extension.yaml@main
with:
matrix: ${{ needs.compute_matrix.outputs.matrix }}
```
+252
View File
@@ -0,0 +1,252 @@
name: MageCheck Extension
on:
workflow_call:
inputs:
path:
type: string
required: false
default: "."
description: "The folder of the Magento store or extension that you are testing."
magento_repository:
type: string
required: false
default: "https://mirror.mage-os.org/"
description: "Where to install Magento from"
matrix:
type: string
required: true
description: "The matrix of Magento versions to test against"
fail-fast:
type: boolean
required: false
default: true
composer_cache_key:
type: string
required: false
default: "_mageos"
description: A key to version the composer cache. Can be incremented if you need to bust the cache.
secrets:
composer_auth:
required: false
description: "Your composer credentials (typically a stringified json object of the contents of your auth.json)"
jobs:
unit-test-extension:
runs-on: ${{ matrix.os }}
strategy:
matrix: ${{ fromJSON(inputs.matrix) }}
fail-fast: ${{ inputs.fail-fast }}
steps:
- uses: actions/checkout@v6
- uses: graycoreio/github-actions-magento2/setup-magento@v7.0.0-rc.0
id: setup-magento
with:
php-version: ${{ matrix.php }}
tools: composer:v${{ matrix.composer }}
mode: extension
magento_version: ${{ matrix.magento }}
magento_repository: ${{ inputs.magento_repository }}
composer_auth: ${{ secrets.composer_auth }}
- uses: graycoreio/github-actions-magento2/cache-magento@v7.0.0-rc.0
with:
composer_cache_key: ${{ inputs.composer_cache_key }}
- name: Add extension repository
working-directory: ${{ steps.setup-magento.outputs.path }}
run: composer config repositories.local path ${{ github.workspace }}/${{ inputs.path }}
- name: Get package name
id: package
run: echo "name=$(jq -r .name ${{ github.workspace }}/${{ inputs.path }}/composer.json)" >> $GITHUB_OUTPUT
- name: Require extension
working-directory: ${{ steps.setup-magento.outputs.path }}
run: composer require "${{ steps.package.outputs.name }}:@dev" --no-install
- name: Composer install
working-directory: ${{ steps.setup-magento.outputs.path }}
run: composer install
env:
COMPOSER_AUTH: ${{ secrets.composer_auth }}
COMPOSER_MIRROR_PATH_REPOS: 1
- name: Configure phpunit.xml.dist
working-directory: ${{ steps.setup-magento.outputs.path }}
run: |
## Add the testsuite
cat > /tmp/testsuite.xml << 'EOF'
<testsuite name="Extension_Unit_Tests">
<directory>../../../vendor/${{ steps.package.outputs.name }}/Test/Unit</directory>
</testsuite>
EOF
sed -i '/<testsuites>/r /tmp/testsuite.xml' dev/tests/unit/phpunit.xml.dist
## Disable allure (See https://github.com/magento/magento2/issues/36702 )
## (╯°□°)╯︵ ┻━┻
sed -i '/<extensions>/,/<\/extensions>/d' dev/tests/unit/phpunit.xml.dist
- name: Run extension unit tests
working-directory: ${{ steps.setup-magento.outputs.path }}
run: vendor/bin/phpunit -c dev/tests/unit/phpunit.xml.dist --testsuite Extension_Unit_Tests
compile-extension:
runs-on: ${{ matrix.os }}
strategy:
matrix: ${{ fromJSON(inputs.matrix) }}
fail-fast: ${{ inputs.fail-fast }}
steps:
- uses: actions/checkout@v6
- uses: graycoreio/github-actions-magento2/setup-magento@v7.0.0-rc.0
id: setup-magento
with:
php-version: ${{ matrix.php }}
tools: composer:v${{ matrix.composer }}
mode: extension
magento_version: ${{ matrix.magento }}
magento_repository: ${{ inputs.magento_repository }}
composer_auth: ${{ secrets.composer_auth }}
- uses: graycoreio/github-actions-magento2/cache-magento@v7.0.0-rc.0
with:
composer_cache_key: ${{ inputs.composer_cache_key }}
- name: Add extension repository
working-directory: ${{ steps.setup-magento.outputs.path }}
run: composer config repositories.local path ${{ github.workspace }}/${{ inputs.path }}
- name: Get package name
id: package
run: echo "name=$(jq -r .name ${{ github.workspace }}/${{ inputs.path }}/composer.json)" >> $GITHUB_OUTPUT
- name: Require extension
working-directory: ${{ steps.setup-magento.outputs.path }}
run: composer require "${{ steps.package.outputs.name }}:@dev" --no-install
env:
COMPOSER_AUTH: ${{ secrets.composer_auth }}
- name: Composer install
working-directory: ${{ steps.setup-magento.outputs.path }}
run: composer install
env:
COMPOSER_AUTH: ${{ secrets.composer_auth }}
COMPOSER_MIRROR_PATH_REPOS: 1
- name: Enable all modules
working-directory: ${{ steps.setup-magento.outputs.path }}
run: php bin/magento module:enable --all
- name: Compile
working-directory: ${{ steps.setup-magento.outputs.path }}
run: php bin/magento setup:di:compile
coding-standard:
runs-on: ${{ matrix.os }}
strategy:
matrix: ${{ fromJSON(inputs.matrix) }}
fail-fast: ${{ inputs.fail-fast }}
steps:
- uses: actions/checkout@v6
- uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
tools: composer:v${{ matrix.composer }}
coverage: none
- uses: graycoreio/github-actions-magento2/coding-standard@v7.0.0-rc.0
with:
path: ${{ inputs.path }}
composer_auth: ${{ secrets.composer_auth }}
integration_test:
runs-on: ${{ matrix.os }}
strategy:
matrix: ${{ fromJSON(inputs.matrix) }}
fail-fast: ${{ inputs.fail-fast }}
services: ${{ matrix.services }}
steps:
- uses: actions/checkout@v6
- uses: graycoreio/github-actions-magento2/setup-magento@v7.0.0-rc.0
id: setup-magento
with:
php-version: ${{ matrix.php }}
tools: composer:v${{ matrix.composer }}
mode: extension
magento_version: ${{ matrix.magento }}
magento_repository: ${{ inputs.magento_repository }}
composer_auth: ${{ secrets.composer_auth }}
- uses: graycoreio/github-actions-magento2/cache-magento@v7.0.0-rc.0
with:
composer_cache_key: ${{ inputs.composer_cache_key }}
- name: Add extension repository
working-directory: ${{ steps.setup-magento.outputs.path }}
run: composer config repositories.local path ${{ github.workspace }}/${{ inputs.path }}
- name: Get package name
id: package
run: echo "name=$(jq -r .name ${{ github.workspace }}/${{ inputs.path }}/composer.json)" >> $GITHUB_OUTPUT
- name: Require extension
working-directory: ${{ steps.setup-magento.outputs.path }}
run: composer require "${{ steps.package.outputs.name }}:@dev" --no-install
env:
COMPOSER_AUTH: ${{ secrets.composer_auth }}
- name: Composer install
working-directory: ${{ steps.setup-magento.outputs.path }}
run: composer install
env:
COMPOSER_AUTH: ${{ secrets.composer_auth }}
COMPOSER_MIRROR_PATH_REPOS: 1
- uses: graycoreio/github-actions-magento2/get-magento-version@v7.0.0-rc.0
id: magento-version
with:
working-directory: ${{ steps.setup-magento.outputs.path }}
- name: Replace Configuration Settings for env
working-directory: ${{ steps.setup-magento.outputs.path }}/dev/tests/integration
run: |
sed -i "s/'db-host' => 'localhost'/'db-host' => '127.0.0.1'/" etc/install-config-mysql.php.dist
sed -i "s/'db-user' => 'root'/'db-user' => 'user'/" etc/install-config-mysql.php.dist
sed -i "s/'db-password' => '123123q'/'db-password' => 'password'/" etc/install-config-mysql.php.dist
sed -i "s/'elasticsearch-host' => 'localhost'/'elasticsearch-host' => '127.0.0.1'/" etc/install-config-mysql.php.dist
sed -i "s/'amqp-host' => 'localhost'/'amqp-host' => '127.0.0.1'/" etc/install-config-mysql.php.dist
- name: Enable log-bin-trust-function-creators
run: |
mysql -h127.0.0.1 -uroot -prootpassword -e "SET GLOBAL log_bin_trust_function_creators = 1;"
- name: Configure phpunit.xml.dist
working-directory: ${{ steps.setup-magento.outputs.path }}
run: |
## Add the testsuite
cat > /tmp/testsuite.xml << 'EOF'
<testsuite name="Extension_Integration_Tests">
<directory>../../../vendor/${{ steps.package.outputs.name }}/Test/Integration</directory>
</testsuite>
EOF
sed -i '/<testsuites>/r /tmp/testsuite.xml' dev/tests/integration/phpunit.xml.dist
- name: Run Integration Tests
working-directory: ${{ steps.setup-magento.outputs.path }}/dev/tests/integration
run: ../../../vendor/bin/phpunit -c phpunit.xml.dist --testsuite Extension_Integration_Tests
- name: Upload test sandbox dir
uses: actions/upload-artifact@v6
if: failure()
with:
name: sandbox-data-${{ steps.magento-version.outputs.version }}
path: ${{ steps.setup-magento.outputs.path }}/dev/tests/integration/tmp/sandbox-*
retention-days: 3
+5 -3
View File
@@ -8,9 +8,10 @@ See the [integration.yaml](./integration.yaml)
| Input | Description | Required | Default |
| ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------- | -------- | ----------------------------- |
| matrix | JSON string of [version matrix for Magento](./#matrix-format) | true | NULL |
| matrix | JSON string of [version matrix for Magento](./#matrix-format). Must include a `services` key (pass `include_services: true` to the supported-version action). | true | NULL |
| fail-fast | Same as Github's [fail-fast](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstrategyfail-fast) | false | true |
| package_name | The name of the package | true | NULL |
| use_local_source | Whether or not you want to test your local package or not. | false | true |
| source_folder | The source folder of the package | false | $GITHUB_WORKSPACE |
| magento_directory | The folder where Magento will be installed | false | ../magento2 |
| magento_repository | Where to install Magento from | false | https://mirror.mage-os.org/ |
@@ -46,10 +47,11 @@ jobs:
outputs:
matrix: ${{ steps.supported-version.outputs.matrix }}
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v6
- uses: graycoreio/github-actions-magento2/supported-version@main
with:
include_services: true
id: supported-version
- run: echo ${{ steps.supported-version.outputs.matrix }}
integration-workflow:
needs: compute_matrix
uses: graycoreio/github-actions-magento2/.github/workflows/integration.yaml@main
+10 -43
View File
@@ -59,50 +59,12 @@ on:
jobs:
integration_test:
runs-on: ${{ matrix.os }}
services: ${{ matrix.services }}
strategy:
fail-fast: ${{ inputs.fail-fast }}
matrix: ${{ fromJSON(inputs.matrix) }}
services:
elasticsearch:
image: ${{ matrix.elasticsearch }}
env:
# By default, ElasticSearch refuses to spawn in single node configuration, as it expects redundancy.
# This is a dev environment, so redundancy is just wasteful.
discovery.type: single-node
# Disable HTTPS and password authentication
# this is a local dev environment, so the added CA chain complexity is an extreme overkill
xpack.security.enabled: false
xpack.security.http.ssl.enabled: false
xpack.security.transport.ssl.enabled: false
options: >-
--health-cmd "curl http://localhost:9200/_cluster/health"
--health-interval 10s
--health-timeout 5s
--health-retries 10
ports:
- 9200:9200
mysql:
image: ${{ matrix.mysql }}
env:
MYSQL_DATABASE: magento_integration_tests
MYSQL_USER: user
MYSQL_PASSWORD: password
MYSQL_ROOT_PASSWORD: rootpassword
ports:
- 3306:3306
options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
rabbitmq:
image: ${{ matrix.rabbitmq }}
env:
RABBITMQ_DEFAULT_USER: guest
RABBITMQ_DEFAULT_PASS: guest
ports:
- 5672:5672
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- name: Set PHP Version
uses: shivammathur/setup-php@v2
with:
@@ -110,13 +72,17 @@ jobs:
tools: composer:v${{ matrix.composer }}
coverage: none
- name: Allow SQL triggers
run: |
mysql --host 127.0.0.1 --port ${{ job.services.mysql.ports['3306'] }} -u root -prootpassword -e "set global log_bin_trust_function_creators=1;"
- run: composer create-project --repository-url="${{ inputs.magento_repository }}" "${{ matrix.magento }}" ${{ inputs.magento_directory }} --no-install
shell: bash
env:
COMPOSER_AUTH: ${{ secrets.composer_auth }}
name: Create Magento ${{ matrix.magento }} Project
- uses: graycoreio/github-actions-magento2/get-magento-version@main
- uses: graycoreio/github-actions-magento2/get-magento-version@v7.0.0-rc.0
id: magento-version
with:
working-directory: ${{ inputs.magento_directory }}
@@ -130,7 +96,7 @@ jobs:
- name: "Cache Composer Packages"
uses: actions/cache@v4
uses: actions/cache@v5
with:
key: "composer | v5 | ${{ inputs.composer_cache_key }} | ${{ hashFiles('composer.lock') }} | ${{ matrix.os }} | ${{ matrix.composer }} | ${{ matrix.php }} | ${{ matrix.magento }}"
path: ${{ steps.composer-cache.outputs.dir }}
@@ -174,6 +140,7 @@ jobs:
env:
COMPOSER_CACHE_DIR: ${{ steps.composer-cache.outputs.dir }}
COMPOSER_AUTH: ${{ secrets.composer_auth }}
COMPOSER_MIRROR_PATH_REPOS: 1
- name: Replace Configuration Settings for env
working-directory: ${{ inputs.magento_directory }}/dev/tests/integration
@@ -215,7 +182,7 @@ jobs:
name: Run Integration Tests
- name: Upload test sandbox dir
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v6
if: failure()
with:
name: sandbox-data-${{ steps.magento-version.outputs.version }}
+125 -3
View File
@@ -4,13 +4,135 @@ on:
push:
branches:
- main
workflow_dispatch:
env:
RELEASE_BRANCH: release-please--branches--main--components--github-actions-magento2
jobs:
release-please:
runs-on: ubuntu-latest
permissions:
contents: write
outputs:
releases_created: ${{ steps.release.outputs.releases_created }}
steps:
- uses: google-github-actions/release-please-action@v4
- id: release
uses: googleapis/release-please-action@v4
with:
token: ${{ secrets.GRAYCORE_GITHUB_TOKEN }}
command: manifest
default-branch: main
- name: Check if release branch exists
id: branch-check
if: steps.release.outputs.releases_created != 'true'
env:
GH_TOKEN: ${{ secrets.GRAYCORE_GITHUB_TOKEN }}
run: |
if gh api "repos/${{ github.repository }}/git/refs/heads/${{ env.RELEASE_BRANCH }}" --silent 2>/dev/null; then
echo "EXISTS=true" >> $GITHUB_OUTPUT
else
echo "EXISTS=false" >> $GITHUB_OUTPUT
fi
- name: Checkout release PR branch
if: steps.branch-check.outputs.EXISTS == 'true'
uses: actions/checkout@v6
with:
ref: ${{ env.RELEASE_BRANCH }}
token: ${{ secrets.GRAYBOT_PIN_BACK_PAT }}
- name: Pin refs on release PR branch
id: pin-refs
if: steps.branch-check.outputs.EXISTS == 'true'
run: |
VERSION="v$(jq -r '."."' .release-please-manifest.json)"
echo "VERSION=${VERSION}" >> $GITHUB_OUTPUT
sed -i "s|uses: graycoreio/github-actions-magento2/\([^@]*\)@main|uses: graycoreio/github-actions-magento2/\1@${VERSION}|g" \
*/action.yml \
$(find .github/workflows \( -name "*.yml" -o -name "*.yaml" \) ! -name "release-*" ! -name "_internal*")
if git diff --quiet; then
echo "HAS_CHANGES=false" >> $GITHUB_OUTPUT
else
echo "HAS_CHANGES=true" >> $GITHUB_OUTPUT
fi
- name: Commit pinned refs
if: steps.pin-refs.outputs.HAS_CHANGES == 'true'
env:
GRAYBOT_GPG_KEY: ${{ secrets.GRAYBOT_GPG_KEY }}
run: |
echo "$GRAYBOT_GPG_KEY" | gpg --batch --import
export GPG_KEY_ID=$(gpg --list-secret-keys --keyid-format LONG | grep sec | awk '{print $2}' | cut -d/ -f2)
git config --global user.signingkey $GPG_KEY_ID
git config --global commit.gpgSign true
git config --global user.email "automation@graycore.io"
git config --global user.name "Beep Boop"
git add .
git commit -m "chore: pin internal action refs to ${{ steps.pin-refs.outputs.VERSION }}"
git push origin ${{ env.RELEASE_BRANCH }}
pinback:
needs: release-please
if: needs.release-please.outputs.releases_created == 'true'
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v6
with:
ref: main
token: ${{ secrets.GRAYBOT_PIN_BACK_PAT }}
- name: Extract version
id: version
run: |
VERSION="v$(jq -r '."."' .release-please-manifest.json)"
echo "VERSION=${VERSION}" >> $GITHUB_OUTPUT
- name: Restore @main refs
run: |
sed -i "s|uses: graycoreio/github-actions-magento2/\([^@]*\)@[^ #]*|uses: graycoreio/github-actions-magento2/\1@main|g" \
*/action.yml \
$(find .github/workflows \( -name "*.yml" -o -name "*.yaml" \) ! -name "release-please.yml")
- name: Show changed files
run: git diff
- name: Check for changes
id: changes
run: |
if git diff --quiet; then
echo "HAS_CHANGES=false" >> $GITHUB_OUTPUT
else
echo "HAS_CHANGES=true" >> $GITHUB_OUTPUT
fi
- name: Commit and open pinback PR
if: steps.changes.outputs.HAS_CHANGES == 'true'
env:
GRAYBOT_GPG_KEY: ${{ secrets.GRAYBOT_GPG_KEY }}
GH_TOKEN: ${{ secrets.GRAYBOT_PIN_BACK_PAT }}
run: |
echo "$GRAYBOT_GPG_KEY" | gpg --batch --import
export GPG_KEY_ID=$(gpg --list-secret-keys --keyid-format LONG | grep sec | awk '{print $2}' | cut -d/ -f2)
git config --global user.signingkey $GPG_KEY_ID
git config --global commit.gpgSign true
git config --global user.email "automation@graycore.io"
git config --global user.name "Beep Boop"
BRANCH="chore/pinback-${{ steps.version.outputs.VERSION }}"
git checkout -b "$BRANCH"
git add .
git commit -m "chore: restore internal action refs to @main"
git push --force origin "$BRANCH"
EXISTING=$(gh pr list --head "$BRANCH" --json number --jq '.[0].number // empty')
if [ -z "$EXISTING" ]; then
gh pr create \
--base main \
--head "$BRANCH" \
--title "chore: restore internal action refs to @main after ${{ steps.version.outputs.VERSION }}" \
--body "Restores all internal \`graycoreio/github-actions-magento2\` action refs from \`${{ steps.version.outputs.VERSION }}\` back to \`@main\`."
else
echo "PR #$EXISTING already exists for $BRANCH — skipping creation"
fi
+1
View File
@@ -1,2 +1,3 @@
node_modules/
.idea/
tmp
+1 -1
View File
@@ -1 +1 @@
v18.18.0
v24.12.0
+1 -1
View File
@@ -1 +1 @@
{".":"3.0.0"}
{".":"7.0.0-rc.0"}
+120
View File
@@ -2,6 +2,126 @@
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
## [7.0.0-rc.0](https://github.com/graycoreio/github-actions-magento2/compare/v6.0.0...v7.0.0-rc.0) (2026-04-28)
### ⚠ BREAKING CHANGES
* **coding-standard:** Much of the "setup" that's built-into the command is removed in favor of a leaner action. This also includes the "on PR, only diff PR contents" behavior. This can be restored, but it shouldn't be the default and should be done as an input.
* **coding-standard-baseline:** remove coding-standard-baseline action ([#223](https://github.com/graycoreio/github-actions-magento2/issues/223))
* **install-test:** You should rely on [Check Extension](https://github.com/graycoreio/github-actions-magento2/blob/main/.github/workflows/check-extension-README.md) instead.
* **unit-test:** remove unit-test action ([#221](https://github.com/graycoreio/github-actions-magento2/issues/221))
* **supported-version:** `include_services` now defaults to `true`. Callers that strictly validate the matrix schema and do not expect a `services` key must explicitly pass `include_services: false`.
### Features
* **coding-standard-baseline:** remove coding-standard-baseline action ([#223](https://github.com/graycoreio/github-actions-magento2/issues/223)) ([953de84](https://github.com/graycoreio/github-actions-magento2/commit/953de845ebf7b5d2c9a24670b380c016bd6efdcd))
* **coding-standard:** add missing composer_auth to require of magento-coding-standard ([3fad3a8](https://github.com/graycoreio/github-actions-magento2/commit/3fad3a89954be09a0f11f04a6c1c7d927fc872eb))
* **coding-standard:** remove pr-diff feature and built-in php setup ([#224](https://github.com/graycoreio/github-actions-magento2/issues/224)) ([d5c744e](https://github.com/graycoreio/github-actions-magento2/commit/d5c744e15544e249f79fa486a073d7020635e48a))
* **coding-standard:** skip composer install if the coding is already installed ([e1a8a81](https://github.com/graycoreio/github-actions-magento2/commit/e1a8a81488c77144786427ff63a99f93cd17b897))
* **install-test:** remove install test ([#222](https://github.com/graycoreio/github-actions-magento2/issues/222)) ([de415ea](https://github.com/graycoreio/github-actions-magento2/commit/de415eaff54507ca24cbecf8916fd1526beb0186))
* **unit-test:** remove unit-test action ([#221](https://github.com/graycoreio/github-actions-magento2/issues/221)) ([98923b2](https://github.com/graycoreio/github-actions-magento2/commit/98923b24c58899779a6a6367e3863d718b09bb8d))
### Bug Fixes
* **check-extension:** mirror path repos to prevent symlink errors with template files ([#218](https://github.com/graycoreio/github-actions-magento2/issues/218)) ([d80befb](https://github.com/graycoreio/github-actions-magento2/commit/d80befbe9b26dfa37af117775544c85ea36b7127)), closes [#217](https://github.com/graycoreio/github-actions-magento2/issues/217)
* **check-extension:** probe vendor dir for MageOS/Magento standards when running phpcs ([#216](https://github.com/graycoreio/github-actions-magento2/issues/216)) ([7799f0f](https://github.com/graycoreio/github-actions-magento2/commit/7799f0f9bf788545bc36924b6528c09c6a8bb09a)), closes [#213](https://github.com/graycoreio/github-actions-magento2/issues/213)
* **supported-version:** default include_services to true ([#215](https://github.com/graycoreio/github-actions-magento2/issues/215)) ([b510ea2](https://github.com/graycoreio/github-actions-magento2/commit/b510ea21e38c97a4852776fc4e57fbcf9917fa9f)), closes [#214](https://github.com/graycoreio/github-actions-magento2/issues/214)
### Miscellaneous Chores
* release 7.0.0-rc.0 ([4001e81](https://github.com/graycoreio/github-actions-magento2/commit/4001e8118b6da28d7c9fd18d3ab127cee03681d3))
## [6.0.0](https://github.com/graycoreio/github-actions-magento2/compare/v5.1.0...v6.0.0) (2026-03-11)
### ⚠ BREAKING CHANGES
* **supported-version:** Adobe has dropped support for elasticsearch and redis in their latest releases of v2.4.8.
### Features
* **supported-version:** add support for MageOS 2.2.0 ([b4526db](https://github.com/graycoreio/github-actions-magento2/commit/b4526dbb52f59ad79b07fedb5fe487424c0b4dea))
* **supported-version:** update for Magento v2.4.8-p4 release ([e6be791](https://github.com/graycoreio/github-actions-magento2/commit/e6be791eed5d2b4f83bb56391e7eab39c52eed59))
* **supported-version:** upgrade opensearch to 2.19.5 ([7e40a62](https://github.com/graycoreio/github-actions-magento2/commit/7e40a62efaff0c31fab1284980fc5400997b211f))
## [5.1.0](https://github.com/graycoreio/github-actions-magento2/compare/v5.0.0...v5.1.0) (2026-02-19)
### Features
* **supported-version:** backport composer 2.9.3 to older mage-os verisons ([48902e8](https://github.com/graycoreio/github-actions-magento2/commit/48902e8e6a748a1328a0e50eff32e717a560975c))
* **supported-version:** bump all composer versions to latest supported version ([c26e84f](https://github.com/graycoreio/github-actions-magento2/commit/c26e84f69361cd53dce853b415656f3af9b44427))
* **supported-version:** bump all nginx versions to latest supported version ([c19912d](https://github.com/graycoreio/github-actions-magento2/commit/c19912dc4bfc83f4649bbd6bff8b8e9366384906))
* **supported-versions:** upgrade 2.4.8-p2/p3 to opensearch 3 ([d29e574](https://github.com/graycoreio/github-actions-magento2/commit/d29e57447582250203ee5cbad561306ca6080ffa))
* **supported-version:** updated matrix for Mage-OS 2.1.0 ([07f8953](https://github.com/graycoreio/github-actions-magento2/commit/07f89530df8396d359c043c6b3a8b429a67465a8))
* **supported-version:** upgrade to compsoer 2.9.5 ([7e70ee9](https://github.com/graycoreio/github-actions-magento2/commit/7e70ee93efb85c48ef312cf4f796bc90acc1b9cf))
### Bug Fixes
* **supported-version:** pin specific composer 2 versions for historic Magento releases ([505179c](https://github.com/graycoreio/github-actions-magento2/commit/505179ce7bdf1b41472d9ba735cc36002b84e2a0))
* using `latest` accidentally output two versions for Magento Open Source ([34ddee6](https://github.com/graycoreio/github-actions-magento2/commit/34ddee6aef5e21f1e4bfa992ff333031b7552c35))
## [5.0.0](https://github.com/graycoreio/github-actions-magento2/compare/v4.0.1...v5.0.0) (2026-02-18)
### ⚠ BREAKING CHANGES
* remove unmaintained setup-di-compile action
### Features
* remove unmaintained setup-di-compile action ([7b5ccf7](https://github.com/graycoreio/github-actions-magento2/commit/7b5ccf7d9d67da8c67e77b222b89b0abf332b183))
* use actions/cache@v5 ([86b01b1](https://github.com/graycoreio/github-actions-magento2/commit/86b01b17faf443802bdf827fdbb706c55ae7e3fb))
* use actions/checkout@v6 ([c2c3755](https://github.com/graycoreio/github-actions-magento2/commit/c2c375572967ee6ff8afc3a406b8d5a02880159e))
* use actions/upload-artifact@v6 ([5f3ba73](https://github.com/graycoreio/github-actions-magento2/commit/5f3ba73bc67a5c09e22f83c6e51421596103e0ce))
## [4.0.1](https://github.com/graycoreio/github-actions-magento2/compare/v4.0.0...v4.0.1) (2025-12-16)
### Bug Fixes
* **supported-version:** handle semver-ish values from old magento verisons ([7c0bc65](https://github.com/graycoreio/github-actions-magento2/commit/7c0bc65842e0e866cd957a44f879d37d04d11dce))
## [4.0.0](https://github.com/graycoreio/github-actions-magento2/compare/v3.0.0...v4.0.0) (2025-12-15)
### ⚠ BREAKING CHANGES
* **integration:** use services from supported-version ([#207](https://github.com/graycoreio/github-actions-magento2/issues/207))
* **unit-test:** set default unit-test php version to 8.4
* **supported-version:** upgrade to use node24
### Features
* **check-extension:** add coding standard ([#203](https://github.com/graycoreio/github-actions-magento2/issues/203)) ([da59af2](https://github.com/graycoreio/github-actions-magento2/commit/da59af27fa8aa088a53f5e99b834ed8b88959395))
* **check-extension:** add integration tests ([#205](https://github.com/graycoreio/github-actions-magento2/issues/205)) ([87b8b80](https://github.com/graycoreio/github-actions-magento2/commit/87b8b80febfa50df4107623942627079d4f12850))
* **check-extension:** add new check-extension workflow ([#201](https://github.com/graycoreio/github-actions-magento2/issues/201)) ([1ab0330](https://github.com/graycoreio/github-actions-magento2/commit/1ab0330f1f9f7663dec418d22c2674eaf599cc35))
* **check-extension:** add setup:di:compile test ([#202](https://github.com/graycoreio/github-actions-magento2/issues/202)) ([0c244f2](https://github.com/graycoreio/github-actions-magento2/commit/0c244f2f2891e3b8250b12c66781981775cbeb09))
* **check-extension:** prefer phpcs conf if it exists ([810a570](https://github.com/graycoreio/github-actions-magento2/commit/810a5705cfc5fafa8230214ab84a44fc86de5baf))
* **extension-check:** support composer auth ([#204](https://github.com/graycoreio/github-actions-magento2/issues/204)) ([886bbbb](https://github.com/graycoreio/github-actions-magento2/commit/886bbbb9ba2cb296c9f945e37bcd2669864384af))
* **integration:** use services from supported-version ([#207](https://github.com/graycoreio/github-actions-magento2/issues/207)) ([5fb9523](https://github.com/graycoreio/github-actions-magento2/commit/5fb9523081c1f6e353320c4540d609ce735cf474))
* **supported-version:** Add 2.4.5-p14, 2.4.6-p12, 2.4.7-p7 and 2.4.8-p2 ([#295](https://github.com/graycoreio/github-actions-magento2/issues/295)) ([499eb24](https://github.com/graycoreio/github-actions-magento2/commit/499eb24a13ed9f783c4af7ffac5bd5339c357774))
* **supported-version:** add optional services output for each matrix entry ([#206](https://github.com/graycoreio/github-actions-magento2/issues/206)) ([9c1dbc7](https://github.com/graycoreio/github-actions-magento2/commit/9c1dbc7d072a9864f9eb1d1a6219b8aaa99f0bcd))
* **supported-versions:** 1.3.1 ([#297](https://github.com/graycoreio/github-actions-magento2/issues/297)) ([a8e8db3](https://github.com/graycoreio/github-actions-magento2/commit/a8e8db3572abfabfd64a5a701f62b630aabc3260))
* **supported-versions:** update matrix for Magento 2.4.8-p3, 2.4.7-p8, 2.4.6-p13 ([#301](https://github.com/graycoreio/github-actions-magento2/issues/301)) ([e99b140](https://github.com/graycoreio/github-actions-magento2/commit/e99b140104280b87fd23e482f86b45442e7a6167))
* **supported-version:** update matrix for Mage-OS 2.0.0 ([#298](https://github.com/graycoreio/github-actions-magento2/issues/298)) ([b0a3bea](https://github.com/graycoreio/github-actions-magento2/commit/b0a3bea8e4d0fbead1e5a7eab72d56a025845049))
* **supported-version:** upgrade to use node24 ([3ef4318](https://github.com/graycoreio/github-actions-magento2/commit/3ef43188b22ccc25226e7e39bfbe5d5ee2599a58))
* **unit-test:** set default unit-test php version to 8.4 ([8a95e72](https://github.com/graycoreio/github-actions-magento2/commit/8a95e723df2aec4a5a528189e2df73aebe9ad148))
* updated supported-version matrix for Mage-OS release 1.2.0 ([f546006](https://github.com/graycoreio/github-actions-magento2/commit/f5460068b60334f81a186235c67c8239ab2f6e14))
* upgrade setup-magento action test to v2.4.8-p3 ([#198](https://github.com/graycoreio/github-actions-magento2/issues/198)) ([6c31728](https://github.com/graycoreio/github-actions-magento2/commit/6c31728af28fbf37cebc296192ee10367dcdd546))
### Bug Fixes
* 'invalid kind provided' when defining `usable` type ([#305](https://github.com/graycoreio/github-actions-magento2/issues/305)) ([c057552](https://github.com/graycoreio/github-actions-magento2/commit/c05755261db8ae7f335d559bea60c231b04bfc5b))
* allow matrix testing without EOL versions ([#299](https://github.com/graycoreio/github-actions-magento2/issues/299)) ([5608271](https://github.com/graycoreio/github-actions-magento2/commit/5608271fe3546ed7ed6d94e33b3984b3bb8dbfd6))
* **supported-verison:** upstream version for Mage-OS 2.0.0 ([#302](https://github.com/graycoreio/github-actions-magento2/issues/302)) ([5fd96b9](https://github.com/graycoreio/github-actions-magento2/commit/5fd96b988e2f3576aa5b7add7fa5c9018ad35416))
* **supported-version:** adjust correct key for mage-os/project-community-edition:&gt;=1.2 &lt;1.3 ([e12d993](https://github.com/graycoreio/github-actions-magento2/commit/e12d9937614ebd8537ce791e1cf2c34672716871))
## [3.0.0](https://github.com/graycoreio/github-actions-magento2/compare/v2.0.0...v3.0.0) (2025-04-09)
+19 -19
View File
@@ -3,33 +3,33 @@
<div align="center">
![GitHub release (latest SemVer)](https://img.shields.io/github/v/release/graycoreio/github-actions-magento2)
[![Unit Test](https://github.com/graycoreio/github-actions-magento2/actions/workflows/_internal-unit.yaml/badge.svg)](https://github.com/graycoreio/github-actions-magento2/actions/workflows/_internal-unit.yaml)
[![Integration Test](https://github.com/graycoreio/github-actions-magento2/actions/workflows/_internal-integration.yaml/badge.svg)](https://github.com/graycoreio/github-actions-magento2/actions/workflows/_internal-integration.yaml)
[![Installation Test](https://github.com/graycoreio/github-actions-magento2/actions/workflows/_internal-install.yaml/badge.svg)](https://github.com/graycoreio/github-actions-magento2/actions/workflows/_internal-install.yaml)
[![Integration Test](https://img.shields.io/github/actions/workflow/status/graycoreio/github-actions-magento2/_internal-integration.yaml?label=Integration%20Test&labelColor=1a1a1a)](https://github.com/graycoreio/github-actions-magento2/actions/workflows/_internal-integration.yaml)
[![MageCheck](https://img.shields.io/github/actions/workflow/status/graycoreio/github-actions-magento2/_internal_check_extension.yaml?label=Check%20Extension%20Test&labelColor=1a1a1a)](https://github.com/graycoreio/github-actions-magento2/actions/workflows/_internal_check_extension.yaml)
</div>
Opinionated Github Actions and Workflows to make building, testing, and maintaining Magento 2 Modules easier.
* [README if you are new to Github Actions.](https://docs.github.com/en/actions/learn-github-actions/understanding-github-actions#the-components-of-github-actions)
* [What is a workflow?](https://docs.github.com/en/actions/learn-github-actions/understanding-github-actions#workflows)
* [What is an action?](https://docs.github.com/en/actions/learn-github-actions/understanding-github-actions#actions)
- [README if you are new to Github Actions.](https://docs.github.com/en/actions/learn-github-actions/understanding-github-actions#the-components-of-github-actions)
- [What is a workflow?](https://docs.github.com/en/actions/learn-github-actions/understanding-github-actions#workflows)
- [What is an action?](https://docs.github.com/en/actions/learn-github-actions/understanding-github-actions#actions)
## Workflows
| Workflow Name | Description |
| ------------------------------------------------------------- | ---------------------------------------------------------------------- |
| [Integration Test](./.github/workflows/integration-README.md) | A Github Workflow that runs the Integration Tests of a Magento Package |
| Workflow Name | Description |
| -------------------------------------------------------------------- | ------------------------------------------------------------------------------------ |
| [Integration Test](./.github/workflows/integration-README.md) | A Github Workflow that runs the Integration Tests of a Magento Package |
| [MageCheck Extension](./.github/workflows/check-extension-README.md) | A Github Workflow that runs various kinds of quality checks for a Magento Extension. |
## Actions
| Action Name | Description |
| ------------------------------------------------------ | ----------------------------------------------------------------------------------------- |
| [Unit Test](./unit-test/README.md) | A Github Action that runs the Unit Tests a Magento Package |
| [Fix Magento Install](./fix-magento-install/README.md) | A Github Action that fixes Magento before `composer install` |
| [Cache Magento](./cache-magento/README.md) | A Github Action that creates a composer cache for a Magento extension or store. |
| [Setup Magento](./setup-magento/README.md) | A Github Action that sets up Magento before `composer install` for an extension or store. |
| [Get Magento Version](./get-magento-version/README.md) | A Github Action that computes the installed Magento version. |
| [Installation Test](./installation-test/README.md) | A Github Action that tests the installability of a Magento Package |
| [Semver Compare](./semver-compare/README.md) | A Github Action that semantically compares two versions |
| [Supported Version](./supported-version/README.md) | A Github Action that computes the currently supported Github Actions Matrix for Magento 2 |
| Action Name | Description |
| ------------------------------------------------------------ | ----------------------------------------------------------------------------------------- |
| [Fix Magento Install](./fix-magento-install/README.md) | A Github Action that fixes Magento before `composer install` |
| [Cache Magento](./cache-magento/README.md) | A Github Action that creates a composer cache for a Magento extension or store. |
| [Setup Magento](./setup-magento/README.md) | A Github Action that sets up Magento before `composer install` for an extension or store. |
| [Get Magento Version](./get-magento-version/README.md) | A Github Action that computes the installed Magento version. |
| [Get Composer Version](./get-composer-version/README.md) | A Github Action that computes an installed Composer version. |
| [Coding Standard](./coding-standard/README.md) | A Github Action that runs the Magento Coding Standard. |
| [Semver Compare](./semver-compare/README.md) | A Github Action that semantically compares two versions |
| [Supported Version](./supported-version/README.md) | A Github Action that computes the currently supported Github Actions Matrix for Magento 2 |
+1
View File
@@ -1,2 +1,3 @@
vendor/
.phpunit.result.cache
composer.lock
@@ -0,0 +1,24 @@
<?php
namespace Graycore\DemoPackage\Test\Integration;
use Magento\Framework\View\Element\Template;
use Magento\TestFramework\Helper\Bootstrap;
/**
* Fails when the extension is installed as a symlink (default Composer path repo behavior)
* because Magento's template engine cannot resolve .phtml files through symlinks.
* Requires COMPOSER_MIRROR_PATH_REPOS=1 during composer install.
*/
class TemplateRenderTest extends \PHPUnit\Framework\TestCase
{
/**
* @magentoAppArea frontend
*/
public function testTemplateRendersWithoutSymlinkError()
{
$block = Bootstrap::getObjectManager()->create(Template::class);
$block->setTemplate('Graycore_DemoPackage::demo.phtml');
$this->assertNotEmpty($block->toHtml());
}
}
+1 -1
View File
@@ -45,6 +45,6 @@
}
},
"require-dev": {
"phpunit/phpunit": "^9.5"
"phpunit/phpunit": "^9.5 || ^10 || ^11 || ^12"
}
}
-6001
View File
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,2 @@
<?php /** @var \Magento\Framework\View\Element\Template $block */ ?>
<div>demo</div>
+1 -4
View File
@@ -10,7 +10,6 @@ See the [action.yml](./action.yml)
| Input | Description | Required | Default |
| ------------------ | -------------------------------------------------------------------------------------- | -------- | ------------ |
| composer_cache_key | A key to version the composer cache. Can be incremented if you need to bust the cache. | false | '__mageos' |
| mode | "The mode for setup, one of: `extension` or `store`." | true | N/A |
### Usage
@@ -29,10 +28,8 @@ jobs:
showcase_cache:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v6
- uses: graycoreio/github-actions-magento2/cache-magento@main
with:
mode: 'store'
id: cache-magento
- run: composer install
+1 -5
View File
@@ -8,10 +8,6 @@ inputs:
default: "__mageos"
description: A key to version the composer cache. Can be incremented if you need to bust the cache.
mode:
required: true
description: "The mode for setup, one of: `extension` or `store`."
outputs:
cache-hit:
description: "A boolean value to indicate an exact match was found for the key"
@@ -36,7 +32,7 @@ runs:
id: cache-magento-get-composer-version
- name: "Cache Composer Packages"
uses: actions/cache@v3
uses: actions/cache@v5
id: cache-magento-cache
with:
key: "composer | v5.8 | ${{ inputs.composer_cache_key }} | ${{ steps.cache-magento-get-composer-version.outputs.version }} | ${{ steps.cache-magento-get-php-version.outputs.version }}"
-45
View File
@@ -1,45 +0,0 @@
# Magento 2 Coding Standard Action
This Github Action automates the enforcement of Magento Coding Standards. It ensures code consistency and quality by checking code against Magento's specific coding guidelines.
## Inputs
For detailed descriptions of each input, refer to [action.yml](./action.yml).
## Why a Baseline?
Running PHP CodeSniffer (PHPCS) with a baseline is crucial for managing legacy code. It allows you to set a "starting point" for code quality, ignoring existing issues while ensuring no new issues are introduced. This approach is especially useful for large codebases where addressing all existing issues at once is not feasible. The baseline serves as a record of known issues, enabling teams to focus on maintaining and gradually improving code quality in new or modified code.
## Usage Example
The following example demonstrates how to set up the action in your workflow:
Check how this action is used in mage-os [here](https://github.com/mage-os/mageos-magento2/blob/2.4-develop/.github/workflows/coding-standard-baseline.yml).
```yml
name: Coding Standard Baseline
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
coding-standard:
runs-on: ubuntu-latest
steps:
- uses: graycoreio/github-actions-magento2/coding-standard-baseline@main
with:
head_repo: "mage-os/mageos-magento2"
head_ref: "main"
php_version: "8.2"
composer_version: "2"
version: "*"
severity: "5"
warning_severity: "8"
error_severity: "8"
baseline_version: "*"
```
-151
View File
@@ -1,151 +0,0 @@
name: "M2 Coding Standard"
author: "Mage-OS"
description: "A Github Action that runs the Magento Coding Standard."
inputs:
php_version:
type: string
required: true
default: "8.2"
description: "PHP version used to do the coding standard check (default: 8.2)."
composer_version:
type: string
required: true
default: "2"
description: "The version of composer to use (default: 2)."
version:
type: string
required: false
default: "*"
description: "The version of the coding standard to use (default: latest)."
severity:
type: string
required: false
default: "5"
description: "The minimum severity required to display an error or warning (default: 5)"
warning_severity:
type: string
required: false
default: "8"
description: "The minimum severity required to display a warning (default: 8)."
error_severity:
type: string
required: false
default: "8"
description: "The minimum severity required to display an error (default: 8)."
baseline_version:
type: string
required: false
default: "*"
description: "The version of phpcs baseline to use (default: latest)."
head_repo:
type: string
required: true
description: "The repository full name of the head branch. E.g.: mage-os/mageos-magento2"
head_ref:
type: string
required: true
description: "The branch name of the head branch. E.g.: main"
runs:
using: composite
steps:
- name: Checkout head
uses: actions/checkout@v4
with:
ref: ${{ inputs.head_ref }}
repository: ${{ inputs.head_repo }}
- uses: dorny/paths-filter@v2
name: Filter changed files
id: filter
with:
list-files: shell
filters: |
baseline:
- modified: '**/**.{php,phtml,graphqls,less,css,html,xml,js}'
phpcs:
- added|modified: '**/**.{php,phtml,graphqls,less,css,html,xml,js}'
- name: Check changed files for PHPcs
if: steps.filter.outputs.phpcs == 'true'
shell: bash
run: |
echo "One or more files relevant to PHPCS have changed."
echo "List all the files that have been added or changed: ${{ steps.filter.outputs.phpcs_files }}"
- name: Setup PHP
if: steps.filter.outputs.phpcs == 'true'
uses: shivammathur/setup-php@v2
with:
php-version: ${{ inputs.php_version }}
tools: composer:v${{ inputs.composer_version }}
coverage: none
- name: Install coding standards
if: steps.filter.outputs.phpcs == 'true'
shell: bash
run: |
composer create-project --no-plugins --no-dev \
magento/magento-coding-standard \
magento-coding-standard "${{ github.event.inputs.version || '*' }}"
- name: Install phpcs baseline
if: steps.filter.outputs.phpcs == 'true'
working-directory: magento-coding-standard
shell: bash
run: |
composer config --no-plugins allow-plugins.digitalrevolution/php-codesniffer-baseline true
composer require --dev "digitalrevolution/php-codesniffer-baseline: ${{ github.event.inputs.baseline_version || '*' }}"
- name: Checkout base
if: steps.filter.outputs.phpcs == 'true'
uses: actions/checkout@v4
with:
ref: ${{github.event.pull_request.base.ref}}
repository: ${{github.event.pull_request.base.repo.full_name}}
path: base
- name: Create phpcs.baseline.xml from base
shell: bash
working-directory: base
if: steps.filter.outputs.baseline == 'true'
run: |
php ${{ github.workspace }}/magento-coding-standard/vendor/bin/phpcs --standard=Magento2 \
$([ -n "${{ inputs.severity }}" ] && echo "--severity=${{ inputs.severity }}") \
$([ -n "${{ inputs.warning_severity }}" ] && echo "--warning-severity=${{ inputs.warning_severity }}") \
$([ -n "${{ inputs.error_severity }}" ] && echo "--error-severity=${{ inputs.error_severity }}") \
--report=\\DR\\CodeSnifferBaseline\\Reports\\Baseline --report-file=phpcs.baseline.xml \
${{ steps.filter.outputs.baseline_files }} || /bin/true
- name: Copy baseline to head
if: steps.filter.outputs.baseline == 'true'
shell: bash
run: |
cp ${{ github.workspace }}/base/phpcs.baseline.xml ${{ github.workspace }}/magento-coding-standard/phpcs.baseline.xml
# Since we ran phpcs in the base folder, the files in phpcs.baseline.xml contain the base folder in the path.
# We need to remove /base/ so that the phpcs can locate the correct files.
- name: Remove base dir from phpcs baseline
if: steps.filter.outputs.baseline == 'true'
shell: bash
run: |
sed -i "s|/base/|/|" ${{ github.workspace }}/magento-coding-standard/phpcs.baseline.xml
- name: Execute phpcs on head for changed files
shell: bash
if: steps.filter.outputs.phpcs == 'true'
run: |
php ${{ github.workspace }}/magento-coding-standard/vendor/bin/phpcs --standard=Magento2 \
$([ -n "${{ inputs.severity }}" ] && echo "--severity=${{ inputs.severity }}") \
$([ -n "${{ inputs.warning_severity }}" ] && echo "--warning-severity=${{ inputs.warning_severity }}") \
$([ -n "${{ inputs.error_severity }}" ] && echo "--error-severity=${{ inputs.error_severity }}") \
${{ steps.filter.outputs.phpcs_files }}
+11 -1
View File
@@ -11,6 +11,8 @@ See the [action.yml](./action.yml)
## Usage
The caller is responsible for checking out the repository and setting up PHP before calling this action.
```yml
name: Coding Standard
@@ -26,10 +28,18 @@ jobs:
coding-standard:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: shivammathur/setup-php@v2
with:
php-version: '8.3'
tools: composer:v2
coverage: none
- uses: graycoreio/github-actions-magento2/coding-standard@main
with:
path: app/code # Optional, defaults to .
version: 25 # Optional, will use the latest if omitted.
path: app/code # Optional, will be used when event is not a pull request.
severity: 8 # Optional, will use phpcs default of 5 if not specified.
warning_severity: 4 # Optional, will use severity value if not specified.
error_severity: 7 # Optional, will use severity value if not specified.
+59 -51
View File
@@ -3,20 +3,10 @@ author: "Graycore"
description: "A Github Action that runs the Magento Coding Standard."
inputs:
php_version:
required: true
default: "8.1"
description: "PHP version used to do the coding standard check."
composer_version:
required: true
default: "2"
description: "The version of composer to use."
path:
required: true
default: 'app/code'
description: "The directory (relative to the project root) in which the coding standard will be checked. Used when the event is not a pull request."
default: '.'
description: "The directory containing the code to check."
version:
required: false
@@ -42,72 +32,90 @@ inputs:
default: 'false'
required: false
composer_auth:
required: false
default: ""
description: "Composer authentication credentials (contents of auth.json as a JSON string)"
runs:
using: composite
steps:
- name: Checkout Project
uses: actions/checkout@v3
with:
fetch-depth: 0
path: project
- name: Create Standard Directory
- name: Check if Coding Standard is already installed
id: check-installed
shell: bash
run: mkdir standard
- name: Set PHP Version
uses: shivammathur/setup-php@v2
with:
php-version: ${{ inputs.php_version }}
tools: composer:v${{ inputs.composer_version }}
coverage: none
working-directory: ${{ inputs.path }}
run: |
if [ -d "vendor/magento/magento-coding-standard" ] || [ -d "vendor/mage-os/magento-coding-standard" ]; then
echo "installed=true" >> $GITHUB_OUTPUT
else
echo "installed=false" >> $GITHUB_OUTPUT
fi
- name: Get Composer Version
uses: graycoreio/github-actions-magento2/get-composer-version@main
uses: graycoreio/github-actions-magento2/get-composer-version@v7.0.0-rc.0
id: get-composer-version
if: steps.check-installed.outputs.installed != 'true'
- name: Check if allow-plugins option is available for this version of composer
uses: graycoreio/github-actions-magento2/semver-compare@main
uses: graycoreio/github-actions-magento2/semver-compare@v7.0.0-rc.0
id: is-allow-plugins-available
if: steps.check-installed.outputs.installed != 'true'
with:
version: 2.2
compare_against: ${{ steps.get-composer-version.outputs.version }}
id: is-allow-plugins-available
- name: Enable dealerdirect/phpcodesniffer-composer-installer plugin
shell: bash
working-directory: standard
run: composer config allow-plugins.dealerdirect/phpcodesniffer-composer-installer true --global
if: steps.is-allow-plugins-available.outputs.result < 1
working-directory: ${{ inputs.path }}
run: composer config allow-plugins.dealerdirect/phpcodesniffer-composer-installer true --global
if: steps.check-installed.outputs.installed != 'true' && steps.is-allow-plugins-available.outputs.result < 1
- name: Install Coding Standard
shell: bash
working-directory: standard
run: composer require "magento/magento-coding-standard:${{ inputs.version || '*' }}"
working-directory: ${{ inputs.path }}
run: composer require "magento/magento-coding-standard:${{ inputs.version || '*' }}" "magento/php-compatibility-fork"
if: steps.check-installed.outputs.installed != 'true'
env:
COMPOSER_AUTH: ${{ inputs.composer_auth }}
- name: Register Coding Standard
shell: bash
working-directory: standard
run: vendor/bin/phpcs --config-set installed_paths ${{ github.workspace }}/standard/vendor/magento/magento-coding-standard,${{ github.workspace }}/standard/vendor/magento/php-compatibility-fork
working-directory: ${{ inputs.path }}
run: |
if [ -d vendor/magento/magento-coding-standard ]; then
CODING_STANDARD_VENDOR=magento
elif [ -d vendor/mage-os/magento-coding-standard ]; then
CODING_STANDARD_VENDOR=mage-os
else
echo "No magento-coding-standard directory found under vendor/magento or vendor/mage-os."
echo "Trusting dealerdirect/phpcodesniffer-composer-installer to have registered installed_paths."
exit 0
fi
vendor/bin/phpcs --config-set installed_paths \
"vendor/${CODING_STANDARD_VENDOR}/magento-coding-standard,vendor/${CODING_STANDARD_VENDOR}/php-compatibility-fork"
if: steps.check-installed.outputs.installed != 'true'
- name: Set ignore warnings flag
shell: bash
working-directory: standard
working-directory: ${{ inputs.path }}
run: vendor/bin/phpcs --config-set ignore_warnings_on_exit 1
if: inputs.ignore_warnings == 'true'
- name: Get Changed Files
shell: bash
working-directory: project
id: changed-files
run: echo "files=$(git diff --name-only --diff-filter=ACMRT ${{ github.event.pull_request.base.sha }} ${{ github.sha }} | xargs)" >> $GITHUB_OUTPUT
if: github.event_name == 'pull_request'
- name: Coding Standard Check
shell: bash
working-directory: ${{ inputs.path }}
run: |
../standard/vendor/bin/phpcs --standard=Magento2 \
$([ -n "${{ inputs.severity }}" ] && echo "--severity=${{ inputs.severity }}") \
$([ -n "${{ inputs.warning_severity }}" ] && echo "--warning-severity=${{ inputs.warning_severity }}") \
$([ -n "${{ inputs.error_severity }}" ] && echo "--error-severity=${{ inputs.error_severity }}") \
${{ github.event_name == 'pull_request' && steps.changed-files.outputs.files || inputs.path }}
working-directory: project
FLAGS=()
[ -n "${{ inputs.severity }}" ] && FLAGS+=(--severity=${{ inputs.severity }}) || true
[ -n "${{ inputs.warning_severity }}" ] && FLAGS+=(--warning-severity=${{ inputs.warning_severity }}) || true
[ -n "${{ inputs.error_severity }}" ] && FLAGS+=(--error-severity=${{ inputs.error_severity }}) || true
if [ -f .phpcs.xml ] || [ -f phpcs.xml ] || [ -f .phpcs.xml.dist ] || [ -f phpcs.xml.dist ]; then
vendor/bin/phpcs "${FLAGS[@]}" .
else
vendor/bin/phpcs --standard=Magento2 --ignore=*vendor/* "${FLAGS[@]}" .
fi
branding:
icon: "code"
color: "green"
+40
View File
@@ -0,0 +1,40 @@
# What belongs in a composite action
A composite action should do one thing. The guiding test: **can a caller reasonably want to skip part of what this action does, independently of the rest?** If yes, those parts should be separate actions that the caller composes themselves.
## Good fits for a composite action
**A single tool installation paired with its execution.** Install the tool, run it, done. `coding-standard` installs PHPCS and runs it. `fix-magento-install` applies a known set of patches. The install and the run are not independently useful — splitting them would add complexity with no benefit.
**A utility that extracts and exposes a single value.** `get-composer-version`, `get-magento-version`, and `semver-compare` each run one or two commands and write an output. These exist because their output is needed inline by the next step in the same job. That is the right scope for a composite action.
**A setup operation with a well-defined end state.** `cache-magento` leaves the Composer cache populated. `setup-magento` leaves a Magento project at a known path. The caller gets a clear postcondition and nothing else.
## Signs an action is too broad
**It bundles independent setup concerns with execution.** Imagine a `unit-test` action that sets up PHP, installs Composer dependencies, and then runs the test command. These three things can each be wanted or skipped independently. A caller whose job already has PHP set up cannot avoid step 1. A caller that wants to run tests against already-installed dependencies cannot avoid step 2.
The right scope is just the execution step:
```yaml
inputs:
test_command:
required: true
default: composer run test
source_folder:
required: true
default: .
runs:
using: composite
steps:
- run: ${{ inputs.test_command }}
shell: bash
working-directory: ${{ inputs.source_folder }}
```
The caller is then responsible for composing `setup-php`, `cache-magento`, and `composer install` before calling it — each of which is already a separate action in this repo.
**It reimplements logic that already exists in another action.** If a new action rolls its own Composer caching inline rather than calling `cache-magento`, that creates two different cache key strategies in the same repo and makes it harder to update caching behavior consistently.
**The name describes a pipeline, not a step.** Names like "install and test" or "build and deploy" are warning signs. A good action name describes what state it produces or what it checks — not a sequence of operations.
+1 -1
View File
@@ -25,7 +25,7 @@ jobs:
fix:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v6
- uses: graycoreio/github-actions-magento2/fix-magento-install@main
with:
magento_directory: path/to/magento
+1 -1
View File
@@ -9,7 +9,7 @@ inputs:
runs:
using: "composite"
steps:
- uses: graycoreio/github-actions-magento2/get-magento-version@main
- uses: graycoreio/github-actions-magento2/get-magento-version@v7.0.0-rc.0
id: init-magento-get-magento-version
with:
working-directory: ${{ inputs.magento_directory }}
+1 -1
View File
@@ -24,7 +24,7 @@ jobs:
runs-on: ubuntu-latest
name: A job to compute an installed Composer version.
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v6
- uses: graycoreio/github-actions-magento2/get-composer-version@main
id: get-composer-version
- run: echo version ${{ steps.get-composer-version.outputs.version }}
+1 -1
View File
@@ -24,7 +24,7 @@ jobs:
runs-on: ubuntu-latest
name: A job to compute an installed Magento version.
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v6
- uses: graycoreio/github-actions-magento2/get-magento-version@main
id: get-magento-version
- run: echo version ${{ steps.get-magento-version.outputs.version }}
-48
View File
@@ -1,48 +0,0 @@
# Magento 2 Package Installation Test Action
A Github Action that tests the installability of a Magento Package
## Inputs
See the [action.yml](./action.yml)
## Usage
```yml
name: Installation Test
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
compute_matrix:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.supported-version.outputs.matrix }}
steps:
- uses: actions/checkout@v2
- uses: graycoreio/github-actions-magento2/supported-version@main
id: supported-version
- run: echo ${{ steps.supported-version.outputs.matrix }}
install-test:
needs: compute_matrix
strategy:
matrix: ${{ fromJSON(needs.compute_matrix.outputs.matrix) }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: graycoreio/github-actions-magento2/installation-test@main
with:
composer_version: ${{ matrix.composer }}
php_version: ${{ matrix.php }}
magento_version: ${{ matrix.magento }}
composer_auth: ${{ secrets.COMPOSER_AUTH }}
package_name: vendor/package
source_folder: $GITHUB_WORKSPACE
```
-122
View File
@@ -1,122 +0,0 @@
name: "Installation Test"
author: "Graycore"
description: " A Github Action that tests the installability of a Magento Package"
inputs:
php_version:
required: true
default: "8.1"
description: "PHP Version to use"
cache_key:
required: true
default: "2"
description: "The cache key used to hold Composer Packages"
composer_version:
required: true
default: "2"
description: "The version of composer to use"
use_local_source:
required: false
default: "true"
description: "Whether or not you want to test your local package or not."
source_folder:
required: true
default: $GITHUB_WORKSPACE
description: "The source folder of the package"
package_name:
required: true
description: "The name of the package"
magento_directory:
required: true
default: "../magento2"
description: "The folder where Magento will be installed"
magento_version:
required: true
default: "magento/project-community-edition"
description: "The version of Magento to test against"
magento_repository:
required: true
default: "https://mirror.mage-os.org/"
description: "Where to install Magento from"
composer_cache_key:
required: false
default: ''
description: A key to version the composer cache. Can be incremented if you need to bust the cache.
composer_auth:
required: false
description: "Composer Authentication Credentials"
runs:
using: "composite"
steps:
- name: Set PHP Version
uses: shivammathur/setup-php@v2
with:
php-version: ${{ inputs.php_version }}
- run: composer self-update ${{ inputs.composer_version }}
name: Pin to Composer Version ${{ inputs.composer_version }}
if: contains(inputs.composer_version, '.') == true
shell: bash
- run: composer self-update --${{ inputs.composer_version }}
name: Pin to Composer Version ${{ inputs.composer_version }} (Range)
if: contains(inputs.composer_version, '.') == false
shell: bash
- run: composer create-project --repository-url="${{ inputs.magento_repository }}" "${{ inputs.magento_version }}" ${{ inputs.magento_directory }} --no-install
shell: bash
env:
COMPOSER_AUTH: ${{ inputs.composer_auth }}
name: Create Magento ${{ inputs.magento_version }} Project
- name: Get Composer Cache Directory
shell: bash
working-directory: ${{ inputs.magento_directory }}
id: composer-cache
run: |
echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
- name: "Cache Composer Packages"
uses: actions/cache@v3
with:
key: "composer | v5 | ${{ inputs.composer_cache_key }} | ${{ hashFiles('composer.lock') }} | ${{ runner.os }} | ${{ inputs.composer_version }} | ${{ inputs.php_version }} | ${{ inputs.magento_version }}"
path: ${{ steps.composer-cache.outputs.dir }}
- run: composer config repositories.local path ${{ inputs.source_folder }}
name: Add Github Repo for Testing
working-directory: ${{ inputs.magento_directory }}
shell: bash
if: ${{ inputs.use_local_source == 'true' }}
- run: |
composer config --no-interaction allow-plugins.dealerdirect/phpcodesniffer-composer-installer true
composer config --no-interaction allow-plugins.laminas/laminas-dependency-plugin true
composer config --no-interaction allow-plugins.magento/* true
name: Fixup Composer Plugins
shell: bash
working-directory: ${{ inputs.magento_directory }}
if: ${{ !startsWith(inputs.composer_version, '1') }}
- run: composer require ${{ inputs.package_name }} "@dev" --no-update && composer install
name: Require and attempt install
working-directory: ${{ inputs.magento_directory }}
shell: bash
env:
COMPOSER_CACHE_DIR: ${{ steps.composer-cache.outputs.dir }}
COMPOSER_AUTH: ${{ inputs.composer_auth }}
branding:
icon: "code"
color: "green"
+655 -2526
View File
File diff suppressed because it is too large Load Diff
+10 -11
View File
@@ -1,6 +1,6 @@
{
"name": "@graycoreio/github-actions-magento2",
"version": "3.0.0",
"version": "7.0.0-rc.0",
"description": "Github Actions for Magento 2",
"scripts": {
"test": "cd supported-version && npm run test && cd -",
@@ -18,18 +18,17 @@
},
"homepage": "https://github.com/graycoreio/github-actions-magento2#readme",
"dependencies": {
"@actions/core": "^1.10.0"
"@actions/core": "^1.11.1"
},
"devDependencies": {
"@types/jest": "^29.5.11",
"@types/node": "^22.13.9",
"@typescript-eslint/eslint-plugin": "^8.26.1",
"@typescript-eslint/parser": "^8.26.1",
"esbuild": "^0.25.1",
"eslint": "^9.22.0",
"@types/jest": "^29.5.14",
"@types/node": "^24.10.4",
"@typescript-eslint/eslint-plugin": "^8.49.0",
"@typescript-eslint/parser": "^8.49.0",
"esbuild": "^0.25.12",
"eslint": "^9.39.2",
"jest": "^29.5.0",
"standard-version": "^9.5.0",
"ts-jest": "^29.2.6",
"typescript": "^5.8.2"
"ts-jest": "^29.4.6",
"typescript": "^5.9.3"
}
}
+1 -1
View File
@@ -30,7 +30,7 @@ jobs:
runs-on: ubuntu-latest
name: A job to semantically compare two versions
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v6
- uses: graycoreio/github-actions-magento2/semver-compare@main
with:
version: 2.1.0
-29
View File
@@ -1,29 +0,0 @@
# Magento 2 setup:di:compile action
A Github Action that runs `php bin/magento setup:di:compile` and checks for compilation errors.
## Inputs
See the [action.yml](./action.yml)
## Usage
```yml
name: Magento setup:di:compile check
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
setup-di-compile:
runs-on: ubuntu-latest
steps:
- uses: graycoreio/github-actions-magento2/setup-di-compile@main
with:
php_version: "8.3"
composer_version: "2"
```
-58
View File
@@ -1,58 +0,0 @@
name: "Magento compilation (setup:di:compile)"
author: "MageOS"
description: "A Github Action that runs bin/magento setup:di:compile."
inputs:
php_version:
required: true
default: "8.3"
description: "PHP version used to run setup:di:compile."
composer_version:
required: true
default: "2"
description: "The version of composer to use."
runs:
using: composite
steps:
- name: Checkout Project
uses: actions/checkout@v3
- name: Get changed files that could break compilation
uses: tj-actions/changed-files@v39
id: changed-files
with:
files_yaml: |
magento:
- 'composer.lock'
- 'composer.json'
- '**/*.php'
- '**/*.xml'
- name: Set PHP Version
if: steps.changed-files.outputs.magento_any_changed == 'true'
uses: shivammathur/setup-php@v2
with:
php-version: ${{ inputs.php_version }}
tools: composer:v${{ inputs.composer_version }}
coverage: none
- uses: graycoreio/github-actions-magento2/cache-magento@main
with:
mode: 'store'
- name: Install composer dependencies
if: steps.changed-files.outputs.magento_any_changed == 'true'
shell: bash
run: composer install
- name: Enable all modules
if: steps.changed-files.outputs.magento_any_changed == 'true'
shell: bash
run: php bin/magento module:enable --all
- name: Compile
if: steps.changed-files.outputs.magento_any_changed == 'true'
shell: bash
run: php bin/magento setup:di:compile
+78 -47
View File
@@ -1,79 +1,110 @@
# Magento 2 Package Installation Test Action
# Setup Magento
A Github Action that sets Magento up to the point of composer install.
A GitHub Action that prepares a Magento 2 environment for testing. It handles PHP setup and Magento project creation, stopping just before `composer install` so you can add custom repositories or packages.
## Modes
The action operates in two modes:
- **`extension`** (default): Creates a fresh Magento project in `../magento2` for testing your extension against. Use this when your repository contains a Magento module/extension.
- **`store`**: Uses your existing Magento project in the working directory. Use this when your repository is a full Magento store.
## Inputs
See the [action.yml](./action.yml)
| Input | Required | Default | Description |
|-------|----------|---------|-------------|
| `php-version` | Yes | `8.4` | PHP version to install |
| `mode` | Yes | `extension` | Either `extension` or `store` |
| `magento_version` | No | `magento/project-community-edition:2.4.8-p3` | Magento version to install (extension mode only) |
| `magento_repository` | No | `https://mirror.mage-os.org/` | Composer repository URL for Magento packages |
| `tools` | No | - | PHP tools to install globally (e.g., `composer:v2`) |
| `extensions` | No | - | Additional PHP extensions to install |
| `coverage` | No | - | Code coverage driver (e.g., `xdebug`, `pcov`) |
| `working-directory` | No | `.` | Working directory for the action |
| `apply_fixes` | No | `false` | Apply Magento installation fixes (always applied in extension mode) |
| `composer_auth` | No | - | Composer authentication credentials JSON |
## Outputs
| Output | Description |
|--------|-------------|
| `path` | Absolute path to the Magento installation directory |
## Usage
### Stores
### Testing an Extension
Use `mode: extension` when your repository contains a Magento module. The action creates a fresh Magento instance and you can then require your extension into it.
```yml
name: Setup Magento Store
name: Test Extension
on:
push:
branches:
- main
branches: [main]
pull_request:
branches:
- main
branches: [main]
jobs:
setup-magento-store:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: ./setup-magento
with:
php-version: 8.1
tools: composer:v2
mode: store
working-directory: $GITHUB_WORKSPACE
- uses: actions/checkout@v6
- run: composer install
name: Composer install
shell: bash
- uses: graycoreio/github-actions-magento/setup-magento@main
id: setup-magento
with:
php-version: "8.3"
tools: composer:v2
mode: extension
magento_version: "magento/project-community-edition:2.4.8-p3"
- name: Add local repository
working-directory: ${{ steps.setup-magento.outputs.path }}
run: composer config repositories.local path $GITHUB_WORKSPACE
- name: Require extension
working-directory: ${{ steps.setup-magento.outputs.path }}
run: composer require vendor/my-extension "@dev"
env:
COMPOSER_AUTH: ${{ secrets.COMPOSER_AUTH }}
```
### Extensions
### Testing a Magento Store
Use `mode: store` when your repository is a complete Magento project.
```yml
name: Setup Magento Store
name: Test Store
on:
push:
branches:
- main
branches: [main]
pull_request:
branches:
- main
branches: [main]
jobs:
setup-magento-extension:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: ./setup-magento
with:
php-version: 8.1
tools: composer:v2
mode: extension
magento_version: 2.4.5-p1
- uses: graycoreio/github-actions-magento/setup-magento@main
id: setup-magento
with:
php-version: "8.3"
tools: composer:v2
mode: store
- run: composer config repositories.local path $GITHUB_WORKSPACE
name: Add Github Repo for Testing
working-directory: ${{ steps.setup-magento.outputs.path }}
shell: bash
- run: composer require my/package "@dev"
name: Attempt install
working-directory: ${{ steps.setup-magento.outputs.path }}
shell: bash
env:
COMPOSER_AUTH: ${{ secrets.composer_auth }}
- name: Install dependencies
working-directory: ${{ steps.setup-magento.outputs.path }}
run: composer install
env:
COMPOSER_AUTH: ${{ secrets.COMPOSER_AUTH }}
```
## Notes
- The action uses [shivammathur/setup-php](https://github.com/shivammathur/setup-php) for PHP installation
- By default, Magento packages are fetched from the [Mage-OS mirror](https://mirror.mage-os.org/) which doesn't require authentication
- For Adobe Commerce or private packages, provide `composer_auth` with your credentials
+3 -3
View File
@@ -5,7 +5,7 @@ description: "This action sets up a Magento instance for further actions like ru
inputs:
php-version:
description: "Setup PHP version."
default: "8.1"
default: "8.4"
required: true
tools:
@@ -27,7 +27,7 @@ inputs:
magento_version:
required: false
default: '~2.4.5'
default: 'magento/project-community-edition:2.4.8-p3'
description: "The version of Magento to use. This is only relevant if you are testing an extension."
apply_fixes:
@@ -90,7 +90,7 @@ runs:
env:
COMPOSER_AUTH: ${{ inputs.composer_auth }}
- uses: graycoreio/github-actions-magento2/fix-magento-install@main
- uses: graycoreio/github-actions-magento2/fix-magento-install@v7.0.0-rc.0
name: Fix Magento Out of Box Install Issues
with:
magento_directory: ${{ steps.setup-magento-compute-directory.outputs.MAGENTO_DIRECTORY }}
+1
View File
@@ -21,6 +21,7 @@ See the [action.yml](./action.yml)
- `currently-supported` - The currently supported Magento Open Source versions by Adobe.
- `latest` - The latest version of Magento only.
- `custom` - A custom subset of the versions, as specified by you. Requires `custom_versions` sibling key.
- `usable` - All versions of Magento, minus any that can no longer be installed or used under normal circumstances.
- `nightly` - The nightly version of Magento (only available via `https://upstream-nightly.mage-os.org`)
- `all` - All versions of Magento (including patched/unpatched versions).
+7 -3
View File
@@ -5,7 +5,7 @@ description: "A Github Action that computes the Github Actions matrix for the ch
inputs:
kind:
required: false
description: "The kind of versions you want to return. Allowed values are `currently-supported`, `latest`, `custom`, `nightly`, `recent` and `all`"
description: "The kind of versions you want to return. Allowed values are `currently-supported`, `latest`, `custom`, `usable`, `nightly`, `recent` and `all`"
default: "currently-supported"
project:
required: false
@@ -22,13 +22,17 @@ inputs:
default: "2y"
description: "The time frame (from today). Only used in `recent` kind. String that defines a time duration using a combination of years (y), months (m), and days (d). Each unit is optional and can appear in any order, separated by spaces. For example `2y 2m 2d`. "
include_services:
required: false
default: "true"
description: "Whether to include a `services` key in each matrix entry with GitHub Actions service configurations."
outputs:
matrix:
description: "The Github Actions matrix of software technologies required to run Magento."
value: ${{ steps.generate.outputs.matrix }}
runs:
using: "node16"
using: "node24"
main: dist/index.js
branding:
+67 -6
View File
File diff suppressed because one or more lines are too long
+5 -5
View File
@@ -11,12 +11,12 @@
"author": "",
"license": "MIT",
"dependencies": {
"@actions/core": "^1.10.1",
"@actions/github": "^6.0.0"
"@actions/core": "0.0.0-PLACEHOLDER",
"@actions/github": "0.0.0-PLACEHOLDER"
},
"devDependencies": {
"@types/jest": "^29.5.12",
"jest": "^29.7.0",
"ts-jest": "^29.2.3"
"@types/jest": "0.0.0-PLACEHOLDER",
"jest": "0.0.0-PLACEHOLDER",
"ts-jest": "0.0.0-PLACEHOLDER"
}
}
+15 -1
View File
@@ -2,6 +2,7 @@ import * as core from '@actions/core';
import { validateKind } from './kind/validate-kinds';
import { getMatrixForKind } from './matrix/get-matrix-for-kind';
import { validateProject } from "./project/validate-projects";
import { buildServicesForEntry } from "./services/build-services";
export async function run(): Promise<void> {
@@ -10,12 +11,25 @@ export async function run(): Promise<void> {
const customVersions = core.getInput("custom_versions");
const project = core.getInput("project");
const recent_time_frame = core.getInput("recent_time_frame");
const include_services = core.getInput("include_services") === "true";
validateProject(<any>project)
validateKind(<any>kind, customVersions ? customVersions.split(',') : undefined);
core.setOutput('matrix', getMatrixForKind(kind, project, customVersions, recent_time_frame));
let matrix = getMatrixForKind(kind, project, customVersions, recent_time_frame);
if (include_services) {
matrix = {
magento: matrix.magento,
include: matrix.include.map((entry) => ({
...entry,
services: buildServicesForEntry(entry)
}))
};
}
core.setOutput('matrix', matrix);
}
catch (error) {
core.setFailed(error.message);
@@ -44,38 +44,51 @@ describe('getCurrentlySupportedVersions for magento-open-source', () => {
'magento/project-community-edition:2.4.6-p8',
'magento/project-community-edition:2.4.7-p3',
]],
['2025-08-08T00:00:00Z', 'Day Before v2.4.5 EoL', [
['2025-06-09T00:00:00Z', 'Day before new patch releases', [
'magento/project-community-edition:2.4.5-p12',
'magento/project-community-edition:2.4.6-p10',
'magento/project-community-edition:2.4.7-p5',
'magento/project-community-edition:2.4.8',
]],
['2025-08-09T00:00:00Z', 'Day of v2.4.5 EoL', [
'magento/project-community-edition:2.4.5-p12',
'magento/project-community-edition:2.4.6-p10',
'magento/project-community-edition:2.4.7-p5',
'magento/project-community-edition:2.4.8',
['2025-06-10T00:00:01Z', 'Day of new patch releases', [
'magento/project-community-edition:2.4.5-p13',
'magento/project-community-edition:2.4.6-p11',
'magento/project-community-edition:2.4.7-p6',
'magento/project-community-edition:2.4.8-p1',
]],
['2025-08-10T00:00:00Z', 'Day after v2.4.5 EoL', [
'magento/project-community-edition:2.4.6-p10',
'magento/project-community-edition:2.4.7-p5',
'magento/project-community-edition:2.4.8',
['2025-08-11T00:00:00Z', 'Day Before v2.4.5 EoL', [
'magento/project-community-edition:2.4.5-p13',
'magento/project-community-edition:2.4.6-p11',
'magento/project-community-edition:2.4.7-p6',
'magento/project-community-edition:2.4.8-p1',
]],
['2025-08-12T00:00:00Z', 'Day of v2.4.5 EoL', [
'magento/project-community-edition:2.4.5-p13',
'magento/project-community-edition:2.4.6-p11',
'magento/project-community-edition:2.4.7-p6',
'magento/project-community-edition:2.4.8-p1',
]],
['2025-08-14T00:00:00Z', 'Day after August 2025 patch release', [
'magento/project-community-edition:2.4.6-p12',
'magento/project-community-edition:2.4.7-p7',
'magento/project-community-edition:2.4.8-p2',
]],
['2025-12-31T00:00:00Z', 'End of 2025', [
'magento/project-community-edition:2.4.6-p10',
'magento/project-community-edition:2.4.7-p5',
'magento/project-community-edition:2.4.8',
'magento/project-community-edition:2.4.6-p13',
'magento/project-community-edition:2.4.7-p8',
'magento/project-community-edition:2.4.8-p3',
]],
['2026-03-15T00:00:00Z', 'Day after v2.4.6 EoL', [
'magento/project-community-edition:2.4.7-p5',
'magento/project-community-edition:2.4.8',
['2026-03-15T00:00:00Z', 'Day after v2.4.6-p14 release', [
'magento/project-community-edition:2.4.6-p14',
'magento/project-community-edition:2.4.7-p9',
'magento/project-community-edition:2.4.8-p4',
]],
['2027-04-09T00:00:00Z', 'Day of v2.4.7 EoL', [
'magento/project-community-edition:2.4.7-p5',
'magento/project-community-edition:2.4.8',
'magento/project-community-edition:2.4.7-p9',
'magento/project-community-edition:2.4.8-p4',
]],
['2027-04-10T00:00:00Z', 'Day after v2.4.7 EoL', [
'magento/project-community-edition:2.4.8',
'magento/project-community-edition:2.4.8-p4',
]],
])(
'supportedVersions for %s',
@@ -110,6 +123,15 @@ describe('getCurrentlySupportedVersions for mage-os', () => {
['2024-07-18T00:00:01Z', 'Release of 1.0.2', [
'mage-os/project-community-edition:1.0.2',
]],
['2025-04-22T00:00:01Z', 'Release of 1.1.1', [
'mage-os/project-community-edition:1.1.1',
]],
['2025-08-13T00:00:01Z', 'Release of 1.3.0', [
'mage-os/project-community-edition:1.3.0',
]],
['2025-09-09T00:00:01Z', 'Release of 1.3.1', [
'mage-os/project-community-edition:1.3.1',
]],
])(
'supportedVersions for %s',
(date, description ,result) => {
@@ -0,0 +1,53 @@
import { getUsableVersions } from "./get-usable";
import { Project } from "../project/projects";
import { getIndividualVersionsForProject } from "../versions/get-versions-for-project";
// Mock the dependencies
jest.mock('../versions/get-versions-for-project');
const mockGetVersions = getIndividualVersionsForProject as jest.Mock;
describe('getUsableVersions for magento-open-source', () => {
const project: Project = "magento-open-source";
beforeEach(() => {
mockGetVersions.mockReset();
});
it('should return an array of versions', () => {
mockGetVersions.mockReturnValue({
'magento/project-community-edition:2.4.6': { composer: '2.2.0' }
});
expect(Array.isArray(getUsableVersions(project))).toBe(true);
});
it('should filter out versions with composer < 2.0.0', () => {
mockGetVersions.mockReturnValue({
'magento/project-community-edition:2.4.5': { composer: '1.9.0' },
'magento/project-community-edition:2.4.6': { composer: '2.2.0' }
});
const versions = getUsableVersions(project);
expect(versions).not.toContain('magento/project-community-edition:2.4.5');
expect(versions).toContain('magento/project-community-edition:2.4.6');
});
it('should handle composer version equal to 2.0.0', () => {
mockGetVersions.mockReturnValue({
'magento/project-community-edition:2.4.6': { composer: '2.0.0' }
});
const versions = getUsableVersions(project);
expect(versions).toContain('magento/project-community-edition:2.4.6');
});
it('should handle numeric composer versions', () => {
mockGetVersions.mockReturnValue({
'magento/project-community-edition:2.3.7-p3': { composer: 1 },
'magento/project-community-edition:2.4.6': { composer: 2 }
});
const versions = getUsableVersions(project);
expect(versions).not.toContain('magento/project-community-edition:2.3.7-p3');
expect(versions).toContain('magento/project-community-edition:2.4.6');
});
});
+23
View File
@@ -0,0 +1,23 @@
import { PackageMatrixVersion } from '../matrix/matrix-type';
import { getIndividualVersionsForProject } from "../versions/get-versions-for-project";
import semver from 'semver';
export const getUsableVersions = (project: string): string[] => {
const allVersions = getIndividualVersionsForProject(project)
return Object.entries(<Record<string,PackageMatrixVersion>>allVersions)
.filter(([key, value]) => {
/**
* Filter out any versions that are not 'usable', and cannot be successfully installed
* anymore for modern systems or other reasons outside our control.
*/
// Packagist retired support for Composer 1 on 2025-09-01.
const composerVersion = semver.coerce(value.composer.toString());
if (composerVersion && semver.lt(composerVersion, '2.0.0')) {
return false;
}
return true;
})
.map(([key, value]) => key);
}
+1
View File
@@ -5,6 +5,7 @@ export const KNOWN_KINDS = {
'currently-supported': true,
'latest': true,
'custom': true,
'usable': true,
'nightly': true,
'recent': true,
'all': true,
@@ -53,15 +53,19 @@ describe('recent for magento-open-source', () => {
"magento/project-community-edition:2.4.5-p10",
"magento/project-community-edition:2.4.5-p11",
"magento/project-community-edition:2.4.5-p12",
"magento/project-community-edition:2.4.5-p13",
"magento/project-community-edition:2.4.6-p7",
"magento/project-community-edition:2.4.6-p8",
"magento/project-community-edition:2.4.6-p9",
"magento/project-community-edition:2.4.6-p10",
"magento/project-community-edition:2.4.6-p11",
"magento/project-community-edition:2.4.7-p2",
"magento/project-community-edition:2.4.7-p3",
"magento/project-community-edition:2.4.7-p4",
"magento/project-community-edition:2.4.7-p5",
"magento/project-community-edition:2.4.7-p6",
"magento/project-community-edition:2.4.8",
"magento/project-community-edition:2.4.8-p1"
]],
])(
'recent for %s',
@@ -11,6 +11,13 @@ describe('getMatrixForKind for mage-os', () => {
expect(result.include).toBeDefined();
});
it('returns a single-element matrix for with a matrix "magento" for `latest`', () => {
const result = getMatrixForKind("latest", project);
expect(result.magento.length).toEqual(1);
expect(result.include.length).toEqual(1);
expect(result.magento[0]).toEqual(result.include[0].magento);
});
it('returns a matrix for `currently-supported`', () => {
const result = getMatrixForKind("currently-supported", project);
@@ -47,6 +54,13 @@ describe('getMatrixForKind for mage-os', () => {
expect(result.include).toBeDefined();
});
it('returns a single-element matrix for with a matrix "magento" for `nightly`', () => {
const result = getMatrixForKind("nightly", project);
expect(result.magento.length).toEqual(1);
expect(result.include.length).toEqual(1);
expect(result.magento[0]).toEqual(result.include[0].magento);
});
it('errors for invalid `custom``', () => {
expect(() => getMatrixForKind("custom", project)).toThrowError();
});
@@ -64,11 +78,18 @@ describe('getMatrixForKind for magento-open-source', () => {
it('returns a matrix for `latest`', () => {
const result = getMatrixForKind("latest", project);
console.log(result);
expect(result.magento).toBeDefined();
expect(result.include).toBeDefined();
});
it('returns a single-element matrix for with a matrix "magento" for `latest`', () => {
const result = getMatrixForKind("latest", project);
expect(result.magento.length).toEqual(1);
expect(result.include.length).toEqual(1);
expect(result.magento[0]).toEqual(result.include[0].magento);
});
it('returns a matrix for `currently-supported`', () => {
const result = getMatrixForKind("currently-supported", project);
@@ -84,7 +105,7 @@ describe('getMatrixForKind for magento-open-source', () => {
});
it('returns a matrix for valid `custom`', () => {
const result = getMatrixForKind("custom", project, "magento/project-community-edition:2.3.7-p3");
const result = getMatrixForKind("custom", project, "magento/project-community-edition:2.4.2");
expect(result.magento).toBeDefined();
expect(result.include).toBeDefined();
@@ -97,8 +118,15 @@ describe('getMatrixForKind for magento-open-source', () => {
expect(result.include).toBeDefined();
});
it('returns a single-element matrix for with a matrix "magento" for `nightly`', () => {
const result = getMatrixForKind("nightly", project);
expect(result.magento.length).toEqual(1);
expect(result.include.length).toEqual(1);
expect(result.magento[0]).toEqual(result.include[0].magento);
});
it('returns a matrix for valid multiple `custom`', () => {
const result = getMatrixForKind("custom", project, "magento/project-community-edition:2.3.7-p3,magento/project-community-edition:2.4.0");
const result = getMatrixForKind("custom", project, "magento/project-community-edition:2.4.2,magento/project-community-edition:2.4.3");
expect(result.magento).toBeDefined();
expect(result.include).toBeDefined();
@@ -4,6 +4,7 @@ import latestJson from '../kind/special-versions/latest.json';
import nightlyJson from '../kind/special-versions/nightly.json';
import { getDayBefore } from '../nightly/get-day-before';
import { getCurrentlySupportedVersions } from "../kind/get-currently-supported";
import { getUsableVersions } from "../kind/get-usable";
import { amendMatrixForNext } from "../nightly/amend-matrix-for-next";
import { getRecentVersions } from "../kind/recent";
@@ -14,6 +15,8 @@ export const getMatrixForKind = (kind: string, project: string, versions = "", r
return getMatrixForVersions(project, latestJson[project]);
case 'currently-supported':
return getMatrixForVersions(project, getCurrentlySupportedVersions(project, new Date()));
case 'usable':
return getMatrixForVersions(project, getUsableVersions(project));
case 'nightly':
return amendMatrixForNext(getMatrixForVersions(project, nightlyJson[project]), 'https://upstream-nightly.mage-os.org', getDayBefore());
case 'all':
+15 -1
View File
@@ -1,16 +1,30 @@
export interface ServiceConfig {
image: string;
env?: Record<string, string>;
ports?: string[];
options?: string;
}
export interface Services {
[serviceName: string]: ServiceConfig;
}
export interface PackageMatrixVersion {
magento: string,
php: string | number,
composer: string | number,
mysql: string,
elasticsearch: string,
opensearch: string,
rabbitmq: string,
redis: string,
varnish: string,
valkey: string,
nginx: string,
os: string,
release: string,
eol: string
eol: string,
services?: Services
}
export interface GithubActionsMatrix {
@@ -12,8 +12,10 @@ describe('amendMatrixForNext', () => {
"composer": "2",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:8.5.3",
"opensearch": "",
"rabbitmq": "rabbitmq:3.11-management",
"redis": "redis:7.0",
"valkey": "",
"varnish": "varnish:7.3",
"nginx": "nginx:1.22",
"os": "ubuntu-latest",
@@ -35,8 +37,10 @@ describe('amendMatrixForNext', () => {
"composer": "2",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:8.5.3",
"opensearch": "",
"rabbitmq": "rabbitmq:3.11-management",
"redis": "redis:7.0",
"valkey": "",
"varnish": "varnish:7.3",
"nginx": "nginx:1.22",
"os": "ubuntu-latest",
@@ -60,8 +64,10 @@ describe('amendMatrixForNext', () => {
"composer": "2",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:8.5.3",
"opensearch": "",
"rabbitmq": "rabbitmq:3.11-management",
"redis": "redis:7.0",
"valkey": "",
"varnish": "varnish:7.3",
"nginx": "nginx:1.22",
"os": "ubuntu-latest",
@@ -83,8 +89,10 @@ describe('amendMatrixForNext', () => {
"composer": "2",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:8.5.3",
"opensearch": "",
"rabbitmq": "rabbitmq:3.11-management",
"redis": "redis:7.0",
"valkey": "",
"varnish": "varnish:7.3",
"nginx": "nginx:1.22",
"os": "ubuntu-latest",
@@ -108,8 +116,10 @@ describe('amendMatrixForNext', () => {
"composer": "2",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:8.5.3",
"opensearch": "",
"rabbitmq": "rabbitmq:3.11-management",
"redis": "redis:7.0",
"valkey": "",
"varnish": "varnish:7.3",
"nginx": "nginx:1.22",
"os": "ubuntu-latest",
@@ -122,8 +132,10 @@ describe('amendMatrixForNext', () => {
"composer": "2",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:8.5.3",
"opensearch": "",
"rabbitmq": "rabbitmq:3.11-management",
"redis": "redis:7.0",
"valkey": "",
"varnish": "varnish:7.3",
"nginx": "nginx:1.22",
"os": "ubuntu-latest",
@@ -145,8 +157,10 @@ describe('amendMatrixForNext', () => {
"composer": "2",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:8.5.3",
"opensearch": "",
"rabbitmq": "rabbitmq:3.11-management",
"redis": "redis:7.0",
"valkey": "",
"varnish": "varnish:7.3",
"nginx": "nginx:1.22",
"os": "ubuntu-latest",
@@ -159,8 +173,10 @@ describe('amendMatrixForNext', () => {
"composer": "2",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:8.5.3",
"opensearch": "",
"rabbitmq": "rabbitmq:3.11-management",
"redis": "redis:7.0",
"valkey": "",
"varnish": "varnish:7.3",
"nginx": "nginx:1.22",
"os": "ubuntu-latest",
@@ -184,8 +200,10 @@ describe('amendMatrixForNext', () => {
"composer": "2",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:8.5.3",
"opensearch": "",
"rabbitmq": "rabbitmq:3.11-management",
"redis": "redis:7.0",
"valkey": "",
"varnish": "varnish:7.3",
"nginx": "nginx:1.22",
"os": "ubuntu-latest",
@@ -207,8 +225,10 @@ describe('amendMatrixForNext', () => {
"composer": "2",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:8.5.3",
"opensearch": "",
"rabbitmq": "rabbitmq:3.11-management",
"redis": "redis:7.0",
"valkey": "",
"varnish": "varnish:7.3",
"nginx": "nginx:1.22",
"os": "ubuntu-latest",
@@ -0,0 +1,248 @@
import { buildServicesForEntry } from './build-services';
import { PackageMatrixVersion } from '../matrix/matrix-type';
const createTestEntry = (overrides: Partial<PackageMatrixVersion> = {}): PackageMatrixVersion => ({
magento: 'magento/project-community-edition:2.4.7',
php: '8.3',
composer: '2.7.4',
mysql: 'mysql:8.4',
elasticsearch: 'elasticsearch:8.11.4',
opensearch: 'opensearchproject/opensearch:2.19.1',
rabbitmq: 'rabbitmq:4.0-management',
redis: 'redis:7.2',
varnish: 'varnish:7.5',
valkey: 'valkey:8.0',
nginx: 'nginx:1.26',
os: 'ubuntu-latest',
release: '2024-04-09T00:00:00+0000',
eol: '2027-04-09T00:00:00+0000',
...overrides
});
describe('buildServicesForEntry', () => {
describe('search engine selection', () => {
it('should prefer opensearch when both are available', () => {
const entry = createTestEntry();
const services = buildServicesForEntry(entry);
expect(services.opensearch).toBeDefined();
expect(services.opensearch.image).toBe('opensearchproject/opensearch:2.19.1');
expect(services.elasticsearch).toBeUndefined();
});
it('should fall back to elasticsearch when opensearch is empty', () => {
const entry = createTestEntry({ opensearch: '' });
const services = buildServicesForEntry(entry);
expect(services.elasticsearch).toBeDefined();
expect(services.elasticsearch.image).toBe('elasticsearch:8.11.4');
expect(services.opensearch).toBeUndefined();
});
it('should not include search engine when neither is available', () => {
const entry = createTestEntry({ opensearch: '', elasticsearch: '' });
const services = buildServicesForEntry(entry);
expect(services.opensearch).toBeUndefined();
expect(services.elasticsearch).toBeUndefined();
});
});
describe('cache selection', () => {
it('should prefer valkey when both are available', () => {
const entry = createTestEntry();
const services = buildServicesForEntry(entry);
expect(services.valkey).toBeDefined();
expect(services.valkey.image).toBe('valkey:8.0');
expect(services.redis).toBeUndefined();
});
it('should fall back to redis when valkey is empty', () => {
const entry = createTestEntry({ valkey: '' });
const services = buildServicesForEntry(entry);
expect(services.redis).toBeDefined();
expect(services.redis.image).toBe('redis:7.2');
expect(services.valkey).toBeUndefined();
});
it('should not include cache when neither is available', () => {
const entry = createTestEntry({ valkey: '', redis: '' });
const services = buildServicesForEntry(entry);
expect(services.valkey).toBeUndefined();
expect(services.redis).toBeUndefined();
});
});
describe('mysql configuration', () => {
it('should include mysql when available', () => {
const entry = createTestEntry();
const services = buildServicesForEntry(entry);
expect(services.mysql).toBeDefined();
expect(services.mysql.image).toBe('mysql:8.4');
});
it('should not include mysql when empty', () => {
const entry = createTestEntry({ mysql: '' });
const services = buildServicesForEntry(entry);
expect(services.mysql).toBeUndefined();
});
it('should include correct mysql env configuration', () => {
const entry = createTestEntry();
const services = buildServicesForEntry(entry);
expect(services.mysql.env).toEqual({
MYSQL_DATABASE: 'magento_integration_tests',
MYSQL_USER: 'user',
MYSQL_PASSWORD: 'password',
MYSQL_ROOT_PASSWORD: 'rootpassword'
});
});
it('should include correct mysql ports', () => {
const entry = createTestEntry();
const services = buildServicesForEntry(entry);
expect(services.mysql.ports).toEqual(['3306:3306']);
});
it('should include mysql health check options', () => {
const entry = createTestEntry();
const services = buildServicesForEntry(entry);
expect(services.mysql.options).toContain('--health-cmd');
expect(services.mysql.options).toContain('mysqladmin ping');
});
});
describe('rabbitmq configuration', () => {
it('should include rabbitmq when available', () => {
const entry = createTestEntry();
const services = buildServicesForEntry(entry);
expect(services.rabbitmq).toBeDefined();
expect(services.rabbitmq.image).toBe('rabbitmq:4.0-management');
});
it('should not include rabbitmq when empty', () => {
const entry = createTestEntry({ rabbitmq: '' });
const services = buildServicesForEntry(entry);
expect(services.rabbitmq).toBeUndefined();
});
it('should include correct rabbitmq env configuration', () => {
const entry = createTestEntry();
const services = buildServicesForEntry(entry);
expect(services.rabbitmq.env).toEqual({
RABBITMQ_DEFAULT_USER: 'guest',
RABBITMQ_DEFAULT_PASS: 'guest'
});
});
it('should include correct rabbitmq ports', () => {
const entry = createTestEntry();
const services = buildServicesForEntry(entry);
expect(services.rabbitmq.ports).toEqual(['5672:5672']);
});
});
describe('opensearch configuration', () => {
it('should include correct opensearch env configuration', () => {
const entry = createTestEntry();
const services = buildServicesForEntry(entry);
expect(services.opensearch.env).toEqual({
'discovery.type': 'single-node',
'DISABLE_INSTALL_DEMO_CONFIG': 'true',
'DISABLE_SECURITY_PLUGIN': 'true'
});
});
it('should include correct opensearch ports', () => {
const entry = createTestEntry();
const services = buildServicesForEntry(entry);
expect(services.opensearch.ports).toEqual(['9200:9200']);
});
it('should include opensearch health check options', () => {
const entry = createTestEntry();
const services = buildServicesForEntry(entry);
expect(services.opensearch.options).toContain('--health-cmd');
expect(services.opensearch.options).toContain('curl');
});
});
describe('elasticsearch configuration', () => {
it('should include correct elasticsearch env configuration', () => {
const entry = createTestEntry({ opensearch: '' });
const services = buildServicesForEntry(entry);
expect(services.elasticsearch.env).toEqual({
'discovery.type': 'single-node',
'xpack.security.enabled': 'false',
'xpack.security.http.ssl.enabled': 'false',
'xpack.security.transport.ssl.enabled': 'false'
});
});
it('should include correct elasticsearch ports', () => {
const entry = createTestEntry({ opensearch: '' });
const services = buildServicesForEntry(entry);
expect(services.elasticsearch.ports).toEqual(['9200:9200']);
});
});
describe('cache configuration', () => {
it('should include correct valkey ports', () => {
const entry = createTestEntry();
const services = buildServicesForEntry(entry);
expect(services.valkey.ports).toEqual(['6379:6379']);
});
it('should include correct redis ports', () => {
const entry = createTestEntry({ valkey: '' });
const services = buildServicesForEntry(entry);
expect(services.redis.ports).toEqual(['6379:6379']);
});
});
describe('complete service output', () => {
it('should build all services when all are available', () => {
const entry = createTestEntry();
const services = buildServicesForEntry(entry);
expect(Object.keys(services)).toHaveLength(4);
expect(services.mysql).toBeDefined();
expect(services.opensearch).toBeDefined();
expect(services.rabbitmq).toBeDefined();
expect(services.valkey).toBeDefined();
});
it('should handle entry with minimal services', () => {
const entry = createTestEntry({
mysql: '',
elasticsearch: '',
opensearch: '',
rabbitmq: '',
redis: '',
valkey: ''
});
const services = buildServicesForEntry(entry);
expect(Object.keys(services)).toHaveLength(0);
});
});
});
@@ -0,0 +1,86 @@
import { PackageMatrixVersion, Services } from '../matrix/matrix-type';
import {
mysqlConfig,
elasticsearchConfig,
opensearchConfig,
rabbitmqConfig,
redisConfig,
valkeyConfig
} from './service-config';
interface SearchEngineChoice {
type: 'opensearch' | 'elasticsearch';
image: string;
}
interface CacheChoice {
type: 'valkey' | 'redis';
image: string;
}
/**
* Determines which search engine to use for a matrix entry.
* Prefers opensearch over elasticsearch.
*/
function getSearchEngineChoice(entry: PackageMatrixVersion): SearchEngineChoice | null {
if (entry.opensearch && entry.opensearch.trim() !== '') {
return { type: 'opensearch', image: entry.opensearch };
}
if (entry.elasticsearch && entry.elasticsearch.trim() !== '') {
return { type: 'elasticsearch', image: entry.elasticsearch };
}
return null;
}
/**
* Determines which cache to use for a matrix entry.
* Prefers valkey over redis.
*/
function getCacheChoice(entry: PackageMatrixVersion): CacheChoice | null {
if (entry.valkey && entry.valkey.trim() !== '') {
return { type: 'valkey', image: entry.valkey };
}
if (entry.redis && entry.redis.trim() !== '') {
return { type: 'redis', image: entry.redis };
}
return null;
}
/**
* Builds the services object for a single matrix entry.
*/
export function buildServicesForEntry(entry: PackageMatrixVersion): Services {
const services: Services = {};
// MySQL is always included if present
if (entry.mysql && entry.mysql.trim() !== '') {
services.mysql = mysqlConfig.getConfig(entry.mysql);
}
// Search engine: prefer opensearch over elasticsearch
const searchEngine = getSearchEngineChoice(entry);
if (searchEngine) {
if (searchEngine.type === 'opensearch') {
services.opensearch = opensearchConfig.getConfig(searchEngine.image);
} else {
services.elasticsearch = elasticsearchConfig.getConfig(searchEngine.image);
}
}
// RabbitMQ
if (entry.rabbitmq && entry.rabbitmq.trim() !== '') {
services.rabbitmq = rabbitmqConfig.getConfig(entry.rabbitmq);
}
// Cache: prefer valkey over redis
const cache = getCacheChoice(entry);
if (cache) {
if (cache.type === 'valkey') {
services.valkey = valkeyConfig.getConfig(cache.image);
} else {
services.redis = redisConfig.getConfig(cache.image);
}
}
return services;
}
@@ -0,0 +1,83 @@
import { ServiceConfig } from '../matrix/matrix-type';
export interface ServiceTemplate {
getConfig(image: string): ServiceConfig;
}
export const mysqlConfig: ServiceTemplate = {
getConfig(image: string): ServiceConfig {
return {
image,
env: {
MYSQL_DATABASE: 'magento_integration_tests',
MYSQL_USER: 'user',
MYSQL_PASSWORD: 'password',
MYSQL_ROOT_PASSWORD: 'rootpassword'
},
ports: ['3306:3306'],
options: '--health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3'
};
}
};
export const elasticsearchConfig: ServiceTemplate = {
getConfig(image: string): ServiceConfig {
return {
image,
env: {
'discovery.type': 'single-node',
'xpack.security.enabled': 'false',
'xpack.security.http.ssl.enabled': 'false',
'xpack.security.transport.ssl.enabled': 'false'
},
ports: ['9200:9200'],
options: '--health-cmd "curl http://localhost:9200/_cluster/health" --health-interval 10s --health-timeout 5s --health-retries 10'
};
}
};
export const opensearchConfig: ServiceTemplate = {
getConfig(image: string): ServiceConfig {
return {
image,
env: {
'discovery.type': 'single-node',
'DISABLE_INSTALL_DEMO_CONFIG': 'true',
'DISABLE_SECURITY_PLUGIN': 'true'
},
ports: ['9200:9200'],
options: '--health-cmd "curl http://localhost:9200/_cluster/health" --health-interval 10s --health-timeout 5s --health-retries 10'
};
}
};
export const rabbitmqConfig: ServiceTemplate = {
getConfig(image: string): ServiceConfig {
return {
image,
env: {
RABBITMQ_DEFAULT_USER: 'guest',
RABBITMQ_DEFAULT_PASS: 'guest'
},
ports: ['5672:5672']
};
}
};
export const redisConfig: ServiceTemplate = {
getConfig(image: string): ServiceConfig {
return {
image,
ports: ['6379:6379']
};
}
};
export const valkeyConfig: ServiceTemplate = {
getConfig(image: string): ServiceConfig {
return {
image,
ports: ['6379:6379']
};
}
};
@@ -1,22 +1,36 @@
{
"mage-os/project-community-edition": {
"magento": "mage-os/project-community-edition",
"php": 8.1,
"composer": "2.2.21",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:8.5.3",
"rabbitmq": "rabbitmq:3.9-management",
"redis": "redis:7.0",
"varnish": "varnish:7.3",
"nginx": "nginx:1.22",
"php": 8.4,
"composer": "2.9.5",
"mysql": "mysql:8.4",
"opensearch": "opensearchproject/opensearch:3",
"rabbitmq": "rabbitmq:4.1-management",
"valkey": "valkey/valkey:8.0",
"varnish": "varnish:7.7",
"nginx": "nginx:1.28",
"os": "ubuntu-latest",
"release": "2023-10-10T00:00:00+0000",
"eol": "2026-10-10T00:00:00+0000"
"release": "2026-03-10T00:00:00+0000",
"eol": "2029-03-10T00:00:00+0000"
},
"mage-os/project-community-edition:next": {
"magento": "mage-os/project-community-edition:next",
"php": 8.4,
"composer": "2.9.5",
"mysql": "mysql:8.4",
"opensearch": "opensearchproject/opensearch:3",
"rabbitmq": "rabbitmq:4.1-management",
"valkey": "valkey/valkey:8.0",
"varnish": "varnish:7.7",
"nginx": "nginx:1.28",
"os": "ubuntu-latest",
"release": "2026-03-10T00:00:00+0000",
"eol": "2029-03-10T00:00:00+0000"
},
"mage-os/project-community-edition:>=1.0 <1.1": {
"magento": "mage-os/project-community-edition:>=1.0 <1.1",
"php": 8.3,
"composer": "2",
"composer": "2.9.5",
"mysql": "mariadb:10.6",
"elasticsearch": "elasticsearch:8.11.4",
"rabbitmq": "rabbitmq:3.13-management",
@@ -24,7 +38,91 @@
"varnish": "varnish:7.5",
"nginx": "nginx:1.26",
"os": "ubuntu-latest",
"release": "2024-10-10T00:00:00+0000",
"eol": "2026-10-10T00:00:00+0000"
"release": "2023-10-10T00:00:00+0000",
"eol": "2025-04-07T00:00:00+0000"
},
"mage-os/project-community-edition:>=1.1 <1.2": {
"magento": "mage-os/project-community-edition:>=1.1 <1.2",
"php": 8.4,
"composer": "2.9.5",
"mysql": "mysql:8.4",
"opensearch": "opensearchproject/opensearch:2.19.1",
"rabbitmq": "rabbitmq:4.0-management",
"redis": "redis:7.2",
"varnish": "varnish:7.6",
"nginx": "nginx:1.26",
"os": "ubuntu-latest",
"release": "2025-04-15T00:00:00+0000",
"eol": "2025-06-16T00:00:00+0000"
},
"mage-os/project-community-edition:>=1.2 <1.3": {
"magento": "mage-os/project-community-edition:>=1.2 <1.3",
"php": 8.4,
"composer": "2.9.5",
"mysql": "mysql:8.4",
"opensearch": "opensearchproject/opensearch:2.19.1",
"rabbitmq": "rabbitmq:4.0-management",
"redis": "redis:7.2",
"varnish": "varnish:7.6",
"nginx": "nginx:1.26",
"os": "ubuntu-latest",
"release": "2025-06-17T00:00:00+0000",
"eol": "2025-08-12T00:00:00+0000"
},
"mage-os/project-community-edition:>=1.3 <1.4": {
"magento": "mage-os/project-community-edition:>=1.2 <1.3",
"php": 8.4,
"composer": "2.9.5",
"mysql": "mysql:8.4",
"opensearch": "opensearchproject/opensearch:2.19.1",
"rabbitmq": "rabbitmq:4.0-management",
"redis": "redis:7.2",
"varnish": "varnish:7.6",
"nginx": "nginx:1.26",
"os": "ubuntu-latest",
"release": "2025-08-13T00:00:00+0000",
"eol": "2025-10-16T00:00:00+0000"
},
"mage-os/project-community-edition:>=2.0 <2.1": {
"magento": "mage-os/project-community-edition:>=2.0 <2.1",
"php": 8.4,
"composer": "2.9.5",
"mysql": "mysql:8.4",
"opensearch": "opensearchproject/opensearch:2.19.1",
"rabbitmq": "rabbitmq:4.0-management",
"redis": "redis:7.2",
"varnish": "varnish:7.6",
"nginx": "nginx:1.26",
"os": "ubuntu-latest",
"release": "2025-10-16T00:00:00+0000",
"eol": "2026-01-20T00:00:00+0000"
},
"mage-os/project-community-edition:>=2.1 <2.2": {
"magento": "mage-os/project-community-edition:>=2.1 <2.2",
"php": 8.4,
"composer": "2.9.5",
"mysql": "mysql:8.4",
"opensearch": "opensearchproject/opensearch:2.19.1",
"rabbitmq": "rabbitmq:4.0-management",
"redis": "redis:7.2",
"varnish": "varnish:7.6",
"nginx": "nginx:1.26",
"os": "ubuntu-latest",
"release": "2026-01-20T00:00:00+0000",
"eol": "2026-03-10T00:00:00+0000"
},
"mage-os/project-community-edition:>=2.2 <2.3": {
"magento": "mage-os/project-community-edition:>=2.2 <2.3",
"php": 8.4,
"composer": "2.9.3",
"mysql": "mysql:8.4",
"opensearch": "opensearchproject/opensearch:3",
"rabbitmq": "rabbitmq:4.1-management",
"valkey": "valkey/valkey:8.0",
"varnish": "varnish:7.7",
"nginx": "nginx:1.28",
"os": "ubuntu-latest",
"release": "2026-03-10T00:00:00+0000",
"eol": "2029-03-10T00:00:00+0000"
}
}
@@ -1,6 +1,7 @@
{
"mage-os/project-community-edition:1.0.0": {
"magento": "mage-os/project-community-edition:1.0.0",
"upstream": "2.4.6-p3",
"php": 8.1,
"composer": "2.2.21",
"mysql": "mysql:8.0",
@@ -15,6 +16,7 @@
},
"mage-os/project-community-edition:1.0.1": {
"magento": "mage-os/project-community-edition:1.0.1",
"upstream": "2.4.6-p3",
"php": 8.1,
"composer": "2.2.21",
"mysql": "mysql:8.0",
@@ -29,6 +31,7 @@
},
"mage-os/project-community-edition:1.0.2": {
"magento": "mage-os/project-community-edition:1.0.2",
"upstream": "2.4.7-p1",
"php": 8.3,
"composer": "2.7.4",
"mysql": "mariadb:10.6",
@@ -43,6 +46,7 @@
},
"mage-os/project-community-edition:1.0.3": {
"magento": "mage-os/project-community-edition:1.0.3",
"upstream": "2.4.7-p1",
"php": 8.3,
"composer": "2.7.4",
"mysql": "mariadb:10.6",
@@ -57,6 +61,7 @@
},
"mage-os/project-community-edition:1.0.4": {
"magento": "mage-os/project-community-edition:1.0.4",
"upstream": "2.4.7-p2",
"php": 8.3,
"composer": "2.7.4",
"mysql": "mariadb:10.6",
@@ -71,6 +76,7 @@
},
"mage-os/project-community-edition:1.0.5": {
"magento": "mage-os/project-community-edition:1.0.5",
"upstream": "2.4.7-p3",
"php": 8.3,
"composer": "2.7.4",
"mysql": "mariadb:10.6",
@@ -85,6 +91,7 @@
},
"mage-os/project-community-edition:1.0.6": {
"magento": "mage-os/project-community-edition:1.0.6",
"upstream": "2.4.7-p4",
"php": 8.3,
"composer": "2.7.4",
"mysql": "mariadb:10.6",
@@ -95,6 +102,126 @@
"nginx": "nginx:1.26",
"os": "ubuntu-latest",
"release": "2025-02-12T00:00:00+0000",
"eol": "2027-02-14T00:00:00+0000"
"eol": "2025-04-07T00:00:00+0000"
},
"mage-os/project-community-edition:1.1.0": {
"magento": "mage-os/project-community-edition:1.1.0",
"upstream": "2.4.8",
"php": 8.4,
"composer": "2.9.5",
"mysql": "mysql:8.4",
"opensearch": "opensearchproject/opensearch:2.19.1",
"rabbitmq": "rabbitmq:4.0-management",
"redis": "redis:7.2",
"varnish": "varnish:7.6",
"nginx": "nginx:1.26",
"os": "ubuntu-latest",
"release": "2025-04-15T00:00:00+0000",
"eol": "2025-04-21T00:00:00+0000"
},
"mage-os/project-community-edition:1.1.1": {
"magento": "mage-os/project-community-edition:1.1.1",
"upstream": "2.4.8",
"php": 8.4,
"composer": "2.9.5",
"mysql": "mysql:8.4",
"opensearch": "opensearchproject/opensearch:2.19.1",
"rabbitmq": "rabbitmq:4.0-management",
"redis": "redis:7.2",
"varnish": "varnish:7.6",
"nginx": "nginx:1.26",
"os": "ubuntu-latest",
"release": "2025-04-22T00:00:00+0000",
"eol": "2025-06-16T00:00:00+0000"
},
"mage-os/project-community-edition:1.2.0": {
"magento": "mage-os/project-community-edition:1.2.0",
"upstream": "2.4.8-p1",
"php": 8.4,
"composer": "2.9.5",
"mysql": "mysql:8.4",
"opensearch": "opensearchproject/opensearch:2.19.1",
"rabbitmq": "rabbitmq:4.0-management",
"redis": "redis:7.2",
"varnish": "varnish:7.6",
"nginx": "nginx:1.26",
"os": "ubuntu-latest",
"release": "2025-06-17T00:00:00+0000",
"eol": "2025-08-12T00:00:00+0000"
},
"mage-os/project-community-edition:1.3.0": {
"magento": "mage-os/project-community-edition:1.3.0",
"upstream": "2.4.8-p2",
"php": 8.4,
"composer": "2.9.5",
"mysql": "mysql:8.4",
"opensearch": "opensearchproject/opensearch:2.19.1",
"rabbitmq": "rabbitmq:4.0-management",
"redis": "redis:7.2",
"varnish": "varnish:7.6",
"nginx": "nginx:1.26",
"os": "ubuntu-latest",
"release": "2025-08-13T00:00:00+0000",
"eol": "2025-09-08T00:00:00+0000"
},
"mage-os/project-community-edition:1.3.1": {
"magento": "mage-os/project-community-edition:1.3.1",
"upstream": "2.4.8-p2",
"php": 8.4,
"composer": "2.9.5",
"mysql": "mysql:8.4",
"opensearch": "opensearchproject/opensearch:2.19.1",
"rabbitmq": "rabbitmq:4.0-management",
"redis": "redis:7.2",
"varnish": "varnish:7.6",
"nginx": "nginx:1.26",
"os": "ubuntu-latest",
"release": "2025-09-09T00:00:00+0000",
"eol": "2025-10-16T00:00:00+0000"
},
"mage-os/project-community-edition:2.0.0": {
"magento": "mage-os/project-community-edition:2.0.0",
"upstream": "2.4.8-p3",
"php": 8.4,
"composer": "2.9.5",
"mysql": "mysql:8.4",
"opensearch": "opensearchproject/opensearch:2.19.1",
"rabbitmq": "rabbitmq:4.0-management",
"redis": "redis:7.2",
"varnish": "varnish:7.6",
"nginx": "nginx:1.26",
"os": "ubuntu-latest",
"release": "2025-10-16T00:00:00+0000",
"eol": "2026-01-20T00:00:00+0000"
},
"mage-os/project-community-edition:2.1.0": {
"magento": "mage-os/project-community-edition:2.1.0",
"upstream": "2.4.8-p3",
"php": 8.4,
"composer": "2.9.5",
"mysql": "mysql:8.4",
"opensearch": "opensearchproject/opensearch:2.19.1",
"rabbitmq": "rabbitmq:4.0-management",
"redis": "redis:7.2",
"varnish": "varnish:7.6",
"nginx": "nginx:1.26",
"os": "ubuntu-latest",
"release": "2026-01-20T00:00:00+0000",
"eol": "2026-03-10T00:00:00+0000"
},
"mage-os/project-community-edition:2.2.0": {
"magento": "mage-os/project-community-edition:2.2.0",
"upstream": "2.4.8-p4",
"php": 8.4,
"composer": "2.9.3",
"mysql": "mysql:8.4",
"opensearch": "opensearchproject/opensearch:3",
"rabbitmq": "rabbitmq:4.1-management",
"valkey": "valkey/valkey:8.0",
"varnish": "varnish:7.7",
"nginx": "nginx:1.28",
"os": "ubuntu-latest",
"release": "2026-03-10T00:00:00+0000",
"eol": "2029-03-10T00:00:00+0000"
}
}
@@ -44,7 +44,7 @@
"magento/project-community-edition:>=2.4.2 <2.4.3": {
"magento": "magento/project-community-edition:>=2.4.2 <2.4.3",
"php": 7.4,
"composer": 2,
"composer": "2.2.21",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:7.9.3",
"rabbitmq": "rabbitmq:3.8-management",
@@ -58,7 +58,7 @@
"magento/project-community-edition:>=2.4.3 <2.4.4": {
"magento": "magento/project-community-edition:>=2.4.3 <2.4.4",
"php": 7.4,
"composer": 2,
"composer": "2.2.21",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:7.16.3",
"rabbitmq": "rabbitmq:3.8-management",
@@ -100,27 +100,29 @@
"magento/project-community-edition:>=2.4.6 <2.4.7": {
"magento": "magento/project-community-edition:>=2.4.6 <2.4.7",
"php": 8.2,
"composer": "2.2.25",
"composer": "2.2.26",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:8.17.4",
"rabbitmq": "rabbitmq:3.13-management",
"elasticsearch": "elasticsearch:8.19.2",
"rabbitmq": "rabbitmq:4.1-management",
"redis": "redis:7.2",
"varnish": "varnish:7.6",
"nginx": "nginx:1.26",
"varnish": "varnish:7.7",
"nginx": "nginx:1.28",
"os": "ubuntu-latest",
"release": "2025-04-08T00:00:00+0000",
"eol": "2026-03-14T00:00:00+0000"
"eol": "2026-08-11T00:00:00+0000"
},
"magento/project-community-edition:>=2.4.7 <2.4.8": {
"magento": "magento/project-community-edition:>=2.4.7 <2.4.8",
"php": 8.3,
"composer": "2.8.8",
"composer": "2.9.5",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:8.17.4",
"rabbitmq": "rabbitmq:3.13-management",
"opensearch": "opensearchproject/opensearch:2.19.5",
"rabbitmq": "rabbitmq:4.1-management",
"redis": "redis:7.2",
"varnish": "varnish:7.6",
"nginx": "nginx:1.26",
"valkey": "valkey/valkey:8.0",
"varnish": "varnish:7.7",
"nginx": "nginx:1.28",
"os": "ubuntu-latest",
"release": "2025-04-08T00:00:00+0000",
"eol": "2027-04-09T00:00:00+0000"
@@ -128,44 +130,41 @@
"magento/project-community-edition:>=2.4.8 <2.4.9": {
"magento": "magento/project-community-edition:>=2.4.8 <2.4.9",
"php": 8.4,
"composer": "2.8.8",
"composer": "2.9.5",
"mysql": "mysql:8.4",
"elasticsearch": "elasticsearch:8.17.4",
"rabbitmq": "rabbitmq:4.0-management",
"redis": "redis:7.2",
"valkey": "valkey:8.0",
"varnish": "varnish:7.6",
"nginx": "nginx:1.26",
"opensearch": "opensearchproject/opensearch:3",
"rabbitmq": "rabbitmq:4.1-management",
"valkey": "valkey/valkey:8.0",
"varnish": "varnish:7.7",
"nginx": "nginx:1.28",
"os": "ubuntu-latest",
"release": "2025-04-08T00:00:00+0000",
"eol": "2028-04-09T00:00:00+0000"
},
"magento/project-community-edition": {
"magento": "magento/project-community-edition:>=2.4.8 <2.4.9",
"magento": "magento/project-community-edition",
"php": 8.4,
"composer": "2.8.8",
"composer": "2.9.5",
"mysql": "mysql:8.4",
"elasticsearch": "elasticsearch:8.17.4",
"rabbitmq": "rabbitmq:4.0-management",
"redis": "redis:7.2",
"valkey": "valkey:8.0",
"varnish": "varnish:7.6",
"nginx": "nginx:1.26",
"opensearch": "opensearchproject/opensearch:3",
"rabbitmq": "rabbitmq:4.1-management",
"valkey": "valkey/valkey:8.0",
"varnish": "varnish:7.7",
"nginx": "nginx:1.28",
"os": "ubuntu-latest",
"release": "2025-04-08T00:00:00+0000",
"eol": "2028-04-09T00:00:00+0000"
},
"magento/project-community-edition:next": {
"magento": "magento/project-community-edition:>=2.4.8 <2.4.9",
"magento": "magento/project-community-edition:@alpha",
"php": 8.4,
"composer": "2.8.8",
"composer": "2.9.5",
"mysql": "mysql:8.4",
"elasticsearch": "elasticsearch:8.17.4",
"rabbitmq": "rabbitmq:4.0-management",
"redis": "redis:7.2",
"valkey": "valkey:8.0",
"varnish": "varnish:7.6",
"nginx": "nginx:1.26",
"valkey": "valkey/valkey:8.0",
"opensearch": "opensearchproject/opensearch:3",
"rabbitmq": "rabbitmq:4.1-management",
"varnish": "varnish:7.7",
"nginx": "nginx:1.28",
"os": "ubuntu-latest",
"release": "2025-04-08T00:00:00+0000",
"eol": "2028-04-09T00:00:00+0000"
@@ -86,7 +86,7 @@
"magento/project-community-edition:2.4.2": {
"magento": "magento/project-community-edition:2.4.2",
"php": 7.4,
"composer": 2,
"composer": "2.2.21",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:7.9.3",
"rabbitmq": "rabbitmq:3.8-management",
@@ -100,7 +100,7 @@
"magento/project-community-edition:2.4.2-p1": {
"magento": "magento/project-community-edition:2.4.2-p1",
"php": 7.4,
"composer": 2,
"composer": "2.2.21",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:7.9.3",
"rabbitmq": "rabbitmq:3.8-management",
@@ -114,7 +114,7 @@
"magento/project-community-edition:2.4.2-p2": {
"magento": "magento/project-community-edition:2.4.2-p2",
"php": 7.4,
"composer": 2,
"composer": "2.2.21",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:7.9.3",
"rabbitmq": "rabbitmq:3.8-management",
@@ -128,7 +128,7 @@
"magento/project-community-edition:2.4.3": {
"magento": "magento/project-community-edition:2.4.3",
"php": 7.4,
"composer": 2,
"composer": "2.2.21",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:7.16.3",
"rabbitmq": "rabbitmq:3.8-management",
@@ -142,7 +142,7 @@
"magento/project-community-edition:2.4.3-p1": {
"magento": "magento/project-community-edition:2.4.3-p1",
"php": 7.4,
"composer": 2,
"composer": "2.2.21",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:7.16.3",
"rabbitmq": "rabbitmq:3.8-management",
@@ -156,7 +156,7 @@
"magento/project-community-edition:2.4.3-p2": {
"magento": "magento/project-community-edition:2.4.3-p2",
"php": 7.4,
"composer": 2,
"composer": "2.2.21",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:7.16.3",
"rabbitmq": "rabbitmq:3.8-management",
@@ -170,7 +170,7 @@
"magento/project-community-edition:2.4.3-p3": {
"magento": "magento/project-community-edition:2.4.3-p3",
"php": 7.4,
"composer": 2,
"composer": "2.2.21",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:7.16.3",
"rabbitmq": "rabbitmq:3.8-management",
@@ -184,7 +184,7 @@
"magento/project-community-edition:2.4.4": {
"magento": "magento/project-community-edition:2.4.4",
"php": 8.1,
"composer": 2,
"composer": "2.2.21",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:7.16.3",
"rabbitmq": "rabbitmq:3.9-management",
@@ -198,7 +198,7 @@
"magento/project-community-edition:2.4.4-p1": {
"magento": "magento/project-community-edition:2.4.4-p1",
"php": 8.1,
"composer": 2,
"composer": "2.2.21",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:7.16.3",
"rabbitmq": "rabbitmq:3.9-management",
@@ -212,7 +212,7 @@
"magento/project-community-edition:2.4.4-p2": {
"magento": "magento/project-community-edition:2.4.4-p2",
"php": 8.1,
"composer": 2,
"composer": "2.2.21",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:7.16.3",
"rabbitmq": "rabbitmq:3.9-management",
@@ -319,7 +319,7 @@
"nginx": "nginx:1.22",
"os": "ubuntu-latest",
"release": "2024-06-11T00:00:00+0000",
"eol": "2024-08-12T00:00:00+0000"
"eol": "2024-08-13T00:00:00+0000"
},
"magento/project-community-edition:2.4.4-p10": {
"magento": "magento/project-community-edition:2.4.4-p10",
@@ -333,7 +333,7 @@
"nginx": "nginx:1.22",
"os": "ubuntu-latest",
"release": "2024-08-13T00:00:00+0000",
"eol": "2024-10-07T00:00:00+0000"
"eol": "2024-10-08T00:00:00+0000"
},
"magento/project-community-edition:2.4.4-p11": {
"magento": "magento/project-community-edition:2.4.4-p11",
@@ -347,7 +347,7 @@
"nginx": "nginx:1.22",
"os": "ubuntu-latest",
"release": "2024-10-08T00:00:00+0000",
"eol": "2025-02-10T00:00:00+0000"
"eol": "2025-02-11T00:00:00+0000"
},
"magento/project-community-edition:2.4.4-p12": {
"magento": "magento/project-community-edition:2.4.4-p12",
@@ -361,7 +361,7 @@
"nginx": "nginx:1.22",
"os": "ubuntu-latest",
"release": "2025-02-11T00:00:00+0000",
"eol": "2025-04-07T23:59:59+0000"
"eol": "2025-04-08T00:00:00+0000"
},
"magento/project-community-edition:2.4.4-p13": {
"magento": "magento/project-community-edition:2.4.4-p13",
@@ -380,7 +380,7 @@
"magento/project-community-edition:2.4.5": {
"magento": "magento/project-community-edition:2.4.5",
"php": 8.1,
"composer": 2,
"composer": "2.2.21",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:7.17.5",
"rabbitmq": "rabbitmq:3.9-management",
@@ -389,12 +389,12 @@
"nginx": "nginx:1.22",
"os": "ubuntu-latest",
"release": "2022-08-09T00:00:00+0000",
"eol": "2022-08-09T00:00:00+0000"
"eol": "2022-10-11T00:00:00+0000"
},
"magento/project-community-edition:2.4.5-p1": {
"magento": "magento/project-community-edition:2.4.5-p1",
"php": 8.1,
"composer": 2,
"composer": "2.2.21",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:7.17.5",
"rabbitmq": "rabbitmq:3.9-management",
@@ -501,7 +501,7 @@
"nginx": "nginx:1.22",
"os": "ubuntu-latest",
"release": "2024-06-11T00:00:00+0000",
"eol": "2024-08-12T00:00:00+0000"
"eol": "2024-08-13T00:00:00+0000"
},
"magento/project-community-edition:2.4.5-p9": {
"magento": "magento/project-community-edition:2.4.5-p9",
@@ -515,7 +515,7 @@
"nginx": "nginx:1.22",
"os": "ubuntu-latest",
"release": "2024-08-13T00:00:00+0000",
"eol": "2024-10-07T00:00:00+0000"
"eol": "2024-10-08T00:00:00+0000"
},
"magento/project-community-edition:2.4.5-p10": {
"magento": "magento/project-community-edition:2.4.5-p10",
@@ -529,7 +529,7 @@
"nginx": "nginx:1.22",
"os": "ubuntu-latest",
"release": "2024-10-08T00:00:00+0000",
"eol": "2025-02-10T00:00:00+0000"
"eol": "2025-02-11T00:00:00+0000"
},
"magento/project-community-edition:2.4.5-p11": {
"magento": "magento/project-community-edition:2.4.5-p11",
@@ -543,7 +543,7 @@
"nginx": "nginx:1.22",
"os": "ubuntu-latest",
"release": "2025-02-11T00:00:00+0000",
"eol": "2025-04-07T23:59:59+0000"
"eol": "2025-04-08T00:00:00+0000"
},
"magento/project-community-edition:2.4.5-p12": {
"magento": "magento/project-community-edition:2.4.5-p12",
@@ -557,12 +557,40 @@
"nginx": "nginx:1.26",
"os": "ubuntu-latest",
"release": "2025-04-08T00:00:00+0000",
"eol": "2025-08-09T00:00:00+0000"
"eol": "2025-06-10T00:00:00+0000"
},
"magento/project-community-edition:2.4.5-p13": {
"magento": "magento/project-community-edition:2.4.5-p13",
"php": 8.1,
"composer": "2.2.21",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:7.17.5",
"rabbitmq": "rabbitmq:3.11-management",
"redis": "redis:6.2",
"varnish": "varnish:7.1",
"nginx": "nginx:1.22",
"os": "ubuntu-latest",
"release": "2025-06-10T00:00:00+0000",
"eol": "2025-08-12T00:00:00+0000"
},
"magento/project-community-edition:2.4.5-p14": {
"magento": "magento/project-community-edition:2.4.5-p14",
"php": 8.1,
"composer": "2.2.21",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:7.17.5",
"rabbitmq": "rabbitmq:3.11-management",
"redis": "redis:6.2",
"varnish": "varnish:7.1",
"nginx": "nginx:1.22",
"os": "ubuntu-latest",
"release": "2025-08-12T00:00:00+0000",
"eol": "2025-08-12T00:00:00+0000"
},
"magento/project-community-edition:2.4.6": {
"magento": "magento/project-community-edition:2.4.6",
"php": 8.1,
"composer": "2.2.21",
"composer": "2.2.26",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:7.17.5",
"rabbitmq": "rabbitmq:3.9-management",
@@ -576,7 +604,7 @@
"magento/project-community-edition:2.4.6-p1": {
"magento": "magento/project-community-edition:2.4.6-p1",
"php": 8.1,
"composer": "2.2.21",
"composer": "2.2.26",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:8.5.3",
"rabbitmq": "rabbitmq:3.9-management",
@@ -590,7 +618,7 @@
"magento/project-community-edition:2.4.6-p2": {
"magento": "magento/project-community-edition:2.4.6-p2",
"php": 8.1,
"composer": "2.2.21",
"composer": "2.2.26",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:8.5.3",
"rabbitmq": "rabbitmq:3.9-management",
@@ -604,13 +632,13 @@
"magento/project-community-edition:2.4.6-p3": {
"magento": "magento/project-community-edition:2.4.6-p3",
"php": 8.1,
"composer": "2.2.21",
"composer": "2.2.26",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:8.5.3",
"rabbitmq": "rabbitmq:3.9-management",
"redis": "redis:7.0",
"varnish": "varnish:7.3",
"nginx": "nginx:1.22",
"nginx": "nginx:1.26",
"os": "ubuntu-latest",
"release": "2023-10-10T00:00:00+0000",
"eol": "2024-02-12T00:00:00+0000"
@@ -618,13 +646,13 @@
"magento/project-community-edition:2.4.6-p4": {
"magento": "magento/project-community-edition:2.4.6-p4",
"php": 8.1,
"composer": "2.2.21",
"composer": "2.2.26",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:8.5.3",
"rabbitmq": "rabbitmq:3.9-management",
"redis": "redis:7.0",
"varnish": "varnish:7.3",
"nginx": "nginx:1.22",
"nginx": "nginx:1.26",
"os": "ubuntu-latest",
"release": "2024-02-12T00:00:00+0000",
"eol": "2024-04-09T00:00:00+0000"
@@ -632,13 +660,13 @@
"magento/project-community-edition:2.4.6-p5": {
"magento": "magento/project-community-edition:2.4.6-p5",
"php": 8.1,
"composer": "2.2.21",
"composer": "2.2.26",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:8.5.3",
"rabbitmq": "rabbitmq:3.9-management",
"redis": "redis:7.0",
"varnish": "varnish:7.3",
"nginx": "nginx:1.22",
"nginx": "nginx:1.26",
"os": "ubuntu-latest",
"release": "2024-04-09T00:00:00+0000",
"eol": "2024-06-11T00:00:00+0000"
@@ -646,63 +674,63 @@
"magento/project-community-edition:2.4.6-p6": {
"magento": "magento/project-community-edition:2.4.6-p6",
"php": 8.1,
"composer": "2.2.21",
"composer": "2.2.26",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:8.5.3",
"rabbitmq": "rabbitmq:3.9-management",
"redis": "redis:7.0",
"varnish": "varnish:7.3",
"nginx": "nginx:1.22",
"nginx": "nginx:1.26",
"os": "ubuntu-latest",
"release": "2024-06-11T00:00:00+0000",
"eol": "2024-08-12T00:00:00+0000"
"eol": "2024-08-13T00:00:00+0000"
},
"magento/project-community-edition:2.4.6-p7": {
"magento": "magento/project-community-edition:2.4.6-p7",
"php": 8.1,
"composer": "2.2.21",
"composer": "2.2.26",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:8.5.3",
"rabbitmq": "rabbitmq:3.9-management",
"redis": "redis:7.0",
"varnish": "varnish:7.3",
"nginx": "nginx:1.22",
"nginx": "nginx:1.26",
"os": "ubuntu-latest",
"release": "2024-08-13T00:00:00+0000",
"eol": "2024-10-07T00:00:00+0000"
"eol": "2024-10-08T00:00:00+0000"
},
"magento/project-community-edition:2.4.6-p8": {
"magento": "magento/project-community-edition:2.4.6-p8",
"php": 8.1,
"composer": "2.2.21",
"composer": "2.2.26",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:8.5.3",
"rabbitmq": "rabbitmq:3.9-management",
"redis": "redis:7.0",
"varnish": "varnish:7.3",
"nginx": "nginx:1.22",
"nginx": "nginx:1.26",
"os": "ubuntu-latest",
"release": "2024-10-08T00:00:00+0000",
"eol": "2025-02-10T00:00:00+0000"
"eol": "2025-02-11T00:00:00+0000"
},
"magento/project-community-edition:2.4.6-p9": {
"magento": "magento/project-community-edition:2.4.6-p9",
"php": 8.1,
"composer": "2.2.21",
"composer": "2.2.26",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:8.5.3",
"rabbitmq": "rabbitmq:3.9-management",
"redis": "redis:7.0",
"varnish": "varnish:7.3",
"nginx": "nginx:1.22",
"nginx": "nginx:1.26",
"os": "ubuntu-latest",
"release": "2025-02-11T00:00:00+0000",
"eol": "2025-04-07T23:59:59+0000"
"eol": "2025-04-08T00:00:00+0000"
},
"magento/project-community-edition:2.4.6-p10": {
"magento": "magento/project-community-edition:2.4.6-p10",
"php": 8.2,
"composer": "2.2.25",
"composer": "2.2.26",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:8.17.4",
"rabbitmq": "rabbitmq:3.13-management",
@@ -711,12 +739,70 @@
"nginx": "nginx:1.26",
"os": "ubuntu-latest",
"release": "2025-04-08T00:00:00+0000",
"eol": "2026-03-14T00:00:00+0000"
"eol": "2025-06-10T00:00:00+0000"
},
"magento/project-community-edition:2.4.6-p11": {
"magento": "magento/project-community-edition:2.4.6-p11",
"php": 8.1,
"composer": "2.2.26",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:8.5.3",
"rabbitmq": "rabbitmq:3.13-management",
"redis": "redis:7.2",
"varnish": "varnish:7.3",
"nginx": "nginx:1.26",
"os": "ubuntu-latest",
"release": "2025-06-10T00:00:00+0000",
"eol": "2025-08-12T00:00:00+0000"
},
"magento/project-community-edition:2.4.6-p12": {
"magento": "magento/project-community-edition:2.4.6-p12",
"php": 8.1,
"composer": "2.2.26",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:8.5.3",
"rabbitmq": "rabbitmq:3.13-management",
"redis": "redis:7.2",
"varnish": "varnish:7.3",
"nginx": "nginx:1.28",
"os": "ubuntu-latest",
"release": "2025-08-12T00:00:00+0000",
"eol": "2025-10-14T00:00:00+0000"
},
"magento/project-community-edition:2.4.6-p13": {
"magento": "magento/project-community-edition:2.4.6-p13",
"php": 8.1,
"composer": "2.2.26",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:8.5.3",
"rabbitmq": "rabbitmq:3.13-management",
"redis": "redis:7.2",
"varnish": "varnish:7.3",
"nginx": "nginx:1.28",
"os": "ubuntu-latest",
"release": "2025-10-14T00:00:00+0000",
"eol": "2026-03-09T00:00:00+0000"
},
"magento/project-community-edition:2.4.6-p14": {
"magento": "magento/project-community-edition:2.4.6-p14",
"php": 8.2,
"composer": "2.2.26",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:8.19.2",
"opensearch": "opensearchproject/opensearch:2.19.5",
"rabbitmq": "rabbitmq:4.1-management",
"redis": "redis:7.2",
"valkey": "valkey/valkey:8.0",
"varnish": "varnish:7.7",
"nginx": "nginx:1.28",
"os": "ubuntu-latest",
"release": "2026-03-10T00:00:00+0000",
"eol": "2026-08-11T00:00:00+0000"
},
"magento/project-community-edition:2.4.7": {
"magento": "magento/project-community-edition:2.4.7",
"php": 8.3,
"composer": "2.7.4",
"composer": "2.9.5",
"mysql": "mariadb:10.6",
"elasticsearch": "elasticsearch:8.11.4",
"rabbitmq": "rabbitmq:3.13-management",
@@ -730,7 +816,7 @@
"magento/project-community-edition:2.4.7-p1": {
"magento": "magento/project-community-edition:2.4.7-p1",
"php": 8.3,
"composer": "2.7.4",
"composer": "2.9.5",
"mysql": "mariadb:10.6",
"elasticsearch": "elasticsearch:8.11.4",
"rabbitmq": "rabbitmq:3.13-management",
@@ -739,12 +825,12 @@
"nginx": "nginx:1.26",
"os": "ubuntu-latest",
"release": "2024-06-11T00:00:00+0000",
"eol": "2024-08-12T00:00:00+0000"
"eol": "2024-08-13T00:00:00+0000"
},
"magento/project-community-edition:2.4.7-p2": {
"magento": "magento/project-community-edition:2.4.7-p2",
"php": 8.3,
"composer": "2.7.4",
"composer": "2.9.5",
"mysql": "mariadb:10.6",
"elasticsearch": "elasticsearch:8.11.4",
"rabbitmq": "rabbitmq:3.13-management",
@@ -753,12 +839,12 @@
"nginx": "nginx:1.26",
"os": "ubuntu-latest",
"release": "2024-08-13T00:00:00+0000",
"eol": "2024-10-07T00:00:00+0000"
"eol": "2024-10-08T00:00:00+0000"
},
"magento/project-community-edition:2.4.7-p3": {
"magento": "magento/project-community-edition:2.4.7-p3",
"php": 8.3,
"composer": "2.7.4",
"composer": "2.9.5",
"mysql": "mariadb:10.6",
"elasticsearch": "elasticsearch:8.11.4",
"rabbitmq": "rabbitmq:3.13-management",
@@ -767,12 +853,12 @@
"nginx": "nginx:1.26",
"os": "ubuntu-latest",
"release": "2024-10-08T00:00:00+0000",
"eol": "2025-02-10T00:00:00+0000"
"eol": "2025-02-11T00:00:00+0000"
},
"magento/project-community-edition:2.4.7-p4": {
"magento": "magento/project-community-edition:2.4.7-p4",
"php": 8.3,
"composer": "2.7.4",
"composer": "2.9.5",
"mysql": "mariadb:10.6",
"elasticsearch": "elasticsearch:8.11.4",
"rabbitmq": "rabbitmq:3.13-management",
@@ -781,12 +867,12 @@
"nginx": "nginx:1.26",
"os": "ubuntu-latest",
"release": "2025-02-11T00:00:00+0000",
"eol": "2025-04-07T23:59:59+0000"
"eol": "2025-04-08T00:00:00+0000"
},
"magento/project-community-edition:2.4.7-p5": {
"magento": "magento/project-community-edition:2.4.7-p5",
"php": 8.3,
"composer": "2.8.8",
"composer": "2.9.5",
"mysql": "mysql:8.0",
"elasticsearch": "elasticsearch:8.17.4",
"rabbitmq": "rabbitmq:3.13-management",
@@ -795,21 +881,136 @@
"nginx": "nginx:1.26",
"os": "ubuntu-latest",
"release": "2025-04-08T00:00:00+0000",
"eol": "2025-06-10T00:00:00+0000"
},
"magento/project-community-edition:2.4.7-p6": {
"magento": "magento/project-community-edition:2.4.7-p6",
"php": 8.3,
"composer": "2.9.5",
"mysql": "mariadb:10.6",
"elasticsearch": "elasticsearch:8.17.4",
"rabbitmq": "rabbitmq:3.13-management",
"redis": "redis:7.2",
"varnish": "varnish:7.5",
"nginx": "nginx:1.26",
"os": "ubuntu-latest",
"release": "2025-06-10T00:00:00+0000",
"eol": "2025-08-12T00:00:00+0000"
},
"magento/project-community-edition:2.4.7-p7": {
"magento": "magento/project-community-edition:2.4.7-p7",
"php": 8.3,
"composer": "2.9.5",
"mysql": "mariadb:10.6",
"elasticsearch": "elasticsearch:8.17.4",
"rabbitmq": "rabbitmq:3.13-management",
"redis": "redis:7.2",
"varnish": "varnish:7.5",
"nginx": "nginx:1.28",
"os": "ubuntu-latest",
"release": "2025-08-12T00:00:00+0000",
"eol": "2025-10-14T00:00:00+0000"
},
"magento/project-community-edition:2.4.7-p8": {
"magento": "magento/project-community-edition:2.4.7-p8",
"php": 8.3,
"composer": "2.9.5",
"mysql": "mariadb:10.6",
"elasticsearch": "elasticsearch:8.17.4",
"rabbitmq": "rabbitmq:3.13-management",
"redis": "redis:7.2",
"varnish": "varnish:7.5",
"nginx": "nginx:1.28",
"os": "ubuntu-latest",
"release": "2025-10-14T00:00:00+0000",
"eol": "2026-03-09T00:00:00+0000"
},
"magento/project-community-edition:2.4.7-p9": {
"magento": "magento/project-community-edition:2.4.7-p9",
"php": 8.3,
"composer": "2.9.5",
"mysql": "mariadb:10.11",
"elasticsearch": "elasticsearch:8.17.4",
"opensearch": "opensearchproject/opensearch:2.19.5",
"rabbitmq": "rabbitmq:4.1-management",
"redis": "redis:7.2",
"valkey": "valkey/valkey:8.0",
"varnish": "varnish:7.7",
"nginx": "nginx:1.28",
"os": "ubuntu-latest",
"release": "2026-03-10T00:00:00+0000",
"eol": "2027-04-09T00:00:00+0000"
},
"magento/project-community-edition:2.4.8": {
"magento": "magento/project-community-edition:2.4.8",
"php": 8.4,
"composer": "2.8.8",
"composer": "2.9.5",
"mysql": "mysql:8.4",
"elasticsearch": "elasticsearch:8.17.4",
"opensearch": "opensearchproject/opensearch:2.19.5",
"rabbitmq": "rabbitmq:4.0-management",
"redis": "redis:7.2",
"valkey": "valkey:8.0",
"valkey": "valkey/valkey:8.0",
"varnish": "varnish:7.6",
"nginx": "nginx:1.26",
"os": "ubuntu-latest",
"release": "2025-04-08T00:00:00+0000",
"eol": "2025-06-10T00:00:00+0000"
},
"magento/project-community-edition:2.4.8-p1": {
"magento": "magento/project-community-edition:2.4.8-p1",
"php": 8.4,
"composer": "2.9.5",
"mysql": "mysql:8.4",
"opensearch": "opensearchproject/opensearch:2.19.5",
"rabbitmq": "rabbitmq:4.0-management",
"redis": "redis:7.2",
"varnish": "varnish:7.6",
"nginx": "nginx:1.26",
"os": "ubuntu-latest",
"release": "2025-06-10T00:00:00+0000",
"eol": "2025-08-12T00:00:00+0000"
},
"magento/project-community-edition:2.4.8-p2": {
"magento": "magento/project-community-edition:2.4.8-p2",
"php": 8.4,
"composer": "2.9.5",
"mysql": "mysql:8.4",
"opensearch": "opensearchproject/opensearch:3",
"rabbitmq": "rabbitmq:4.0-management",
"redis": "redis:7.2",
"varnish": "varnish:7.6",
"nginx": "nginx:1.28",
"os": "ubuntu-latest",
"release": "2025-08-12T00:00:00+0000",
"eol": "2025-10-14T00:00:00+0000"
},
"magento/project-community-edition:2.4.8-p3": {
"magento": "magento/project-community-edition:2.4.8-p3",
"php": 8.4,
"composer": "2.9.5",
"mysql": "mysql:8.4",
"opensearch": "opensearchproject/opensearch:3",
"rabbitmq": "rabbitmq:4.0-management",
"redis": "redis:7.2",
"varnish": "varnish:7.6",
"nginx": "nginx:1.28",
"os": "ubuntu-latest",
"release": "2025-10-14T00:00:00+0000",
"eol": "2026-03-09T00:00:00+0000"
},
"magento/project-community-edition:2.4.8-p4": {
"magento": "magento/project-community-edition:2.4.8-p4",
"php": 8.4,
"composer": "2.9.5",
"mysql": "mysql:8.4",
"opensearch": "opensearchproject/opensearch:3",
"rabbitmq": "rabbitmq:4.1-management",
"valkey": "valkey/valkey:8.0",
"varnish": "varnish:7.7",
"nginx": "nginx:1.28",
"os": "ubuntu-latest",
"release": "2026-03-10T00:00:00+0000",
"eol": "2028-04-09T00:00:00+0000"
}
}
-36
View File
@@ -1,36 +0,0 @@
# Magento 2 Unit Test Action
A Github Action that runs the Unit Tests of a Magento Package
## Inputs
See the [action.yml](./action.yml)
## Usage
```yml
name: Unit Test
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
unit-test:
strategy:
matrix:
php_version:
- 7.4
- 8.1
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: graycoreio/github-actions-magento2/unit-test@main
with:
php_version: ${{ matrix.php_version }}
composer_auth: ${{ secrets.COMPOSER_AUTH }}
```
-63
View File
@@ -1,63 +0,0 @@
name: "Unit Test"
author: "Graycore"
description: "A Github Action that runs the Unit Tests of a Magento Package"
inputs:
php_version:
required: true
default: "8.1"
description: "PHP Version to use"
source_folder:
required: true
default: .
description: "The source folder of the package"
test_command:
required: true
default: composer run test
description: "The test command"
composer_auth:
required: false
description: "Composer Authentication Credentials"
runs:
using: "composite"
steps:
- name: Set PHP Version
uses: shivammathur/setup-php@v2
with:
php-version: ${{ inputs.php_version }}
- name: Get Composer Cache Directory
shell: bash
working-directory: ${{ inputs.source_folder }}
id: composer-cache
run: |
echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
- name: "Cache Composer Packages"
uses: actions/cache@v3
with:
key: "composer | v3 | ${{ hashFiles('composer.lock') }} | ${{ runner.os }} | ${{ inputs.php_version }}"
path: ${{ steps.composer-cache.outputs.dir }}
- run: composer install
name: Require and attempt install
working-directory: ${{ inputs.source_folder }}
shell: bash
env:
COMPOSER_CACHE_DIR: ${{ steps.composer-cache.outputs.dir }}
COMPOSER_AUTH: ${{ inputs.composer_auth }}
- run: ${{ inputs.test_command }}
name: Run Unit Tests
working-directory: ${{ inputs.source_folder }}
shell: bash
env:
COMPOSER_CACHE_DIR: ${{ steps.composer-cache.outputs.dir }}
COMPOSER_AUTH: ${{ inputs.composer_auth }}
branding:
icon: "code"
color: "green"