chore: harmonize CI workflow, templates, and test structure - #268
Conversation
Part of the fleet-wide plugin_* harmonization effort. - Pin actions/checkout, shivammathur/setup-php, actions/upload-artifact to current release commit SHAs (was floating @v4/@v2). - Stop logging the MySQL root password in CI output (cat ~/.my.cnf -> chmod 600). - Harden MySQL bootstrap: quoted --defaults-file, grants added for both 'cactiuser'@'localhost' and 'cactiuser'@'127.0.0.1'. - Add "Restore vendor ownership for Pest" step after Composer install. - Switch the PHP syntax-check step to the vendor-excluding, null-delimited find/xargs pattern used in plugin_audit. - Remove the unused "Configure Apache" step (apache2/libapache2-mod-php are not installed and not needed). - Simplify the Pest invocation to rely solely on phpunit.xml's <testsuites>. - No CodeQL workflow added: this repo has no JavaScript/Python/Ruby content (PHP only), so there is nothing for CodeQL to scan. - Consolidate tests/Security/Php74CompatibilityTest.php into tests/Security/PhpCompatibilityTest.php, now checking for PHP 8.3/8.4-only syntax (this plugin's floor is PHP 8.2 per the CI matrix). - Remove tests/TestCase.php and its require in tests/bootstrap-unit.php: not referenced by any uses(TestCase::class) call in this plugin's tests. - Add .github/ISSUE_TEMPLATE/{bug_report,feature_request}.md and .github/PULL_REQUEST_TEMPLATE.md, styled after Cacti/cacti's own templates. - Document CI/dependency baselines in copilot-instructions.md.
There was a problem hiding this comment.
Copilot review overview
🟡 Changes recommended
Address the CI password exposure, compatibility coverage gaps, and required changelog/documentation updates.
Get a fresh assessment by requesting another Copilot review.
Review effort: Lite
Findings: 1
Open (3)
What changed in this PR
Harmonizes the CI workflow, PHP compatibility tests, test structure, and GitHub templates with fleet conventions.
Changes:
- Pins Actions and hardens MySQL/Composer setup.
- Replaces obsolete PHP 7.4 compatibility testing.
- Removes unused test scaffolding and adds standardized templates and guidance.
| File | Reviewed change |
|---|---|
tests/TestCase.php |
Removes unused test base class. |
tests/Security/PhpCompatibilityTest.php |
Adds PHP compatibility guards. |
tests/Security/Php74CompatibilityTest.php |
Removes obsolete compatibility checks. |
tests/bootstrap-unit.php |
Removes obsolete fixture loading. |
.github/workflows/plugin-ci-workflow.yml |
Updates CI setup, actions, database handling, and test execution. |
.github/PULL_REQUEST_TEMPLATE.md |
Adds a standardized PR template. |
.github/ISSUE_TEMPLATE/feature_request.md |
Updates the feature request template. |
.github/ISSUE_TEMPLATE/bug_report.md |
Updates the bug report template. |
.github/copilot-instructions.md |
Documents CI and dependency baselines. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
- Document the locales/build_gettext.sh + cacti.pot workflow in copilot-instructions.md (Weblate owns per-language .po/.mo sync). - Add a CI step that regenerates cacti.pot and fails if it is stale, ignoring the POT-Creation-Date timestamp. - Mark locales/build_gettext.sh executable. - Bump the CI MariaDB service image floor to 11.8 (from mariadb:10.6 / mysql:8.0).
- mariadb:11.8 no longer ships mysqladmin; use mariadb-admin for the service container healthcheck. - Run chmod/build_gettext.sh with sudo in the i18n verification step, since locales/ is owned by www-data by the time it runs.
Ran the real locales/build_gettext.sh (xgettext/msgmerge/msgfmt) to refresh the translation template against current source. Per the i18n workflow documented in copilot-instructions.md, only the regenerated cacti.pot is committed here; Weblate owns syncing the per-language .po/.mo files from it.
…ibilityTest Matches the project's PSR coding standard (short array syntax, single quotes for non-interpolated strings) that php-cs-fixer enforces in CI.
`find` without `sort` returns filesystem/readdir-order results, which can differ between machines (e.g. a local regen vs. a GitHub Actions runner), producing a spurious reordering diff in cacti.pot even when no strings actually changed. Pipe through `sort` and regenerate cacti.pot with the now-deterministic order.
- tests/Security/PhpCompatibilityTest.php: fixed the #[Override]/#[Deprecated] attribute regexes to also match the fully qualified (`#[\Override]`, `#[\Deprecated]`) form, added a realpath() false-guard for the plugin root, included the relative file path in both RuntimeException messages, added typed-class-constant and dynamic-class-constant-fetch checks (PHP 8.3), and restored each()/create_function() removed-in-PHP-8.0 guards that the consolidation had dropped. Also excludes include/vendor/ (not just vendor/) from the recursive source scan. - .github/workflows/plugin-ci-workflow.yml: the "Create MySQL Config" step's root password is now masked via `::add-mask::` before it's echoed into ~/.my.cnf, so it no longer appears in plaintext in the Actions log (chmod 600 alone only protected the file after creation, not the command's own echoed source in the log).
|
This PR's |
- CHANGELOG.md: added an entry documenting the CI/template harmonization change (was previously missing per review feedback). - locales/po/cacti.pot (+ .po/.mo): regenerated via locales/build_gettext.sh so the new "Verify translation template is up to date" CI check actually passes against the current source tree instead of comparing against a stale committed POT. - locales/build_gettext.sh: added --from-code=UTF-8 to the xgettext invocation - without it, xgettext aborts outright on any non-ASCII string in the source (e.g. a "…" character), silently leaving the previous cacti.pot in place and defeating the up-to-date check entirely. - tests/Security/PhpCompatibilityTest.php: dropped the PHP 8.3-only checks (kept only the PHP 8.4-only ones) and corrected the floor comment, since this repo's actual CI matrix only runs PHP 8.3/8.4 (no 8.2) - it tracks Cacti's `develop` branch, not `1.2.x`. - tests/Security/PhpCompatibilityTest.php: renamed the local plugin_test_read_source_file() helper to schema_test_read_source_file(), matching this repo's own naming convention (schema_ prefix for non- lifecycle helpers). - tests/Helpers/ThresholdScenario.php: fixed a flush-left statement inside inMaintenance() to use tab indentation, matching the surrounding code. - README.md / tests/README.md / copilot-instructions.md: corrected stale PHP-floor references (7.4/8.1 -> 8.2) and a stale test-filename reference (Php82CompatibilityTest.php -> the consolidated PhpCompatibilityTest.php) left over from the harmonization pass.
|
Fixed: added a |
The each()-removed-in-PHP-8.0 check matched jQuery's $.each(/.each( calls too, which have nothing to do with the removed PHP global function. Exclude any each( preceded by . or > via a negative lookbehind.


Description
Part of the fleet-wide
plugin_*CI/template/test-structure harmonizationeffort (see plugin_analytics#8, plugin_apcupsd#29).
Changes
actions/checkout,shivammathur/setup-php,actions/upload-artifactnow pinned to current release commit SHAs.cat ~/.my.cnfprinted the root passwordinto the Actions log; replaced with
chmod 600.--defaults-file, grants added forboth
'cactiuser'@'localhost'and'cactiuser'@'127.0.0.1'.step after Composer install, matching the pattern in
plugin_apcupsd.find/xargspattern fromplugin_audit.never installed in this workflow, so the step was dead weight.
phpunit.xml's own<testsuites>block instead of duplicating the test directory list.test replaced with
tests/Security/PhpCompatibilityTest.php, checking forPHP 8.3/8.4-only syntax (this plugin's floor is PHP 8.2 per the CI matrix).
tests/TestCase.php: not referenced by anyuses(TestCase::class)call in this plugin's actual tests.Related Issue
N/A — internal fleet harmonization, not tracked against a specific issue.
How Has This Been Tested?
Types of changes
Checklist
out across
plugin_*repos.