mirror of
https://github.com/graycoreio/github-actions-magento2.git
synced 2026-06-13 05:04:54 +00:00
Compare commits
49 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5fb823da94 | |||
| 38423ddb9b | |||
| d7959941c6 | |||
| 74f1e3ec39 | |||
| d38c375b83 | |||
| dcbd219ac1 | |||
| 761188e82f | |||
| aa1b545010 | |||
| 45d1df0162 | |||
| baef64bc0a | |||
| 59f87b6b2e | |||
| 0cbc4297b1 | |||
| c78e635688 | |||
| 5c04c25fe8 | |||
| 8d00f8149a | |||
| 2d7238de14 | |||
| 44e7c34892 | |||
| c53607cca8 | |||
| a729f8b2fd | |||
| f6a7355bd9 | |||
| 307f527997 | |||
| 85b7909eb1 | |||
| 837f1da96b | |||
| d311df7966 | |||
| a7e327d44f | |||
| c786530c3e | |||
| 483ec3ac17 | |||
| a1c6246c78 | |||
| 87989bb250 | |||
| bdb9528f8c | |||
| 6a520d49fd | |||
| 212f9a8e86 | |||
| 0808fab9c3 | |||
| bbd830745f | |||
| e31f6f656a | |||
| 198bc1072a | |||
| 3c0a90f92b | |||
| c115395583 | |||
| 20cbf5d06a | |||
| ff6279a518 | |||
| b74bdcde41 | |||
| 1c312fe567 | |||
| 62d2aec976 | |||
| 771dd05439 | |||
| f8036173e1 | |||
| bbecc7f5f9 | |||
| db1267a94b | |||
| 90babb16bf | |||
| 93c0b480e2 |
@@ -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
|
||||
|
||||
@@ -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 }}
|
||||
@@ -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
|
||||
@@ -101,10 +183,12 @@ jobs:
|
||||
mode: store
|
||||
working-directory: ${{ env.magento_folder }}
|
||||
composer_auth: ${{ secrets.COMPOSER_AUTH }}
|
||||
|
||||
|
||||
- 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,24 +198,32 @@ 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
|
||||
- uses: actions/checkout@v6
|
||||
|
||||
- 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:
|
||||
|
||||
@@ -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.0
|
||||
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.0
|
||||
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.0
|
||||
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.0
|
||||
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.0
|
||||
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.0
|
||||
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.0
|
||||
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.0
|
||||
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.0
|
||||
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.0
|
||||
id: magento-version
|
||||
with:
|
||||
working-directory: ${{ steps.setup-magento.outputs.path }}
|
||||
|
||||
@@ -0,0 +1,174 @@
|
||||
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.0
|
||||
id: get-magento-version
|
||||
with:
|
||||
working-directory: ${{ inputs.path }}
|
||||
|
||||
- uses: graycoreio/github-actions-magento2/supported-version@v8.0.0-rc.0
|
||||
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.0
|
||||
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.0
|
||||
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</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: |
|
||||
if find app/code -name "*Test.php" -print -quit | grep -q .; then
|
||||
vendor/bin/phpunit -c dev/tests/unit/phpunit.xml.dist --testsuite Store_Unit_Tests
|
||||
else
|
||||
echo "No unit tests found in app/code, skipping."
|
||||
fi
|
||||
|
||||
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.0
|
||||
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.0
|
||||
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.0
|
||||
with:
|
||||
path: ${{ steps.setup-magento.outputs.path }}
|
||||
composer_auth: ${{ secrets.composer_auth }}
|
||||
@@ -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.0
|
||||
id: magento-version
|
||||
with:
|
||||
working-directory: ${{ inputs.magento_directory }}
|
||||
|
||||
@@ -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 @@
|
||||
{".":"7.0.0-rc.0"}
|
||||
{".":"8.0.0-rc.0"}
|
||||
|
||||
@@ -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
|
||||
@@ -2,6 +2,54 @@
|
||||
|
||||
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.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)
|
||||
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||

|
||||
[](https://github.com/graycoreio/github-actions-magento2/actions/workflows/_internal-integration.yaml)
|
||||
[](https://github.com/graycoreio/github-actions-magento2/actions/workflows/_internal_check_extension.yaml)
|
||||
[](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. |
|
||||
|
||||
+65
-26
@@ -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' |
|
||||
| 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` |
|
||||
| `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 2–5 minutes of package extraction per job.
|
||||
|
||||
The trade-off is size. The `vendor/` directory for a Magento project runs 300–600 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.
|
||||
|
||||
@@ -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.0
|
||||
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"
|
||||
|
||||
@@ -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}"
|
||||
Executable
+18
@@ -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"
|
||||
Generated
+9
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"packages": [
|
||||
{
|
||||
"name": "magento/product-community-edition",
|
||||
"version": "2.4.7"
|
||||
}
|
||||
],
|
||||
"packages-dev": []
|
||||
}
|
||||
@@ -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 ]
|
||||
@@ -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.
|
||||
|
||||
@@ -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.0
|
||||
id: get-composer-version
|
||||
if: steps.check-installed.outputs.installed != 'true'
|
||||
|
||||
- name: Check if allow-plugins option is available for this version of composer
|
||||
uses: graycoreio/github-actions-magento2/semver-compare@v7.0.0-rc.0
|
||||
uses: graycoreio/github-actions-magento2/semver-compare@v8.0.0-rc.0
|
||||
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 }}
|
||||
```
|
||||
@@ -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 }}
|
||||
@@ -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
|
||||
```
|
||||
|
||||
@@ -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.0
|
||||
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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -2,29 +2,27 @@ name: "Get Magento Version"
|
||||
author: "Graycore"
|
||||
description: " A Github Action that determines the currently installed version of Magento"
|
||||
|
||||
inputs:
|
||||
working-directory:
|
||||
inputs:
|
||||
working-directory:
|
||||
default: $GITHUB_WORKSPACE
|
||||
description: "The current working directory of the action"
|
||||
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"
|
||||
|
||||
@@ -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": {}
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
@@ -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 ]
|
||||
Generated
+23
-7
@@ -1,15 +1,16 @@
|
||||
{
|
||||
"name": "@graycoreio/github-actions-magento2",
|
||||
"version": "7.0.0-rc.0",
|
||||
"version": "8.0.0-rc.0",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "@graycoreio/github-actions-magento2",
|
||||
"version": "7.0.0-rc.0",
|
||||
"version": "8.0.0-rc.0",
|
||||
"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
@@ -1,9 +1,9 @@
|
||||
{
|
||||
"name": "@graycoreio/github-actions-magento2",
|
||||
"version": "7.0.0-rc.0",
|
||||
"version": "8.0.0-rc.0",
|
||||
"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",
|
||||
|
||||
@@ -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 }
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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 }}
|
||||
```
|
||||
@@ -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"
|
||||
@@ -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
|
||||
|
||||
@@ -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 }}
|
||||
```
|
||||
@@ -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"
|
||||
@@ -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 }}
|
||||
```
|
||||
@@ -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"
|
||||
Vendored
+69
File diff suppressed because one or more lines are too long
@@ -0,0 +1,9 @@
|
||||
module.exports = {
|
||||
clearMocks: true,
|
||||
moduleFileExtensions: ['js', 'ts'],
|
||||
testMatch: ['**/*.spec.ts'],
|
||||
transform: {
|
||||
'^.+\\.ts$': 'ts-jest'
|
||||
},
|
||||
verbose: true
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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,
|
||||
]);
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -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;
|
||||
};
|
||||
@@ -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();
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"resolveJsonModule": true,
|
||||
"esModuleInterop": true,
|
||||
"typeRoots": ["../node_modules/@types"],
|
||||
"types": ["jest"]
|
||||
}
|
||||
}
|
||||
+17
-17
@@ -11,23 +11,23 @@ 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) |
|
||||
| `magento_repository` | No | `https://mirror.mage-os.org/` | Composer repository URL for Magento packages |
|
||||
| `tools` | No | - | PHP tools to install globally (e.g., `composer:v2`) |
|
||||
| `extensions` | No | - | Additional PHP extensions to install |
|
||||
| `coverage` | No | - | Code coverage driver (e.g., `xdebug`, `pcov`) |
|
||||
| `working-directory` | No | `.` | Working directory for the action |
|
||||
| `apply_fixes` | No | `false` | Apply Magento installation fixes (always applied in extension mode) |
|
||||
| `composer_auth` | No | - | Composer authentication credentials JSON |
|
||||
| Input | Required | Default | Description |
|
||||
| -------------------- | -------- | -------------------------------------------- | ------------------------------------------------------------------- |
|
||||
| `php-version` | Yes | `8.4` | PHP version to install |
|
||||
| `mode` | Yes | `extension` | Either `extension` or `store` |
|
||||
| `magento_version` | No | `magento/project-community-edition:2.4.8-p3` | Magento version to install (extension mode only) |
|
||||
| `magento_repository` | No | `https://mirror.mage-os.org/` | Composer repository URL for Magento packages |
|
||||
| `tools` | No | - | PHP tools to install globally (e.g., `composer:v2`) |
|
||||
| `extensions` | No | - | Additional PHP extensions to install |
|
||||
| `coverage` | No | - | Code coverage driver (e.g., `xdebug`, `pcov`) |
|
||||
| `working-directory` | No | `.` | Working directory for the action |
|
||||
| `apply_fixes` | No | `false` | Apply Magento installation fixes (always applied in extension mode) |
|
||||
| `composer_auth` | No | - | Composer authentication credentials JSON |
|
||||
|
||||
## Outputs
|
||||
|
||||
| Output | Description |
|
||||
|--------|-------------|
|
||||
| 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"
|
||||
@@ -107,4 +107,4 @@ jobs:
|
||||
|
||||
- The action uses [shivammathur/setup-php](https://github.com/shivammathur/setup-php) for PHP installation
|
||||
- By default, Magento packages are fetched from the [Mage-OS mirror](https://mirror.mage-os.org/) which doesn't require authentication
|
||||
- For Adobe Commerce or private packages, provide `composer_auth` with your credentials
|
||||
- For Adobe Commerce or private packages, provide `composer_auth` with your credentials
|
||||
|
||||
@@ -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,12 @@ 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'
|
||||
|
||||
- uses: graycoreio/github-actions-magento2/fix-magento-install@v8.0.0-rc.0
|
||||
name: Fix Magento Out of Box Install Issues
|
||||
with:
|
||||
magento_directory: ${{ steps.setup-magento-compute-directory.outputs.MAGENTO_DIRECTORY }}
|
||||
|
||||
@@ -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 }}
|
||||
```
|
||||
|
||||
Vendored
+13
-13
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) => {
|
||||
|
||||
@@ -25,7 +25,7 @@ describe('getUsableVersions for magento-open-source', () => {
|
||||
'magento/project-community-edition:2.4.5': { composer: '1.9.0' },
|
||||
'magento/project-community-edition:2.4.6': { composer: '2.2.0' }
|
||||
});
|
||||
|
||||
|
||||
const versions = getUsableVersions(project);
|
||||
expect(versions).not.toContain('magento/project-community-edition:2.4.5');
|
||||
expect(versions).toContain('magento/project-community-edition:2.4.6');
|
||||
@@ -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');
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -4,10 +4,11 @@ describe('amendMatrixForNext', () => {
|
||||
it('should amend the "next" versions listed in the matrix output for the given repo', () => {
|
||||
expect(
|
||||
amendMatrixForNext(
|
||||
{
|
||||
{
|
||||
include: [
|
||||
{
|
||||
"magento": "magento/project-community-edition:next",
|
||||
"version": "next",
|
||||
"php": 8.2,
|
||||
"composer": "2",
|
||||
"mysql": "mysql:8.0",
|
||||
@@ -24,15 +25,16 @@ describe('amendMatrixForNext', () => {
|
||||
}
|
||||
],
|
||||
magento: ["magento/project-community-edition:next"]
|
||||
},
|
||||
"https://upstream-nightly.mage-os.org",
|
||||
},
|
||||
"https://upstream-nightly.mage-os.org",
|
||||
new Date()
|
||||
)
|
||||
).toEqual(
|
||||
{
|
||||
{
|
||||
include: [
|
||||
{
|
||||
"magento": "magento/project-community-edition:@alpha",
|
||||
"version": "@alpha",
|
||||
"php": 8.2,
|
||||
"composer": "2",
|
||||
"mysql": "mysql:8.0",
|
||||
@@ -56,10 +58,11 @@ describe('amendMatrixForNext', () => {
|
||||
it('should should do nothing to matrixes that contain no next versions', () => {
|
||||
expect(
|
||||
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",
|
||||
@@ -76,15 +79,16 @@ describe('amendMatrixForNext', () => {
|
||||
}
|
||||
],
|
||||
magento: ["magento/project-community-edition:v2.4.6-p2"]
|
||||
},
|
||||
"https://upstream-nightly.mage-os.org",
|
||||
},
|
||||
"https://upstream-nightly.mage-os.org",
|
||||
new Date()
|
||||
)
|
||||
).toEqual(
|
||||
{
|
||||
{
|
||||
include: [
|
||||
{
|
||||
"magento": "magento/project-community-edition:v2.4.6-p2",
|
||||
"version": "v2.4.6-p2",
|
||||
"php": 8.2,
|
||||
"composer": "2",
|
||||
"mysql": "mysql:8.0",
|
||||
@@ -108,10 +112,11 @@ describe('amendMatrixForNext', () => {
|
||||
it('should only modify next versions', () => {
|
||||
expect(
|
||||
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",
|
||||
@@ -144,15 +150,16 @@ describe('amendMatrixForNext', () => {
|
||||
}
|
||||
],
|
||||
magento: ["magento/project-community-edition:v2.4.6-p2", "magento/project-community-edition:next"]
|
||||
},
|
||||
"https://upstream-nightly.mage-os.org",
|
||||
},
|
||||
"https://upstream-nightly.mage-os.org",
|
||||
new Date()
|
||||
)
|
||||
).toEqual(
|
||||
{
|
||||
{
|
||||
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",
|
||||
@@ -192,10 +200,11 @@ describe('amendMatrixForNext', () => {
|
||||
it('should amend the "next" versions listed in the matrix output for the given repo, for a different project', () => {
|
||||
expect(
|
||||
amendMatrixForNext(
|
||||
{
|
||||
{
|
||||
include: [
|
||||
{
|
||||
"magento": "mage-os/project-community-edition:next",
|
||||
"version": "next",
|
||||
"php": 8.2,
|
||||
"composer": "2",
|
||||
"mysql": "mysql:8.0",
|
||||
@@ -212,15 +221,16 @@ describe('amendMatrixForNext', () => {
|
||||
}
|
||||
],
|
||||
magento: ["mage-os/project-community-edition:next"]
|
||||
},
|
||||
"https://upstream-nightly.mage-os.org",
|
||||
},
|
||||
"https://upstream-nightly.mage-os.org",
|
||||
new Date()
|
||||
)
|
||||
).toEqual(
|
||||
{
|
||||
{
|
||||
include: [
|
||||
{
|
||||
"magento": "mage-os/project-community-edition:@alpha",
|
||||
"version": "@alpha",
|
||||
"php": 8.2,
|
||||
"composer": "2",
|
||||
"mysql": "mysql:8.0",
|
||||
@@ -240,4 +250,4 @@ describe('amendMatrixForNext', () => {
|
||||
}
|
||||
)
|
||||
});
|
||||
})
|
||||
})
|
||||
|
||||
@@ -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),
|
||||
}
|
||||
: item;
|
||||
if (!item.magento.match(nextVersionRegExp)) {
|
||||
return 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"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user