Skip to content

Merge commit from fork #2158

Merge commit from fork

Merge commit from fork #2158

Workflow file for this run

---
name: Build Windows release
concurrency:
cancel-in-progress: true
group: ${{ github.workflow }}-${{ github.ref }}
on:
pull_request:
types: [opened, synchronize, reopened, labeled]
branches:
- main
push:
branches:
- main
tags:
- v*.*.*
workflow_dispatch:
inputs:
#checkov:skip=CKV_GHA_7
version:
description: "FrankenPHP version"
required: false
type: string
schedule:
- cron: "0 8 * * *"
permissions:
contents: read
env:
BUILD_RELEASE: "${{ github.event_name != 'pull_request' || contains(github.event.pull_request.labels.*.name, 'CI: All jobs') }}"
GOTOOLCHAIN: local
GOTESTSUM_FORMAT: pkgname-and-test-fails
GOFLAGS: "-ldflags=-extldflags=-fuse-ld=lld -tags=nobadger,nomysql,nopgx,deprecated_topic,deprecated_claim"
PHP_DOWNLOAD_BASE: "https://downloads.php.net/~windows/releases/"
CC: clang
CXX: clang++
jobs:
build:
permissions:
contents: write
id-token: write
attestations: write
artifact-metadata: write
runs-on: windows-latest
steps:
- name: Determine ref
run: |
$ref = $env:REF
if (-not $ref -and $env:GITHUB_EVENT_NAME -eq "schedule") {
$ref = (gh release view --repo php/frankenphp --json tagName --jq '.tagName')
}
"REF=$ref" >> $env:GITHUB_ENV
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
REF: ${{ (github.ref_type == 'tag' && github.ref_name) || (github.event_name == 'workflow_dispatch' && inputs.version) || '' }}
- name: Configure Git
run: |
git config --global core.autocrlf false
git config --global core.eol lf
- name: Checkout Code
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: ${{ env.REF || '' }}
path: frankenphp
persist-credentials: false
- id: version
uses: ./frankenphp/.github/actions/version
with:
ref: ${{ env.REF }}
- name: Setup Go
uses: ./frankenphp/.github/actions/setup-go
with:
working-directory: frankenphp
cache: ${{ !env.REF }}
- name: Determine runner image
id: image
run: '"version=$env:ImageVersion" >> $env:GITHUB_OUTPUT'
# SourceForge sometimes serves runners a non-archive body for pthreads sources; release runs skip the cache
- name: Cache Vcpkg Packages # zizmor: ignore[cache-poisoning]
if: ${{ !env.REF }}
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
path: ~\AppData\Local\vcpkg\archives
key: vcpkg-${{ runner.os }}-${{ steps.image.outputs.version }}-${{ hashFiles('frankenphp/vcpkg.json') }}
restore-keys: vcpkg-${{ runner.os }}-
# The runner's preinstalled vcpkg lags behind; port scripts must match the baseline
- name: Sync Vcpkg With Baseline
working-directory: frankenphp
run: |
$baseline = (Get-Content vcpkg.json | ConvertFrom-Json).'builtin-baseline'
git -C $env:VCPKG_INSTALLATION_ROOT fetch --quiet origin $baseline
git -C $env:VCPKG_INSTALLATION_ROOT checkout --quiet $baseline
& "$env:VCPKG_INSTALLATION_ROOT\bootstrap-vcpkg.bat" -disableMetrics
- name: Install Vcpkg Libraries
working-directory: frankenphp
run: "vcpkg install"
- name: Download Watcher
run: |
$latestTag = gh release list --repo e-dant/watcher --limit 1 --exclude-drafts --exclude-pre-releases --json tagName --jq '.[0].tagName'
Write-Host "Latest Watcher version: $latestTag"
gh release download $latestTag --repo e-dant/watcher --pattern "*x86_64-pc-windows-msvc.tar" -O watcher.tar
tar -xf "watcher.tar" -C "$env:GITHUB_WORKSPACE"
Rename-Item -Path "$env:GITHUB_WORKSPACE\x86_64-pc-windows-msvc" -NewName "watcher"
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Download PHP
run: |
$webContent = Invoke-WebRequest -Uri $env:PHP_DOWNLOAD_BASE
# Rebuilt binaries get a build number suffix, e.g. php-8.5.12-1-Win32-vs17-x64.zip
$links = $webContent.Links.Href | Where-Object { $_ -match "php-\d+\.\d+\.\d+(-\d+)?-Win32-vs17-x64\.zip$" }
if (-not $links) { throw "Could not find PHP zip files at $env:PHP_DOWNLOAD_BASE" }
$latestFile = $links | Sort-Object { if ($_ -match '(\d+\.\d+\.\d+)(?:-(\d+))?-Win32') { [version]"$($matches[1]).$([int]$matches[2])" } } | Select-Object -Last 1
if ($latestFile -match '((\d+\.\d+\.\d+)(?:-\d+)?)-Win32') { $build = $matches[1]; $version = $matches[2] }
Write-Host "Detected latest PHP version: $version"
"PHP_VERSION=$version" >> $env:GITHUB_ENV
$phpZip = "php-$build-Win32-vs17-x64.zip"
$develZip = "php-devel-pack-$build-Win32-vs17-x64.zip"
$dirName = "frankenphp-windows-x86_64"
"DIR_NAME=$dirName" >> $env:GITHUB_ENV
Invoke-WebRequest -Uri "$env:PHP_DOWNLOAD_BASE/$phpZip" -OutFile "$env:TEMP\php.zip"
Expand-Archive -Path "$env:TEMP\php.zip" -DestinationPath "$env:GITHUB_WORKSPACE\$dirName"
Invoke-WebRequest -Uri "$env:PHP_DOWNLOAD_BASE/$develZip" -OutFile "$env:TEMP\php-devel.zip"
Expand-Archive -Path "$env:TEMP\php-devel.zip" -DestinationPath "$env:GITHUB_WORKSPACE\php-devel"
- name: Prepare env
run: |
$vcpkgRoot = "$env:GITHUB_WORKSPACE\frankenphp\vcpkg_installed\x64-windows"
$watcherRoot = "$env:GITHUB_WORKSPACE\watcher"
$phpBin = "$env:GITHUB_WORKSPACE\$env:DIR_NAME"
$phpDevel = (Get-ChildItem "$env:GITHUB_WORKSPACE\php-devel" -Directory | Select-Object -First 1).FullName
"C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\Llvm\bin" >> $env:GITHUB_PATH
"$vcpkgRoot\bin" >> $env:GITHUB_PATH
"$watcherRoot" >> $env:GITHUB_PATH
"$phpBin" >> $env:GITHUB_PATH
"PKG_CONFIG_PATH=$vcpkgRoot\lib\pkgconfig" >> $env:GITHUB_ENV
"CGO_CFLAGS=-DFRANKENPHP_VERSION=$env:FRANKENPHP_VERSION -I$vcpkgRoot\include -I$watcherRoot -I$phpDevel\include -I$phpDevel\include\main -I$phpDevel\include\TSRM -I$phpDevel\include\Zend -I$phpDevel\include\ext" >> $env:GITHUB_ENV
"CGO_LDFLAGS=-L$vcpkgRoot\lib -lbrotlienc -L$watcherRoot -llibwatcher-c -L$phpBin -L$phpDevel\lib -lphp8ts -lphp8embed" >> $env:GITHUB_ENV
env:
FRANKENPHP_VERSION: ${{ steps.version.outputs.version }}
- name: Embed Windows icon and metadata
if: env.BUILD_RELEASE == 'true'
working-directory: frankenphp\caddy\frankenphp
run: |
go install github.com/josephspurrier/goversioninfo/cmd/goversioninfo@latest
$major = 0; $minor = 0; $patch = 0; $build = 0
if ($env:FRANKENPHP_VERSION -match '^(?<major>\d+)\.(?<minor>\d+)\.(?<patch>\d+)$') {
$major = [int]$Matches['major']
$minor = [int]$Matches['minor']
$patch = [int]$Matches['patch']
}
$json = @{
FixedFileInfo = @{
FileVersion = @{ Major = $major; Minor = $minor; Patch = $patch; Build = $build }
ProductVersion = @{ Major = $major; Minor = $minor; Patch = $patch; Build = $build }
}
StringFileInfo = @{
CompanyName = "FrankenPHP"
FileDescription = "The modern PHP app server"
FileVersion = $env:FRANKENPHP_VERSION
InternalName = "frankenphp"
OriginalFilename = "frankenphp.exe"
LegalCopyright = "(c) 2022 Kévin Dunglas, MIT License"
ProductName = "FrankenPHP"
ProductVersion = $env:FRANKENPHP_VERSION
Comments = "https://frankenphp.dev/"
}
VarFileInfo = @{
Translation = @{ LangID = 9; CharsetID = 1200 }
}
} | ConvertTo-Json -Depth 10
$json | Set-Content "versioninfo.json"
goversioninfo -64 -icon ..\..\frankenphp.ico versioninfo.json -o resource.syso
env:
FRANKENPHP_VERSION: ${{ steps.version.outputs.version }}
- name: Build FrankenPHP
if: env.BUILD_RELEASE == 'true'
run: |
$customVersion = "FrankenPHP $env:FRANKENPHP_VERSION PHP $env:PHP_VERSION Caddy"
go build -ldflags="-extldflags=-fuse-ld=lld -X 'github.com/caddyserver/caddy/v2.CustomVersion=$customVersion' -X 'github.com/caddyserver/caddy/v2.CustomBinaryName=frankenphp' -X 'github.com/caddyserver/caddy/v2/modules/caddyhttp.ServerHeader=FrankenPHP Caddy'"
working-directory: frankenphp\caddy\frankenphp
env:
FRANKENPHP_VERSION: ${{ steps.version.outputs.version }}
- name: Create Directory
if: env.BUILD_RELEASE == 'true'
run: |
Copy-Item frankenphp\caddy\frankenphp\frankenphp.exe $env:DIR_NAME
Copy-Item watcher\libwatcher-c.dll $env:DIR_NAME
Copy-Item frankenphp\vcpkg_installed\x64-windows\bin\brotlienc.dll $env:DIR_NAME
Copy-Item frankenphp\vcpkg_installed\x64-windows\bin\brotlidec.dll $env:DIR_NAME
Copy-Item frankenphp\vcpkg_installed\x64-windows\bin\brotlicommon.dll $env:DIR_NAME
Copy-Item frankenphp\vcpkg_installed\x64-windows\bin\pthreadVC3.dll $env:DIR_NAME
- name: Upload Artifact
if: env.BUILD_RELEASE == 'true' && !env.REF
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: ${{ env.DIR_NAME }}
path: ${{ env.DIR_NAME }}
if-no-files-found: error
- name: Zip Release Artifact
if: ${{ env.REF }}
run: Compress-Archive -Path "$env:DIR_NAME\*" -DestinationPath "$env:DIR_NAME.zip"
- name: Upload Release Asset
if: ${{ env.REF }}
run: gh release upload "$env:REF" "$env:DIR_NAME.zip" --repo php/frankenphp --clobber
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- if: ${{ env.REF }}
uses: actions/attest@1e69f48acb82d1966a394da916b4c1698aa569d6 # v4.2.2
with:
subject-path: ${{ github.workspace }}\${{ env.DIR_NAME }}.zip
- name: Run Tests
run: |
"opcache.enable=0`r`nopcache.enable_cli=0" | Out-File php.ini
$env:PHPRC = Get-Location
go install gotest.tools/gotestsum@latest
gotestsum -- -race ./...
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
cd caddy
gotestsum -- -race ./...
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
working-directory: ${{ github.workspace }}\frankenphp