From 29974928d239aab38a231a1fdd012cb455e56a0d Mon Sep 17 00:00:00 2001 From: ArthurErlich Date: Sat, 3 Oct 2026 23:22:23 +0200 Subject: [PATCH 01/13] docs(spec): add Shopware guideline compliance spec Co-Authored-By: Claude Sonnet 5.5 --- docs/spec/shopware-guideline-compliance.md | 68 ++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 docs/spec/shopware-guideline-compliance.md diff --git a/docs/spec/shopware-guideline-compliance.md b/docs/spec/shopware-guideline-compliance.md new file mode 100644 index 0000000..23692b9 --- /dev/null +++ b/docs/spec/shopware-guideline-compliance.md @@ -0,0 +1,68 @@ +# Spec: Shopware plugin guideline compliance (build/release pipeline) + +Outcome of the Wayfinder map `.scratch/shopware-guideline-compliance/` (tickets 01-05; research evidence +on branches `research/shopware-guideline-checklist`, `research/shopware-cli-ci-behaviour`, +`research/gitea-28-pipeline-standards`). Target: **Store-ready** artifacts, published to Gitea only +(Gitea Release + Composer registry). Uploading to the Shopware Store is out of scope. + +## 1. Principles + +- Workflows are **plugin-agnostic**: no plugin name, package name, owner, repo or host is hard-coded; + all derive from `composer.json` and the `gitea` context. The same files must work unchanged for a + second plugin and be extractable to Gitea's shared-workflow repository later. +- One artifact: the `shopware-cli extension package` zip (prebuilt admin/storefront JS) is used for + both the Gitea Release asset and the Composer registry. +- `shopware-cli` is intentionally **unpinned** (`latest`). Known tradeoff: a CLI release can turn PRs + red without a repo change; treat that as a signal to fix config. +- `RELEASE_TOKEN` is the only token (release, assets, registry publish, link). Workflows still declare + `permissions:`. + +## 2. Plugin changes + +| # | Change | +|---|--------| +| P1 | Commit `src/Resources/config/plugin.png` (256x256). Do not ship `plugin-transparent.png`. | +| P2 | Logging: monolog channel `aeon_dump_manager` (`Resources/config/packages/monolog.yaml`, `build()` in the plugin class loading `packages/*.yaml`); inject `monolog.logger.aeon_dump_manager` into `PurgeDumpsTaskHandler`, `DumpService`, `CreateDumpHandler`; log dump job start/finish/failure. | +| P3 | Migrate `services.xml` -> `services.yaml` and `routes.php` -> `routes.yaml`. No validation ignore for this. Update the "XML services" rule in `CLAUDE.md`. | +| P4 | `composer.json`: `php` -> `^8.2`. Verify Shopware 6.6's own PHP requirement. | +| P5 | Delete the empty lifecycle overrides in `AeonDumpManager`; keep `uninstall`. | +| P6 | `.config/shopware-extension.yml` for build excludes and validation settings (add ignores only for real, accepted findings). | +| P7 | Keep Keep-a-Changelog `CHANGELOG.md`; verify with a local `shopware-cli extension package --release` how the changelog is read. | + +## 3. Pipeline + +### PR workflow (`.gitea/workflows/pr.yml`, replaces `pr-version-check.yml`) + +Jobs (all required checks on `main`): +1. `version-changelog` - unchanged logic (version bump + changelog heading). Keep this job/workflow name so the existing required context `version-changelog / version-changelog (pull_request)` keeps working, or update protection when renamed. +2. `validate` - install `shopware-cli`, `extension validate .` (hard gate, no `|| true`). +3. `package` - `extension package` with `--git-commit "$GITHUB_SHA"`, then assert the zip contains built admin JS (`Resources/public/administration/js`) when an admin entry exists. +4. `phpunit` - `composer create-project shopware/production` (6.6.x) + MariaDB service, symlink plugin, install/activate, run phpunit. PHP 8.3. + +### Release workflow (`.gitea/workflows/release.yml`) + +On push to `main`, guarded against re-release by an existing tag: +validate -> `extension package --git-commit "$GITHUB_SHA"` -> **validate the zip** -> create the Gitea +release via API (`POST /repos/{owner}/{repo}/releases`, creates the tag) with the zip as asset -> +upload the same zip to the Composer registry -> link package to repository. +Removes the manual `git tag` step, the `akkuman` action and the `git archive` zip. Packaging happens +before the tag exists, so a failed build leaves no orphan tag. + +### Branch protection (one-time, manual) + +`scripts/protect-main.sh` using `tea api PATCH repos/{owner}/{repo}/branch_protections/main` to set the +required status-check contexts (current: `version-changelog / version-changelog (pull_request)`; add +the new PR jobs). `tea branches protect` cannot set status checks. Not run by the pipeline. + +## 4. Open items to verify while implementing + +- Release POST creates a missing tag (fallback: tag step after packaging). +- Meaning of HTTP 400 on the package-link endpoint. +- Whether bare `validate` runs PHPStan/ESLint (needs PHP/Node on the runner); Node availability on the runner image. +- Accepted size for `metadata.icon.size`; error-vs-warning rule list of validate. +- Whether `routes.php` is flagged by validate; `shopware-cli extension fix` correctness for the YAML migration. +- Exact status-check context names of the new jobs (set after the first run). + +## 5. Out of scope / later + +Shopware Store upload; Gitea shared-workflow repository; phpunit lowest-version matrix; Store listing metadata. -- 2.54.0 From 8efaef2042c186524a06342e9a0c0b3db10e38f3 Mon Sep 17 00:00:00 2001 From: ArthurErlich Date: Sat, 3 Oct 2026 23:26:21 +0200 Subject: [PATCH 02/13] feat(plugin): align with Shopware plugin guidelines - add dedicated monolog channel aeon_dump_manager and log dump jobs - migrate services.xml/routes.php to YAML - require PHP ^8.2 - add extension icon and .config/shopware-extension.yml - drop empty lifecycle overrides Co-Authored-By: Claude Sonnet 5.5 --- .config/shopware-extension.yml | 21 ++++ CLAUDE.md | 4 +- composer.json | 2 +- src/AeonDumpManager.php | 53 +++++----- .../Handler/CreateDumpHandler.php | 4 + src/Resources/config/packages/monolog.yaml | 2 + src/Resources/config/plugin.png | Bin 0 -> 48700 bytes src/Resources/config/routes.php | 7 -- src/Resources/config/routes.yaml | 3 + src/Resources/config/services.xml | 88 ----------------- src/Resources/config/services.yaml | 92 ++++++++++++++++++ src/Service/DumpService.php | 8 ++ 12 files changed, 155 insertions(+), 129 deletions(-) create mode 100644 .config/shopware-extension.yml create mode 100644 src/Resources/config/packages/monolog.yaml create mode 100644 src/Resources/config/plugin.png delete mode 100644 src/Resources/config/routes.php create mode 100644 src/Resources/config/routes.yaml delete mode 100755 src/Resources/config/services.xml create mode 100644 src/Resources/config/services.yaml diff --git a/.config/shopware-extension.yml b/.config/shopware-extension.yml new file mode 100644 index 0000000..f6ab11f --- /dev/null +++ b/.config/shopware-extension.yml @@ -0,0 +1,21 @@ +# shopware-cli extension configuration (build/package/validate) +build: + zip: + pack: + excludes: + paths: + - tests + - docs + - scripts + - phpunit.xml + - docker-compose.yml + - skills-lock.json + - AGENTS.md + - CLAUDE.md + - QWEN.md + - .claude + - .scratch + - .wayfinder + - src/Resources/config/plugin-transparent.png +validation: + ignore: [] diff --git a/CLAUDE.md b/CLAUDE.md index 284ecc7..634eee2 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -14,7 +14,7 @@ the full build spec live under `.scratch/admin-dump-manager/` and `.scratch/dump - Plugin bootstrap class: `src/AeonDumpManager.php` (extends `Shopware\Core\Framework\Plugin`) — this is the entry point Shopware calls for install/uninstall/activate/deactivate/update lifecycle hooks. - Plugin class name is wired via `composer.json` → `extra.shopware-plugin-class`. -- Services are registered manually in `src/Resources/config/services.xml` (Symfony DI, XML format, +- Services are registered manually in `src/Resources/config/services.yaml` (Symfony DI, YAML format, autowiring is not configured — every new service/command/task must be added here explicitly with its tag, e.g. `console.command` or `shopware.scheduled.task`). - Plugin store-config UI fields (e.g. `maxDumps`, `retantionDays`) are defined in @@ -66,7 +66,7 @@ vendor/bin/phpunit tests/SomeTest.php # single file ## Adding functionality - New console commands go in `src/Command/`, new scheduled tasks in `src/ScheduledTask/` — both must - be registered in `src/Resources/config/services.xml` with the appropriate tag or Shopware will not + be registered in `src/Resources/config/services.yaml` with the appropriate tag or Shopware will not discover them. - Scheduled tasks need a matching handler (tagged `messenger.message_handler`) to actually run; a bare `ScheduledTask` subclass like `ExampleTask` only defines the schedule, not the behavior. diff --git a/composer.json b/composer.json index 2e90da2..2e2d71a 100755 --- a/composer.json +++ b/composer.json @@ -25,7 +25,7 @@ "source": "https://git.arthurerlich.de/haylan/AeonDumpManager" }, "require": { - "php": "^8.1", + "php": "^8.2", "shopware/core": "~6.6.0" }, "require-dev": { diff --git a/src/AeonDumpManager.php b/src/AeonDumpManager.php index 09ae91b..61710e2 100755 --- a/src/AeonDumpManager.php +++ b/src/AeonDumpManager.php @@ -4,17 +4,33 @@ namespace AeonDumpManager; use Doctrine\DBAL\Connection; use Shopware\Core\Framework\Plugin; -use Shopware\Core\Framework\Plugin\Context\ActivateContext; -use Shopware\Core\Framework\Plugin\Context\DeactivateContext; -use Shopware\Core\Framework\Plugin\Context\InstallContext; use Shopware\Core\Framework\Plugin\Context\UninstallContext; -use Shopware\Core\Framework\Plugin\Context\UpdateContext; +use Symfony\Component\Config\FileLocator; +use Symfony\Component\Config\Loader\DelegatingLoader; +use Symfony\Component\Config\Loader\LoaderResolver; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Loader\DirectoryLoader; +use Symfony\Component\DependencyInjection\Loader\GlobFileLoader; +use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; class AeonDumpManager extends Plugin { - public function install(InstallContext $installContext): void + public function build(ContainerBuilder $container): void { - // Do stuff such as creating a new payment method + parent::build($container); + + // Registers the dedicated monolog channel (Resources/config/packages/monolog.yaml) + $locator = new FileLocator('Resources/config'); + $resolver = new LoaderResolver([ + new YamlFileLoader($container, $locator), + new GlobFileLoader($container, $locator), + new DirectoryLoader($container, $locator), + ]); + + (new DelegatingLoader($resolver))->load( + \rtrim($this->getPath(), '/') . '/Resources/config/packages/*.yaml', + 'glob' + ); } public function uninstall(UninstallContext $uninstallContext): void @@ -29,29 +45,4 @@ class AeonDumpManager extends Plugin $connection = $this->container->get(Connection::class); $connection->executeStatement('DROP TABLE IF EXISTS `aeon_dump_manager_job`'); } - - public function activate(ActivateContext $activateContext): void - { - // Activate entities, such as a new payment method - // Or create new entities here, because now your plugin is installed and active for sure - } - - public function deactivate(DeactivateContext $deactivateContext): void - { - // Deactivate entities, such as a new payment method - // Or remove previously created entities - } - - public function update(UpdateContext $updateContext): void - { - // Update necessary stuff, mostly non-database related - } - - public function postInstall(InstallContext $installContext): void - { - } - - public function postUpdate(UpdateContext $updateContext): void - { - } } diff --git a/src/MessageQueue/Handler/CreateDumpHandler.php b/src/MessageQueue/Handler/CreateDumpHandler.php index 256df68..c9e6e47 100644 --- a/src/MessageQueue/Handler/CreateDumpHandler.php +++ b/src/MessageQueue/Handler/CreateDumpHandler.php @@ -5,6 +5,7 @@ namespace AeonDumpManager\MessageQueue\Handler; use AeonDumpManager\MessageQueue\Message\CreateDumpMessage; use AeonDumpManager\Service\DumpJobStatusService; use AeonDumpManager\Service\DumpService; +use Psr\Log\LoggerInterface; use Symfony\Component\Messenger\Attribute\AsMessageHandler; #[AsMessageHandler] @@ -13,6 +14,7 @@ class CreateDumpHandler public function __construct( private readonly DumpService $dumpService, private readonly DumpJobStatusService $jobStatus, + private readonly LoggerInterface $logger, ) { } @@ -20,10 +22,12 @@ class CreateDumpHandler { $jobId = $message->getJobId(); $this->jobStatus->markRunning($jobId); + $this->logger->info('Dump job started.', ['jobId' => $jobId]); try { $this->dumpService->createAsync($jobId, $this->jobStatus); } catch (\Throwable $exception) { + $this->logger->error('Dump job failed.', ['jobId' => $jobId, 'exception' => $exception]); $this->jobStatus->markFailed($jobId, $exception->getMessage()); } } diff --git a/src/Resources/config/packages/monolog.yaml b/src/Resources/config/packages/monolog.yaml new file mode 100644 index 0000000..e59b78f --- /dev/null +++ b/src/Resources/config/packages/monolog.yaml @@ -0,0 +1,2 @@ +monolog: + channels: ['aeon_dump_manager'] diff --git a/src/Resources/config/plugin.png b/src/Resources/config/plugin.png new file mode 100644 index 0000000000000000000000000000000000000000..cb3f9c9f42bcbaba042eed3f74692299c4e397e4 GIT binary patch literal 48700 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 . '/../../Controller/*Controller.php', 'attribute'); -}; diff --git a/src/Resources/config/routes.yaml b/src/Resources/config/routes.yaml new file mode 100644 index 0000000..5930254 --- /dev/null +++ b/src/Resources/config/routes.yaml @@ -0,0 +1,3 @@ +aeon_dump_manager_controllers: + resource: ../../Controller/*Controller.php + type: attribute diff --git a/src/Resources/config/services.xml b/src/Resources/config/services.xml deleted file mode 100755 index 1d8d433..0000000 --- a/src/Resources/config/services.xml +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Resources/config/services.yaml b/src/Resources/config/services.yaml new file mode 100644 index 0000000..0fc47e3 --- /dev/null +++ b/src/Resources/config/services.yaml @@ -0,0 +1,92 @@ +services: + Symfony\Component\Process\ExecutableFinder: ~ + + aeon_dump_manager.dump_filename_parser: + class: AeonDumpManager\Service\DumpFilenameParser + + aeon_dump_manager.dump_binary_locator: + class: AeonDumpManager\Service\DumpBinaryLocator + arguments: + - '@Doctrine\DBAL\Connection' + - '@Shopware\Core\System\SystemConfig\SystemConfigService' + - '@Symfony\Component\Process\ExecutableFinder' + + aeon_dump_manager.dump_job_status_service: + class: AeonDumpManager\Service\DumpJobStatusService + arguments: + - '@Doctrine\DBAL\Connection' + + aeon_dump_manager.dump_lister: + class: AeonDumpManager\Service\DumpLister + arguments: + - '@aeon_dump_manager.filesystem.private' + - '@aeon_dump_manager.dump_filename_parser' + + aeon_dump_manager.dump_service: + class: AeonDumpManager\Service\DumpService + arguments: + - '@aeon_dump_manager.dump_lister' + - '@aeon_dump_manager.filesystem.private' + - '@aeon_dump_manager.dump_binary_locator' + - '@Doctrine\DBAL\Connection' + - '@Shopware\Core\System\SystemConfig\SystemConfigService' + - '@aeon_dump_manager.dump_filename_parser' + - '@monolog.logger.aeon_dump_manager' + + # Async create job + aeon_dump_manager.message_queue.create_dump_handler: + class: AeonDumpManager\MessageQueue\Handler\CreateDumpHandler + arguments: + - '@aeon_dump_manager.dump_service' + - '@aeon_dump_manager.dump_job_status_service' + - '@monolog.logger.aeon_dump_manager' + tags: + - { name: messenger.message_handler } + + # Retention + aeon_dump_manager.scheduled_task.purge_dumps_task: + class: AeonDumpManager\ScheduledTask\PurgeDumpsTask + tags: + - { name: shopware.scheduled.task } + + aeon_dump_manager.scheduled_task.purge_dumps_task_handler: + class: AeonDumpManager\ScheduledTask\PurgeDumpsTaskHandler + arguments: + - '@scheduled_task.repository' + - '@monolog.logger.aeon_dump_manager' + - '@aeon_dump_manager.dump_service' + - '@aeon_dump_manager.dump_job_status_service' + - '@Shopware\Core\System\SystemConfig\SystemConfigService' + tags: + - { name: messenger.message_handler, handles: AeonDumpManager\ScheduledTask\PurgeDumpsTask } + + # Console commands + aeon_dump_manager.command.dump_list: + class: AeonDumpManager\Command\DumpListCommand + arguments: + - '@aeon_dump_manager.dump_lister' + tags: + - { name: console.command } + + aeon_dump_manager.command.dump_create: + class: AeonDumpManager\Command\DumpCreateCommand + arguments: + - '@aeon_dump_manager.dump_service' + tags: + - { name: console.command } + + aeon_dump_manager.command.dump_remove: + class: AeonDumpManager\Command\DumpRemoveCommand + arguments: + - '@aeon_dump_manager.dump_service' + tags: + - { name: console.command } + + # Admin API controller + AeonDumpManager\Controller\DumpController: + public: true + arguments: + - '@aeon_dump_manager.dump_lister' + - '@aeon_dump_manager.dump_service' + - '@aeon_dump_manager.dump_job_status_service' + - '@messenger.default_bus' diff --git a/src/Service/DumpService.php b/src/Service/DumpService.php index 8725be6..d0cb382 100644 --- a/src/Service/DumpService.php +++ b/src/Service/DumpService.php @@ -6,6 +6,7 @@ use AeonDumpManager\Service\Exception\DumpNotFoundException; use AeonDumpManager\Struct\DumpFile; use Doctrine\DBAL\Connection; use League\Flysystem\FilesystemOperator; +use Psr\Log\LoggerInterface; use Shopware\Core\System\SystemConfig\SystemConfigService; use Symfony\Component\Process\Exception\ProcessFailedException; use Symfony\Component\Process\Process; @@ -24,6 +25,7 @@ class DumpService private readonly Connection $connection, private readonly SystemConfigService $systemConfigService, private readonly DumpFilenameParser $filenameParser, + private readonly LoggerInterface $logger, ) { } @@ -69,6 +71,7 @@ class DumpService } $this->aeonDumpManagerFilesystemPrivate->delete($path); + $this->logger->info('Dump deleted.', ['filename' => $filename]); } /** @@ -100,6 +103,7 @@ class DumpService foreach ($excess as $dumpFile) { $this->aeonDumpManagerFilesystemPrivate->delete(DumpLister::path($dumpFile->filename)); + $this->logger->info('Dump removed: maxDumps exceeded.', ['filename' => $dumpFile->filename]); } } @@ -108,6 +112,7 @@ class DumpService foreach ($this->dumpLister->list() as $dumpFile) { if ($dumpFile->datetime < $threshold) { $this->aeonDumpManagerFilesystemPrivate->delete(DumpLister::path($dumpFile->filename)); + $this->logger->info('Dump removed: older than retention.', ['filename' => $dumpFile->filename]); } } } @@ -143,6 +148,7 @@ class DumpService if (!$process->isSuccessful()) { @unlink($tempPath); + $this->logger->error('Dump process failed.', ['exitCode' => $process->getExitCode()]); throw new ProcessFailedException($process); } @@ -153,6 +159,8 @@ class DumpService fclose($stream); @unlink($tempPath); + $this->logger->info('Dump created.', ['filename' => $filename, 'sizeBytes' => $sizeBytes]); + return new DumpFile($filename, $dateTime, $sizeBytes); } -- 2.54.0 From a551034442d8d7015a8d1d4ba5efa72cecca681b Mon Sep 17 00:00:00 2001 From: ArthurErlich Date: Sat, 3 Oct 2026 23:28:15 +0200 Subject: [PATCH 03/13] ci: plugin-agnostic PR checks and package-then-release pipeline - plugin-checks workflow: shopware-cli validate, package + built-JS assertion, phpunit - release: validate, package from the merge commit, validate the zip, create the release via the Gitea API, publish the same zip to the Composer registry - scripts/protect-main.sh sets required status checks via tea api - bump to 0.1.0 Co-Authored-By: Claude Sonnet 5.5 --- .gitea/workflows/plugin-checks.yml | 100 ++++++++++++++++ .gitea/workflows/pr-version-check.yml | 3 + .gitea/workflows/release.yml | 128 +++++++++++---------- CHANGELOG.md | 17 +++ composer.json | 2 +- docs/spec/shopware-guideline-compliance.md | 11 +- scripts/protect-main.sh | 17 +++ 7 files changed, 212 insertions(+), 66 deletions(-) create mode 100644 .gitea/workflows/plugin-checks.yml create mode 100644 scripts/protect-main.sh diff --git a/.gitea/workflows/plugin-checks.yml b/.gitea/workflows/plugin-checks.yml new file mode 100644 index 0000000..53b3ca2 --- /dev/null +++ b/.gitea/workflows/plugin-checks.yml @@ -0,0 +1,100 @@ +name: plugin-checks + +# Plugin-agnostic: nothing below names this plugin. Name, version and paths come from composer.json. +# shopware-cli is intentionally unpinned (latest); a red build after a CLI release means fix the config. + +on: + pull_request: + branches: [main] + +permissions: + contents: read + +jobs: + validate: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: shivammathur/setup-php@v2 + with: + php-version: '8.3' + - uses: actions/setup-node@v4 + with: + node-version: '20' + - name: Install shopware-cli + run: | + curl -sL https://github.com/shopware/shopware-cli/releases/latest/download/shopware-cli_Linux_x86_64.tar.gz | tar -xz -C /tmp shopware-cli + sudo install /tmp/shopware-cli /usr/local/bin/shopware-cli || install /tmp/shopware-cli /usr/local/bin/shopware-cli + - name: Validate extension + run: shopware-cli extension validate . + + package: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - uses: actions/setup-node@v4 + with: + node-version: '20' + - name: Install shopware-cli + run: | + curl -sL https://github.com/shopware/shopware-cli/releases/latest/download/shopware-cli_Linux_x86_64.tar.gz | tar -xz -C /tmp shopware-cli + sudo install /tmp/shopware-cli /usr/local/bin/shopware-cli || install /tmp/shopware-cli /usr/local/bin/shopware-cli + - name: Package extension + run: shopware-cli extension package . --output-directory .build --filename package.zip --git-commit "$GITHUB_SHA" + - name: Validate packaged zip + run: shopware-cli extension validate .build/package.zip + - name: Assert built JS is in the zip + run: | + set -e + LIST=$(unzip -Z1 .build/package.zip) + if [ -f src/Resources/app/administration/src/main.js ] || [ -f src/Resources/app/administration/src/main.ts ]; then + echo "$LIST" | grep -q 'Resources/public/administration/js/' || { echo "::error::admin entry exists but the zip has no built admin JS"; exit 1; } + fi + if [ -f src/Resources/app/storefront/src/main.js ] || [ -f src/Resources/app/storefront/src/main.ts ]; then + echo "$LIST" | grep -q 'Resources/app/storefront/dist/' || { echo "::error::storefront entry exists but the zip has no built storefront JS"; exit 1; } + fi + + phpunit: + runs-on: ubuntu-latest + services: + database: + image: mariadb:11.4 + env: + MARIADB_ROOT_PASSWORD: root + options: >- + --health-cmd="healthcheck.sh --connect --innodb_initialized" + --health-interval=5s --health-timeout=5s --health-retries=20 + env: + DATABASE_URL: mysql://root:root@database:3306/shopware + APP_ENV: test + APP_URL: http://localhost + steps: + - uses: actions/checkout@v4 + with: + path: plugin-src + - uses: shivammathur/setup-php@v2 + with: + php-version: '8.3' + extensions: gd, intl, pdo_mysql, zip, curl, mbstring, dom, xml, fileinfo, sodium, bcmath + tools: composer + - name: Resolve plugin name + run: | + # plugin directory name = short class name of extra.shopware-plugin-class + CLASS=$(jq -r '.extra["shopware-plugin-class"]' plugin-src/composer.json) + echo "PLUGIN_NAME=${CLASS##*\\}" >> "$GITHUB_ENV" + - name: Create Shopware 6.6 project + run: composer create-project shopware/production:6.6.* shopware --no-interaction --no-scripts + - name: Install Shopware and the plugin + working-directory: shopware + run: | + set -e + composer require --dev phpunit/phpunit:^10 --no-interaction + bin/console system:install --basic-setup --create-database --force --no-interaction + cp -r ../plugin-src "custom/plugins/${PLUGIN_NAME}" + bin/console plugin:refresh + bin/console plugin:install --activate "${PLUGIN_NAME}" + - name: Run phpunit + working-directory: shopware + run: vendor/bin/phpunit -c "custom/plugins/${PLUGIN_NAME}/phpunit.xml" diff --git a/.gitea/workflows/pr-version-check.yml b/.gitea/workflows/pr-version-check.yml index 3f5a2d8..271dbc1 100644 --- a/.gitea/workflows/pr-version-check.yml +++ b/.gitea/workflows/pr-version-check.yml @@ -4,6 +4,9 @@ on: pull_request: branches: [main] +permissions: + contents: read + jobs: version-changelog: runs-on: ubuntu-latest diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index ed1e8bb..5750cf7 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -1,11 +1,16 @@ name: release +# Plugin-agnostic: owner, repo, host, package name and version come from the `github` context +# and composer.json. shopware-cli is intentionally unpinned (latest). +# RELEASE_TOKEN is the single token used for releases, assets and the Composer registry. + on: push: branches: [main] -env: - SERVER_URL: https://git.arthurerlich.de +permissions: + contents: write + packages: write jobs: release: @@ -17,15 +22,19 @@ jobs: token: ${{ secrets.RELEASE_TOKEN }} - name: Determine version and guard against re-release - id: version + id: meta run: | set -e - VERSION=$(grep -m1 '"version"' composer.json | sed -E 's/.*"version"[[:space:]]*:[[:space:]]*"([^"]+)".*/\1/') - PACKAGE_NAME=$(grep -m1 '"name"' composer.json | sed -E 's/.*"name"[[:space:]]*:[[:space:]]*"([^"]+)".*/\1/') + VERSION=$(jq -r .version composer.json) + PACKAGE_NAME=$(jq -r .name composer.json) + REPO_NAME="${GITHUB_REPOSITORY#*/}" TAG="v${VERSION}" - echo "version=${VERSION}" >> "$GITHUB_OUTPUT" - echo "package_name=${PACKAGE_NAME}" >> "$GITHUB_OUTPUT" - echo "tag=${TAG}" >> "$GITHUB_OUTPUT" + { + echo "version=${VERSION}" + echo "package_name=${PACKAGE_NAME}" + echo "tag=${TAG}" + echo "zip=${REPO_NAME}-${TAG}.zip" + } >> "$GITHUB_OUTPUT" if git ls-remote --tags origin "refs/tags/${TAG}" | grep -q "${TAG}"; then echo "skip=true" >> "$GITHUB_OUTPUT" echo "Tag ${TAG} already exists, nothing to release." @@ -33,68 +42,66 @@ jobs: echo "skip=false" >> "$GITHUB_OUTPUT" fi - - name: Extract changelog section - if: steps.version.outputs.skip == 'false' + - uses: actions/setup-node@v4 + if: steps.meta.outputs.skip == 'false' + with: + node-version: '20' + + - name: Install shopware-cli + if: steps.meta.outputs.skip == 'false' run: | - awk -v ver="${{ steps.version.outputs.version }}" ' + curl -sL https://github.com/shopware/shopware-cli/releases/latest/download/shopware-cli_Linux_x86_64.tar.gz | tar -xz -C /tmp shopware-cli + sudo install /tmp/shopware-cli /usr/local/bin/shopware-cli || install /tmp/shopware-cli /usr/local/bin/shopware-cli + + - name: Validate extension + if: steps.meta.outputs.skip == 'false' + run: shopware-cli extension validate . + + - name: Package extension (prebuilt admin/storefront assets) + if: steps.meta.outputs.skip == 'false' + run: | + shopware-cli extension package . --output-directory .build \ + --filename "${{ steps.meta.outputs.zip }}" --git-commit "$GITHUB_SHA" + + - name: Validate packaged zip + if: steps.meta.outputs.skip == 'false' + run: shopware-cli extension validate ".build/${{ steps.meta.outputs.zip }}" + + - name: Extract changelog section + if: steps.meta.outputs.skip == 'false' + run: | + awk -v ver="${{ steps.meta.outputs.version }}" ' BEGIN { found=0 } /^## \[/ { if (found) exit - if ($0 ~ "\[" ver "\]") { found=1; next } + if ($0 ~ "\\[" ver "\\]") { found=1; next } } found { print } ' CHANGELOG.md > release-notes.md cat release-notes.md - - name: Create and push tag - if: steps.version.outputs.skip == 'false' + - name: Create Gitea release (creates the tag) and upload the zip + if: steps.meta.outputs.skip == 'false' + env: + TOKEN: ${{ secrets.RELEASE_TOKEN }} run: | - git config user.name "gitea-actions" - git config user.email "actions@git.arthurerlich.de" - git tag "${{ steps.version.outputs.tag }}" - git push origin "${{ steps.version.outputs.tag }}" + set -e + API="${GITHUB_SERVER_URL}/api/v1/repos/${GITHUB_REPOSITORY}" + BODY=$(jq -n --arg tag "${{ steps.meta.outputs.tag }}" --arg sha "$GITHUB_SHA" --rawfile notes release-notes.md \ + '{tag_name:$tag, target_commitish:$sha, name:$tag, body:$notes}') + RELEASE_ID=$(curl -sf -H "Authorization: token ${TOKEN}" -H "Content-Type: application/json" -d "$BODY" "${API}/releases" | jq -r .id) + echo "release id: ${RELEASE_ID}" + curl -sf -H "Authorization: token ${TOKEN}" \ + -F "attachment=@.build/${{ steps.meta.outputs.zip }}" \ + "${API}/releases/${RELEASE_ID}/assets?name=${{ steps.meta.outputs.zip }}" > /dev/null - - name: Install shopware-cli - if: steps.version.outputs.skip == 'false' - run: | - curl -sL -o /tmp/shopware-cli.tar.gz \ - https://github.com/shopware/shopware-cli/releases/latest/download/shopware-cli_Linux_x86_64.tar.gz - mkdir -p /tmp/swcli-extract - tar -xzf /tmp/shopware-cli.tar.gz -C /tmp/swcli-extract - cp /tmp/swcli-extract/shopware-cli /usr/local/bin/shopware-cli - - - name: Validate extension (informational only, does not gate the release) - if: steps.version.outputs.skip == 'false' - run: shopware-cli extension validate . || true - - - name: Package Store-style zip for the Gitea Release asset - if: steps.version.outputs.skip == 'false' - run: | - shopware-cli extension package . --output-directory .build \ - --filename "AeonDumpManager-${{ steps.version.outputs.tag }}.zip" - - - name: Build root-level zip for the Composer registry - if: steps.version.outputs.skip == 'false' - run: git archive --format=zip -o "composer-package-${{ steps.version.outputs.tag }}.zip" "${{ steps.version.outputs.tag }}" - - - name: Create Gitea Release - if: steps.version.outputs.skip == 'false' - uses: akkuman/gitea-release-action@v1 - with: - server_url: ${{ env.SERVER_URL }} - token: ${{ secrets.RELEASE_TOKEN }} - tag_name: ${{ steps.version.outputs.tag }} - name: ${{ steps.version.outputs.tag }} - body_path: release-notes.md - files: .build/AeonDumpManager-${{ steps.version.outputs.tag }}.zip - - - name: Publish to Composer registry - if: steps.version.outputs.skip == 'false' + - name: Publish the same zip to the Composer registry + if: steps.meta.outputs.skip == 'false' run: | STATUS=$(curl -s -o /tmp/composer-publish.log -w "%{http_code}" \ - -u "haylan:${{ secrets.RELEASE_TOKEN }}" \ - -T "composer-package-${{ steps.version.outputs.tag }}.zip" \ - "https://git.arthurerlich.de/api/packages/haylan/composer") + -u "${GITHUB_REPOSITORY_OWNER}:${{ secrets.RELEASE_TOKEN }}" \ + -T ".build/${{ steps.meta.outputs.zip }}" \ + "${GITHUB_SERVER_URL}/api/packages/${GITHUB_REPOSITORY_OWNER}/composer") cat /tmp/composer-publish.log if [ "$STATUS" != "201" ] && [ "$STATUS" != "409" ]; then echo "Unexpected HTTP status $STATUS publishing to the Composer registry" @@ -102,10 +109,11 @@ jobs: fi - name: Link Composer package to this repository - if: steps.version.outputs.skip == 'false' + if: steps.meta.outputs.skip == 'false' run: | - ENCODED_NAME=$(printf '%s' "${{ steps.version.outputs.package_name }}" | sed 's#/#%2F#g') - STATUS=$(curl -s -o /dev/null -w "%{http_code}" -u "haylan:${{ secrets.RELEASE_TOKEN }}" -X POST "https://git.arthurerlich.de/api/v1/packages/haylan/composer/${ENCODED_NAME}/-/link/AeonDumpManager") + ENCODED_NAME=$(printf '%s' "${{ steps.meta.outputs.package_name }}" | sed 's#/#%2F#g') + STATUS=$(curl -s -o /dev/null -w "%{http_code}" -u "${GITHUB_REPOSITORY_OWNER}:${{ secrets.RELEASE_TOKEN }}" -X POST \ + "${GITHUB_SERVER_URL}/api/v1/packages/${GITHUB_REPOSITORY_OWNER}/composer/${ENCODED_NAME}/-/link/${GITHUB_REPOSITORY#*/}") echo "link status: $STATUS" if [ "$STATUS" != "201" ] && [ "$STATUS" != "400" ]; then echo "::warning::Unexpected status linking the Composer package to this repository (HTTP $STATUS) - not fatal, release already published" diff --git a/CHANGELOG.md b/CHANGELOG.md index d15f8cb..dde9226 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.1.0] - 2026-10-03 + +### Changed + +- Services and routes are now configured in YAML; the plugin requires PHP `^8.2`. +- Release pipeline: the packaged `shopware-cli` zip (with prebuilt assets) is validated and used for both the Gitea Release and the Composer registry; the release is created through the Gitea API after packaging, so a failed build no longer leaves an orphan tag. +- New PR checks: `shopware-cli` validate, package build and phpunit. + +### Added + +- Dedicated `aeon_dump_manager` monolog channel; dump jobs, deletions and purges are logged. +- Extension icon and `.config/shopware-extension.yml`. + +### Removed + +- Empty plugin lifecycle overrides. + ## [0.0.5] - 2026-09-21 ### Fixed diff --git a/composer.json b/composer.json index 2e2d71a..a677ca4 100755 --- a/composer.json +++ b/composer.json @@ -3,7 +3,7 @@ "description": "Export database dumps for Shopware 6 environments.", "type": "shopware-platform-plugin", "license": "MIT", - "version": "0.0.5", + "version": "0.1.0", "keywords": [ "shopware", "shopware6", diff --git a/docs/spec/shopware-guideline-compliance.md b/docs/spec/shopware-guideline-compliance.md index 23692b9..56e56aa 100644 --- a/docs/spec/shopware-guideline-compliance.md +++ b/docs/spec/shopware-guideline-compliance.md @@ -31,13 +31,14 @@ on branches `research/shopware-guideline-checklist`, `research/shopware-cli-ci-b ## 3. Pipeline -### PR workflow (`.gitea/workflows/pr.yml`, replaces `pr-version-check.yml`) +### PR workflows Jobs (all required checks on `main`): -1. `version-changelog` - unchanged logic (version bump + changelog heading). Keep this job/workflow name so the existing required context `version-changelog / version-changelog (pull_request)` keeps working, or update protection when renamed. -2. `validate` - install `shopware-cli`, `extension validate .` (hard gate, no `|| true`). -3. `package` - `extension package` with `--git-commit "$GITHUB_SHA"`, then assert the zip contains built admin JS (`Resources/public/administration/js`) when an admin entry exists. -4. `phpunit` - `composer create-project shopware/production` (6.6.x) + MariaDB service, symlink plugin, install/activate, run phpunit. PHP 8.3. +`pr-version-check.yml` (job `version-changelog`) is unchanged apart from `permissions:`; its name keeps the existing required context. New `plugin-checks.yml`: + +1. `validate` - install `shopware-cli`, `extension validate .` (hard gate, no `|| true`). +2. `package` - `extension package` with `--git-commit "$GITHUB_SHA"`, then assert the zip contains built admin JS (`Resources/public/administration/js`) when an admin entry exists. +3. `phpunit` - `composer create-project shopware/production` (6.6.x) + MariaDB service, copy the plugin into `custom/plugins`, install/activate, run phpunit. PHP 8.3. ### Release workflow (`.gitea/workflows/release.yml`) diff --git a/scripts/protect-main.sh b/scripts/protect-main.sh new file mode 100644 index 0000000..5303a53 --- /dev/null +++ b/scripts/protect-main.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +# One-time (re-runnable) setup: require the PR checks on `main` using the Gitea `tea` CLI. +# `tea branches protect` cannot set status-check contexts, hence `tea api`. +# Usage: scripts/protect-main.sh [owner/repo] (default: derived from the git remote) +set -euo pipefail + +REPO="${1:-$(git config --get remote.origin.url | sed -E 's#^.*[:/]([^/]+/[^/]+)$#\1#; s#\.git$##')}" + +tea api -X PATCH "repos/${REPO}/branch_protections/main" -d '{ + "enable_status_check": true, + "status_check_contexts": [ + "version-changelog / version-changelog (pull_request)", + "plugin-checks / validate (pull_request)", + "plugin-checks / package (pull_request)", + "plugin-checks / phpunit (pull_request)" + ] +}' -- 2.54.0 From 89a445f900efed324ac9f952cf32d6fbe64a2e09 Mon Sep 17 00:00:00 2001 From: ArthurErlich Date: Sat, 3 Oct 2026 23:37:03 +0200 Subject: [PATCH 04/13] fix: satisfy shopware-cli validate (description length, icon under 30kb) Co-Authored-By: Claude Sonnet 5.5 --- composer.json | 4 ++-- src/Resources/config/plugin.png | Bin 48700 -> 12348 bytes 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index a677ca4..a7e34cf 100755 --- a/composer.json +++ b/composer.json @@ -39,8 +39,8 @@ "en-GB": "Dump Manager" }, "description": { - "de-DE": "Verwaltet Datenbank-Dumps für Shopware 6 Entwicklungsumgebungen.", - "en-GB": "Manages database dumps for Shopware 6 development environments." + "de-DE": "Verwaltet Datenbank-Dumps für Shopware 6 Entwicklungsumgebungen: komprimierte SQL-Dumps im Backend oder per Konsole erstellen, auflisten und löschen, mit automatischer Aufbewahrung.", + "en-GB": "Manages database dumps for Shopware 6 development environments: create, list and delete compressed SQL dumps from the admin or via console commands, with automatic retention cleanup." }, "manufacturerLink": { "de-DE": "https://arthurerlich.de", diff --git a/src/Resources/config/plugin.png b/src/Resources/config/plugin.png index cb3f9c9f42bcbaba042eed3f74692299c4e397e4..b90fbc13c2eb2e6853a78dc64aca45be856d342f 100644 GIT binary patch literal 12348 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 OfSQt);zxPQ$o~O|Wk*N= literal 48700 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 m(;2;8-Y##K`OBdl3I87+U^jJNIeE_j0000 Date: Sat, 3 Oct 2026 23:46:11 +0200 Subject: [PATCH 05/13] fix(plugin): reword descriptions, add transparent icon variant --- composer.json | 4 ++-- src/Resources/config/plugin-transparent.png | Bin 0 -> 54773 bytes 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 src/Resources/config/plugin-transparent.png diff --git a/composer.json b/composer.json index a7e34cf..bd55f73 100755 --- a/composer.json +++ b/composer.json @@ -39,8 +39,8 @@ "en-GB": "Dump Manager" }, "description": { - "de-DE": "Verwaltet Datenbank-Dumps für Shopware 6 Entwicklungsumgebungen: komprimierte SQL-Dumps im Backend oder per Konsole erstellen, auflisten und löschen, mit automatischer Aufbewahrung.", - "en-GB": "Manages database dumps for Shopware 6 development environments: create, list and delete compressed SQL dumps from the admin or via console commands, with automatic retention cleanup." + "de-DE": "Für Datenbank-Backups in Shopware 6 Umgebungen erzeugt Dump Manager komprimierte SQL-Dumps per Backend oder Konsole, listet und löscht sie und räumt alte Dumps automatisch auf.", + "en-GB": "To get a database dump for Shopware 6 environments, Dump Manager creates compressed SQL dumps from the admin or console, lists and deletes them, and purges old dumps automatically." }, "manufacturerLink": { "de-DE": "https://arthurerlich.de", diff --git a/src/Resources/config/plugin-transparent.png b/src/Resources/config/plugin-transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..b4eb2dcef3d0182dc2fd25684e104c78924719c2 GIT binary patch literal 54773 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 literal 0 HcmV?d00001 -- 2.54.0 From 221ffece3f1d0e84b6273666e2b5937a1c564c36 Mon Sep 17 00:00:00 2001 From: ArthurErlich Date: Sat, 3 Oct 2026 23:51:10 +0200 Subject: [PATCH 06/13] ci: fix hanging setup-php, wait for DB manually, add compatibility_date - validate job needs no PHP (the package job already validates without it) - phpunit: runner=self-hosted so setup-php does not hang under act; replace the unhealthy service healthcheck with a TCP wait loop - .config/shopware-extension.yml: set compatibility_date Co-Authored-By: Claude Sonnet 5.5 --- .config/shopware-extension.yml | 1 + .gitea/workflows/plugin-checks.yml | 15 +++++++++------ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/.config/shopware-extension.yml b/.config/shopware-extension.yml index f6ab11f..fa16e4b 100644 --- a/.config/shopware-extension.yml +++ b/.config/shopware-extension.yml @@ -1,3 +1,4 @@ +compatibility_date: 2026-02-11 # shopware-cli extension configuration (build/package/validate) build: zip: diff --git a/.gitea/workflows/plugin-checks.yml b/.gitea/workflows/plugin-checks.yml index 53b3ca2..243abec 100644 --- a/.gitea/workflows/plugin-checks.yml +++ b/.gitea/workflows/plugin-checks.yml @@ -15,9 +15,6 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: shivammathur/setup-php@v2 - with: - php-version: '8.3' - uses: actions/setup-node@v4 with: node-version: '20' @@ -63,9 +60,6 @@ jobs: image: mariadb:11.4 env: MARIADB_ROOT_PASSWORD: root - options: >- - --health-cmd="healthcheck.sh --connect --innodb_initialized" - --health-interval=5s --health-timeout=5s --health-retries=20 env: DATABASE_URL: mysql://root:root@database:3306/shopware APP_ENV: test @@ -75,10 +69,19 @@ jobs: with: path: plugin-src - uses: shivammathur/setup-php@v2 + env: + runner: self-hosted # non-GitHub runner (act): without this setup-php hangs with: php-version: '8.3' extensions: gd, intl, pdo_mysql, zip, curl, mbstring, dom, xml, fileinfo, sodium, bcmath tools: composer + - name: Wait for the database + run: | + for i in $(seq 60); do + (echo > /dev/tcp/database/3306) 2>/dev/null && exit 0 + sleep 2 + done + echo "::error::database service did not come up"; exit 1 - name: Resolve plugin name run: | # plugin directory name = short class name of extra.shopware-plugin-class -- 2.54.0 From 1ec194b4640114dd42456c7ed9d229f0faaaf62a Mon Sep 17 00:00:00 2001 From: ArthurErlich Date: Sun, 4 Oct 2026 00:03:12 +0200 Subject: [PATCH 07/13] ci: PHP via apt in a bookworm container, retry shopware-cli download setup-php hangs on the runner even with runner=self-hosted; the CLI download returned a non-gzip body once under concurrent load. Co-Authored-By: Claude Sonnet 5.5 --- .gitea/workflows/plugin-checks.yml | 22 +++++++++++++--------- .gitea/workflows/release.yml | 3 ++- docs/spec/shopware-guideline-compliance.md | 2 +- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/.gitea/workflows/plugin-checks.yml b/.gitea/workflows/plugin-checks.yml index 243abec..20a431d 100644 --- a/.gitea/workflows/plugin-checks.yml +++ b/.gitea/workflows/plugin-checks.yml @@ -20,7 +20,8 @@ jobs: node-version: '20' - name: Install shopware-cli run: | - curl -sL https://github.com/shopware/shopware-cli/releases/latest/download/shopware-cli_Linux_x86_64.tar.gz | tar -xz -C /tmp shopware-cli + curl -fsSL --retry 5 --retry-delay 10 -o /tmp/swcli.tgz https://github.com/shopware/shopware-cli/releases/latest/download/shopware-cli_Linux_x86_64.tar.gz + tar -xzf /tmp/swcli.tgz -C /tmp shopware-cli sudo install /tmp/shopware-cli /usr/local/bin/shopware-cli || install /tmp/shopware-cli /usr/local/bin/shopware-cli - name: Validate extension run: shopware-cli extension validate . @@ -36,7 +37,8 @@ jobs: node-version: '20' - name: Install shopware-cli run: | - curl -sL https://github.com/shopware/shopware-cli/releases/latest/download/shopware-cli_Linux_x86_64.tar.gz | tar -xz -C /tmp shopware-cli + curl -fsSL --retry 5 --retry-delay 10 -o /tmp/swcli.tgz https://github.com/shopware/shopware-cli/releases/latest/download/shopware-cli_Linux_x86_64.tar.gz + tar -xzf /tmp/swcli.tgz -C /tmp shopware-cli sudo install /tmp/shopware-cli /usr/local/bin/shopware-cli || install /tmp/shopware-cli /usr/local/bin/shopware-cli - name: Package extension run: shopware-cli extension package . --output-directory .build --filename package.zip --git-commit "$GITHUB_SHA" @@ -55,6 +57,9 @@ jobs: phpunit: runs-on: ubuntu-latest + # shivammathur/setup-php hangs on this runner, so PHP comes from Debian bookworm (8.2) via apt. + container: + image: node:20-bookworm services: database: image: mariadb:11.4 @@ -64,17 +69,16 @@ jobs: DATABASE_URL: mysql://root:root@database:3306/shopware APP_ENV: test APP_URL: http://localhost + COMPOSER_MEMORY_LIMIT: '-1' + COMPOSER_ALLOW_SUPERUSER: '1' steps: - uses: actions/checkout@v4 with: path: plugin-src - - uses: shivammathur/setup-php@v2 - env: - runner: self-hosted # non-GitHub runner (act): without this setup-php hangs - with: - php-version: '8.3' - extensions: gd, intl, pdo_mysql, zip, curl, mbstring, dom, xml, fileinfo, sodium, bcmath - tools: composer + - name: Install PHP and tools + run: | + apt-get update -q + apt-get install -y -q --no-install-recommends php-cli php-gd php-intl php-mysql php-zip php-curl php-mbstring php-xml php-bcmath composer unzip jq git ca-certificates - name: Wait for the database run: | for i in $(seq 60); do diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index 5750cf7..6ddafb8 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -50,7 +50,8 @@ jobs: - name: Install shopware-cli if: steps.meta.outputs.skip == 'false' run: | - curl -sL https://github.com/shopware/shopware-cli/releases/latest/download/shopware-cli_Linux_x86_64.tar.gz | tar -xz -C /tmp shopware-cli + curl -fsSL --retry 5 --retry-delay 10 -o /tmp/swcli.tgz https://github.com/shopware/shopware-cli/releases/latest/download/shopware-cli_Linux_x86_64.tar.gz + tar -xzf /tmp/swcli.tgz -C /tmp shopware-cli sudo install /tmp/shopware-cli /usr/local/bin/shopware-cli || install /tmp/shopware-cli /usr/local/bin/shopware-cli - name: Validate extension diff --git a/docs/spec/shopware-guideline-compliance.md b/docs/spec/shopware-guideline-compliance.md index 56e56aa..0e731c2 100644 --- a/docs/spec/shopware-guideline-compliance.md +++ b/docs/spec/shopware-guideline-compliance.md @@ -38,7 +38,7 @@ Jobs (all required checks on `main`): 1. `validate` - install `shopware-cli`, `extension validate .` (hard gate, no `|| true`). 2. `package` - `extension package` with `--git-commit "$GITHUB_SHA"`, then assert the zip contains built admin JS (`Resources/public/administration/js`) when an admin entry exists. -3. `phpunit` - `composer create-project shopware/production` (6.6.x) + MariaDB service, copy the plugin into `custom/plugins`, install/activate, run phpunit. PHP 8.3. +3. `phpunit` - `composer create-project shopware/production` (6.6.x) + MariaDB service, copy the plugin into `custom/plugins`, install/activate, run phpunit. PHP from the Debian bookworm container (8.2), because `shivammathur/setup-php` hangs on this runner. ### Release workflow (`.gitea/workflows/release.yml`) -- 2.54.0 From c3b242675ef1771dd0903a171c43181e9665b48b Mon Sep 17 00:00:00 2001 From: ArthurErlich Date: Sun, 4 Oct 2026 00:07:07 +0200 Subject: [PATCH 08/13] ci: run shopware-cli jobs in the official Docker image Replaces the curl/tar install and setup-node steps; the image ships the CLI plus its PHP/Node toolchain. Co-Authored-By: Claude Sonnet 5.5 --- .gitea/workflows/plugin-checks.yml | 26 +++++++++----------------- .gitea/workflows/release.yml | 21 ++++++++------------- 2 files changed, 17 insertions(+), 30 deletions(-) diff --git a/.gitea/workflows/plugin-checks.yml b/.gitea/workflows/plugin-checks.yml index 20a431d..a7888a9 100644 --- a/.gitea/workflows/plugin-checks.yml +++ b/.gitea/workflows/plugin-checks.yml @@ -1,7 +1,7 @@ name: plugin-checks # Plugin-agnostic: nothing below names this plugin. Name, version and paths come from composer.json. -# shopware-cli is intentionally unpinned (latest); a red build after a CLI release means fix the config. +# shopware-cli runs from its official Docker image, intentionally unpinned (latest); a red build after a CLI release means fix the config. on: pull_request: @@ -13,37 +13,29 @@ permissions: jobs: validate: runs-on: ubuntu-latest + container: + image: ghcr.io/shopware/shopware-cli:latest steps: - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: '20' - - name: Install shopware-cli - run: | - curl -fsSL --retry 5 --retry-delay 10 -o /tmp/swcli.tgz https://github.com/shopware/shopware-cli/releases/latest/download/shopware-cli_Linux_x86_64.tar.gz - tar -xzf /tmp/swcli.tgz -C /tmp shopware-cli - sudo install /tmp/shopware-cli /usr/local/bin/shopware-cli || install /tmp/shopware-cli /usr/local/bin/shopware-cli - name: Validate extension run: shopware-cli extension validate . package: runs-on: ubuntu-latest + container: + image: ghcr.io/shopware/shopware-cli:latest steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - - uses: actions/setup-node@v4 - with: - node-version: '20' - - name: Install shopware-cli - run: | - curl -fsSL --retry 5 --retry-delay 10 -o /tmp/swcli.tgz https://github.com/shopware/shopware-cli/releases/latest/download/shopware-cli_Linux_x86_64.tar.gz - tar -xzf /tmp/swcli.tgz -C /tmp shopware-cli - sudo install /tmp/shopware-cli /usr/local/bin/shopware-cli || install /tmp/shopware-cli /usr/local/bin/shopware-cli - name: Package extension run: shopware-cli extension package . --output-directory .build --filename package.zip --git-commit "$GITHUB_SHA" - name: Validate packaged zip run: shopware-cli extension validate .build/package.zip + - name: Ensure helper tools (jq, curl, unzip) + run: | + command -v jq >/dev/null && command -v curl >/dev/null && command -v unzip >/dev/null && exit 0 + (apt-get update -q && apt-get install -y -q --no-install-recommends jq curl unzip) || apk add --no-cache jq curl unzip - name: Assert built JS is in the zip run: | set -e diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index 6ddafb8..312ab37 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -1,7 +1,7 @@ name: release # Plugin-agnostic: owner, repo, host, package name and version come from the `github` context -# and composer.json. shopware-cli is intentionally unpinned (latest). +# and composer.json. shopware-cli runs from its official Docker image, intentionally unpinned (latest). # RELEASE_TOKEN is the single token used for releases, assets and the Composer registry. on: @@ -15,7 +15,14 @@ permissions: jobs: release: runs-on: ubuntu-latest + container: + image: ghcr.io/shopware/shopware-cli:latest steps: + - name: Ensure helper tools (jq, curl, unzip, git) + run: | + command -v jq >/dev/null && command -v curl >/dev/null && command -v unzip >/dev/null && command -v git >/dev/null && exit 0 + (apt-get update -q && apt-get install -y -q --no-install-recommends jq curl unzip git) || apk add --no-cache jq curl unzip git + - uses: actions/checkout@v4 with: fetch-depth: 0 @@ -42,18 +49,6 @@ jobs: echo "skip=false" >> "$GITHUB_OUTPUT" fi - - uses: actions/setup-node@v4 - if: steps.meta.outputs.skip == 'false' - with: - node-version: '20' - - - name: Install shopware-cli - if: steps.meta.outputs.skip == 'false' - run: | - curl -fsSL --retry 5 --retry-delay 10 -o /tmp/swcli.tgz https://github.com/shopware/shopware-cli/releases/latest/download/shopware-cli_Linux_x86_64.tar.gz - tar -xzf /tmp/swcli.tgz -C /tmp shopware-cli - sudo install /tmp/shopware-cli /usr/local/bin/shopware-cli || install /tmp/shopware-cli /usr/local/bin/shopware-cli - - name: Validate extension if: steps.meta.outputs.skip == 'false' run: shopware-cli extension validate . -- 2.54.0 From ff693777495b097a1ddbcb8e5652f04212319535 Mon Sep 17 00:00:00 2001 From: ArthurErlich Date: Sun, 4 Oct 2026 00:15:25 +0200 Subject: [PATCH 09/13] ci: dedupe validate into package, add caches, run phpunit in the shopware-cli image - drop the separate validate job (the zip is validated after packaging); same in release - shared scripts/ci/assert-built-assets.sh (BusyBox-safe), now also used by release - actions/cache for npm, shopware-cli and composer - phpunit: shopware-cli image instead of a 4.5 min apt install; MariaDB 10.11 (11.4 broke Shopware's migrations: Duplicate column 'sorter_key') - protect-main.sh: drop the removed validate context Co-Authored-By: Claude Sonnet 5.5 --- .gitea/workflows/plugin-checks.yml | 57 ++++++++++------------ .gitea/workflows/release.yml | 13 ++++- docs/spec/shopware-guideline-compliance.md | 7 ++- scripts/ci/assert-built-assets.sh | 17 +++++++ scripts/protect-main.sh | 1 - 5 files changed, 57 insertions(+), 38 deletions(-) create mode 100644 scripts/ci/assert-built-assets.sh diff --git a/.gitea/workflows/plugin-checks.yml b/.gitea/workflows/plugin-checks.yml index a7888a9..5eac50e 100644 --- a/.gitea/workflows/plugin-checks.yml +++ b/.gitea/workflows/plugin-checks.yml @@ -1,7 +1,8 @@ name: plugin-checks # Plugin-agnostic: nothing below names this plugin. Name, version and paths come from composer.json. -# shopware-cli runs from its official Docker image, intentionally unpinned (latest); a red build after a CLI release means fix the config. +# shopware-cli runs from its official Docker image, intentionally unpinned (latest); a red build +# after a CLI release means fix the config. on: pull_request: @@ -11,15 +12,8 @@ permissions: contents: read jobs: - validate: - runs-on: ubuntu-latest - container: - image: ghcr.io/shopware/shopware-cli:latest - steps: - - uses: actions/checkout@v4 - - name: Validate extension - run: shopware-cli extension validate . - + # Packages the extension (builds admin/storefront assets) and validates the resulting zip, + # which is the artifact that ships. A separate directory validate would only repeat these checks. package: runs-on: ubuntu-latest container: @@ -28,33 +22,29 @@ jobs: - uses: actions/checkout@v4 with: fetch-depth: 0 + - uses: actions/cache@v4 + with: + path: | + ~/.npm + ~/.cache/shopware-cli + key: swcli-${{ runner.os }}-${{ hashFiles('composer.json', 'src/Resources/app/**/package*.json') }} + restore-keys: swcli-${{ runner.os }}- - name: Package extension run: shopware-cli extension package . --output-directory .build --filename package.zip --git-commit "$GITHUB_SHA" - name: Validate packaged zip run: shopware-cli extension validate .build/package.zip - - name: Ensure helper tools (jq, curl, unzip) - run: | - command -v jq >/dev/null && command -v curl >/dev/null && command -v unzip >/dev/null && exit 0 - (apt-get update -q && apt-get install -y -q --no-install-recommends jq curl unzip) || apk add --no-cache jq curl unzip - name: Assert built JS is in the zip - run: | - set -e - LIST=$(unzip -Z1 .build/package.zip) - if [ -f src/Resources/app/administration/src/main.js ] || [ -f src/Resources/app/administration/src/main.ts ]; then - echo "$LIST" | grep -q 'Resources/public/administration/js/' || { echo "::error::admin entry exists but the zip has no built admin JS"; exit 1; } - fi - if [ -f src/Resources/app/storefront/src/main.js ] || [ -f src/Resources/app/storefront/src/main.ts ]; then - echo "$LIST" | grep -q 'Resources/app/storefront/dist/' || { echo "::error::storefront entry exists but the zip has no built storefront JS"; exit 1; } - fi + run: scripts/ci/assert-built-assets.sh .build/package.zip phpunit: runs-on: ubuntu-latest - # shivammathur/setup-php hangs on this runner, so PHP comes from Debian bookworm (8.2) via apt. + # Same image as above: it already ships PHP, Composer and Node, so no apt install. container: - image: node:20-bookworm + image: ghcr.io/shopware/shopware-cli:latest services: database: - image: mariadb:11.4 + # Shopware 6.6 supports MariaDB 10.11 / MySQL 8; 11.4 broke Shopware's own migrations. + image: mariadb:10.11 env: MARIADB_ROOT_PASSWORD: root env: @@ -67,10 +57,15 @@ jobs: - uses: actions/checkout@v4 with: path: plugin-src - - name: Install PHP and tools - run: | - apt-get update -q - apt-get install -y -q --no-install-recommends php-cli php-gd php-intl php-mysql php-zip php-curl php-mbstring php-xml php-bcmath composer unzip jq git ca-certificates + - uses: actions/cache@v4 + with: + path: | + ~/.cache/composer + ~/.composer/cache + key: composer-${{ runner.os }}-shopware-6.6-${{ hashFiles('plugin-src/composer.json') }} + restore-keys: composer-${{ runner.os }}-shopware-6.6- + - name: Toolchain + run: php -v && composer --version && php -m | tr '\n' ' ' - name: Wait for the database run: | for i in $(seq 60); do @@ -81,7 +76,7 @@ jobs: - name: Resolve plugin name run: | # plugin directory name = short class name of extra.shopware-plugin-class - CLASS=$(jq -r '.extra["shopware-plugin-class"]' plugin-src/composer.json) + CLASS=$(php -r 'echo json_decode(file_get_contents("plugin-src/composer.json"), true)["extra"]["shopware-plugin-class"];') echo "PLUGIN_NAME=${CLASS##*\\}" >> "$GITHUB_ENV" - name: Create Shopware 6.6 project run: composer create-project shopware/production:6.6.* shopware --no-interaction --no-scripts diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index 312ab37..c7f1001 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -49,9 +49,14 @@ jobs: echo "skip=false" >> "$GITHUB_OUTPUT" fi - - name: Validate extension + - uses: actions/cache@v4 if: steps.meta.outputs.skip == 'false' - run: shopware-cli extension validate . + with: + path: | + ~/.npm + ~/.cache/shopware-cli + key: swcli-${{ runner.os }}-${{ hashFiles('composer.json', 'src/Resources/app/**/package*.json') }} + restore-keys: swcli-${{ runner.os }}- - name: Package extension (prebuilt admin/storefront assets) if: steps.meta.outputs.skip == 'false' @@ -63,6 +68,10 @@ jobs: if: steps.meta.outputs.skip == 'false' run: shopware-cli extension validate ".build/${{ steps.meta.outputs.zip }}" + - name: Assert built JS is in the zip + if: steps.meta.outputs.skip == 'false' + run: scripts/ci/assert-built-assets.sh ".build/${{ steps.meta.outputs.zip }}" + - name: Extract changelog section if: steps.meta.outputs.skip == 'false' run: | diff --git a/docs/spec/shopware-guideline-compliance.md b/docs/spec/shopware-guideline-compliance.md index 0e731c2..3603f38 100644 --- a/docs/spec/shopware-guideline-compliance.md +++ b/docs/spec/shopware-guideline-compliance.md @@ -36,14 +36,13 @@ on branches `research/shopware-guideline-checklist`, `research/shopware-cli-ci-b Jobs (all required checks on `main`): `pr-version-check.yml` (job `version-changelog`) is unchanged apart from `permissions:`; its name keeps the existing required context. New `plugin-checks.yml`: -1. `validate` - install `shopware-cli`, `extension validate .` (hard gate, no `|| true`). -2. `package` - `extension package` with `--git-commit "$GITHUB_SHA"`, then assert the zip contains built admin JS (`Resources/public/administration/js`) when an admin entry exists. -3. `phpunit` - `composer create-project shopware/production` (6.6.x) + MariaDB service, copy the plugin into `custom/plugins`, install/activate, run phpunit. PHP from the Debian bookworm container (8.2), because `shivammathur/setup-php` hangs on this runner. +1. `package` - `extension package` with `--git-commit "$GITHUB_SHA"`, `extension validate` on the resulting zip (hard gate; replaces a separate directory validate, which only repeats those checks), then `scripts/ci/assert-built-assets.sh` (built admin/storefront JS present when sources exist). All shopware-cli jobs run in `ghcr.io/shopware/shopware-cli:latest`; npm and shopware-cli caches via `actions/cache`. +2. `phpunit` - `composer create-project shopware/production` (6.6.x) + MariaDB service, copy the plugin into `custom/plugins`, install/activate, run phpunit. Runs in the same `shopware-cli` image (PHP and Composer included; `shivammathur/setup-php` hangs on this runner and apt installs cost ~4.5 min). MariaDB 10.11, because 11.4 broke Shopware's own migrations. ### Release workflow (`.gitea/workflows/release.yml`) On push to `main`, guarded against re-release by an existing tag: -validate -> `extension package --git-commit "$GITHUB_SHA"` -> **validate the zip** -> create the Gitea +`extension package --git-commit "$GITHUB_SHA"` -> **validate the zip** -> assert built assets -> create the Gitea release via API (`POST /repos/{owner}/{repo}/releases`, creates the tag) with the zip as asset -> upload the same zip to the Composer registry -> link package to repository. Removes the manual `git tag` step, the `akkuman` action and the `git archive` zip. Packaging happens diff --git a/scripts/ci/assert-built-assets.sh b/scripts/ci/assert-built-assets.sh new file mode 100644 index 0000000..888a5d9 --- /dev/null +++ b/scripts/ci/assert-built-assets.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +# Assert that a packaged extension zip contains the built admin/storefront JS when the sources exist. +# Usage: scripts/ci/assert-built-assets.sh (run from the repo root; BusyBox-safe: uses unzip -l) +set -euo pipefail +ZIP="${1:?usage: assert-built-assets.sh }" +LIST=$(unzip -l "$ZIP") + +check() { #