diff --git a/.github/workflows/build-plugin-archive.yml b/.github/workflows/build-plugin-archive.yml index ec83d247..d72807ce 100644 --- a/.github/workflows/build-plugin-archive.yml +++ b/.github/workflows/build-plugin-archive.yml @@ -35,7 +35,7 @@ on: type: string PHP_VERSION_BUILD: description: PHP version to use when executing build tools. - default: "8.0" + default: "8.2" required: false type: string ARCHIVE_NAME: @@ -87,6 +87,8 @@ jobs: name: Install production dependencies timeout-minutes: 5 runs-on: ubuntu-latest + outputs: + artifact: ${{ steps.set-artifact-name.outputs.artifact }} env: ENV_VARS: ${{ secrets.ENV_VARS }} COMPOSER_AUTH: '${{ secrets.COMPOSER_AUTH_JSON }}' @@ -131,9 +133,11 @@ jobs: !./.git !./.ddev !./.github + include-hidden-files: true + run-build-tools: name: Process build steps - timeout-minutes: 5 + timeout-minutes: 10 runs-on: ubuntu-latest needs: checkout-dependencies env: @@ -147,6 +151,13 @@ jobs: uses: actions/download-artifact@v4 with: name: ${{ needs.checkout-dependencies.outputs.artifact }} + + - name: Set up PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ inputs.PHP_VERSION_BUILD }} + tools: humbug/php-scoper, rector + - name: Check optional Composer build tools id: composer-tools run: | @@ -157,17 +168,29 @@ jobs: echo "$EXIT" exit 0 fi - jq '.extra | has("composer-asset-compiler")' < composer.json >/dev/null 2>&1 + jq '.extra | has("composer-asset-compiler")' --exit-status < composer.json >/dev/null 2>&1 local EXIT=$? echo "$EXIT" } hasTranslateConfig(){ - jq '.extra | has("wp-translation-downloader")' < composer.json >/dev/null 2>&1 + jq '.extra | has("wp-translation-downloader")' --exit-status < composer.json >/dev/null 2>&1 + local EXIT=$? + echo "$EXIT" + } + hasScoperConfig(){ + test -f scoper.inc.php + local EXIT=$? + echo "$EXIT" + } + hasRectorConfig(){ + test -f rector.php local EXIT=$? echo "$EXIT" } echo "assets-compiler=$( hasAssetConfig )" >> $GITHUB_OUTPUT echo "translation-downloader=$( hasTranslateConfig )" >> $GITHUB_OUTPUT + echo "php-scoper=$( hasScoperConfig )" >> $GITHUB_OUTPUT + echo "rector=$( hasRectorConfig )" >> $GITHUB_OUTPUT - name: Set up node cache mode run: | @@ -202,16 +225,38 @@ jobs: composer global require inpsyde/wp-translation-downloader composer wp-translation-downloader:download + - name: Run Rector + if: steps.composer-tools.outputs.rector == '0' + run: | + rector + + - name: Run PHP-Scoper + if: steps.composer-tools.outputs.php-scoper == '0' + run: | + php-scoper add-prefix --force --output-dir=build + composer --working-dir=build dump-autoload -o + sed -i "s/'__composer_autoload_files'/\'__composer_autoload_files_${{ github.sha }}'/g" "build/vendor/composer/autoload_real.php" + + - name: Move code to the `build/` directory + if: steps.composer-tools.outputs.php-scoper != '0' + run: | + shopt -s extglob dotglob + mkdir build + mv !(build) build + - name: Set artifact name id: set-artifact-name run: echo "artifact=interim-built" >> $GITHUB_OUTPUT + - name: Upload artifact uses: actions/upload-artifact@v4 with: name: ${{ steps.set-artifact-name.outputs.artifact }} path: | - . - !**/node_modules + build/ + !build/**/node_modules + include-hidden-files: true + create-plugin-archive: name: Create build archive timeout-minutes: 5 @@ -239,11 +284,9 @@ jobs: run: echo "archive-name=${ARCHIVE_NAME:-${{ github.event.repository.name }}}" >> $GITHUB_OUTPUT - name: Add commit hash to plugin header - working-directory: interim-deps run: 'sed -Ei "s/SHA: .*/SHA: ${GIT_SHA}/g" ${{ inputs.PLUGIN_MAIN_FILE }}' - name: Set plugin version header - working-directory: interim-deps run: 'sed -Ei "s/Version: .*/Version: ${PLUGIN_VERSION}/g" ${{ inputs.PLUGIN_MAIN_FILE }}' - name: Set up PHP @@ -261,7 +304,7 @@ jobs: - name: Run WP-CLI command run: | - wp dist-archive ./interim-deps ./archive.zip --plugin-dirname=${{ steps.plugin-folder-name.outputs.plugin-folder-name }} + wp dist-archive . ./archive.zip --plugin-dirname=${{ steps.plugin-folder-name.outputs.plugin-folder-name }} # GitHub Action artifacts would otherwise produce a zip within a zip - name: Unzip archive to dist/ @@ -276,3 +319,4 @@ jobs: with: name: ${{ steps.set-artifact-name.outputs.artifact }} path: ./dist/* + include-hidden-files: true diff --git a/docs/archive-creation.md b/docs/archive-creation.md index b7cb8fe7..05f9c5e7 100644 --- a/docs/archive-creation.md +++ b/docs/archive-creation.md @@ -7,10 +7,12 @@ To achieve that, the reusable workflow: 1. Installs dependencies (including dev-dependencies) defined in `composer.json` 2. Executes `inpsyde/composer-assets-compiler` if required & configured by the package 3. Executes `inpsyde/wp-translation-downloader` if required & configured by the package -4. Re-installs dependencies without dev-dependencies -5. Sets current commit hash and plugin version in the plugin's main file -6. Runs `wp dist-archive` to create the final archive (with builtin support for a `.distignore` file) -7. Uploads it as an artifact for download or further processing +4. Executes PHP-Scoper if configured by the package +5. Executes Rector if configured by the package +6. Re-installs dependencies without dev-dependencies +7. Sets current commit hash and plugin version in the plugin's main file +8. Runs `wp dist-archive` to create the final archive (with builtin support for a `.distignore` file) +9. Uploads it as an artifact for download or further processing ## Simple usage example