Skip to content

Build Self-Hosted PHP Binary (Unix) #22

Build Self-Hosted PHP Binary (Unix)

Build Self-Hosted PHP Binary (Unix) #22

name: Build Self-Hosted PHP Binary (Unix)
on:
workflow_dispatch:
jobs:
build-release-artifacts:
name: "Build ${{ matrix.php-version }}-${{ matrix.combination }} on ${{ matrix.runner }}"
runs-on: ${{ matrix.runner }}
strategy:
fail-fast: false
matrix:
php-version:
- "8.1"
- "8.2"
- "8.3"
- "8.4"
runner:
- "ubuntu-latest"
- "macos-13"
- "ubuntu-20.04"
- "macos-14"
combination:
- minimal
- bulk
- common
steps:
- name: "Process env string"
id: process-env
shell: bash
run: |
case "${{ matrix.combination }}" in
minimal)
echo "EXTENSIONS=pcntl,posix,mbstring,tokenizer,phar" >> "$GITHUB_OUTPUT"
echo "DEPLOY_TARGET=${{ secrets.DEPLOY_SERVER_TARGET_MINIMAL }}" >> "$GITHUB_OUTPUT"
;;
common)
echo "EXTENSIONS=bcmath,bz2,calendar,ctype,curl,dom,exif,fileinfo,filter,ftp,gd,gmp,iconv,xml,mbstring,mbregex,mysqlnd,openssl,pcntl,pdo,pdo_mysql,pdo_sqlite,phar,posix,redis,session,simplexml,soap,sockets,sqlite3,tokenizer,xmlwriter,xmlreader,zlib,zip" >> "$GITHUB_OUTPUT"
echo "DEPLOY_TARGET=${{ secrets.DEPLOY_SERVER_TARGET }}" >> "$GITHUB_OUTPUT"
;;
bulk)
echo "EXTENSIONS=apcu,bcmath,bz2,calendar,ctype,curl,dba,dom,event,exif,fileinfo,filter,ftp,gd,gmp,iconv,imagick,imap,intl,mbregex,mbstring,mysqli,mysqlnd,opcache,openssl,pcntl,pdo,pdo_mysql,pgsql,phar,posix,protobuf,readline,redis,session,shmop,simplexml,soap,sockets,sodium,sqlite3,swoole,swoole-hook-mysql,swoole-hook-pgsql,swoole-hook-sqlite,sysvmsg,sysvsem,sysvshm,tokenizer,xml,xmlreader,xmlwriter,xsl,zip,zlib" >> "$GITHUB_OUTPUT"
echo "DEPLOY_TARGET=${{ secrets.DEPLOY_SERVER_TARGET_BULK }}" >> "$GITHUB_OUTPUT"
;;
esac
case "${{ matrix.runner }}" in
ubuntu-latest)
echo "OS=linux" >> "$GITHUB_OUTPUT"
echo "ARCH=x86_64" >> "$GITHUB_OUTPUT"
echo "CMD=bin/spc-alpine-docker" >> "$GITHUB_OUTPUT"
;;
ubuntu-20.04)
echo "OS=linux" >> "$GITHUB_OUTPUT"
echo "ARCH=aarch64" >> "$GITHUB_OUTPUT"
echo CMD="SPC_USE_ARCH=aarch64 bin/spc-alpine-docker" >> "$GITHUB_OUTPUT"
;;
windows-2019)
echo "OS=windows" >> "$GITHUB_OUTPUT"
echo "ARCH=x86_64" >> "$GITHUB_OUTPUT"
echo "CMD=bin/spc" >> "$GITHUB_OUTPUT"
;;
macos-13)
echo "OS=macos" >> "$GITHUB_OUTPUT"
echo "ARCH=x86_64" >> "$GITHUB_OUTPUT"
echo "CMD=bin/spc" >> "$GITHUB_OUTPUT"
;;
macos-14)
echo "OS=macos" >> "$GITHUB_OUTPUT"
echo "ARCH=aarch64" >> "$GITHUB_OUTPUT"
echo "CMD=bin/spc" >> "$GITHUB_OUTPUT"
;;
esac
- name: "Checkout remote"
if: github.repository != 'crazywhalecc/static-php-cli'
uses: actions/checkout@v4
with:
repository: crazywhalecc/static-php-cli
ref: main
- name: "Setup PHP"
if: matrix.runner != 'ubuntu-20.04'
uses: shivammathur/setup-php@v2
with:
php-version: 8.2
tools: pecl, composer
extensions: curl, openssl, mbstring
ini-values: memory_limit=-1
- name: "Cache composer packages"
id: composer-cache
uses: actions/cache@v4
with:
path: vendor
key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }}
restore-keys: |
${{ runner.os }}-php
# Cache downloaded source
- id: cache-download
uses: actions/cache@v4
with:
path: downloads
key: pack-lib-dependencies-${{ matrix.combination }}-${{ matrix.php-version }}-${{ matrix.runner }}
- name: "Install Dependencies"
if: matrix.runner != 'ubuntu-20.04'
run: composer update -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist --no-dev
- run: ${{ steps.process-env.outputs.CMD }} doctor --auto-fix
# If there's no dependencies cache, fetch sources
- name: "Download sources"
env:
GITHUB_TOKEN: ${{ secrets.S_GITHUB_TOKEN }}
run: ${{ steps.process-env.outputs.CMD }} download --with-php=${{ matrix.php-version }} --for-extensions=${{ steps.process-env.outputs.EXTENSIONS }} --retry=5 --prefer-pre-built
- name: "Build library: ${{ matrix.library }}"
run: |
if [ "${{ steps.process-env.outputs.OS }}" = "linux" ]; then
${{ steps.process-env.outputs.CMD }} install-pkg upx
if [ "${{ steps.process-env.outputs.ARCH }}" = "x86_64" ]; then
UPX=--with-upx-pack
fi
fi
${{ steps.process-env.outputs.CMD }} build --build-cli --build-micro --build-fpm ${{ steps.process-env.outputs.EXTENSIONS }} --debug $UPX
# Copy out from buildroot, because docker build has different permission
mkdir -p tmp_dist/
cp buildroot/bin/php tmp_dist/
cp buildroot/bin/micro.sfx tmp_dist/
cp buildroot/bin/php-fpm tmp_dist/
# UPX outside for linux-aarch64
if [ "${{ steps.process-env.outputs.OS }}-${{ steps.process-env.outputs.ARCH }}" = "linux-aarch64" ]; then
mkdir -p upx-x86_64
cd upx-x86_64
curl -#fSL -o upx.txz https://github.com/upx/upx/releases/download/v4.2.4/upx-4.2.4-amd64_linux.tar.xz
tar -xf upx.txz --strip-components 1
./upx --best ../tmp_dist/php
./upx --best ../tmp_dist/micro.sfx
SFX_SIZE=$(readelf -l ../tmp_dist/micro.sfx | awk '/LOAD|GNU_STACK/ {getline; print $1, $2, $3, $4, $6, $7}' | sed -n '2p' | awk '{print $1}')
head -c $(printf "%d" $SFX_SIZE) ../tmp_dist/micro.sfx > ../tmp_dist/micro.sfx.new
mv ../tmp_dist/micro.sfx.new ../tmp_dist/micro.sfx
./upx --best ../tmp_dist/php-fpm
cd ..
fi
PHPVER=$(cat source/php-src/main/php_version.h | grep "PHP_VERSION " | awk -F\" '{print $2}')
if [ ! -d "dist" ]; then
mkdir dist/
fi
sudo chmod -R 777 dist
tar -czf dist/php-$PHPVER-cli-${{ steps.process-env.outputs.OS }}-${{ steps.process-env.outputs.ARCH }}.tar.gz -C tmp_dist/ php
tar -czf dist/php-$PHPVER-micro-${{ steps.process-env.outputs.OS }}-${{ steps.process-env.outputs.ARCH }}.tar.gz -C tmp_dist/ micro.sfx
tar -czf dist/php-$PHPVER-fpm-${{ steps.process-env.outputs.OS }}-${{ steps.process-env.outputs.ARCH }}.tar.gz -C tmp_dist/ php-fpm
if [ "${{ matrix.php-version }}" == "8.4" ] && [ "${{ matrix.runner }}" == "ubuntu-latest" ]; then
cp -r buildroot/license dist/
cp buildroot/build-extensions.json dist/
cp buildroot/build-libraries.json dist/
echo "# Note\n\nCurrent distribution uses extensions:\n\n${{ steps.process-env.outputs.EXTENSIONS }}\n\nUsing compile command:\n\n bin/spc build --build-cli --build-micro --build-fpm ${{ steps.process-env.outputs.EXTENSIONS }} --debug --with-upx-pack" > dist/README.txt
fi
- name: "Deploy to self-hosted OSS"
uses: static-php/[email protected]
with:
aws_key_id: ${{ secrets.AWS_KEY_ID }}
aws_secret_access_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws_bucket: ${{ secrets.AWS_BUCKET }}
source_dir: "dist/"
destination_dir: static-php-cli/${{ matrix.combination }}/
endpoint: ${{ secrets.AWS_ENDPOINT }}
- name: "Upload Artifact"
uses: actions/upload-artifact@v4
with:
name: php-${{ matrix.php-version }}-${{ matrix.combination }}-${{ steps.process-env.outputs.OS }}-${{ steps.process-env.outputs.ARCH }}
path: |
tmp_dist/php
tmp_dist/php-fpm
tmp_dist/micro.sfx
if-no-files-found: error