Skip to content

Windows

Windows #8

Workflow file for this run

name: Build Windows release
concurrency:
cancel-in-progress: true
group: ${{ github.workflow }}-${{ github.ref }}
on:
pull_request:
branches:
- main
paths:
- "docker-bake.hcl"
- ".github/workflows/static.yaml"
- "**cgo.go"
- "**Dockerfile"
- "**.c"
- "**.h"
- "**.sh"
- "**.stub.php"
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:
GOTOOLCHAIN: local
PHP_DOWNLOAD_BASE: "https://windows.php.net/downloads/releases"
CC: clang
CXX: clang++
jobs:
build:
runs-on: windows-latest
defaults:
run:
shell: powershell
steps:
- name: Checkout Code
uses: actions/checkout@v6
with:
path: frankenphp
persist-credentials: false
- name: Setup Go
uses: actions/setup-go@v6
with:
go-version: "1.26.0-rc.1"
cache-dependency-path: |
frankenphp/go.sum
frankenphp/caddy/go.sum
cache: false
check-latest: true
- name: Cache Vcpkg Packages
uses: actions/cache@v5
with:
path: |
${{ env.VCPKG_INSTALLED_ROOT }}\installed
${{ env.VCPKG_INSTALLED_ROOT }}\downloads
key: ${{ runner.os }}-vcpkg-libs-${{ hashFiles('vcpkg/ports/**') }}
restore-keys: |
${{ runner.os }}-vcpkg-libs-
lookup-only: true
- name: Install Vcpkg Libraries
working-directory: frankenphp
run: '& "$env:VCPKG_INSTALLED_ROOT\vcpkg.exe" 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"
# See https://github.com/e-dant/watcher/issues/108
New-Item -Path .\watcher\wtr -ItemType Directory
Move-Item -Path .\watcher-c.h -Destination .\watcher\wtr\watcher-c.h
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Download PHP
run: |
$webContent = Invoke-WebRequest -Uri $env:PHP_DOWNLOAD_BASE -UseBasicParsing
$links = $webContent.Links.Href | Where-Object { $_ -match "php-\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+)') { [version]$matches[1] } } | Select-Object -Last 1
$version = if ($latestFile -match '(\d+\.\d+\.\d+)') { $matches[1] }
Write-Host "Detected latest PHP version: $version"
"PHP_VERSION=$version" | Out-File -FilePath $env:GITHUB_ENV -Append
$phpZip = "php-$version-Win32-vs17-x64.zip"
$develZip = "php-devel-pack-$version-Win32-vs17-x64.zip"
Invoke-WebRequest -Uri "$env:PHP_DOWNLOAD_BASE/$phpZip" -OutFile "$env:TEMP\php.zip"
Expand-Archive -Path "$env:TEMP\php.zip" -DestinationPath "$env:GITHUB_WORKSPACE\php-bin"
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:VCPKG_INSTALLED_ROOT\installed\x64-windows"
$watcherRoot = "$env:GITHUB_WORKSPACE\watcher"
$phpBin = "$env:GITHUB_WORKSPACE\php-bin"
$phpDevel = "$env:GITHUB_WORKSPACE\php-devel\php-$env:PHP_VERSION-devel-vs17-x64"
echo "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\Llvm\bin" | Out-File -FilePath $env:GITHUB_PATH -Append
echo "$env:VCPKG_INSTALLED_ROOT\installed\x64-windows\bin" | Out-File -FilePath $env:GITHUB_PATH -Append
echo "$env:VCPKG_INSTALLED_ROOT\watcher" | Out-File -FilePath $env:GITHUB_PATH -Append
echo "$env:GITHUB_WORKSPACE\php-bin" | Out-File -FilePath $env:GITHUB_PATH -Append
echo "CGO_CFLAGS=-I$vcpkgRoot\include -I$watcherRoot -I$phpDevel\include -I$phpDevel\include\main -I$phpDevel\include\TSRM -I$phpDevel\include\Zend -I$phpDevel\include\ext" | Out-File -FilePath $env:GITHUB_ENV -Append
echo "CGO_LDFLAGS=-L$vcpkgRoot\lib -lbrotlienc -L$watcherRoot -llibwatcher-c -L$phpBin -L$phpDevel\lib -lphp8ts -lphp8embed" | Out-File -FilePath $env:GITHUB_ENV -Append
- name: Build FrankenPHP
run: go build -ldflags '-extldflags="-fuse-ld=lld"' -tags nobadger,nomysql,nopgx
working-directory: ${{ env.GITHUB_WORKSPACE }}/frankenphp
- name: Create Zip Archive
run: |
Move-Item frankenphp\caddy\frankenphp\frankenphp.exe php-bin
Move-Item watcher\libwatcher-c.dll php-bin
Move-Item "$env:VCPKG_INSTALLED_ROOT\installed\x64-windows\bin\brotlienc.dll" php-bin
Move-Item "$env:VCPKG_INSTALLED_ROOT\installed\x64-windows\bin\brotlicommon.dll" php-bin
Move-Item "$env:VCPKG_INSTALLED_ROOT\installed\x64-windows\bin\pthreadVC3.dll" php-bin
$version = $env:PHP_VERSION
$zipName = "frankenphp-php-$version-Win32-vs17-x64.zip"
# TODO: create a single folder inside the zip
Compress-Archive -Path "php-bin\*" -DestinationPath "$zipName"
echo "ASSET_NAME=$zipName" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
- name: Upload Artifact
if: github.event_name != 'release'
uses: actions/upload-artifact@v6
with:
name: ${{ env.ASSET_NAME }}
path: ${{ env.GITHUB_WORKSPACE }}\${{ env.ASSET_PATH }}
- name: Upload Release Asset
if: github.event_name == 'release'
run: gh release upload $env:GITHUB_EVENT_RELEASE_TAG_NAME "$env:ASSET_PATH" --clobber
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_EVENT_RELEASE_TAG_NAME: ${{ github.event.release.tag_name }}
- name: Run Tests
run: |
"opcache.enable=0`r`nopcache.enable_cli=0" | Out-File php.ini
$env:PHPRC = Get-Location
go test -ldflags '-extldflags="-fuse-ld=lld"' ./...
cd caddy
go test -ldflags '-extldflags="-fuse-ld=lld"' -tags nobadger,nomysql,nopgx ./...
working-directory: ${{ env.GITHUB_WORKSPACE }}/frankenphp