Compare commits

...

55 Commits

Author SHA1 Message Date
GrayBot 0df8ac6e57 chore: release 8.0.0-rc.1 (#256) 2026-05-10 18:38:05 -04:00
Damien Retzinger ef06f4566b fix(check-store): only run unit tests for unit tests 2026-05-10 17:55:28 -04:00
Damien Retzinger 4c9a28930b refactor(check-store): remove extraneous guard around running tests 2026-05-10 17:54:58 -04:00
Damien Retzinger 22627e1000 feat(setup-magento): prevent Magento dir from being mirrored into vendor 2026-05-10 13:30:54 -04:00
Damien Retzinger b0131f0fa0 fix(check-extension): prevent recursively mirroring _ghamagento into _ghamagento 2026-05-10 10:34:32 -04:00
GrayBot 23c77e10c8 chore: restore internal action refs to @main (#254) 2026-05-09 20:25:19 -04:00
GrayBot 5fb823da94 chore: release 8.0.0-rc.0 (#253) 2026-05-09 20:24:17 -04:00
Damien Retzinger 38423ddb9b ci: dont run internal tests on markdown changes 2026-05-09 20:19:03 -04:00
Damien Retzinger d7959941c6 docs: dont bump docs on release candidates 2026-05-09 20:18:41 -04:00
Damien Retzinger 74f1e3ec39 docs: use x-release-please-version
release-please with x-release-please-major clobbered the magento2 -> magento8. This is obviously dumb.
2026-05-09 20:10:09 -04:00
Damien Retzinger d38c375b83 ci: tag prelease with trailing numeric 2026-05-09 20:03:11 -04:00
Damien Retzinger dcbd219ac1 ci: add release-please for release-candidates 2026-05-09 20:00:21 -04:00
Damien Retzinger 761188e82f ci: add ability to rc and graduate a release 2026-05-09 19:41:05 -04:00
Damien Retzinger aa1b545010 docs: migrate workflow docs to separate folder
Files under `.github/workflows/` require the `workflow` PAT scope to
modify. Once release-please's `extra-files` glob started rewriting these
README files on release, the action failed with "Error adding to tree."
Moving the docs to `docs/workflows/` lets the existing token update them
without needing a wider scope.
2026-05-09 19:30:22 -04:00
Damien Retzinger 45d1df0162 docs: bump READMEs on release 2026-05-09 19:18:17 -04:00
Damien Retzinger baef64bc0a feat(check-extension): enable stamp caching (#248)
Adds an optional `stamp` boolean input on the public check-extension
workflow that is forwarded to cache-magento, plus the matching
`working-directory`. Internal CI exercises stamp:true.
2026-05-09 18:58:38 -04:00
Damien Retzinger 59f87b6b2e feat(check-store): enable stamp caching (#247) 2026-05-09 16:24:21 -04:00
Damien Retzinger 0cbc4297b1 refactor(_internal-setup-magento): replace bespoke cache with cache-magento stamp (#250)
Drop the actions/cache + create-project + cp pattern in favor of
running cache-magento with stamp:true directly against the work
directory. The PSEUDO_REPO_FOLDER staging directory is removed
entirely; create-project lands in `_ghamagento` and stays there.

To keep the cache lean, the workflow writes Magento's stock
.gitignore before `git init && git clean -fdx` so vendor/, var/,
generated/, and pub/static/ are stripped from the snapshot that
seeds the test fixture. The stamp cache then handles vendor/.

Adds `compute_matrix_latest` so setup-magento-extension runs
across the supported matrix (kind: latest) instead of being
hard-coded to 8.4 / composer 2.8 / 2.4.8-p3.
2026-05-09 16:16:26 -04:00
Damien Retzinger c78e635688 ci(setup-install): adopt cache-magento stamp cache (#249)
Adds `composer update --no-install` ahead of cache-magento so the
lock exists when the stamp key is computed, then flips on
stamp:true with the matching working-directory.
2026-05-09 16:12:45 -04:00
Damien Retzinger 5c04c25fe8 ci(sansec-ecomscan): adopt cache-magento stamp cache (#251)
Adds `composer update --no-install` ahead of cache-magento so the
lock exists when the stamp key is computed, then flips on
stamp:true with the matching working-directory. This shortens
ecomscan runs from "full composer install" to "warm vendor/" on
warm hits.
2026-05-09 16:09:01 -04:00
Damien Retzinger 8d00f8149a feat(cache-magento): add stamp caching for vendor/ directory (#245)
Adds an opt-in `stamp` mode that caches the extracted `vendor/`
directory in addition to the Composer download cache. On a warm
hit, `composer install` is effectively a no-op and shaves 2–5
minutes off a full Magento install.
2026-05-09 15:47:53 -04:00
Damien Retzinger 2d7238de14 feat(cache-magento): include runner.os in the cache key (#245)
Composer's download cache contains platform-specific binaries and
extracted archives that aren't safe to share across operating
systems. Add the runner OS as a key segment so a Linux job won't
restore a macOS-built cache (or vice versa).
2026-05-09 15:47:51 -04:00
Damien Retzinger 44e7c34892 refactor(cache-magento): extract key computation into a script (#245) 2026-05-09 15:47:47 -04:00
Damien Retzinger c53607cca8 feat(setup-magento): mkdir app/etc in extension mode (#246)
This prevents the magento/composer-plugin from crashing when doing caching for setup-magento in extension mode.
2026-05-09 13:45:40 -04:00
Damien Retzinger a729f8b2fd feat(setup-magento)!: extension working dir changed to _ghamagento folder (#246)
BREAKING CHANGE: Previously, when using setup-magento in extension mode, the magento 2 repo root was ../magento2 (outside of the extension folder). Due to interactions with `cache-magento` we need to keep magento inside the GITHUB_WORKSPACE (the root repo). We now do this in the `_ghamagento` folder. If you rely on the `steps.setup-magento.outputs.path` nothing changes for you. But, if you hardcoded the path, it's likely broken.
2026-05-09 13:45:34 -04:00
Damien Retzinger f6a7355bd9 docs: denote deprecation / replacement of integration with CheckExtension 2026-05-07 10:33:57 -04:00
Damien Retzinger 307f527997 docs: add short description to README 2026-05-07 10:31:33 -04:00
Damien Retzinger 85b7909eb1 docs: add sansec ecomscan to the root README 2026-05-07 10:29:23 -04:00
Damien Retzinger 837f1da96b docs: add docs for check-store 2026-05-07 10:25:47 -04:00
Damien Retzinger d311df7966 feat(check-store): introduce new check-store workflow (#241) 2026-05-07 10:20:20 -04:00
Damien Retzinger a7e327d44f feat(supported-version): dynamically append "version" to matrix 2026-05-07 09:30:09 -04:00
Damien Retzinger c786530c3e test(get-magento-version): document and pin what happens in various kinds of installs 2026-05-07 09:30:07 -04:00
Damien Retzinger 483ec3ac17 docs: add AGENTS.md and CLAUDE.md 2026-05-07 09:29:17 -04:00
Damien Retzinger a1c6246c78 fix(coding-standard): use exactly phpcs.xml if exists (#243)
Inadvertently, the added period causes the `file` / `files` of phpcs to be ignored. This caused `vendor` to be linted.
2026-05-07 09:15:18 -04:00
Damien Retzinger 87989bb250 feat(get-magento-version): pull version from lockfile if it exists (#242)
Additionally, this exposes a new `output` called project which tells you which project was used.
2026-05-06 14:03:19 -04:00
Damien Retzinger bdb9528f8c docs: add working! grill-me skill 2026-05-06 11:08:17 -04:00
Damien Retzinger 6a520d49fd feat(check-extension): use setup-di-compile action in compile-extension job (#240) 2026-05-06 10:59:22 -04:00
Damien Retzinger 212f9a8e86 feat(setup-di-compile): restore setup-di-compile as a lean action (#239) 2026-05-06 10:51:27 -04:00
Damien Retzinger 0808fab9c3 refactor: remove now default arg 2026-05-06 10:32:43 -04:00
Damien Retzinger bbd830745f feat(sansec-ecomscan): skip server checks by default (#238) 2026-05-06 09:42:48 -04:00
Damien Retzinger e31f6f656a feat(setup-install): add new setup-install action (#237) 2026-05-05 16:06:59 -04:00
Damien Retzinger 198bc1072a docs: add grill-me skill 2026-05-05 15:57:10 -04:00
Damien Retzinger 3c0a90f92b feat(sansec-ecomscan): add sansec ecomscan feature (#235) 2026-05-05 11:56:14 -04:00
Damien Retzinger c115395583 fix(fix-magento-install): remove deprecated set-output 2026-05-02 12:57:10 -04:00
Damien Retzinger 20cbf5d06a test(supported-version): add test coverage for 2026-03-10 (#233) 2026-05-02 11:54:51 -04:00
Damien Retzinger ff6279a518 docs: doc supported-versions for recent kind 2026-05-02 10:35:01 -04:00
Damien Retzinger b74bdcde41 docs: add docs for include_services key on supported-version 2026-05-02 10:32:27 -04:00
GrayBot 1c312fe567 chore: restore internal action refs to @main (#232) 2026-05-01 07:56:31 -04:00
GrayBot 62d2aec976 chore: release 7.0.0 (#230) 2026-05-01 07:52:47 -04:00
kristof-ringleff 771dd05439 fix(cache-magento): address set-output deprecation (#231) 2026-04-28 21:54:56 -04:00
Ryan Hoerr f8036173e1 fix(supported-version): filter uninstallable versions from usable kind (#319)
Exclude versions that cannot be installed due to security or dependency issues:
- Magento 2.4.2 through 2.4.3-p3: require composer <=2.1, which is insecure
- Mage-OS 2.2.1: blocked by webonyx/graphql-php security advisory
2026-04-28 10:21:08 -04:00
Ryan Hoerr bbecc7f5f9 feat(supported-version): update for Mage-OS 2.2.2 (#317) 2026-04-28 10:19:20 -04:00
Ryan Hoerr db1267a94b chore(supported-version): Add supported version for Mage-OS 2.2.1 (#316) 2026-04-28 10:15:31 -04:00
Damien Retzinger 90babb16bf chore: promote release 7.0.0
Release-As: 7.0.0
2026-04-28 10:07:35 -04:00
GrayBot 93c0b480e2 chore: restore internal action refs to @main (#229) 2026-04-28 09:56:18 -04:00
79 changed files with 2342 additions and 216 deletions
+13
View File
@@ -0,0 +1,13 @@
---
name: grill-me
description: Interview the user relentlessly about a plan or design until reaching shared understanding, resolving each branch of the decision tree. Use when user wants to stress-test a plan, get grilled on their design, or mentions "grill me".
---
Interview me relentlessly about every aspect of this plan until
we reach a shared understanding. Walk down each branch of the design
tree resolving dependencies between decisions one by one.
If a question can be answered by exploring the codebase, explore
the codebase instead.
For each question, provide your recommended answer.
@@ -0,0 +1,23 @@
name: Cache Magento Test
on:
push:
branches: [main]
paths:
- "cache-magento/**"
- ".github/workflows/_internal-cache-magento.yaml"
- "!**/*.md"
pull_request:
branches: [main]
paths:
- "cache-magento/**"
- ".github/workflows/_internal-cache-magento.yaml"
- "!**/*.md"
jobs:
unit:
if: "!startsWith(github.head_ref, 'release-please')"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- run: bash cache-magento/test.sh
@@ -0,0 +1,101 @@
name: Check Store Test
on:
workflow_dispatch: {}
push:
branches:
- main
paths:
- ".github/workflows/_internal-check-store.yaml"
- ".github/workflows/check-store.yaml"
- "supported-version/**"
- "get-magento-version/**"
- "!**/*.md"
pull_request:
branches:
- main
paths:
- ".github/workflows/_internal-check-store.yaml"
- ".github/workflows/check-store.yaml"
- "supported-version/**"
- "get-magento-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
id: supported-version
with:
kind: currently-supported
prepare-fixture:
needs: compute_matrix
runs-on: ${{ matrix.os }}
strategy:
matrix: ${{ fromJSON(needs.compute_matrix.outputs.matrix) }}
fail-fast: false
steps:
- uses: actions/checkout@v6
- uses: ./setup-magento
id: setup-magento
with:
php-version: ${{ matrix.php }}
tools: composer:v${{ matrix.composer }}
magento_version: ${{ matrix.magento }}
mode: extension
- run: composer update --no-install
working-directory: ${{ steps.setup-magento.outputs.path }}
- uses: ./cache-magento
with:
composer_cache_key: ${{ matrix.magento }}
working-directory: ${{ steps.setup-magento.outputs.path }}
stamp: true
- name: Inspect stamp cache contents
if: always()
working-directory: ${{ steps.setup-magento.outputs.path }}
run: |
echo "=== top-level vendor/magento ==="
ls vendor/magento/ 2>/dev/null | head -30 || echo "(no vendor/magento)"
echo
echo "=== magento2-base presence ==="
if [ -d vendor/magento/magento2-base ]; then
echo "PRESENT — file count: $(find vendor/magento/magento2-base -type f | wc -l)"
else
echo "ABSENT (negation worked)"
fi
echo
echo "=== installed.json mentions magento/magento2-base ==="
grep -c '"name": "magento/magento2-base"' vendor/composer/installed.json 2>/dev/null || echo 0
- run: composer install
working-directory: ${{ steps.setup-magento.outputs.path }}
- uses: actions/upload-artifact@v7
with:
name: store-fixture-${{ matrix.version }}
path: |
${{ steps.setup-magento.outputs.path }}
!${{ steps.setup-magento.outputs.path }}/vendor
retention-days: 3
check-store:
needs: [compute_matrix, prepare-fixture]
strategy:
matrix: ${{ fromJSON(needs.compute_matrix.outputs.matrix) }}
fail-fast: false
uses: ./.github/workflows/check-store.yaml
with:
store_artifact_name: store-fixture-${{ matrix.version }}
path: "_ghamagento/"
composer_cache_key: ${{ matrix.magento }}
stamp: true
@@ -8,7 +8,7 @@ on:
- "_test/demo-package/**"
- ".github/workflows/_internal-coding-standard.yaml"
- "coding-standard/**"
- "!(**/*.md)"
- "!**/*.md"
pull_request:
branches:
- main
@@ -16,7 +16,7 @@ on:
- "_test/demo-package/**"
- ".github/workflows/_internal-coding-standard.yaml"
- "coding-standard/**"
- "!(**/*.md)"
- "!**/*.md"
workflow_dispatch:
inputs:
version:
@@ -8,14 +8,14 @@ on:
paths:
- ".github/workflows/_internal-get-composer-version.yaml"
- "get-composer-version/**"
- "!(**/*.md)"
- "!**/*.md"
pull_request:
branches:
- main
paths:
- ".github/workflows/_internal-get-composer-version.yaml"
- "get-composer-version/**"
- "!(**/*.md)"
- "!**/*.md"
jobs:
get-composer-version:
@@ -7,14 +7,14 @@ on:
paths:
- ".github/workflows/_internal-get-magento-version.yaml"
- "get-magento-version/**"
- "!(**/*.md)"
- "!**/*.md"
pull_request:
branches:
- main
paths:
- ".github/workflows/_internal-get-magento-version.yaml"
- "get-magento-version/**"
- "!(**/*.md)"
- "!**/*.md"
jobs:
get-magento-version:
@@ -37,8 +37,34 @@ jobs:
with:
working-directory: ../magento2
- name: Fail if key does not match
- name: Fail if version does not match
if: steps.magento-version.outputs.version != '"2.4.5-p1"'
shell: bash
run: echo "${{ steps.magento-version.outputs.version }}" && exit 1
- name: Fail if project does not match
if: steps.magento-version.outputs.project != 'magento/project-community-edition'
shell: bash
run: echo "${{ steps.magento-version.outputs.project }}" && exit 1
get-magento-version-extension:
if: "!startsWith(github.head_ref, 'release-please')"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Create mock extension composer.json
shell: bash
run: |
mkdir -p /tmp/test-extension
echo '{"name":"vendor/module","type":"magento2-module","require":{}}' > /tmp/test-extension/composer.json
- uses: ./get-magento-version
id: ext-version
with:
working-directory: /tmp/test-extension
- name: Fail if project is not empty
if: steps.ext-version.outputs.project != ''
shell: bash
run: echo "Expected empty project, got '${{ steps.ext-version.outputs.project }}'" && exit 1
+2 -3
View File
@@ -10,7 +10,7 @@ on:
- ".github/workflows/_internal-integration.yaml"
- ".github/workflows/integration.yaml"
- "supported-version/**"
- "!(**/*.md)"
- "!**/*.md"
pull_request:
branches:
- main
@@ -19,7 +19,7 @@ on:
- ".github/workflows/_internal-integration.yaml"
- ".github/workflows/integration.yaml"
- "supported-version/**"
- "!(**/*.md)"
- "!**/*.md"
jobs:
compute_matrix:
@@ -32,7 +32,6 @@ jobs:
- uses: ./supported-version
with:
kind: currently-supported
include_services: true
id: supported-version
integration-workflow:
needs: compute_matrix
@@ -0,0 +1,78 @@
name: Sansec eComscan Security Scan
on:
push:
branches:
- main
paths:
- ".github/workflows/_internal-sansec-ecomscan.yaml"
- "sansec-ecomscan/**"
- "!**/*.md"
pull_request:
branches:
- main
paths:
- ".github/workflows/_internal-sansec-ecomscan.yaml"
- "sansec-ecomscan/**"
- "!**/*.md"
workflow_dispatch:
env:
MAGENTO_COMPOSER_REPO: "https://mirror.mage-os.org/"
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
id: supported-version
run-ecomscan:
needs: compute_matrix
strategy:
matrix: ${{ fromJSON(needs.compute_matrix.outputs.matrix) }}
fail-fast: false
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: read
steps:
- uses: actions/checkout@v6
- uses: ./setup-magento
id: setup-magento
with:
php-version: ${{ matrix.php }}
tools: composer:v${{ matrix.composer }}
mode: extension
magento_repository: ${{ env.MAGENTO_COMPOSER_REPO }}
magento_version: ${{ matrix.magento }}
composer_auth: ${{ secrets.COMPOSER_AUTH }}
- run: composer update --no-install
working-directory: ${{ steps.setup-magento.outputs.path }}
- uses: ./cache-magento
with:
composer_cache_key: ${{ matrix.magento }}
working-directory: ${{ steps.setup-magento.outputs.path }}
stamp: true
- name: Composer install
shell: bash
run: composer install
working-directory: ${{ steps.setup-magento.outputs.path }}
env:
COMPOSER_AUTH: ${{ secrets.COMPOSER_AUTH }}
- uses: ./sansec-ecomscan
with:
license: ${{ secrets.SANSEC_LICENSE_KEY }}
path: ${{ steps.setup-magento.outputs.path }}
@@ -7,14 +7,14 @@ on:
paths:
- ".github/workflows/_internal-semver-compare.yaml"
- "semver-compare/**"
- "!(**/*.md)"
- "!**/*.md"
pull_request:
branches:
- main
paths:
- ".github/workflows/_internal-semver-compare.yaml"
- "semver-compare/**"
- "!(**/*.md)"
- "!**/*.md"
jobs:
semver-compare:
@@ -0,0 +1,89 @@
name: Setup Install Test
on:
workflow_dispatch: {}
push:
branches:
- main
paths:
- "_test/demo-package/**"
- "setup-install/**"
- ".github/workflows/_internal-setup-install.yaml"
- "supported-version/**"
- "!**/*.md"
pull_request:
branches:
- main
paths:
- "_test/demo-package/**"
- "setup-install/**"
- ".github/workflows/_internal-setup-install.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
id: supported-version
with:
kind: currently-supported
include_services: true
setup-install:
needs: compute_matrix
strategy:
matrix: ${{ fromJSON(needs.compute_matrix.outputs.matrix) }}
fail-fast: false
runs-on: ${{ matrix.os }}
services: ${{ matrix.services }}
steps:
- uses: actions/checkout@v6
- uses: ./setup-magento
id: setup-magento
with:
php-version: ${{ matrix.php }}
tools: composer:v${{ matrix.composer }}
mode: extension
magento_version: ${{ matrix.magento }}
magento_repository: "https://mirror.mage-os.org/"
composer_auth: ${{ secrets.COMPOSER_AUTH }}
- run: composer update --no-install
working-directory: ${{ steps.setup-magento.outputs.path }}
- uses: ./cache-magento
with:
composer_cache_key: ${{ matrix.magento }}
working-directory: ${{ steps.setup-magento.outputs.path }}
stamp: true
- name: Add extension repository
working-directory: ${{ steps.setup-magento.outputs.path }}
run: composer config repositories.local path ${{ github.workspace }}/_test/demo-package
- name: Get package name
id: package
run: echo "name=$(jq -r .name ${{ github.workspace }}/_test/demo-package/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
- uses: ./setup-install
with:
services: ${{ toJSON(matrix.services) }}
path: ${{ steps.setup-magento.outputs.path }}
+125 -33
View File
@@ -9,7 +9,7 @@ on:
- "setup-magento/**"
- ".github/workflows/_internal-setup-magento.yaml"
- "supported-version/**"
- "!(**/*.md)"
- "!**/*.md"
pull_request:
branches:
- main
@@ -17,11 +17,10 @@ on:
- "setup-magento/**"
- ".github/workflows/_internal-setup-magento.yaml"
- "supported-version/**"
- "!(**/*.md)"
- "!**/*.md"
env:
PSEUDO_REPO_FOLDER: ../magento_repo
magento_folder: ../magento2
magento_folder: _ghamagento
MAGENTO_COMPOSER_REPO: "https://mirror.mage-os.org/"
jobs:
@@ -38,6 +37,18 @@ jobs:
id: supported-version
- run: echo ${{ steps.supported-version.outputs.matrix }}
compute_matrix_latest:
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: latest
id: supported-version
setup-magento-store:
needs: compute_matrix
strategy:
@@ -47,51 +58,122 @@ jobs:
steps:
- uses: actions/checkout@v6
- run: |
PSEUDO_STORE_FULL_PATH=$(realpath "${{ env.PSEUDO_REPO_FOLDER }}")
echo "PSEUDO_STORE_FULL_PATH=$PSEUDO_STORE_FULL_PATH" >> $GITHUB_ENV
name: Generate Full Pseudo Store Path
shell: bash
- name: Set PHP Version
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
tools: composer:v${{ matrix.composer }}
- uses: actions/cache@v5
id: setup-magento-store-cache
with:
key: setup-magento-ci | ${{ runner.os }} | ${{ matrix.magento }}
path: ${{ env.PSEUDO_STORE_FULL_PATH }}
- run: composer create-project --repository-url="${{ env.MAGENTO_COMPOSER_REPO }}" "${{ matrix.magento }}" "${{ env.PSEUDO_REPO_FOLDER }}" --no-install
- run: composer create-project --repository-url="${{ env.MAGENTO_COMPOSER_REPO }}" "${{ matrix.magento }}" "${{ env.magento_folder }}" --no-install
name: Create Store to simulate a real Magento store in a real repo.
if: steps.setup-magento-store-cache.outputs.cache-hit != 'true'
env:
COMPOSER_AUTH: ${{ secrets.COMPOSER_AUTH }}
- uses: ./fix-magento-install
name: Fix Magento Out of Box Install Issues
with:
magento_directory: ${{ env.PSEUDO_REPO_FOLDER }}
if: steps.setup-magento-store-cache.outputs.cache-hit != 'true'
magento_directory: ${{ env.magento_folder }}
env:
COMPOSER_AUTH: ${{ secrets.COMPOSER_AUTH }}
- run: composer update --no-install
working-directory: ${{ env.magento_folder }}
- uses: ./cache-magento
with:
composer_cache_key: ${{ matrix.magento }}
working-directory: ${{ env.magento_folder }}
stamp: true
- run: composer install
shell: bash
working-directory: "${{ env.PSEUDO_REPO_FOLDER }}"
if: steps.setup-magento-store-cache.outputs.cache-hit != 'true'
working-directory: "${{ env.magento_folder }}"
env:
COMPOSER_AUTH: ${{ secrets.COMPOSER_AUTH }}
- run: git init && git config user.email "you@example.com" && git config user.name "Your Name" && git add . && git commit -m "init" && git clean -fdx
working-directory: "${{ env.PSEUDO_REPO_FOLDER }}"
if: steps.setup-magento-store-cache.outputs.cache-hit != 'true'
- run: cp -R ${{ env.PSEUDO_REPO_FOLDER }} ${{ env.magento_folder }}
- name: Write Magento .gitignore so git clean strips vendor/generated/var from the cached tree
working-directory: "${{ env.magento_folder }}"
shell: bash
run: |
cat > .gitignore <<'EOF'
/.buildpath
/.cache
/.metadata
/.project
/.settings
/.vscode
atlassian*
/nbproject
/robots.txt
/pub/robots.txt
/sitemap
/sitemap.xml
/pub/sitemap
/pub/sitemap.xml
/.idea
/.gitattributes
/app/config_sandbox
/app/etc/config.php
/app/etc/env.php
/app/code/Magento/TestModule*
/lib/internal/flex/uploader/.actionScriptProperties
/lib/internal/flex/uploader/.flexProperties
/lib/internal/flex/uploader/.project
/lib/internal/flex/uploader/.settings
/lib/internal/flex/varien/.actionScriptProperties
/lib/internal/flex/varien/.flexLibProperties
/lib/internal/flex/varien/.project
/lib/internal/flex/varien/.settings
/node_modules
/.grunt
/Gruntfile.js
/package.json
/.php_cs
/.php_cs.cache
/.php-cs-fixer.php
/.php-cs-fixer.cache
/grunt-config.json
/pub/media/*.*
!/pub/media/.htaccess
/pub/media/attribute/*
!/pub/media/attribute/.htaccess
/pub/media/analytics/*
/pub/media/catalog/*
!/pub/media/catalog/.htaccess
/pub/media/customer/*
!/pub/media/customer/.htaccess
/pub/media/downloadable/*
!/pub/media/downloadable/.htaccess
/pub/media/favicon/*
/pub/media/import/*
!/pub/media/import/.htaccess
/pub/media/logo/*
/pub/media/custom_options/*
!/pub/media/custom_options/.htaccess
/pub/media/theme/*
/pub/media/theme_customization/*
!/pub/media/theme_customization/.htaccess
/pub/media/wysiwyg/*
!/pub/media/wysiwyg/.htaccess
/pub/media/tmp/*
!/pub/media/tmp/.htaccess
/pub/media/captcha/*
/pub/media/sitemap/*
!/pub/media/sitemap/.htaccess
/pub/static/*
!/pub/static/.htaccess
/var/*
!/var/.htaccess
/vendor/*
!/vendor/.htaccess
/generated/*
!/generated/.htaccess
.DS_Store
EOF
- run: git init && git config user.email "you@example.com" && git config user.name "Your Name" && git add . && git commit -m "init" && git clean -fdx
working-directory: "${{ env.magento_folder }}"
- uses: ./setup-magento
id: setup-magento
@@ -104,7 +186,9 @@ jobs:
- uses: ./cache-magento
with:
composer_cache_key: '${{ matrix.magento }}'
composer_cache_key: ${{ matrix.magento }}
working-directory: ${{ env.magento_folder }}
stamp: true
- run: composer install
name: Composer install
@@ -114,7 +198,10 @@ jobs:
COMPOSER_AUTH: ${{ secrets.COMPOSER_AUTH }}
setup-magento-extension:
if: "!startsWith(github.head_ref, 'release-please')"
needs: compute_matrix_latest
strategy:
matrix: ${{ fromJSON(needs.compute_matrix_latest.outputs.matrix) }}
fail-fast: false
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
@@ -122,16 +209,21 @@ jobs:
- uses: ./setup-magento
id: setup-magento
with:
php-version: 8.4
tools: composer:v2.8
php-version: ${{ matrix.php }}
tools: composer:v${{ matrix.composer }}
mode: extension
magento_repository: ${{ env.MAGENTO_COMPOSER_REPO }}
composer_auth: ${{ secrets.COMPOSER_AUTH }}
magento_version: magento/project-community-edition:2.4.8-p3
magento_version: ${{ matrix.magento }}
- run: composer update --no-install
working-directory: ${{ steps.setup-magento.outputs.path }}
- uses: ./cache-magento
with:
composer_cache_key: 'magento/project-community-edition:2.4.8-p3'
composer_cache_key: ${{ matrix.magento }}
working-directory: ${{ steps.setup-magento.outputs.path }}
stamp: true
- run: composer install
name: Composer install
@@ -10,7 +10,7 @@ on:
- ".github/workflows/_internal_check_extension.yaml"
- ".github/workflows/check-extension.yaml"
- "supported-version/**"
- "!(**/*.md)"
- "!**/*.md"
pull_request:
branches:
- main
@@ -19,7 +19,7 @@ on:
- ".github/workflows/_internal_check_extension.yaml"
- ".github/workflows/check-extension.yaml"
- "supported-version/**"
- "!(**/*.md)"
- "!**/*.md"
jobs:
compute_matrix:
if: "!startsWith(github.head_ref, 'release-please')"
@@ -39,3 +39,4 @@ jobs:
with:
path: _test/demo-package
matrix: ${{ needs.compute_matrix.outputs.matrix }}
stamp: true
@@ -8,7 +8,7 @@ on:
- ".github/workflows/_internal-supported-version.yaml"
- "supported-version/**"
- "package-lock.json"
- "!(**/*.md)"
- "!**/*.md"
pull_request:
branches:
- main
@@ -16,7 +16,7 @@ on:
- ".github/workflows/_internal-supported-version.yaml"
- "supported-version/**"
- "package-lock.json"
- "!(**/*.md)"
- "!**/*.md"
jobs:
unit-test:
+46 -25
View File
@@ -27,9 +27,15 @@ on:
composer_cache_key:
type: string
required: false
default: "_mageos"
default: ""
description: A key to version the composer cache. Can be incremented if you need to bust the cache.
stamp:
type: boolean
required: false
default: false
description: "Cache the vendor/ directory in addition to the Composer download cache."
secrets:
composer_auth:
required: false
@@ -44,7 +50,7 @@ jobs:
steps:
- uses: actions/checkout@v6
- uses: graycoreio/github-actions-magento2/setup-magento@v7.0.0-rc.0
- uses: graycoreio/github-actions-magento2/setup-magento@v8.0.0-rc.1
id: setup-magento
with:
php-version: ${{ matrix.php }}
@@ -54,10 +60,6 @@ jobs:
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 }}
@@ -70,6 +72,15 @@ jobs:
working-directory: ${{ steps.setup-magento.outputs.path }}
run: composer require "${{ steps.package.outputs.name }}:@dev" --no-install
- run: composer update --no-install
working-directory: ${{ steps.setup-magento.outputs.path }}
- uses: graycoreio/github-actions-magento2/cache-magento@v8.0.0-rc.1
with:
composer_cache_key: ${{ inputs.composer_cache_key && format('{0} | {1}', inputs.composer_cache_key, matrix.magento) || matrix.magento }}
working-directory: ${{ steps.setup-magento.outputs.path }}
stamp: ${{ inputs.stamp }}
- name: Composer install
working-directory: ${{ steps.setup-magento.outputs.path }}
run: composer install
@@ -104,7 +115,7 @@ jobs:
steps:
- uses: actions/checkout@v6
- uses: graycoreio/github-actions-magento2/setup-magento@v7.0.0-rc.0
- uses: graycoreio/github-actions-magento2/setup-magento@v8.0.0-rc.1
id: setup-magento
with:
php-version: ${{ matrix.php }}
@@ -114,10 +125,6 @@ jobs:
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 }}
@@ -132,6 +139,15 @@ jobs:
env:
COMPOSER_AUTH: ${{ secrets.composer_auth }}
- run: composer update --no-install
working-directory: ${{ steps.setup-magento.outputs.path }}
- uses: graycoreio/github-actions-magento2/cache-magento@v8.0.0-rc.1
with:
composer_cache_key: ${{ inputs.composer_cache_key && format('{0} | {1}', inputs.composer_cache_key, matrix.magento) || matrix.magento }}
working-directory: ${{ steps.setup-magento.outputs.path }}
stamp: ${{ inputs.stamp }}
- name: Composer install
working-directory: ${{ steps.setup-magento.outputs.path }}
run: composer install
@@ -139,13 +155,9 @@ jobs:
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
- uses: graycoreio/github-actions-magento2/setup-di-compile@v8.0.0-rc.1
with:
path: ${{ steps.setup-magento.outputs.path }}
coding-standard:
runs-on: ${{ matrix.os }}
@@ -161,7 +173,11 @@ jobs:
tools: composer:v${{ matrix.composer }}
coverage: none
- uses: graycoreio/github-actions-magento2/coding-standard@v7.0.0-rc.0
- uses: graycoreio/github-actions-magento2/cache-magento@v8.0.0-rc.1
with:
composer_cache_key: ${{ inputs.composer_cache_key && format('{0} | {1}', inputs.composer_cache_key, matrix.magento) || matrix.magento }}
- uses: graycoreio/github-actions-magento2/coding-standard@v8.0.0-rc.1
with:
path: ${{ inputs.path }}
composer_auth: ${{ secrets.composer_auth }}
@@ -175,7 +191,7 @@ jobs:
steps:
- uses: actions/checkout@v6
- uses: graycoreio/github-actions-magento2/setup-magento@v7.0.0-rc.0
- uses: graycoreio/github-actions-magento2/setup-magento@v8.0.0-rc.1
id: setup-magento
with:
php-version: ${{ matrix.php }}
@@ -185,10 +201,6 @@ jobs:
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 }}
@@ -203,6 +215,15 @@ jobs:
env:
COMPOSER_AUTH: ${{ secrets.composer_auth }}
- run: composer update --no-install
working-directory: ${{ steps.setup-magento.outputs.path }}
- uses: graycoreio/github-actions-magento2/cache-magento@v8.0.0-rc.1
with:
composer_cache_key: ${{ inputs.composer_cache_key && format('{0} | {1}', inputs.composer_cache_key, matrix.magento) || matrix.magento }}
working-directory: ${{ steps.setup-magento.outputs.path }}
stamp: ${{ inputs.stamp }}
- name: Composer install
working-directory: ${{ steps.setup-magento.outputs.path }}
run: composer install
@@ -210,7 +231,7 @@ jobs:
COMPOSER_AUTH: ${{ secrets.composer_auth }}
COMPOSER_MIRROR_PATH_REPOS: 1
- uses: graycoreio/github-actions-magento2/get-magento-version@v7.0.0-rc.0
- uses: graycoreio/github-actions-magento2/get-magento-version@v8.0.0-rc.1
id: magento-version
with:
working-directory: ${{ steps.setup-magento.outputs.path }}
+169
View File
@@ -0,0 +1,169 @@
name: MageCheck Store
on:
workflow_call:
inputs:
path:
type: string
required: false
default: "."
description: "The folder of the Magento store that you are testing."
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.
store_artifact_name:
type: string
required: false
default: ""
description: "If provided, download store files from this artifact instead of using actions/checkout."
stamp:
type: boolean
required: false
default: false
description: "Cache the vendor/ directory in addition to the Composer download cache."
secrets:
composer_auth:
required: false
description: "Your composer credentials (typically a stringified json object of the contents of your auth.json)"
jobs:
compute_matrix:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.supported-version.outputs.matrix }}
steps:
- uses: actions/checkout@v6
if: inputs.store_artifact_name == ''
- uses: actions/download-artifact@v8
if: inputs.store_artifact_name != ''
with:
name: ${{ inputs.store_artifact_name }}
path: ${{ inputs.path }}
- uses: graycoreio/github-actions-magento2/get-magento-version@v8.0.0-rc.1
id: get-magento-version
with:
working-directory: ${{ inputs.path }}
- uses: graycoreio/github-actions-magento2/supported-version@v8.0.0-rc.1
id: supported-version
with:
kind: custom
custom_versions: ${{ steps.get-magento-version.outputs.project }}:${{ fromJSON(steps.get-magento-version.outputs.version) }}
unit-test:
runs-on: ${{ matrix.os }}
needs: compute_matrix
strategy:
matrix: ${{ fromJSON(needs.compute_matrix.outputs.matrix) }}
steps:
- uses: actions/checkout@v6
if: inputs.store_artifact_name == ''
- uses: actions/download-artifact@v8
if: inputs.store_artifact_name != ''
with:
name: ${{ inputs.store_artifact_name }}
path: ${{ inputs.path }}
- uses: graycoreio/github-actions-magento2/setup-magento@v8.0.0-rc.1
id: setup-magento
with:
php-version: ${{ matrix.php }}
tools: composer:v${{ matrix.composer }}
mode: store
working-directory: ${{ inputs.path }}
composer_auth: ${{ secrets.composer_auth }}
- uses: graycoreio/github-actions-magento2/cache-magento@v8.0.0-rc.1
with:
composer_cache_key: ${{ inputs.composer_cache_key }}
working-directory: ${{ steps.setup-magento.outputs.path }}
stamp: ${{ inputs.stamp }}
- 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: |
mkdir -p app/code
cat > /tmp/testsuite.xml << 'EOF'
<testsuite name="Store_Unit_Tests">
<directory>../../../app/code/*/*/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 unit tests
working-directory: ${{ steps.setup-magento.outputs.path }}
run: vendor/bin/phpunit -c dev/tests/unit/phpunit.xml.dist --testsuite Store_Unit_Tests
coding-standard:
runs-on: ${{ matrix.os }}
needs: compute_matrix
strategy:
matrix: ${{ fromJSON(needs.compute_matrix.outputs.matrix) }}
steps:
- uses: actions/checkout@v6
if: inputs.store_artifact_name == ''
- uses: actions/download-artifact@v8
if: inputs.store_artifact_name != ''
with:
name: ${{ inputs.store_artifact_name }}
path: ${{ inputs.path }}
- uses: graycoreio/github-actions-magento2/setup-magento@v8.0.0-rc.1
id: setup-magento
with:
php-version: ${{ matrix.php }}
tools: composer:v${{ matrix.composer }}
mode: store
working-directory: ${{ inputs.path }}
composer_auth: ${{ secrets.composer_auth }}
- uses: graycoreio/github-actions-magento2/cache-magento@v8.0.0-rc.1
with:
composer_cache_key: ${{ inputs.composer_cache_key }}
working-directory: ${{ steps.setup-magento.outputs.path }}
stamp: ${{ inputs.stamp }}
- name: Composer install
working-directory: ${{ steps.setup-magento.outputs.path }}
run: composer install
env:
COMPOSER_AUTH: ${{ secrets.composer_auth }}
- name: Create default phpcs.xml if none exists
working-directory: ${{ steps.setup-magento.outputs.path }}
run: |
mkdir -p app/code
if [ ! -f .phpcs.xml ] && [ ! -f phpcs.xml ] && [ ! -f .phpcs.xml.dist ] && [ ! -f phpcs.xml.dist ]; then
cat > phpcs.xml << 'EOF'
<ruleset name="Store">
<rule ref="Magento2"/>
<file>app/code</file>
</ruleset>
EOF
fi
- uses: graycoreio/github-actions-magento2/coding-standard@v8.0.0-rc.1
with:
path: ${{ steps.setup-magento.outputs.path }}
composer_auth: ${{ secrets.composer_auth }}
+1 -1
View File
@@ -82,7 +82,7 @@ jobs:
COMPOSER_AUTH: ${{ secrets.composer_auth }}
name: Create Magento ${{ matrix.magento }} Project
- uses: graycoreio/github-actions-magento2/get-magento-version@v7.0.0-rc.0
- uses: graycoreio/github-actions-magento2/get-magento-version@v8.0.0-rc.1
id: magento-version
with:
working-directory: ${{ inputs.magento_directory }}
+7
View File
@@ -5,6 +5,12 @@ on:
branches:
- main
workflow_dispatch:
inputs:
release-candidate:
description: 'Cut a release-candidate (prerelease) instead of a normal release.'
type: boolean
required: false
default: false
env:
RELEASE_BRANCH: release-please--branches--main--components--github-actions-magento2
@@ -21,6 +27,7 @@ jobs:
uses: googleapis/release-please-action@v4
with:
token: ${{ secrets.GRAYCORE_GITHUB_TOKEN }}
config-file: ${{ inputs.release-candidate && 'release-please-config.rc.json' || 'release-please-config.json' }}
- name: Check if release branch exists
id: branch-check
+1 -1
View File
@@ -1 +1 @@
{".":"7.0.0-rc.0"}
{".":"8.0.0-rc.1"}
+111
View File
@@ -0,0 +1,111 @@
# AGENTS.md
## Project Overview
`github-actions-magento2` — a GitHub Actions toolkit for Magento 2 development. Provides reusable composite actions and reusable workflows that Magento module and store developers call from their own CI pipelines.
## Repository Structure
```
.github/workflows/ # Reusable workflows and internal CI workflows
_test/demo-package/ # Test fixture used by internal CI workflows
docs/ # General documentation
other-root-level-folders # Individual GitHub Actions (all are external/public)
```
Most actions are **composite** (bash scripts in `action.yml`). Two are **TypeScript bundled**: `supported-version` and `setup-install`.
## Commands
```bash
# Run all tests
npm ci
npm test
# Run tests for a single package
cd actionName && npm test
# Build a TypeScript action (must be committed after source changes)
cd supported-version && npm run build
cd setup-install && npm run build
```
Build uses `esbuild` and outputs `dist/index.js`. The `dist/` file **must be committed** — GitHub Actions runs the bundled output directly.
## Code Style
- TypeScript with strict settings
- ESLint: `eslint:recommended` + `@typescript-eslint/recommended`
- No comments unless the "why" is non-obvious
- Conventional commits
## Hard Rules (all agents)
- Never edit `CHANGELOG.md` — managed by release-please
- Never commit TypeScript source changes without also committing the rebuilt `dist/index.js`
- Never add external runtime dependencies to TypeScript actions without flagging bundle size impact
- Never call `_internal-*` workflows from external repositories
---
## @test-agent
Writes and updates Jest specs for TypeScript actions (`supported-version`, `setup-install`). Scope is limited to `**/*.spec.ts` files.
### Style
Test observable behavior, not implementation details. No filesystem mocks — use real temp dirs if needed. No network access.
```ts
import { validateKind } from "./validate-kinds";
describe('validateKind', () => {
it('returns `true` if its a valid kind', () => {
expect(validateKind("latest")).toBe(true);
});
it('throws a helpful exception if its an invalid kind', () => {
expect(() => validateKind(<any>"taco")).toThrowError();
});
});
```
### Never
- Test implementation details
- Mock the filesystem
- Write tests that require network access
---
## @supported-version-agent
Manages the Magento/Mage-OS version compatibility data in `supported-version/src/versions/`. Scope is limited to those JSON files.
### After every edit
Run `npm test` inside `supported-version/` before declaring done.
### Never
- Remove a version entry — only add or mark end-of-life
- Guess version compatibility — only use data from official Magento/Mage-OS release notes
- Edit TypeScript source in `supported-version/src/`
---
## @workflow-agent
Owns all externally-facing aspects of the repo: every root-level composite action and the three public reusable workflows (`integration.yaml`, `check-extension.yaml`, `check-store.yaml`). Changes here affect downstream callers.
### Boundaries
**Free to act** — implementation changes that do not alter the public interface (inputs, outputs, default behavior)
**Ask first** — any change to inputs, outputs, or default behavior of an external action or reusable workflow
**Never**
- Remove or rename an existing input/output without a major version bump
- Change the default value of an existing input
- Modify `_internal-*` workflows (out of scope)
- Add a runtime dependency to a TypeScript action without flagging bundle size impact
+61
View File
@@ -2,6 +2,67 @@
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.
## [8.0.0-rc.1](https://github.com/graycoreio/github-actions-magento2/compare/v8.0.0-rc.0...v8.0.0-rc.1) (2026-05-10)
### Features
* **setup-magento:** prevent Magento dir from being mirrored into vendor ([22627e1](https://github.com/graycoreio/github-actions-magento2/commit/22627e100059b090adaf2484a09db2d5568492ce))
### Bug Fixes
* **check-extension:** prevent recursively mirroring _ghamagento into _ghamagento ([b0131f0](https://github.com/graycoreio/github-actions-magento2/commit/b0131f0fa08dae3b41c6ae476ae5f81ac654c68b))
* **check-store:** only run unit tests for unit tests ([ef06f45](https://github.com/graycoreio/github-actions-magento2/commit/ef06f4566ba2bd9e132d0fe85becb5a96b58aa38))
## [8.0.0-rc.0](https://github.com/graycoreio/github-actions-magento2/compare/v7.0.0...v8.0.0-rc.0) (2026-05-10)
### ⚠ BREAKING CHANGES
* **setup-magento:** Previously, when using setup-magento in extension mode, the magento 2 repo root was ../magento2 (outside of the extension folder). Due to interactions with `cache-magento` we need to keep magento inside the GITHUB_WORKSPACE (the root repo). We now do this in the `_ghamagento` folder. If you rely on the `steps.setup-magento.outputs.path` nothing changes for you. But, if you hardcoded the path, it's likely broken.
### Features
* **cache-magento:** add stamp caching for vendor/ directory ([#245](https://github.com/graycoreio/github-actions-magento2/issues/245)) ([8d00f81](https://github.com/graycoreio/github-actions-magento2/commit/8d00f8149abb5fe9dc9cc87775b108f30284cf21))
* **cache-magento:** include runner.os in the cache key ([#245](https://github.com/graycoreio/github-actions-magento2/issues/245)) ([2d7238d](https://github.com/graycoreio/github-actions-magento2/commit/2d7238de14a6ce3657b430ebd89f60b4cc341a09))
* **check-extension:** enable stamp caching ([#248](https://github.com/graycoreio/github-actions-magento2/issues/248)) ([baef64b](https://github.com/graycoreio/github-actions-magento2/commit/baef64bc0a235dc92cb81c10afbd22e70e6623f2))
* **check-extension:** use setup-di-compile action in compile-extension job ([#240](https://github.com/graycoreio/github-actions-magento2/issues/240)) ([6a520d4](https://github.com/graycoreio/github-actions-magento2/commit/6a520d49fd4ba3f33151dbb8c12dfd3be47630ab))
* **check-store:** enable stamp caching ([#247](https://github.com/graycoreio/github-actions-magento2/issues/247)) ([59f87b6](https://github.com/graycoreio/github-actions-magento2/commit/59f87b6b2e4e0007e041c82329291012ee95ce61))
* **check-store:** introduce new check-store workflow ([#241](https://github.com/graycoreio/github-actions-magento2/issues/241)) ([d311df7](https://github.com/graycoreio/github-actions-magento2/commit/d311df79661d13ab252eb681600608ed821c78fd))
* **get-magento-version:** pull version from lockfile if it exists ([#242](https://github.com/graycoreio/github-actions-magento2/issues/242)) ([87989bb](https://github.com/graycoreio/github-actions-magento2/commit/87989bb250aab72274ad9f71481f70f0a8d8ac1e))
* **sansec-ecomscan:** add sansec ecomscan feature ([#235](https://github.com/graycoreio/github-actions-magento2/issues/235)) ([3c0a90f](https://github.com/graycoreio/github-actions-magento2/commit/3c0a90f92ba4e3aaa6854bc98d451fde7340877d))
* **sansec-ecomscan:** skip server checks by default ([#238](https://github.com/graycoreio/github-actions-magento2/issues/238)) ([bbd8307](https://github.com/graycoreio/github-actions-magento2/commit/bbd830745f9b752d308f4ef1b8fdc48cea10e5ba))
* **setup-di-compile:** restore setup-di-compile as a lean action ([#239](https://github.com/graycoreio/github-actions-magento2/issues/239)) ([212f9a8](https://github.com/graycoreio/github-actions-magento2/commit/212f9a8e86e2c214910e26c3ea19eb90b9aafc4b))
* **setup-install:** add new setup-install action ([#237](https://github.com/graycoreio/github-actions-magento2/issues/237)) ([e31f6f6](https://github.com/graycoreio/github-actions-magento2/commit/e31f6f656a2e24afcb95dcc1b4c4dc51e73d00f7))
* **setup-magento:** extension working dir changed to _ghamagento folder ([#246](https://github.com/graycoreio/github-actions-magento2/issues/246)) ([a729f8b](https://github.com/graycoreio/github-actions-magento2/commit/a729f8b2fda45af7c4a4cd0bbe32bdf5151bf125))
* **setup-magento:** mkdir app/etc in extension mode ([#246](https://github.com/graycoreio/github-actions-magento2/issues/246)) ([c53607c](https://github.com/graycoreio/github-actions-magento2/commit/c53607cca85b77c08a9ae826e5f1365f2b7b9ace))
* **supported-version:** dynamically append "version" to matrix ([a7e327d](https://github.com/graycoreio/github-actions-magento2/commit/a7e327d44f6dbca270be5f5c5488498f8ba27b2b))
### Bug Fixes
* **coding-standard:** use exactly phpcs.xml if exists ([#243](https://github.com/graycoreio/github-actions-magento2/issues/243)) ([a1c6246](https://github.com/graycoreio/github-actions-magento2/commit/a1c6246c7834203379f25acb03ba8ad7ad42c859))
* **fix-magento-install:** remove deprecated set-output ([c115395](https://github.com/graycoreio/github-actions-magento2/commit/c115395583913b1beb539aa514a305d8dcbb9364))
## [7.0.0](https://github.com/graycoreio/github-actions-magento2/compare/v7.0.0-rc.0...v7.0.0) (2026-04-29)
### Features
* **supported-version:** update for Mage-OS 2.2.2 ([#317](https://github.com/graycoreio/github-actions-magento2/issues/317)) ([bbecc7f](https://github.com/graycoreio/github-actions-magento2/commit/bbecc7f5f9e4ddfdf5b41eb17fac6db1b30b56f0))
### Bug Fixes
* **cache-magento:** address `set-output` deprecation ([#231](https://github.com/graycoreio/github-actions-magento2/issues/231)) ([771dd05](https://github.com/graycoreio/github-actions-magento2/commit/771dd054395a0e0a33e2d712d9793ca8322173e9))
* **supported-version:** filter uninstallable versions from usable kind ([#319](https://github.com/graycoreio/github-actions-magento2/issues/319)) ([f803617](https://github.com/graycoreio/github-actions-magento2/commit/f8036173e143ab5d13147c136e0d9e0c6bbb829b))
### Miscellaneous Chores
* promote release 7.0.0 ([90babb1](https://github.com/graycoreio/github-actions-magento2/commit/90babb16bfb28ca1953c95edb2301c9090b52f67))
## [7.0.0-rc.0](https://github.com/graycoreio/github-actions-magento2/compare/v6.0.0...v7.0.0-rc.0) (2026-04-28)
+1
View File
@@ -0,0 +1 @@
@AGENTS.md
+12 -2
View File
@@ -5,6 +5,7 @@
![GitHub release (latest SemVer)](https://img.shields.io/github/v/release/graycoreio/github-actions-magento2)
[![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)
[![MageCheck Store](https://img.shields.io/github/actions/workflow/status/graycoreio/github-actions-magento2/_internal-check-store.yaml?label=Check%20Store%20Test&labelColor=1a1a1a)](https://github.com/graycoreio/github-actions-magento2/actions/workflows/_internal-check-store.yaml)
</div>
@@ -16,13 +17,19 @@ Opinionated Github Actions and Workflows to make building, testing, and maintain
## Workflows
If you are new here, start with a reusable workflow. They are pre-built CI pipelines that you can adopt in minutes — no deep knowledge of the individual actions required. Pick the one that matches your project type and call it from your own workflow file.
| 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. |
| [Integration Test](./docs/workflows/integration.md) | **Deprecated** — use MageCheck Extension instead. A Github Workflow that runs the Integration Tests of a Magento Package. |
| [MageCheck Extension](./docs/workflows/check-extension.md) | A Github Workflow that runs various kinds of quality checks for a Magento Extension. |
| [MageCheck Store](./docs/workflows/check-store.md) | A Github Workflow that runs various kinds of quality checks for a Magento Store. |
## Actions
If the reusable workflows do not fit your needs, the individual actions are the building blocks they are composed from. Use these when you need full control over your pipeline.
| Action Name | Description |
| ------------------------------------------------------------ | ----------------------------------------------------------------------------------------- |
| [Fix Magento Install](./fix-magento-install/README.md) | A Github Action that fixes Magento before `composer install` |
@@ -33,3 +40,6 @@ Opinionated Github Actions and Workflows to make building, testing, and maintain
| [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 |
| [Setup Install](./setup-install/README.md) | A Github Action that runs `bin/magento setup:install` from the supported-version services matrix |
| [Setup DI Compile](./setup-di-compile/README.md) | A Github Action that enables all modules and runs `bin/magento setup:di:compile` |
| [Sansec eComscan](./sansec-ecomscan/README.md) | A Github Action that runs the Sansec eComscan security scanner. |
+64 -25
View File
@@ -4,35 +4,74 @@ A Github Action that creates a composer cache for a Magento extension or store.
## Inputs
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' |
| -------------------- | -------------------------------------------------------------------------------------- | -------- | ---------- |
| `composer_cache_key` | A key to version the composer cache. Can be incremented if you need to bust the cache. | false | `__mageos` |
| `working-directory` | The directory where Magento is installed (location of `vendor/` and `composer.lock`). | false | `.` |
| `stamp` | Cache the `vendor/` directory in addition to the Composer download cache. | false | `false` |
### Usage
## Cache keys
The download cache key has the format:
```
composer | v5.8 | <os> | <composer_cache_key> | <composer-version> | <php-version>
```
When `stamp: true`, the `vendor/` cache key has the format:
```
composer | stamp | v5.8 | <os> | <composer_cache_key> | <composer-version> | <php-version> | <composer.lock-hash>
```
The `composer.lock` hash is derived from `working-directory/composer.lock` using `hashFiles`. The download key also gains the hash suffix when a Magento product package is detected at `working-directory`.
## Usage
### Extension (download cache only)
```yml
name: Magento Cache
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
showcase_cache:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: graycoreio/github-actions-magento2/cache-magento@main
id: cache-magento
- run: composer install
shell: bash
name: Composer install
- uses: graycoreio/github-actions-magento2/cache-magento@v7.0.0 # x-release-please-version
with:
composer_cache_key: ${{ inputs.composer_cache_key }}
```
### Extension or store (download + vendor stamp cache)
```yml
- uses: graycoreio/github-actions-magento2/setup-magento@v7.0.0 # x-release-please-version
id: setup-magento
with:
mode: extension # or store
# ...
- uses: graycoreio/github-actions-magento2/cache-magento@v7.0.0 # x-release-please-version
with:
composer_cache_key: ${{ inputs.composer_cache_key }}
working-directory: ${{ steps.setup-magento.outputs.path }}
stamp: true
- run: composer install
working-directory: ${{ steps.setup-magento.outputs.path }}
```
### Stamp Mode
On a warm cache hit, `composer install` completes in ~0s because `vendor/` is already present — Composer sees everything installed and exits immediately. For a full Magento install this saves 25 minutes of package extraction per job.
The trade-off is size. The `vendor/` directory for a Magento project runs 300600 MB, so a frequent cache miss means you are consistently paying the upload cost without recouping it on the next run.
As such, use `stamp: true` when `composer.lock` is stable across most runs — a store on a release branch, or extension CI against a pinned Magento version. Skip it when the lock changes often or when runner storage is constrained.
> [!WARNING]
> **Dependabot / Renovate:** Each time a Dependabot or Renovate PR is merged, the remaining open PRs rebase and each produces a new `composer.lock`. This cascades into a large number of unique cache entries, inflating storage costs without delivering proportional compute savings — because automated PRs are not waiting on fast feedback. The fix is to disable stamp caching for automated dependency PRs entirely:
>
> ```yml
> - uses: graycoreio/github-actions-magento2/cache-magento@v7.0.0 # x-release-please-version
> with:
> stamp: ${{ github.actor != 'dependabot[bot]' }}
> ```
>
> If you use Renovate, check its bot account name and adjust the condition accordingly. Dependabot PRs will pay full `composer install` time on every run, which is acceptable — nobody is waiting on them.
+86 -3
View File
@@ -7,11 +7,31 @@ inputs:
required: false
default: "__mageos"
description: A key to version the composer cache. Can be incremented if you need to bust the cache.
working-directory:
required: false
default: "."
description: "The working directory where Magento is installed (location of vendor/ and composer.lock)"
stamp:
required: false
default: "false"
description: "Cache the vendor/ directory in addition to the Composer download cache"
exclude-from-stamp:
required: false
default: ""
description: |
Newline-separated list of Composer package names to exclude from the stamp cache (e.g. magento/module-foo).
magento/magento2-base and mage-os/magento2-base are always excluded regardless of this input.
outputs:
cache-hit:
description: "A boolean value to indicate an exact match was found for the key"
value: ${{ steps.cache-magento-cache.outputs.cache-hit }}
key:
description: "The cache key used for the Composer download cache"
value: ${{ steps.cache-magento-keys.outputs.download-key }}
stamp-key:
description: "The cache key used for the vendor/ stamp cache (only set when stamp: true)"
value: ${{ steps.cache-magento-keys.outputs.stamp-key }}
runs:
using: "composite"
@@ -22,22 +42,85 @@ runs:
run: |
echo "dir=$(composer config cache-files-dir --global)" >> $GITHUB_OUTPUT
- run: echo "::set-output name=version::$(php -v | awk 'NR==1{print $2}')"
- run: echo "version=$(php -v | awk 'NR==1{print $2}')" >> "$GITHUB_OUTPUT"
shell: bash
id: cache-magento-get-php-version
- run: echo "::set-output name=version::$(composer --version | awk '{print $3}')"
- run: echo "version=$(composer --version | awk '{print $3}')" >> "$GITHUB_OUTPUT"
shell: bash
name: Compute Composer Version
id: cache-magento-get-composer-version
- name: Validate working-directory is inside GITHUB_WORKSPACE
if: inputs.stamp == 'true'
shell: bash
run: |
WORKING_DIR="$(realpath '${{ inputs.working-directory }}')"
WORKSPACE="$(realpath '${{ github.workspace }}')"
if [[ "$WORKING_DIR" != "$WORKSPACE"* ]]; then
echo "::error::cache-magento: working-directory '${{ inputs.working-directory }}' resolves outside GITHUB_WORKSPACE. You cannot use the `stamp` cache in folders outside the workspace."
exit 1
fi
- uses: graycoreio/github-actions-magento2/get-magento-version@v8.0.0-rc.1
id: cache-magento-get-magento-version
with:
working-directory: ${{ inputs.working-directory }}
- name: Validate composer.lock exists for stamp cache (store mode)
if: inputs.stamp == 'true' && steps.cache-magento-get-magento-version.outputs.project != ''
shell: bash
run: |
if [[ ! -f "${{ inputs.working-directory }}/composer.lock" ]]; then
echo "::error::cache-magento: stamp: true on a store requires a '${{ inputs.working-directory }}/composer.lock' to exist."
exit 1
fi
- name: Compute cache keys
id: cache-magento-keys
shell: bash
run: |
bash "${{ github.action_path }}/compute-cache-keys.sh" \
"${{ inputs.composer_cache_key }}" \
"${{ runner.os }}" \
"${{ steps.cache-magento-get-php-version.outputs.version }}" \
"${{ steps.cache-magento-get-composer-version.outputs.version }}" \
"${{ steps.cache-magento-get-magento-version.outputs.project }}" \
"${{ hashFiles(format('{0}/composer.lock', inputs.working-directory)) }}" \
>> $GITHUB_OUTPUT
- name: "Cache Composer Packages"
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 }}"
key: ${{ steps.cache-magento-keys.outputs.download-key }}
restore-keys: |
${{ steps.cache-magento-keys.outputs.download-restore-key }}
path: ${{ steps.cache-magento-composer-cache.outputs.dir }}
- name: Compute stamp paths
id: cache-magento-stamp-paths
if: inputs.stamp == 'true'
shell: bash
env:
EXCLUDE_FROM_STAMP: ${{ inputs.exclude-from-stamp }}
WORKING_DIR: ${{ inputs.working-directory }}
run: |
PATHS=$(bash "${{ github.action_path }}/compute-stamp-paths.sh" "$(realpath "$WORKING_DIR")" "$EXCLUDE_FROM_STAMP")
{
echo "paths<<EOF"
echo "$PATHS"
echo "EOF"
} >> "$GITHUB_OUTPUT"
- name: "Cache Vendor (Stamp)"
uses: actions/cache@v5
if: inputs.stamp == 'true'
with:
key: ${{ steps.cache-magento-keys.outputs.stamp-key }}
path: |
${{ steps.cache-magento-stamp-paths.outputs.paths }}
branding:
icon: "code"
color: "green"
+20
View File
@@ -0,0 +1,20 @@
#!/usr/bin/env bash
# Args: composer_cache_key os php_version composer_version project lock_hash
COMPOSER_CACHE_KEY="$1"
OS="$2"
PHP_VERSION="$3"
COMPOSER_VERSION="$4"
PROJECT="$5"
LOCK_HASH="${6:-}"
MODE="extension"
SUFFIX=""
if [ -n "$PROJECT" ]; then
MODE="store"
[ -n "$LOCK_HASH" ] && SUFFIX=" | $LOCK_HASH"
fi
BASE="composer | v5.8 | ${OS} | ${MODE} | ${COMPOSER_CACHE_KEY} | ${COMPOSER_VERSION} | ${PHP_VERSION}"
echo "download-key=${BASE}${SUFFIX}"
echo "download-restore-key=${BASE}"
echo "stamp-key=composer | stamp | v5.8 | ${OS} | ${MODE} | ${COMPOSER_CACHE_KEY} | ${COMPOSER_VERSION} | ${PHP_VERSION}${SUFFIX}"
+18
View File
@@ -0,0 +1,18 @@
#!/usr/bin/env bash
# Args: working_directory exclude_from_stamp
# working_directory: absolute path (caller is responsible for realpath resolution)
# exclude_from_stamp: newline-separated list of composer package names to exclude
WORKING_DIR="$1"
EXCLUDE_FROM_STAMP="${2:-}"
VENDOR="${WORKING_DIR}/vendor"
PATHS="${VENDOR}/**"$'\n'"!${VENDOR}/**/"$'\n'"!${VENDOR}/magento/magento2-base"$'\n'"!${VENDOR}/magento/magento2-base/**"$'\n'"!${VENDOR}/mage-os/magento2-base"$'\n'"!${VENDOR}/mage-os/magento2-base/**"
while IFS= read -r pkg; do
pkg="${pkg#"${pkg%%[![:space:]]*}"}"
pkg="${pkg%"${pkg##*[![:space:]]}"}"
[[ -z "$pkg" ]] && continue
PATHS="${PATHS}"$'\n'"!${VENDOR}/${pkg}"$'\n'"!${VENDOR}/${pkg}/**"
done <<< "$EXCLUDE_FROM_STAMP"
echo "$PATHS"
+9
View File
@@ -0,0 +1,9 @@
{
"packages": [
{
"name": "magento/product-community-edition",
"version": "2.4.7"
}
],
"packages-dev": []
}
+116
View File
@@ -0,0 +1,116 @@
#!/usr/bin/env bash
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SCRIPT="$SCRIPT_DIR/compute-cache-keys.sh"
SCRIPT_STAMP="$SCRIPT_DIR/compute-stamp-paths.sh"
LOCK_HASH=$(sha256sum "$SCRIPT_DIR/fixtures/composer.lock" | cut -d' ' -f1)
PASS=0
FAIL=0
assert_eq() {
local label="$1" expected="$2" actual="$3"
if [ "$expected" = "$actual" ]; then
echo "PASS: $label"
PASS=$((PASS + 1))
else
echo "FAIL: $label"
echo " expected: $expected"
echo " actual: $actual"
FAIL=$((FAIL + 1))
fi
}
field() {
echo "$1" | grep "^${2}=" | cut -d= -f2-
}
# Extension mode: no project resolved, mode derived as "extension", no lock suffix
OUT=$(bash "$SCRIPT" "_mageos" "Linux" "8.3.0" "2.2.6" "" "")
assert_eq "extension: download-key" \
"composer | v5.8 | Linux | extension | _mageos | 2.2.6 | 8.3.0" \
"$(field "$OUT" download-key)"
assert_eq "extension: download-restore-key" \
"composer | v5.8 | Linux | extension | _mageos | 2.2.6 | 8.3.0" \
"$(field "$OUT" download-restore-key)"
assert_eq "extension: stamp-key" \
"composer | stamp | v5.8 | Linux | extension | _mageos | 2.2.6 | 8.3.0" \
"$(field "$OUT" stamp-key)"
# Store mode: project resolved, mode derived as "store", lock hash appended (restore-key drops lock for prefix match)
OUT=$(bash "$SCRIPT" "_mageos" "Linux" "8.3.0" "2.2.6" "magento/project-community-edition" "$LOCK_HASH")
assert_eq "store: download-key" \
"composer | v5.8 | Linux | store | _mageos | 2.2.6 | 8.3.0 | $LOCK_HASH" \
"$(field "$OUT" download-key)"
assert_eq "store: download-restore-key" \
"composer | v5.8 | Linux | store | _mageos | 2.2.6 | 8.3.0" \
"$(field "$OUT" download-restore-key)"
assert_eq "store: stamp-key" \
"composer | stamp | v5.8 | Linux | store | _mageos | 2.2.6 | 8.3.0 | $LOCK_HASH" \
"$(field "$OUT" stamp-key)"
# Store mode without composer.lock (e.g. stamp=false on a store before `composer install`):
# lock_hash is empty, so keys must not carry a trailing " | " with an empty hash slot.
OUT=$(bash "$SCRIPT" "_mageos" "Linux" "8.3.0" "2.2.6" "magento/project-community-edition" "")
assert_eq "store no-lock: download-key" \
"composer | v5.8 | Linux | store | _mageos | 2.2.6 | 8.3.0" \
"$(field "$OUT" download-key)"
assert_eq "store no-lock: download-restore-key" \
"composer | v5.8 | Linux | store | _mageos | 2.2.6 | 8.3.0" \
"$(field "$OUT" download-restore-key)"
assert_eq "store no-lock: stamp-key" \
"composer | stamp | v5.8 | Linux | store | _mageos | 2.2.6 | 8.3.0" \
"$(field "$OUT" stamp-key)"
# Custom composer_cache_key, no project resolved
OUT=$(bash "$SCRIPT" "custom-v2" "Linux" "8.1.5" "2.4.2" "" "")
assert_eq "custom key: download-key" \
"composer | v5.8 | Linux | extension | custom-v2 | 2.4.2 | 8.1.5" \
"$(field "$OUT" download-key)"
assert_eq "custom key: download-restore-key" \
"composer | v5.8 | Linux | extension | custom-v2 | 2.4.2 | 8.1.5" \
"$(field "$OUT" download-restore-key)"
assert_eq "custom key: stamp-key" \
"composer | stamp | v5.8 | Linux | extension | custom-v2 | 2.4.2 | 8.1.5" \
"$(field "$OUT" stamp-key)"
# Stamp paths: no excludes — base paths only, with magento2-base always excluded
OUT=$(bash "$SCRIPT_STAMP" "/work" "")
EXPECTED="/work/vendor/**
!/work/vendor/**/
!/work/vendor/magento/magento2-base
!/work/vendor/magento/magento2-base/**
!/work/vendor/mage-os/magento2-base
!/work/vendor/mage-os/magento2-base/**"
assert_eq "stamp paths: no excludes" "$EXPECTED" "$OUT"
# Stamp paths: single exclude appended after the always-excluded base entries
OUT=$(bash "$SCRIPT_STAMP" "/work" "magento/module-foo")
EXPECTED="/work/vendor/**
!/work/vendor/**/
!/work/vendor/magento/magento2-base
!/work/vendor/magento/magento2-base/**
!/work/vendor/mage-os/magento2-base
!/work/vendor/mage-os/magento2-base/**
!/work/vendor/magento/module-foo
!/work/vendor/magento/module-foo/**"
assert_eq "stamp paths: single exclude" "$EXPECTED" "$OUT"
# Stamp paths: multiple excludes, with whitespace and blank lines tolerated
OUT=$(bash "$SCRIPT_STAMP" "/work" "$(printf 'magento/module-foo\n magento/module-bar \n\nvendor/pkg-baz\n')")
EXPECTED="/work/vendor/**
!/work/vendor/**/
!/work/vendor/magento/magento2-base
!/work/vendor/magento/magento2-base/**
!/work/vendor/mage-os/magento2-base
!/work/vendor/mage-os/magento2-base/**
!/work/vendor/magento/module-foo
!/work/vendor/magento/module-foo/**
!/work/vendor/magento/module-bar
!/work/vendor/magento/module-bar/**
!/work/vendor/vendor/pkg-baz
!/work/vendor/vendor/pkg-baz/**"
assert_eq "stamp paths: multiple excludes with whitespace and blank lines" "$EXPECTED" "$OUT"
echo ""
echo "$PASS passed, $FAIL failed"
[ "$FAIL" -eq 0 ]
+1 -1
View File
@@ -36,7 +36,7 @@ jobs:
tools: composer:v2
coverage: none
- uses: graycoreio/github-actions-magento2/coding-standard@main
- uses: graycoreio/github-actions-magento2/coding-standard@v7.0.0 # x-release-please-version
with:
path: app/code # Optional, defaults to .
version: 25 # Optional, will use the latest if omitted.
+3 -3
View File
@@ -52,12 +52,12 @@ runs:
fi
- name: Get Composer Version
uses: graycoreio/github-actions-magento2/get-composer-version@v7.0.0-rc.0
uses: graycoreio/github-actions-magento2/get-composer-version@v8.0.0-rc.1
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@v7.0.0-rc.0
uses: graycoreio/github-actions-magento2/semver-compare@v8.0.0-rc.1
id: is-allow-plugins-available
if: steps.check-installed.outputs.installed != 'true'
with:
@@ -111,7 +111,7 @@ runs:
[ -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[@]}" .
vendor/bin/phpcs "${FLAGS[@]}"
else
vendor/bin/phpcs --standard=Magento2 --ignore=*vendor/* "${FLAGS[@]}" .
fi
@@ -4,7 +4,7 @@ A Github Workflow that runs various kinds of quality checks for a Magento Extens
## Inputs
See the [check-extension.yaml](./check-extension.yaml)
See the [check-extension.yaml](../../.github/workflows/check-extension.yaml)
| Input | Description | Required | Default |
| ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------- | -------- | --------------------------- |
@@ -38,12 +38,12 @@ jobs:
matrix: ${{ steps.supported-version.outputs.matrix }}
steps:
- uses: actions/checkout@v6
- uses: graycoreio/github-actions-magento2/supported-version@main
- uses: graycoreio/github-actions-magento2/supported-version@v7.0.0 # x-release-please-version
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
uses: graycoreio/github-actions-magento2/.github/workflows/check-extension.yaml@v7.0.0 # x-release-please-version
with:
matrix: ${{ needs.compute_matrix.outputs.matrix }}
```
+58
View File
@@ -0,0 +1,58 @@
# MageCheck Store
A Github Workflow that runs various kinds of quality checks for a Magento Store.
Unlike [MageCheck Extension](./check-extension.md), this workflow automatically detects the Magento version from your store's `composer.lock` — no matrix computation required in the calling workflow.
## Inputs
See the [check-store.yaml](../../.github/workflows/check-store.yaml)
| Input | Description | Required | Default |
| ------------------- | -------------------------------------------------------------------------------------- | -------- | --------- |
| path | The folder of the Magento store that you are testing | false | . |
| composer_cache_key | A key to version the composer cache. Can be incremented if you need to bust the cache. | false | \_mageos |
| store_artifact_name | If provided, download store files from this artifact instead of using actions/checkout | false | "" |
## Secrets
| Input | Description | Required | Default |
| ------------- | --------------------------------------------------------------------------------------------------------------------------------------- | -------- | ------- |
| composer_auth | Your composer credentials (typically a stringified json object of the contents of your auth.json) | false | NULL |
## Checks Run
- **Unit Tests** — runs PHPUnit against custom code in `app/code`. Skipped automatically if no test files are found.
- **Coding Standard** — runs the Magento Coding Standard against `app/code`. Uses your `phpcs.xml` (or `.phpcs.xml`, `phpcs.xml.dist`, `.phpcs.xml.dist`) if one exists, otherwise a sensible default is generated.
## Usage
```yml
name: Check Store
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
check-store:
uses: graycoreio/github-actions-magento2/.github/workflows/check-store.yaml@v7.0.0 # x-release-please-version
secrets:
composer_auth: ${{ secrets.COMPOSER_AUTH }}
```
### Usage with a store artifact
If your pipeline builds or prepares the store in a prior job and uploads it as an artifact, you can pass the artifact name instead of relying on `actions/checkout`:
```yml
jobs:
check-store:
uses: graycoreio/github-actions-magento2/.github/workflows/check-store.yaml@v7.0.0 # x-release-please-version
secrets:
composer_auth: ${{ secrets.COMPOSER_AUTH }}
```
@@ -1,10 +1,12 @@
# Integration Tests for a Magento Package
> **Deprecated** — use [MageCheck Extension](./check-extension.md) instead. Scheduled for removal in v10.
A Github Workflow that runs the Integration Tests of a Magento Package
## Inputs
See the [integration.yaml](./integration.yaml)
See the [integration.yaml](../../.github/workflows/integration.yaml)
| Input | Description | Required | Default |
| ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------- | -------- | ----------------------------- |
@@ -48,13 +50,13 @@ jobs:
matrix: ${{ steps.supported-version.outputs.matrix }}
steps:
- uses: actions/checkout@v6
- uses: graycoreio/github-actions-magento2/supported-version@main
- uses: graycoreio/github-actions-magento2/supported-version@v7.0.0 # x-release-please-version
with:
include_services: true
id: supported-version
integration-workflow:
needs: compute_matrix
uses: graycoreio/github-actions-magento2/.github/workflows/integration.yaml@main
uses: graycoreio/github-actions-magento2/.github/workflows/integration.yaml@v7.0.0 # x-release-please-version
with:
package_name: my-vendor/package
matrix: ${{ needs.compute_matrix.outputs.matrix }}
+1 -1
View File
@@ -26,7 +26,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: graycoreio/github-actions-magento2/fix-magento-install@main
- uses: graycoreio/github-actions-magento2/fix-magento-install@v7.0.0 # x-release-please-version
with:
magento_directory: path/to/magento
```
+2 -2
View File
@@ -9,12 +9,12 @@ inputs:
runs:
using: "composite"
steps:
- uses: graycoreio/github-actions-magento2/get-magento-version@v7.0.0-rc.0
- uses: graycoreio/github-actions-magento2/get-magento-version@v8.0.0-rc.1
id: init-magento-get-magento-version
with:
working-directory: ${{ inputs.magento_directory }}
- run: echo "::set-output name=version::$(composer --version | awk '{print $3}')"
- run: echo "version=$(composer --version | awk '{print $3}')" >> $GITHUB_OUTPUT
shell: bash
name: Compute Composer Version
id: init-magento-get-composer-version
+1 -1
View File
@@ -25,7 +25,7 @@ jobs:
name: A job to compute an installed Composer version.
steps:
- uses: actions/checkout@v6
- uses: graycoreio/github-actions-magento2/get-composer-version@main
- uses: graycoreio/github-actions-magento2/get-composer-version@v7.0.0 # x-release-please-version
id: get-composer-version
- run: echo version ${{ steps.get-composer-version.outputs.version }}
shell: bash
+1 -1
View File
@@ -25,7 +25,7 @@ jobs:
name: A job to compute an installed Magento version.
steps:
- uses: actions/checkout@v6
- uses: graycoreio/github-actions-magento2/get-magento-version@main
- uses: graycoreio/github-actions-magento2/get-magento-version@v7.0.0 # x-release-please-version
id: get-magento-version
- run: echo version ${{ steps.get-magento-version.outputs.version }}
shell: bash
+8 -10
View File
@@ -9,22 +9,20 @@ inputs:
required: false
outputs:
version: # id of output
description: 'The determined version of Magento'
version:
description: 'The resolved Magento version (e.g. 2.4.6-p14)'
value: ${{ steps.get-magento-version.outputs.version }}
project:
description: 'The Magento project package name (e.g. magento/project-community-edition)'
value: ${{ steps.get-magento-version.outputs.project }}
runs:
using: "composite"
steps:
- run: |
echo "version=$(cat composer.json | jq '.require
| with_entries( select(.key == "magento/product-community-edition" or .key == "magento/product-enterprise-edition") )
| to_entries
| .[0].value')" >> $GITHUB_OUTPUT
shell: bash
working-directory: ${{ inputs.working-directory }}
name: Compute Installed Magento version
- name: Compute Installed Magento version
id: get-magento-version
shell: bash
run: bash "${{ github.action_path }}/get-magento-version.sh" "${{ inputs.working-directory }}" >> $GITHUB_OUTPUT
branding:
icon: "code"
+9
View File
@@ -0,0 +1,9 @@
{
"packages": [
{
"name": "magento/product-enterprise-edition",
"version": "2.4.7-p1"
}
],
"packages-dev": []
}
@@ -0,0 +1,5 @@
{
"name": "vendor/module",
"type": "magento2-module",
"require": {}
}
+9
View File
@@ -0,0 +1,9 @@
{
"packages": [
{
"name": "mage-os/product-community-edition",
"version": "1.0.0"
}
],
"packages-dev": []
}
@@ -0,0 +1,5 @@
{
"require": {
"magento/product-community-edition": "2.4.6-p1"
}
}
+9
View File
@@ -0,0 +1,9 @@
{
"packages": [
{
"name": "magento/product-community-edition",
"version": "2.4.7"
}
],
"packages-dev": []
}
@@ -0,0 +1,9 @@
{
"packages": [
{
"name": "magento/product-community-edition",
"version": "v2.4.6"
}
],
"packages-dev": []
}
@@ -0,0 +1,20 @@
#!/usr/bin/env bash
set -uo pipefail
WORKING_DIR="${1:-.}"
PATTERN="magento/product-(community|enterprise)-edition|mage-os/product-community-edition"
cd "$WORKING_DIR"
if [ -f composer.lock ]; then
RESULT=$(jq -r --arg p "$PATTERN" '.packages[] | select(.name | test($p)) | "\(.name) \(.version)"' composer.lock | head -1)
elif [ -f composer.json ]; then
RESULT=$(jq -r --arg p "$PATTERN" '.require | to_entries[] | select(.key | test($p)) | "\(.key) \(.value)"' composer.json | head -1)
fi
PRODUCT=$(echo "${RESULT:-}" | awk '{print $1}')
VERSION=$(echo "${RESULT:-}" | awk '{print $2}' | sed 's/^v//')
PROJECT=$(echo "$PRODUCT" | sed 's/product-/project-/')
echo "version=\"$VERSION\""
echo "project=$PROJECT"
+55
View File
@@ -0,0 +1,55 @@
#!/usr/bin/env bash
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SCRIPT="$SCRIPT_DIR/get-magento-version.sh"
FIXTURES="$SCRIPT_DIR/fixtures"
PASS=0
FAIL=0
assert_eq() {
local label="$1" expected="$2" actual="$3"
if [ "$expected" = "$actual" ]; then
echo "PASS: $label"
PASS=$((PASS + 1))
else
echo "FAIL: $label"
echo " expected: $expected"
echo " actual: $actual"
FAIL=$((FAIL + 1))
fi
}
field() {
echo "$1" | grep "^${2}=" | cut -d= -f2-
}
OUT=$(bash "$SCRIPT" "$FIXTURES/store-lock")
assert_eq "store lock: version" '"2.4.7"' "$(field "$OUT" version)"
assert_eq "store lock: project" "magento/project-community-edition" "$(field "$OUT" project)"
OUT=$(bash "$SCRIPT" "$FIXTURES/store-v-prefix")
assert_eq "store v-prefix: version" '"2.4.6"' "$(field "$OUT" version)"
OUT=$(bash "$SCRIPT" "$FIXTURES/enterprise")
assert_eq "enterprise: version" '"2.4.7-p1"' "$(field "$OUT" version)"
assert_eq "enterprise: project" "magento/project-enterprise-edition" "$(field "$OUT" project)"
OUT=$(bash "$SCRIPT" "$FIXTURES/mage-os")
assert_eq "mage-os: version" '"1.0.0"' "$(field "$OUT" version)"
assert_eq "mage-os: project" "mage-os/project-community-edition" "$(field "$OUT" project)"
OUT=$(bash "$SCRIPT" "$FIXTURES/store-json")
assert_eq "store json: version" '"2.4.6-p1"' "$(field "$OUT" version)"
assert_eq "store json: project" "magento/project-community-edition" "$(field "$OUT" project)"
OUT=$(bash "$SCRIPT" "$FIXTURES/extension")
assert_eq "extension: version" '""' "$(field "$OUT" version)"
assert_eq "extension: project" "" "$(field "$OUT" project)"
OUT=$(bash "$SCRIPT" "$FIXTURES/empty")
assert_eq "empty dir: version" '""' "$(field "$OUT" version)"
assert_eq "empty dir: project" "" "$(field "$OUT" project)"
echo ""
echo "$PASS passed, $FAIL failed"
[ "$FAIL" -eq 0 ]
+23 -7
View File
@@ -1,15 +1,16 @@
{
"name": "@graycoreio/github-actions-magento2",
"version": "7.0.0-rc.0",
"version": "8.0.0-rc.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@graycoreio/github-actions-magento2",
"version": "7.0.0-rc.0",
"version": "8.0.0-rc.1",
"license": "MIT",
"dependencies": {
"@actions/core": "^1.11.1"
"@actions/core": "^1.11.1",
"@actions/exec": "^3.0.0"
},
"devDependencies": {
"@types/jest": "^29.5.14",
@@ -33,7 +34,7 @@
"@actions/http-client": "^2.0.1"
}
},
"node_modules/@actions/exec": {
"node_modules/@actions/core/node_modules/@actions/exec": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@actions/exec/-/exec-1.1.1.tgz",
"integrity": "sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==",
@@ -42,6 +43,21 @@
"@actions/io": "^1.0.1"
}
},
"node_modules/@actions/core/node_modules/@actions/io": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@actions/io/-/io-1.1.3.tgz",
"integrity": "sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q==",
"license": "MIT"
},
"node_modules/@actions/exec": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@actions/exec/-/exec-3.0.0.tgz",
"integrity": "sha512-6xH/puSoNBXb72VPlZVm7vQ+svQpFyA96qdDBvhB8eNZOE8LtPf9L4oAsfzK/crCL8YZ+19fKYVnM63Sl+Xzlw==",
"license": "MIT",
"dependencies": {
"@actions/io": "^3.0.2"
}
},
"node_modules/@actions/http-client": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.2.3.tgz",
@@ -53,9 +69,9 @@
}
},
"node_modules/@actions/io": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@actions/io/-/io-1.1.3.tgz",
"integrity": "sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q==",
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/@actions/io/-/io-3.0.2.tgz",
"integrity": "sha512-nRBchcMM+QK1pdjO7/idu86rbJI5YHUKCvKs0KxnSYbVe3F51UfGxuZX4Qy/fWlp6l7gWFwIkrOzN+oUK03kfw==",
"license": "MIT"
},
"node_modules/@babel/code-frame": {
+4 -3
View File
@@ -1,9 +1,9 @@
{
"name": "@graycoreio/github-actions-magento2",
"version": "7.0.0-rc.0",
"version": "8.0.0-rc.1",
"description": "Github Actions for Magento 2",
"scripts": {
"test": "cd supported-version && npm run test && cd -",
"test": "cd supported-version && npm run test && cd - && cd setup-install && npm run test && cd -",
"release": "standard-version"
},
"private": true,
@@ -18,7 +18,8 @@
},
"homepage": "https://github.com/graycoreio/github-actions-magento2#readme",
"dependencies": {
"@actions/core": "^1.11.1"
"@actions/core": "^1.11.1",
"@actions/exec": "^3.0.0"
},
"devDependencies": {
"@types/jest": "^29.5.14",
+6 -1
View File
@@ -3,12 +3,17 @@
"bump-patch-for-minor-pre-major": true,
"draft-pull-request": true,
"prerelease": true,
"prerelease-type": "rc.0",
"include-component-in-tag": false,
"include-v-in-tag": true,
"pull-request-title-pattern": "chore: release ${version}",
"packages": {
".": {
"release-type": "node"
"release-type": "node",
"extra-files": [
{ "type": "generic", "path": "*/README.md", "glob": true },
{ "type": "generic", "path": "docs/workflows/*.md", "glob": true }
]
}
}
}
+16
View File
@@ -0,0 +1,16 @@
{
"bump-minor-pre-major": true,
"bump-patch-for-minor-pre-major": true,
"draft-pull-request": true,
"prerelease": true,
"prerelease-type": "rc.0",
"include-component-in-tag": false,
"include-v-in-tag": true,
"pull-request-title-pattern": "chore: release ${version}",
"packages": {
".": {
"release-type": "node",
"versioning": "prerelease"
}
}
}
+34
View File
@@ -0,0 +1,34 @@
# Sansec eComscan Security Scan Action
A Github Action that runs the [Sansec eComscan](https://sansec.io/ecomscan) security scanner.
## Inputs
See the [action.yml](./action.yml)
## Usage
The caller is responsible for checking out the repository before calling this action. A valid Sansec license key must be passed via the `ecomscan_key` input.
The `path` input should point to the root of the Magento installation — the directory that contains `app/`, `vendor/`, etc. It defaults to `.` (the current working directory).
```yml
name: Sansec eComscan Security Scan
on:
push:
pull_request_target:
workflow_dispatch:
jobs:
run-ecomscan:
# Skip if it's a push event on a PR (it can't access secrets)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: graycoreio/github-actions-magento2/sansec-ecomscan@v7.0.0 # x-release-please-version
with:
license: ${{ secrets.SANSEC_LICENSE_KEY }}
```
+53
View File
@@ -0,0 +1,53 @@
name: "Sansec eComscan Security Scan"
author: "Graycore"
description: "A Github Action that runs the Sansec eComscan security scanner."
inputs:
license:
required: true
description: "Sansec license key (ECOMSCAN_KEY)"
path:
required: true
default: '.'
description: "The directory to scan."
skip_database:
required: false
default: 'true'
description: "Skip the database scan (--skip-database). Defaults to true."
skip-server-checks:
required: false
default: 'true'
description: "Skip server / os level checks like copy-fail"
runs:
using: composite
steps:
- name: Download eComscan
shell: bash
run: wget https://ecomscan.com/downloads/linux-amd64/ecomscan
- name: Fix permissions
shell: bash
run: chmod +x ecomscan
- name: Run eComscan
shell: bash
env:
ECOMSCAN_KEY: ${{ inputs.license }}
run: |
[ "${{ inputs.skip-server-checks }}" = "true" ] && export ECOMSCAN_SKIP_SERVER_CHECKS=true
FLAGS=(--no-auto-update --deep --format=csv)
[ "${{ inputs.skip_database }}" = "true" ] && FLAGS+=(--skip-database)
output=$(./ecomscan "${FLAGS[@]}" "${{ inputs.path }}")
if [ -n "$output" ]; then
echo "Security issues found:"
echo "$output"
exit 1
fi
branding:
icon: "shield"
color: "red"
+1 -1
View File
@@ -31,7 +31,7 @@ jobs:
name: A job to semantically compare two versions
steps:
- uses: actions/checkout@v6
- uses: graycoreio/github-actions-magento2/semver-compare@main
- uses: graycoreio/github-actions-magento2/semver-compare@v7.0.0 # x-release-please-version
with:
version: 2.1.0
compare_against: 2.2.3
+58
View File
@@ -0,0 +1,58 @@
# Setup DI Compile
A GitHub Action that enables all Magento modules and runs `bin/magento setup:di:compile`.
The caller is responsible for checkout, PHP/composer setup, and `composer install`. This action only performs the compilation step.
## Inputs
| Input | Required | Default | Description |
| ------ | -------- | ------- | ------------------------------------------------------------------ |
| `path` | No | `.` | Path to the Magento root directory. |
## Usage
```yml
name: DI Compile
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@v7.0.0 # x-release-please-version
id: supported-version
compile:
needs: compute_matrix
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix: ${{ fromJSON(needs.compute_matrix.outputs.matrix) }}
steps:
- uses: actions/checkout@v6
- uses: graycoreio/github-actions-magento2/setup-magento@v7.0.0 # x-release-please-version
id: setup-magento
with:
php-version: ${{ matrix.php }}
tools: composer:v${{ matrix.composer }}
- uses: graycoreio/github-actions-magento2/cache-magento@v7.0.0 # x-release-please-version
- run: composer install
env:
COMPOSER_AUTH: ${{ secrets.COMPOSER_AUTH }}
- uses: graycoreio/github-actions-magento2/setup-di-compile@v7.0.0 # x-release-please-version
with:
path: ${{ steps.setup-magento.outputs.path }}
```
+26
View File
@@ -0,0 +1,26 @@
name: "Magento compilation (setup:di:compile)"
author: "Graycore"
description: "A GitHub Action that runs bin/magento setup:di:compile."
inputs:
path:
required: false
default: "."
description: "Path to the Magento root directory. Accepts the output of the setup-magento action."
runs:
using: composite
steps:
- name: Enable all modules
working-directory: ${{ inputs.path }}
shell: bash
run: php bin/magento module:enable --all
- name: Compile
working-directory: ${{ inputs.path }}
shell: bash
run: php bin/magento setup:di:compile
branding:
icon: "tool"
color: "orange"
+71
View File
@@ -0,0 +1,71 @@
# Setup Install
A GitHub Action that runs `bin/magento setup:install` using the services configuration from the [`supported-version`](../supported-version/README.md) matrix output. Database and service credentials are read directly from the service configuration of `supported-version`, so they stay in sync with the running containers automatically.
## Inputs
| Input | Required | Default | Description |
| ------------ | -------- | ------- | ----------------------------------------------------------- |
| `services` | No | `null` | JSON services object from `supported-version` matrix output |
| `path` | No | `.` | Path to the Magento root directory |
| `extra_args` | No | `""` | Additional arguments to append to `setup:install` |
## Outputs
| Output | Description |
| --------- | --------------------------------------------------------- |
| `command` | The full `bin/magento setup:install` command that was run |
## Usage
This action is designed to work with [`supported-version`](../supported-version/README.md) (with `include_services: true`) and [`setup-magento`](../setup-magento/README.md).
```yml
name: Install 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@v7.0.0 # x-release-please-version
id: supported-version
with:
include_services: "true"
install:
needs: compute_matrix
runs-on: ${{ matrix.os }}
services: ${{ matrix.services }}
strategy:
fail-fast: false
matrix: ${{ fromJSON(needs.compute_matrix.outputs.matrix) }}
steps:
- uses: actions/checkout@v6
- uses: graycoreio/github-actions-magento2/setup-magento@v7.0.0 # x-release-please-version
id: setup-magento
with:
php-version: ${{ matrix.php }}
tools: composer:v${{ matrix.composer }}
env:
COMPOSER_AUTH: ${{ secrets.COMPOSER_AUTH }}
- run: composer install
working-directory: ${{ steps.setup-magento.outputs.path }}
env:
COMPOSER_AUTH: ${{ secrets.COMPOSER_AUTH }}
- uses: graycoreio/github-actions-magento2/setup-install@v7.0.0 # x-release-please-version
with:
services: ${{ toJSON(matrix.services) }}
path: ${{ steps.setup-magento.outputs.path }}
```
+31
View File
@@ -0,0 +1,31 @@
name: "Magento setup:install"
author: "Graycore"
description: "A GitHub Action that runs bin/magento setup:install, deriving service flags from the supported-version services matrix."
inputs:
services:
required: false
default: "null"
description: "JSON string of the services key from the supported-version matrix entry (toJSON(matrix.services))."
path:
required: false
default: "."
description: "Path to the Magento root directory. Accepts the output of the setup-magento action."
extra_args:
required: false
default: ""
description: "Additional raw flags to append to the setup:install command."
outputs:
command:
description: "The full bin/magento setup:install command that was run."
runs:
using: "node24"
main: "dist/index.js"
branding:
icon: "tool"
color: "orange"
+69
View File
File diff suppressed because one or more lines are too long
+9
View File
@@ -0,0 +1,9 @@
module.exports = {
clearMocks: true,
moduleFileExtensions: ['js', 'ts'],
testMatch: ['**/*.spec.ts'],
transform: {
'^.+\\.ts$': 'ts-jest'
},
verbose: true
}
+22
View File
@@ -0,0 +1,22 @@
{
"name": "@graycoreio/github-actions-magento2-setup-install",
"version": "1.0.0",
"description": "A Github Action that runs bin/magento setup:install from the supported-version services matrix",
"main": "index.js",
"private": true,
"scripts": {
"build": "npx esbuild --outfile=dist/index.js --platform=node --bundle --minify src/index.ts",
"test": "jest"
},
"author": "",
"license": "MIT",
"dependencies": {
"@actions/core": "0.0.0-PLACEHOLDER",
"@actions/exec": "0.0.0-PLACEHOLDER"
},
"devDependencies": {
"@types/jest": "0.0.0-PLACEHOLDER",
"jest": "0.0.0-PLACEHOLDER",
"ts-jest": "0.0.0-PLACEHOLDER"
}
}
+176
View File
@@ -0,0 +1,176 @@
import { buildInstallArgs, buildMysqlPrepArgs, Services } from './build-command';
const BASE_ARGS = [
'--base-url=http://localhost/',
'--admin-user=admin',
'--admin-password=admin123',
'--admin-email=admin@example.com',
'--admin-firstname=Admin',
'--admin-lastname=User',
'--backend-frontname=admin',
];
const MYSQL_SERVICE = {
image: 'mysql:8.4',
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',
};
const MYSQL_ARGS = [
'--db-host=127.0.0.1:3306',
'--db-name=magento_integration_tests',
'--db-user=user',
'--db-password=password',
];
const OPENSEARCH_ARGS = [
'--search-engine=opensearch',
'--opensearch-host=localhost',
'--opensearch-port=9200',
];
const RABBITMQ_ARGS = [
'--amqp-host=localhost',
'--amqp-port=5672',
'--amqp-user=guest',
'--amqp-password=guest',
];
const CACHE_ARGS = [
'--session-save=redis',
'--session-save-redis-host=localhost',
'--session-save-redis-port=6379',
'--cache-backend=redis',
'--cache-backend-redis-server=localhost',
'--cache-backend-redis-port=6379',
];
describe('buildInstallArgs', () => {
describe('base args', () => {
it('returns only base args when services is null', () => {
expect(buildInstallArgs(null)).toEqual(BASE_ARGS);
});
it('returns only base args when services is empty', () => {
expect(buildInstallArgs({})).toEqual(BASE_ARGS);
});
});
describe('mysql', () => {
it('adds db flags when mysql service is present', () => {
const services: Services = { mysql: MYSQL_SERVICE };
expect(buildInstallArgs(services)).toEqual([...BASE_ARGS, ...MYSQL_ARGS]);
});
});
describe('search engine', () => {
it('adds opensearch flags when opensearch service is present', () => {
const services: Services = { opensearch: { image: 'opensearchproject/opensearch:2.19.1' } };
expect(buildInstallArgs(services)).toEqual([...BASE_ARGS, ...OPENSEARCH_ARGS]);
});
it('adds elasticsearch7 flags for an elasticsearch 7.x image', () => {
const services: Services = { elasticsearch: { image: 'elasticsearch:7.17.0' } };
expect(buildInstallArgs(services)).toEqual([
...BASE_ARGS,
'--search-engine=elasticsearch7',
'--elasticsearch-host=localhost',
'--elasticsearch-port=9200',
]);
});
it('adds elasticsearch8 flags for an elasticsearch 8.x image', () => {
const services: Services = { elasticsearch: { image: 'elasticsearch:8.11.4' } };
expect(buildInstallArgs(services)).toEqual([
...BASE_ARGS,
'--search-engine=elasticsearch8',
'--elasticsearch-host=localhost',
'--elasticsearch-port=9200',
]);
});
it('prefers opensearch over elasticsearch when both are present', () => {
const services: Services = {
opensearch: { image: 'opensearchproject/opensearch:2.19.1' },
elasticsearch: { image: 'elasticsearch:8.11.4' },
};
const args = buildInstallArgs(services);
expect(args).toContain('--search-engine=opensearch');
expect(args.some(a => a.startsWith('--search-engine=elasticsearch'))).toBe(false);
});
});
describe('rabbitmq', () => {
it('adds amqp flags when rabbitmq service is present', () => {
const services: Services = { rabbitmq: { image: 'rabbitmq:4.0-management' } };
expect(buildInstallArgs(services)).toEqual([...BASE_ARGS, ...RABBITMQ_ARGS]);
});
});
describe('cache / session', () => {
it('adds redis cache flags when redis service is present', () => {
const services: Services = { redis: { image: 'redis:7.2' } };
expect(buildInstallArgs(services)).toEqual([...BASE_ARGS, ...CACHE_ARGS]);
});
it('adds redis cache flags when valkey service is present', () => {
const services: Services = { valkey: { image: 'valkey:8.0' } };
expect(buildInstallArgs(services)).toEqual([...BASE_ARGS, ...CACHE_ARGS]);
});
it('adds cache flags once when both valkey and redis are present', () => {
const services: Services = {
valkey: { image: 'valkey:8.0' },
redis: { image: 'redis:7.2' },
};
const args = buildInstallArgs(services);
expect(args.filter(a => a === '--session-save=redis')).toHaveLength(1);
});
});
describe('buildMysqlPrepArgs', () => {
it('uses root password and port from service config', () => {
expect(buildMysqlPrepArgs(MYSQL_SERVICE)).toEqual([
'-h127.0.0.1',
'--port=3306',
'-uroot',
'-prootpassword',
'-e', 'SET GLOBAL log_bin_trust_function_creators = 1;',
]);
});
it('falls back to default port when ports is absent', () => {
const args = buildMysqlPrepArgs({ image: 'mysql:8.4' });
expect(args).toContain('--port=3306');
});
it('falls back to default root password when env is absent', () => {
const args = buildMysqlPrepArgs({ image: 'mysql:8.4' });
expect(args).toContain('-prootpassword');
});
});
describe('all services', () => {
it('adds all flags when all services are present', () => {
const services: Services = {
mysql: MYSQL_SERVICE,
opensearch: { image: 'opensearchproject/opensearch:2.19.1' },
rabbitmq: { image: 'rabbitmq:4.0-management' },
valkey: { image: 'valkey:8.0' },
};
expect(buildInstallArgs(services)).toEqual([
...BASE_ARGS,
...MYSQL_ARGS,
...OPENSEARCH_ARGS,
...RABBITMQ_ARGS,
...CACHE_ARGS,
]);
});
});
});
+84
View File
@@ -0,0 +1,84 @@
export interface ServiceConfig {
image: string;
env?: Record<string, string>;
ports?: string[];
options?: string;
}
export interface Services {
mysql?: ServiceConfig;
opensearch?: ServiceConfig;
elasticsearch?: ServiceConfig;
rabbitmq?: ServiceConfig;
redis?: ServiceConfig;
valkey?: ServiceConfig;
}
const BASE_ARGS = [
'--base-url=http://localhost/',
'--admin-user=admin',
'--admin-password=admin123',
'--admin-email=admin@example.com',
'--admin-firstname=Admin',
'--admin-lastname=User',
'--backend-frontname=admin',
];
export const buildMysqlPrepArgs = (mysql: ServiceConfig): string[] => {
const rootPassword = mysql.env?.MYSQL_ROOT_PASSWORD ?? 'rootpassword';
const port = mysql.ports?.[0]?.split(':')[0] ?? '3306';
return ['-h127.0.0.1', `--port=${port}`, '-uroot', `-p${rootPassword}`, '-e', 'SET GLOBAL log_bin_trust_function_creators = 1;'];
};
export const buildInstallArgs = (services: Services | null): string[] => {
const args = [...BASE_ARGS];
if (!services) return args;
if (services.mysql) {
const dbPort = services.mysql.ports?.[0]?.split(':')[0] ?? '3306';
args.push(
`--db-host=127.0.0.1:${dbPort}`,
`--db-name=${services.mysql.env?.MYSQL_DATABASE ?? 'magento'}`,
`--db-user=${services.mysql.env?.MYSQL_USER ?? 'magento'}`,
`--db-password=${services.mysql.env?.MYSQL_PASSWORD ?? 'magento'}`,
);
}
if (services.opensearch) {
args.push(
'--search-engine=opensearch',
'--opensearch-host=localhost',
'--opensearch-port=9200',
);
} else if (services.elasticsearch) {
const majorVersion = services.elasticsearch.image.split(':')[1]?.split('.')[0];
args.push(
`--search-engine=elasticsearch${majorVersion}`,
'--elasticsearch-host=localhost',
'--elasticsearch-port=9200',
);
}
if (services.rabbitmq) {
args.push(
'--amqp-host=localhost',
'--amqp-port=5672',
'--amqp-user=guest',
'--amqp-password=guest',
);
}
if (services.valkey || services.redis) {
args.push(
'--session-save=redis',
'--session-save-redis-host=localhost',
'--session-save-redis-port=6379',
'--cache-backend=redis',
'--cache-backend-redis-server=localhost',
'--cache-backend-redis-port=6379',
);
}
return args;
};
+36
View File
@@ -0,0 +1,36 @@
import * as core from '@actions/core';
import * as exec from '@actions/exec';
import { buildInstallArgs, buildMysqlPrepArgs, Services } from './build-command';
export async function run(): Promise<void> {
try {
const servicesInput = core.getInput('services');
const path = core.getInput('path') || '.';
const extraArgs = core.getInput('extra_args').trim();
let services: Services | null = null;
if (servicesInput && servicesInput !== 'null') {
services = JSON.parse(servicesInput) as Services;
}
// setup:install creates MySQL triggers, which requires log_bin_trust_function_creators=1
// when binary logging is enabled.
if (services?.mysql) {
await exec.exec('mysql', buildMysqlPrepArgs(services.mysql));
}
const args = buildInstallArgs(services);
if (extraArgs) {
args.push(...extraArgs.split(/\s+/));
}
core.setOutput('command', `php bin/magento setup:install ${args.join(' ')}`);
await exec.exec('php', ['bin/magento', 'setup:install', ...args], { cwd: path });
} catch (error) {
core.setFailed((error as Error).message);
}
}
run();
+8
View File
@@ -0,0 +1,8 @@
{
"compilerOptions": {
"resolveJsonModule": true,
"esModuleInterop": true,
"typeRoots": ["../node_modules/@types"],
"types": ["jest"]
}
}
+4 -4
View File
@@ -12,7 +12,7 @@ The action operates in two modes:
## Inputs
| 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) |
@@ -27,7 +27,7 @@ The action operates in two modes:
## Outputs
| Output | Description |
|--------|-------------|
| ------ | --------------------------------------------------- |
| `path` | Absolute path to the Magento installation directory |
## Usage
@@ -51,7 +51,7 @@ jobs:
steps:
- uses: actions/checkout@v6
- uses: graycoreio/github-actions-magento/setup-magento@main
- uses: graycoreio/github-actions-magento2/setup-magento@v7.0.0 # x-release-please-version
id: setup-magento
with:
php-version: "8.3"
@@ -89,7 +89,7 @@ jobs:
steps:
- uses: actions/checkout@v6
- uses: graycoreio/github-actions-magento/setup-magento@main
- uses: graycoreio/github-actions-magento2/setup-magento@v7.0.0 # x-release-please-version
id: setup-magento
with:
php-version: "8.3"
+23 -2
View File
@@ -68,7 +68,7 @@ runs:
- run: |
MAGENTO_DIRECTORY=""
if [ "${{ inputs.mode }}" = 'extension' ]; then
MAGENTO_DIRECTORY="../magento2"
MAGENTO_DIRECTORY="_ghamagento"
else
MAGENTO_DIRECTORY="${{ inputs.working-directory }}"
fi
@@ -90,7 +90,28 @@ runs:
env:
COMPOSER_AUTH: ${{ inputs.composer_auth }}
- uses: graycoreio/github-actions-magento2/fix-magento-install@v7.0.0-rc.0
- run: mkdir -p ${{ steps.setup-magento-compute-directory.outputs.MAGENTO_DIRECTORY }}/app/etc
shell: bash
name: Ensure app/etc exists for magento composer plugin
if: inputs.mode == 'extension'
- name: Prevent Magento install from being mirrored into consumer vendor
if: inputs.mode == 'extension'
shell: bash
working-directory: ${{ inputs.working-directory }}
env:
MAGENTO_DIRECTORY: ${{ steps.setup-magento-compute-directory.outputs.MAGENTO_DIRECTORY }}
run: |
line="/$MAGENTO_DIRECTORY export-ignore"
if [[ -f .gitattributes ]] && grep -qxF "$line" .gitattributes; then
exit 0
fi
if [[ -s .gitattributes && -n "$(tail -c1 .gitattributes)" ]]; then
printf '\n' >> .gitattributes
fi
printf '%s\n' "$line" >> .gitattributes
- uses: graycoreio/github-actions-magento2/fix-magento-install@v8.0.0-rc.1
name: Fix Magento Out of Box Install Issues
with:
magento_directory: ${{ steps.setup-magento-compute-directory.outputs.MAGENTO_DIRECTORY }}
+5 -2
View File
@@ -13,9 +13,11 @@ See the [action.yml](./action.yml)
| Input | Description | Required | Default |
|-----------------| ------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------- |-----------------------|
| kind | The "kind" of support you're targeting for your package. Allowed values are `currently-supported`, `latest`, `custom`, `nightly` and `all` | false | 'currently-supported' |
| kind | The "kind" of support you're targeting for your package. See [Kinds](#kinds). | false | 'currently-supported' |
| project | The project to return the supported versions for. Allowed values are `mage-os` and `magento-open-source` | false | 'magento-open-source' |
| custom_versions | The versions you want to support, as a comma-separated string, i.e. 'magento/project-community-edition:2.3.7-p3, magento/project-community-edition:2.4.2-p2' | false | '' |
| recent_time_frame | The time frame (from today) used when `kind` is `recent`. Combination of years (y), months (m), and days (d), e.g. `2y 2m 2d`. | false | '2y' |
| include_services | Whether to include a `services` key in each matrix entry with GitHub Actions service container configurations for MySQL, search engine, RabbitMQ, and cache. | false | 'true' |
## Kinds
- `currently-supported` - The currently supported Magento Open Source versions by Adobe.
@@ -23,6 +25,7 @@ See the [action.yml](./action.yml)
- `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`)
- `recent` - Versions released within a configurable time window from today (see `recent_time_frame`).
- `all` - All versions of Magento (including patched/unpatched versions).
## Projects
@@ -48,7 +51,7 @@ jobs:
outputs:
matrix: ${{ steps.supported-version.outputs.matrix }}
steps:
- uses: graycoreio/github-actions-magento2/supported-version@main
- uses: graycoreio/github-actions-magento2/supported-version@v7.0.0 # x-release-please-version
id: supported-version
- run: echo ${{ steps.supported-version.outputs.matrix }}
```
+13 -13
View File
File diff suppressed because one or more lines are too long
@@ -78,6 +78,11 @@ describe('getCurrentlySupportedVersions for magento-open-source', () => {
'magento/project-community-edition:2.4.7-p8',
'magento/project-community-edition:2.4.8-p3',
]],
['2026-03-10T00:00:01Z', 'Day of March 2026 patch 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',
]],
['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',
@@ -132,6 +137,12 @@ describe('getCurrentlySupportedVersions for mage-os', () => {
['2025-09-09T00:00:01Z', 'Release of 1.3.1', [
'mage-os/project-community-edition:1.3.1',
]],
['2026-03-10T00:00:01Z', 'Release of 2.2.0', [
'mage-os/project-community-edition:2.2.0',
]],
['2026-04-15T00:00:01Z', 'Release of 2.2.2', [
'mage-os/project-community-edition:2.2.2',
]],
])(
'supportedVersions for %s',
(date, description ,result) => {
@@ -50,4 +50,46 @@ describe('getUsableVersions for magento-open-source', () => {
expect(versions).not.toContain('magento/project-community-edition:2.3.7-p3');
expect(versions).toContain('magento/project-community-edition:2.4.6');
});
it('should filter out uninstallable Magento 2.4.2.x and 2.4.3.x versions', () => {
mockGetVersions.mockReturnValue({
'magento/project-community-edition:2.4.2': { composer: '2.2.21' },
'magento/project-community-edition:2.4.2-p1': { composer: '2.2.21' },
'magento/project-community-edition:2.4.2-p2': { composer: '2.2.21' },
'magento/project-community-edition:2.4.3': { composer: '2.2.21' },
'magento/project-community-edition:2.4.3-p1': { composer: '2.2.21' },
'magento/project-community-edition:2.4.3-p2': { composer: '2.2.21' },
'magento/project-community-edition:2.4.3-p3': { composer: '2.2.21' },
'magento/project-community-edition:2.4.4': { composer: '2.2.21' }
});
const versions = getUsableVersions(project);
expect(versions).not.toContain('magento/project-community-edition:2.4.2');
expect(versions).not.toContain('magento/project-community-edition:2.4.2-p1');
expect(versions).not.toContain('magento/project-community-edition:2.4.2-p2');
expect(versions).not.toContain('magento/project-community-edition:2.4.3');
expect(versions).not.toContain('magento/project-community-edition:2.4.3-p1');
expect(versions).not.toContain('magento/project-community-edition:2.4.3-p2');
expect(versions).not.toContain('magento/project-community-edition:2.4.3-p3');
expect(versions).toContain('magento/project-community-edition:2.4.4');
});
});
describe('getUsableVersions for mage-os', () => {
const project: Project = "mage-os";
beforeEach(() => {
mockGetVersions.mockReset();
});
it('should filter out mage-os 2.2.1 due to security advisory', () => {
mockGetVersions.mockReturnValue({
'mage-os/project-community-edition:2.2.0': { composer: '2.9.3' },
'mage-os/project-community-edition:2.2.1': { composer: '2.9.3' }
});
const versions = getUsableVersions(project);
expect(versions).not.toContain('mage-os/project-community-edition:2.2.1');
expect(versions).toContain('mage-os/project-community-edition:2.2.0');
});
});
+23
View File
@@ -2,6 +2,24 @@ import { PackageMatrixVersion } from '../matrix/matrix-type';
import { getIndividualVersionsForProject } from "../versions/get-versions-for-project";
import semver from 'semver';
/**
* Versions that are known to be uninstallable and should be excluded from the usable set.
* Each entry includes a reason for documentation purposes.
*/
const uninstallableVersions: Record<string, string> = {
// magento/composer-root-update-plugin ~1.1 requires composer/composer <=2.1,
// but all composer versions <=2.1 are insecure and cannot be used.
'magento/project-community-edition:2.4.2': 'requires insecure composer <=2.1',
'magento/project-community-edition:2.4.2-p1': 'requires insecure composer <=2.1',
'magento/project-community-edition:2.4.2-p2': 'requires insecure composer <=2.1',
'magento/project-community-edition:2.4.3': 'requires insecure composer <=2.1',
'magento/project-community-edition:2.4.3-p1': 'requires insecure composer <=2.1',
'magento/project-community-edition:2.4.3-p2': 'requires insecure composer <=2.1',
'magento/project-community-edition:2.4.3-p3': 'requires insecure composer <=2.1',
// Security advisory in webonyx/graphql-php prevents installation.
'mage-os/project-community-edition:2.2.1': 'uninstallable due to webonyx/graphql-php security advisory',
};
export const getUsableVersions = (project: string): string[] => {
const allVersions = getIndividualVersionsForProject(project)
return Object.entries(<Record<string,PackageMatrixVersion>>allVersions)
@@ -17,6 +35,11 @@ export const getUsableVersions = (project: string): string[] => {
return false;
}
// Exclude versions known to be uninstallable.
if (key in uninstallableVersions) {
return false;
}
return true;
})
.map(([key, value]) => key);
@@ -16,7 +16,7 @@ export const getMatrixForVersions = (project: string, versions: string[]): Githu
return {
magento: [...acc.magento, current],
include: [...acc.include, knownVersions[current]]
include: [...acc.include, { ...knownVersions[current], version: current.split(':')[1] ?? '' }]
}
}, {magento: [], include: []});
}
@@ -11,6 +11,7 @@ export interface Services {
export interface PackageMatrixVersion {
magento: string,
version: string,
php: string | number,
composer: string | number,
mysql: string,
@@ -8,6 +8,7 @@ describe('amendMatrixForNext', () => {
include: [
{
"magento": "magento/project-community-edition:next",
"version": "next",
"php": 8.2,
"composer": "2",
"mysql": "mysql:8.0",
@@ -33,6 +34,7 @@ describe('amendMatrixForNext', () => {
include: [
{
"magento": "magento/project-community-edition:@alpha",
"version": "@alpha",
"php": 8.2,
"composer": "2",
"mysql": "mysql:8.0",
@@ -60,6 +62,7 @@ describe('amendMatrixForNext', () => {
include: [
{
"magento": "magento/project-community-edition:v2.4.6-p2",
"version": "v2.4.6-p2",
"php": 8.2,
"composer": "2",
"mysql": "mysql:8.0",
@@ -85,6 +88,7 @@ describe('amendMatrixForNext', () => {
include: [
{
"magento": "magento/project-community-edition:v2.4.6-p2",
"version": "v2.4.6-p2",
"php": 8.2,
"composer": "2",
"mysql": "mysql:8.0",
@@ -112,6 +116,7 @@ describe('amendMatrixForNext', () => {
include: [
{
"magento": "magento/project-community-edition:v2.4.6-p2",
"version": "v2.4.6-p2",
"php": 8.2,
"composer": "2",
"mysql": "mysql:8.0",
@@ -128,6 +133,7 @@ describe('amendMatrixForNext', () => {
},
{
"magento": "magento/project-community-edition:next",
"version": "next",
"php": 8.2,
"composer": "2",
"mysql": "mysql:8.0",
@@ -153,6 +159,7 @@ describe('amendMatrixForNext', () => {
include: [
{
"magento": "magento/project-community-edition:v2.4.6-p2",
"version": "v2.4.6-p2",
"php": 8.2,
"composer": "2",
"mysql": "mysql:8.0",
@@ -169,6 +176,7 @@ describe('amendMatrixForNext', () => {
},
{
"magento": "magento/project-community-edition:@alpha",
"version": "@alpha",
"php": 8.2,
"composer": "2",
"mysql": "mysql:8.0",
@@ -196,6 +204,7 @@ describe('amendMatrixForNext', () => {
include: [
{
"magento": "mage-os/project-community-edition:next",
"version": "next",
"php": 8.2,
"composer": "2",
"mysql": "mysql:8.0",
@@ -221,6 +230,7 @@ describe('amendMatrixForNext', () => {
include: [
{
"magento": "mage-os/project-community-edition:@alpha",
"version": "@alpha",
"php": 8.2,
"composer": "2",
"mysql": "mysql:8.0",
@@ -12,12 +12,11 @@ export const amendMatrixForNext = (matrix: GithubActionsMatrix, repository: Repo
const nextVersionRegExp = new RegExp(nextVersionPlaceHolder + '$');
matrix.magento = matrix.magento.map((item) => item.match(nextVersionRegExp) ? unifyNextPackageName(item, repository, date) : item);
matrix.include = matrix.include.map((item) => {
return item.magento.match(nextVersionRegExp)
? {
...item,
magento: unifyNextPackageName(item.magento, repository, date),
if (!item.magento.match(nextVersionRegExp)) {
return item;
}
: item;
const magento = unifyNextPackageName(item.magento, repository, date);
return { ...item, magento, version: magento.split(':')[1] };
});
return matrix;
}
@@ -3,6 +3,7 @@ import { PackageMatrixVersion } from '../matrix/matrix-type';
const createTestEntry = (overrides: Partial<PackageMatrixVersion> = {}): PackageMatrixVersion => ({
magento: 'magento/project-community-edition:2.4.7',
version: '2.4.7',
php: '8.3',
composer: '2.7.4',
mysql: 'mysql:8.4',
@@ -2,30 +2,32 @@
"mage-os/project-community-edition": {
"magento": "mage-os/project-community-edition",
"php": 8.4,
"composer": "2.9.5",
"composer": "2.9.7",
"mysql": "mysql:8.4",
"opensearch": "opensearchproject/opensearch:3",
"rabbitmq": "rabbitmq:4.1-management",
"valkey": "valkey/valkey:8.0",
"redis": "redis:7.2",
"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"
"release": "2026-04-15T00:00:00+0000",
"eol": "2029-04-15T00:00:00+0000"
},
"mage-os/project-community-edition:next": {
"magento": "mage-os/project-community-edition:next",
"php": 8.4,
"composer": "2.9.5",
"composer": "2.9.7",
"mysql": "mysql:8.4",
"opensearch": "opensearchproject/opensearch:3",
"rabbitmq": "rabbitmq:4.1-management",
"valkey": "valkey/valkey:8.0",
"redis": "redis:7.2",
"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"
"release": "2026-04-15T00:00:00+0000",
"eol": "2029-04-15T00:00:00+0000"
},
"mage-os/project-community-edition:>=1.0 <1.1": {
"magento": "mage-os/project-community-edition:>=1.0 <1.1",
@@ -119,10 +121,11 @@
"opensearch": "opensearchproject/opensearch:3",
"rabbitmq": "rabbitmq:4.1-management",
"valkey": "valkey/valkey:8.0",
"redis": "redis:7.2",
"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"
"eol": "2029-04-15T00:00:00+0000"
}
}
@@ -222,6 +222,37 @@
"nginx": "nginx:1.28",
"os": "ubuntu-latest",
"release": "2026-03-10T00:00:00+0000",
"eol": "2029-03-10T00:00:00+0000"
"eol": "2026-03-18T00:00:00+0000"
},
"mage-os/project-community-edition:2.2.1": {
"magento": "mage-os/project-community-edition:2.2.1",
"upstream": "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-18T00:00:00+0000",
"eol": "2026-04-15T00:00:00+0000"
},
"mage-os/project-community-edition:2.2.2": {
"magento": "mage-os/project-community-edition:2.2.2",
"upstream": "2.4.8-p4",
"php": 8.4,
"composer": "2.9.7",
"mysql": "mysql:8.4",
"opensearch": "opensearchproject/opensearch:3",
"rabbitmq": "rabbitmq:4.1-management",
"valkey": "valkey/valkey:8.0",
"redis": "redis:7.2",
"varnish": "varnish:7.7",
"nginx": "nginx:1.28",
"os": "ubuntu-latest",
"release": "2026-04-15T00:00:00+0000",
"eol": "2029-04-15T00:00:00+0000"
}
}