name: CI on: push: branches: - main - develop pull_request: jobs: # PHPCS and PHPStan share a job so the two of them draw once on Setup PHP # rather than twice. That step is slow and intermittently fails on 8.3 # (see #178), so every job that can be folded into another is one less # chance for a run to fall over. They run as separate steps, and PHPCS # failing stops the job before PHPStan reports. quality: name: Coding Standards & Static Analysis runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 # setup-php installs PHP 8.3+ through php-builder, which apt-installs ~70 # -dev packages before unpacking the build (#178). Ubuntu's own image # deletes the .debs after install, so every job re-downloads them from # the archive. Keep them and restore them from the cache server, which # lives in the cluster, turning a WAN download into a local one. # # The dep list is the same for every PHP version on the builder path, so # one shared key serves them all. Only the .debs are cached, never # /var/lib/apt/lists — a stale index is how you get 404s on install. - name: Keep downloaded .debs run: | sudo rm -f /etc/apt/apt.conf.d/docker-clean echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' \ | sudo tee /etc/apt/apt.conf.d/99keep-downloaded-packages >/dev/null - name: Cache apt packages uses: actions/cache@v3 with: path: /var/cache/apt/archives/*.deb key: apt-php-builder-deps-${{ runner.arch }}-v1 # Temporary, for #178: shows whether the cache actually served the # builder's dependencies, and times the step that consumes them. - name: Report restored .debs run: | echo "restored .debs: $(ls /var/cache/apt/archives/*.deb 2>/dev/null | wc -l)" echo "restored size: $(du -sh /var/cache/apt/archives 2>/dev/null | cut -f1)" date -u +'setup-php start: %H:%M:%S' - name: Setup PHP uses: shivammathur/setup-php@v2 with: php-version: '8.3' tools: composer:v2 - name: Cache Composer packages uses: actions/cache@v3 with: path: ~/.composer/cache key: composer-${{ hashFiles('composer.json') }} - name: Install dependencies run: composer install --prefer-dist --no-progress --no-interaction - name: Run PHPCS run: composer cs - name: Run PHPStan run: composer lint test: name: Tests (PHP ${{ matrix.php }}) runs-on: ubuntu-latest strategy: fail-fast: false matrix: php: - '8.1' - '8.2' - '8.3' - '8.5' steps: - uses: actions/checkout@v4 # setup-php installs PHP 8.3+ through php-builder, which apt-installs ~70 # -dev packages before unpacking the build (#178). Ubuntu's own image # deletes the .debs after install, so every job re-downloads them from # the archive. Keep them and restore them from the cache server, which # lives in the cluster, turning a WAN download into a local one. # # The dep list is the same for every PHP version on the builder path, so # one shared key serves them all. Only the .debs are cached, never # /var/lib/apt/lists — a stale index is how you get 404s on install. - name: Keep downloaded .debs run: | sudo rm -f /etc/apt/apt.conf.d/docker-clean echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' \ | sudo tee /etc/apt/apt.conf.d/99keep-downloaded-packages >/dev/null - name: Cache apt packages uses: actions/cache@v3 with: path: /var/cache/apt/archives/*.deb key: apt-php-builder-deps-${{ runner.arch }}-v1 # Temporary, for #178: shows whether the cache actually served the # builder's dependencies, and times the step that consumes them. - name: Report restored .debs run: | echo "restored .debs: $(ls /var/cache/apt/archives/*.deb 2>/dev/null | wc -l)" echo "restored size: $(du -sh /var/cache/apt/archives 2>/dev/null | cut -f1)" date -u +'setup-php start: %H:%M:%S' - name: Setup PHP uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php }} extensions: mbstring, intl coverage: none tools: composer:v2 - name: Cache Composer packages uses: actions/cache@v3 with: path: ~/.composer/cache key: ${{ matrix.php }}-composer-${{ hashFiles('composer.json') }} - name: Install dependencies run: composer install --prefer-dist --no-progress --no-interaction - name: Run PHPUnit run: composer test no-debug: name: No Debug Code runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Check for debug statements run: | # \b keeps method calls like DateTimeImmutable::add() from matching dd(. if grep -rn --include="*.php" -E "\b(var_dump|var_export|print_r|error_log|dd|dump)\s*\(" src/; then echo "Debug code found in src/ — please remove before merging." exit 1 fi build: name: Build Plugin Zip runs-on: ubuntu-latest # Only build a shippable artifact once changes land on main, and only # after the quality gates pass. needs: [quality, test, no-debug] if: github.event_name == 'push' && github.ref == 'refs/heads/main' steps: - uses: actions/checkout@v4 # setup-php installs PHP 8.3+ through php-builder, which apt-installs ~70 # -dev packages before unpacking the build (#178). Ubuntu's own image # deletes the .debs after install, so every job re-downloads them from # the archive. Keep them and restore them from the cache server, which # lives in the cluster, turning a WAN download into a local one. # # The dep list is the same for every PHP version on the builder path, so # one shared key serves them all. Only the .debs are cached, never # /var/lib/apt/lists — a stale index is how you get 404s on install. - name: Keep downloaded .debs run: | sudo rm -f /etc/apt/apt.conf.d/docker-clean echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' \ | sudo tee /etc/apt/apt.conf.d/99keep-downloaded-packages >/dev/null - name: Cache apt packages uses: actions/cache@v3 with: path: /var/cache/apt/archives/*.deb key: apt-php-builder-deps-${{ runner.arch }}-v1 # Temporary, for #178: shows whether the cache actually served the # builder's dependencies, and times the step that consumes them. - name: Report restored .debs run: | echo "restored .debs: $(ls /var/cache/apt/archives/*.deb 2>/dev/null | wc -l)" echo "restored size: $(du -sh /var/cache/apt/archives 2>/dev/null | cut -f1)" date -u +'setup-php start: %H:%M:%S' - name: Setup PHP uses: shivammathur/setup-php@v2 with: php-version: '8.3' tools: composer:v2 - name: Build plugin zip run: composer build - name: Read plugin version id: meta run: | version="$(sed -nE 's/^[[:space:]]*\*?[[:space:]]*Version:[[:space:]]*([^[:space:]]+).*/\1/p' unsupervised-schedular.php | head -1)" echo "version=${version}" >> "$GITHUB_OUTPUT" # Gitea/Actions re-zips artifacts on download. Upload the unpacked plugin # folder (not the built zip) so the downloaded archive's top level is # unsupervised-schedular/ and installs directly in WordPress. Uploading # the zip instead double-wraps it ("No valid plugins were found"). - name: Unpack plugin for artifact run: unzip -q "dist/unsupervised-schedular-${{ steps.meta.outputs.version }}.zip" -d artifact - name: Upload artifact uses: actions/upload-artifact@v3 with: name: unsupervised-schedular-${{ steps.meta.outputs.version }} path: artifact/ if-no-files-found: error