CI on Unix #2
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: "CI on Unix" | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| os: | |
| required: true | |
| description: Build target OS | |
| default: 'linux-x86_64' | |
| type: choice | |
| options: | |
| - 'linux-x86_64' | |
| - 'linux-aarch64' | |
| - 'linux-x86_64-glibc' | |
| - 'linux-aarch64-glibc' | |
| - 'macos-x86_64' | |
| - 'macos-aarch64' | |
| php-version: | |
| required: true | |
| description: PHP version to compile | |
| default: '8.4' | |
| type: choice | |
| options: | |
| - '8.4' | |
| - '8.3' | |
| - '8.2' | |
| - '8.1' | |
| extensions: | |
| description: Extensions to build statically (comma separated) | |
| required: true | |
| type: string | |
| shared-extensions: | |
| description: Extensions to build shared (comma separated, optional) | |
| required: false | |
| type: string | |
| extra-libs: | |
| description: Extra libraries to build (optional, comma separated) | |
| type: string | |
| build-cli: | |
| description: Build cli binary | |
| default: true | |
| type: boolean | |
| build-micro: | |
| description: Build phpmicro binary | |
| type: boolean | |
| build-fpm: | |
| description: Build fpm binary | |
| type: boolean | |
| prefer-pre-built: | |
| description: Prefer pre-built binaries (reduce build time) | |
| type: boolean | |
| default: true | |
| debug: | |
| description: Show full build logs | |
| type: boolean | |
| no-strip: | |
| description: Keep debug symbols for debugging | |
| type: boolean | |
| default: false | |
| workflow_call: | |
| inputs: | |
| os: | |
| required: true | |
| description: Build target OS | |
| default: 'linux-x86_64' | |
| type: string | |
| php-version: | |
| required: true | |
| description: PHP version to compile | |
| default: '8.4' | |
| type: string | |
| extensions: | |
| description: Extensions to build statically (comma separated) | |
| required: true | |
| type: string | |
| shared-extensions: | |
| description: Extensions to build shared (comma separated, optional) | |
| required: false | |
| type: string | |
| extra-libs: | |
| description: Extra libraries to build (optional, comma separated) | |
| type: string | |
| build-cli: | |
| description: Build cli binary | |
| default: true | |
| type: boolean | |
| build-micro: | |
| description: Build phpmicro binary | |
| type: boolean | |
| build-fpm: | |
| description: Build fpm binary | |
| type: boolean | |
| prefer-pre-built: | |
| description: Prefer pre-built binaries (reduce build time) | |
| type: boolean | |
| default: true | |
| debug: | |
| description: Show full build logs | |
| type: boolean | |
| no-strip: | |
| description: Keep debug symbols for debugging | |
| type: boolean | |
| default: false | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| jobs: | |
| define-build: | |
| name: "Define Build Scripts" | |
| runs-on: ubuntu-latest | |
| outputs: | |
| run: ${{ steps.gendef.outputs.run }} | |
| download: ${{ steps.gendef.outputs.download }} | |
| build: ${{ steps.gendef.outputs.build }} | |
| has-shared: ${{ steps.gendef.outputs.has-shared }} | |
| steps: | |
| - name: "Checkout" | |
| uses: actions/checkout@v4 | |
| - name: "Define" | |
| id: gendef | |
| run: | | |
| # 1. Select the base command and runner based on OS | |
| case "${{ inputs.os }}" in | |
| linux-x86_64) | |
| DOWN_CMD="./bin/spc-alpine-docker download" | |
| BUILD_CMD="./bin/spc-alpine-docker build" | |
| RUNS_ON="ubuntu-latest" | |
| ;; | |
| linux-aarch64) | |
| DOWN_CMD="./bin/spc-alpine-docker download" | |
| BUILD_CMD="./bin/spc-alpine-docker build" | |
| RUNS_ON="ubuntu-24.04-arm" | |
| ;; | |
| linux-x86_64-glibc) | |
| DOWN_CMD="./bin/spc-gnu-docker download" | |
| BUILD_CMD="./bin/spc-gnu-docker build" | |
| RUNS_ON="ubuntu-22.04" | |
| ;; | |
| linux-aarch64-glibc) | |
| DOWN_CMD="./bin/spc-gnu-docker download" | |
| BUILD_CMD="./bin/spc-gnu-docker build" | |
| RUNS_ON="ubuntu-22.04-arm" | |
| ;; | |
| macos-x86_64) | |
| DOWN_CMD="composer update --no-dev --classmap-authoritative && ./bin/spc doctor --auto-fix && ./bin/spc download" | |
| BUILD_CMD="./bin/spc build" | |
| RUNS_ON="macos-15-intel" | |
| ;; | |
| macos-aarch64) | |
| DOWN_CMD="composer update --no-dev --classmap-authoritative && ./bin/spc doctor --auto-fix && ./bin/spc download" | |
| BUILD_CMD="./bin/spc build" | |
| RUNS_ON="macos-15" | |
| ;; | |
| esac | |
| # 2. Combine static and shared extensions for the download step | |
| ALL_EXTENSIONS="${{ inputs.extensions }}" | |
| if [ -n "${{ inputs.shared-extensions }}" ]; then | |
| ALL_EXTENSIONS="${ALL_EXTENSIONS},${{ inputs.shared-extensions }}" | |
| echo "has-shared=true" >> "$GITHUB_OUTPUT" | |
| else | |
| echo "has-shared=false" >> "$GITHUB_OUTPUT" | |
| fi | |
| # 3. Construct Download Command | |
| DOWN_CMD="$DOWN_CMD --with-php=${{ inputs.php-version }} --for-extensions=${ALL_EXTENSIONS} --ignore-cache-sources=php-src" | |
| # 4. Construct Build Command | |
| # Add static extensions (passed as main argument for --build-cli usually, or --build-cli=... depending on spc version logic) | |
| # Assuming the original logic BUILD_CMD="$BUILD_CMD ${{ inputs.extensions }}" works for the main target: | |
| BUILD_CMD="$BUILD_CMD --build-cli=\"${{ inputs.extensions }}\"" | |
| # Add shared extensions flag if present | |
| if [ -n "${{ inputs.shared-extensions }}" ]; then | |
| BUILD_CMD="$BUILD_CMD --build-shared=\"${{ inputs.shared-extensions }}\"" | |
| fi | |
| if [ -n "${{ inputs.extra-libs }}" ]; then | |
| DOWN_CMD="$DOWN_CMD --for-libs=${{ inputs.extra-libs }}" | |
| BUILD_CMD="$BUILD_CMD --with-libs=${{ inputs.extra-libs }}" | |
| fi | |
| if [ ${{ inputs.debug }} == true ]; then | |
| DOWN_CMD="$DOWN_CMD --debug" | |
| BUILD_CMD="$BUILD_CMD --debug" | |
| fi | |
| if [ ${{ inputs.prefer-pre-built }} == true ]; then | |
| DOWN_CMD="$DOWN_CMD --prefer-pre-built" | |
| fi | |
| # build-cli is handled above in the main extension list logic usually, | |
| # but we keep these flags just in case the wrapper script needs them. | |
| if [ ${{ inputs.build-micro }} == true ]; then | |
| BUILD_CMD="$BUILD_CMD --build-micro" | |
| fi | |
| if [ ${{ inputs.build-fpm }} == true ]; then | |
| BUILD_CMD="$BUILD_CMD --build-fpm" | |
| fi | |
| echo 'download='"$DOWN_CMD" >> "$GITHUB_OUTPUT" | |
| echo 'build='"$BUILD_CMD" >> "$GITHUB_OUTPUT" | |
| echo 'run='"$RUNS_ON" >> "$GITHUB_OUTPUT" | |
| build: | |
| name: "Build ${{ inputs.version }} on ${{ inputs.os }}" | |
| runs-on: ${{ needs.define-build.outputs.run }} | |
| needs: define-build | |
| timeout-minutes: 240 | |
| steps: | |
| - name: "Checkout" | |
| uses: actions/checkout@v4 | |
| - name: "Setup PHP" | |
| uses: shivammathur/setup-php@v2 | |
| with: | |
| php-version: 8.4 | |
| tools: pecl, composer | |
| extensions: curl, openssl, mbstring | |
| ini-values: memory_limit=-1 | |
| env: | |
| phpts: nts | |
| # Cache downloaded source | |
| - id: cache-download | |
| uses: actions/cache@v4 | |
| with: | |
| path: downloads | |
| key: php-dependencies-${{ inputs.os }}-${{ inputs.php-version }} # Added version to key for safety | |
| - name: "Download sources" | |
| run: ${{ needs.define-build.outputs.download }} | |
| - name: "Build PHP" | |
| run: ${{ needs.define-build.outputs.build }} | |
| # Upload cli executable | |
| - if: ${{ inputs.build-cli == true }} | |
| name: "Upload PHP cli SAPI" | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: php-cli-${{ inputs.php-version }}-${{ inputs.os }} | |
| path: buildroot/bin/php | |
| # Upload micro self-extracted executable | |
| - if: ${{ inputs.build-micro == true }} | |
| name: "Upload PHP micro SAPI" | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: php-micro-${{ inputs.php-version }}-${{ inputs.os }} | |
| path: buildroot/bin/micro.sfx | |
| # Upload fpm executable | |
| - if: ${{ inputs.build-fpm == true }} | |
| name: "Upload PHP fpm SAPI" | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: php-fpm-${{ inputs.php-version }}-${{ inputs.os }} | |
| path: buildroot/bin/php-fpm | |
| # NEW: Upload Shared Extensions (.so files) | |
| - if: ${{ needs.define-build.outputs.has-shared == 'true' }} | |
| name: "Upload Shared Extensions" | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: php-extensions-${{ inputs.php-version }}-${{ inputs.os }} | |
| # SPC outputs shared libs to buildroot/lib/ or buildroot/modules/ depending on version. | |
| # Using a wildcard pattern to catch it. | |
| path: | | |
| buildroot/lib/extensions/*.so | |
| buildroot/modules/*.so | |
| buildroot/lib/*.so | |
| # Upload extensions metadata | |
| - uses: actions/upload-artifact@v4 | |
| name: "Upload License Files" | |
| with: | |
| name: license-files-${{ inputs.php-version }}-${{ inputs.os }} | |
| path: buildroot/license/ | |
| - uses: actions/upload-artifact@v4 | |
| name: "Upload Build Metadata" | |
| with: | |
| name: build-meta-${{ inputs.php-version }}-${{ inputs.os }} | |
| path: | | |
| buildroot/build-extensions.json | |
| buildroot/build-libraries.json |