Compare commits

...

39 Commits

Author SHA1 Message Date
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
40 changed files with 2226 additions and 8726 deletions
+1 -1
View File
@@ -31,8 +31,8 @@ jobs:
- 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
@@ -30,7 +30,7 @@ jobs:
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 +44,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 +58,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 }}
@@ -122,16 +122,16 @@ jobs:
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
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
+4 -3
View File
@@ -23,11 +23,12 @@ jobs:
strategy:
matrix:
php_version:
- 7.4
- 8.1
- 8.2
- 8.3
- 8.4
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- uses: ./unit-test
with:
source_folder: _test/demo-package
@@ -0,0 +1,40 @@
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:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.supported-version.outputs.matrix }}
steps:
- uses: actions/checkout@v4
- 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 }}
@@ -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@v4
- 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 }}
```
+280
View File
@@ -0,0 +1,280 @@
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@main
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@main
with:
mode: extension
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 }}
- 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@main
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@main
with:
mode: extension
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 }}
- 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
- name: Get Composer Version
uses: graycoreio/github-actions-magento2/get-composer-version@main
id: get-composer-version
- name: Check if allow-plugins option is available for this version of composer
uses: graycoreio/github-actions-magento2/semver-compare@main
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: ${{ inputs.path }}
run: composer config allow-plugins.dealerdirect/phpcodesniffer-composer-installer true --global
if: steps.is-allow-plugins-available.outputs.result < 1
- name: Install Coding Standard
shell: bash
working-directory: ${{ inputs.path }}
run: composer require "magento/magento-coding-standard" "magento/php-compatibility-fork"
env:
COMPOSER_AUTH: ${{ secrets.composer_auth }}
- name: Register Coding Standard
shell: bash
working-directory: ${{ inputs.path }}
run: vendor/bin/phpcs --config-set installed_paths vendor/magento/magento-coding-standard,vendor/magento/php-compatibility-fork
- name: Coding Standard Check
shell: bash
run: |
if [ -f .phpcs.xml ] || [ -f phpcs.xml ] || [ -f .phpcs.xml.dist ] || [ -f phpcs.xml.dist ]; then
./vendor/bin/phpcs .
else
./vendor/bin/phpcs --standard=Magento2 --ignore=*vendor/* .
fi
working-directory: ${{ inputs.path }}
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@main
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@main
with:
mode: extension
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 }}
- uses: graycoreio/github-actions-magento2/get-magento-version@main
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@v4
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 -39
View File
@@ -59,48 +59,10 @@ 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
- name: Set PHP Version
@@ -110,6 +72,10 @@ 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:
+1 -1
View File
@@ -1 +1 @@
v18.18.0
v24.12.0
+1 -1
View File
@@ -1 +1 @@
{".":"3.0.0"}
{".":"4.0.1"}
+43
View File
@@ -2,6 +2,49 @@
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.
## [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)
+7 -6
View File
@@ -11,15 +11,16 @@
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
+2 -1
View File
@@ -1,2 +1,3 @@
vendor/
.phpunit.result.cache
.phpunit.result.cache
composer.lock
+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
+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": "4.0.1",
"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"
}
}
+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@v4
- 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@v4
- 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
+2 -2
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:
+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: "false"
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"
}
}
+18 -4
View File
@@ -2,21 +2,35 @@ 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> {
try {
try {
const kind = core.getInput("kind");
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,50 @@ 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',
'magento/project-community-edition:2.4.7-p8',
'magento/project-community-edition:2.4.8-p3',
]],
['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-p8',
'magento/project-community-edition:2.4.8-p3',
]],
['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-p3',
]],
])(
'supportedVersions for %s',
@@ -110,6 +122,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) => {
@@ -118,4 +139,4 @@ describe('getCurrentlySupportedVersions for mage-os', () => {
).toEqual(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',
@@ -84,7 +84,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();
@@ -98,7 +98,7 @@ describe('getMatrixForKind for magento-open-source', () => {
});
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": {
"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.8.8",
"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": "2023-10-10T00:00:00+0000",
"eol": "2026-10-10T00:00:00+0000"
"release": "2025-10-16T00:00:00+0000",
"eol": "2028-10-17T00:00:00+0000"
},
"mage-os/project-community-edition:next": {
"magento": "mage-os/project-community-edition:next",
"php": 8.4,
"composer": "2.8.8",
"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": "2028-10-17T00: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.7.4",
"mysql": "mariadb:10.6",
"elasticsearch": "elasticsearch:8.11.4",
"rabbitmq": "rabbitmq:3.13-management",
@@ -24,7 +38,63 @@
"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.8.8",
"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.8.8",
"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.8.8",
"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.8.8",
"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": "2028-10-17T00: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,96 @@
"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.8.8",
"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.8.8",
"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.8.8",
"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.8.8",
"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.8.8",
"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.8.8",
"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": "2028-10-17T00:00:00+0000"
}
}
@@ -131,9 +131,10 @@
"composer": "2.8.8",
"mysql": "mysql:8.4",
"elasticsearch": "elasticsearch:8.17.4",
"opensearch": "opensearchproject/opensearch:2.19.1",
"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",
@@ -146,9 +147,10 @@
"composer": "2.8.8",
"mysql": "mysql:8.4",
"elasticsearch": "elasticsearch:8.17.4",
"opensearch": "opensearchproject/opensearch:2.19.1",
"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",
@@ -161,9 +163,10 @@
"composer": "2.8.8",
"mysql": "mysql:8.4",
"elasticsearch": "elasticsearch:8.17.4",
"valkey": "valkey/valkey:8.0",
"opensearch": "opensearchproject/opensearch:2.19.1",
"rabbitmq": "rabbitmq:4.0-management",
"redis": "redis:7.2",
"valkey": "valkey:8.0",
"varnish": "varnish:7.6",
"nginx": "nginx:1.26",
"os": "ubuntu-latest",
@@ -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",
@@ -389,7 +389,7 @@
"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",
@@ -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,7 +557,35 @@
"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",
@@ -655,7 +683,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.6-p7": {
"magento": "magento/project-community-edition:2.4.6-p7",
@@ -669,7 +697,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.6-p8": {
"magento": "magento/project-community-edition:2.4.6-p8",
@@ -683,7 +711,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.6-p9": {
"magento": "magento/project-community-edition:2.4.6-p9",
@@ -697,7 +725,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.6-p10": {
"magento": "magento/project-community-edition:2.4.6-p10",
@@ -711,6 +739,48 @@
"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.6-p11": {
"magento": "magento/project-community-edition:2.4.6-p11",
"php": 8.1,
"composer": "2.2.21",
"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.22",
"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.21",
"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.22",
"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.21",
"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.22",
"os": "ubuntu-latest",
"release": "2025-10-14T00:00:00+0000",
"eol": "2026-03-14T00:00:00+0000"
},
"magento/project-community-edition:2.4.7": {
@@ -739,7 +809,7 @@
"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",
@@ -753,7 +823,7 @@
"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",
@@ -767,7 +837,7 @@
"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",
@@ -781,7 +851,7 @@
"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",
@@ -795,6 +865,48 @@
"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.7.4",
"mysql": "mariadb:10.6",
"elasticsearch": "elasticsearch:8.11.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.7.4",
"mysql": "mariadb:10.6",
"elasticsearch": "elasticsearch:8.11.4",
"rabbitmq": "rabbitmq:3.13-management",
"redis": "redis:7.2",
"varnish": "varnish:7.5",
"nginx": "nginx:1.26",
"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.7.4",
"mysql": "mariadb:10.6",
"elasticsearch": "elasticsearch:8.11.4",
"rabbitmq": "rabbitmq:3.13-management",
"redis": "redis:7.2",
"varnish": "varnish:7.5",
"nginx": "nginx:1.26",
"os": "ubuntu-latest",
"release": "2025-10-14T00:00:00+0000",
"eol": "2027-04-09T00:00:00+0000"
},
"magento/project-community-edition:2.4.8": {
@@ -803,13 +915,56 @@
"composer": "2.8.8",
"mysql": "mysql:8.4",
"elasticsearch": "elasticsearch:8.17.4",
"opensearch": "opensearchproject/opensearch:2.19.1",
"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.8.8",
"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-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.8.8",
"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-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.8.8",
"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-14T00:00:00+0000",
"eol": "2028-04-09T00:00:00+0000"
}
}
+3 -3
View File
@@ -4,7 +4,7 @@ description: "A Github Action that runs the Unit Tests of a Magento Package"
inputs:
php_version:
required: true
default: "8.1"
default: "8.4"
description: "PHP Version to use"
source_folder:
@@ -37,9 +37,9 @@ runs:
echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
- name: "Cache Composer Packages"
uses: actions/cache@v3
uses: actions/cache@v5
with:
key: "composer | v3 | ${{ hashFiles('composer.lock') }} | ${{ runner.os }} | ${{ inputs.php_version }}"
key: "composer | v4 | ${{ hashFiles('composer.lock') }} | ${{ runner.os }} | ${{ inputs.php_version }}"
path: ${{ steps.composer-cache.outputs.dir }}
- run: composer install