Збирання micro PHP на власних раннерах (workflow standalone)
bin/jumphp export:standalone і app:export приклеюють гру або застосунок до micro: статично зібраного PHP (StaticPHP)
з розширеннями, потрібними JumPHP. Micro збираються workflow .github/workflows/standalone.yml і публікуються
як реліз standalone-<ключ> (ключ — відбиток версії PHP, списку розширень, коміту StaticPHP
та реєстру і патчів JumPHP: tools/standalone-key.sh). Тож micro перезбирається, лише якщо змінився один із цих елементів.
Ця сторінка пояснює, як запустити цей workflow на ваших раннерах (ci-runner.md, щоб їх встановити), і
що машини GitHub давали безкоштовно, а ваші можуть не мати.
Запуск
Forge > репозиторій > Actions > standalone > Run workflow, або з термінала (gh — це gh форджа в проєкті JumPHP):
gh workflow run standalone.yml -f extensions=tools/app-extensions.txt -f macos=false -f linux=false
| Параметр | Значення | |
|---|---|---|
extensions |
tools/standalone-extensions.txt (ігри: SDL, OpenGL, OpenAL), tools/app-extensions.txt (десктопні застосунки, IDE), tools/hybrid-extensions.txt |
зібране micro = власний ключ |
linux |
true / false |
false: без micro для Linux (див. «Docker» нижче); тоді export:standalone збирає micro для Linux на комп'ютері користувача |
macos |
true / false |
false: без micro для Mac (лише десктопні застосунки); без раннера macOS завдання чекали б безкінечно |
Завдання Windows займає близько 10 хвилин із закешованими завантаженнями, 30–60 найпершого разу. Його результат:
https://<forge>/<власник>/<репозиторій>/releases/download/standalone-<ключ>/micro-windows-x86_64.sfx.
Що мали машини GitHub і чого можуть не мати ваші
На GitHub той самий workflow «працював сам», бо windows-latest і ubuntu-latest — образи, підготовлені GitHub.
Власний раннер — гола машина. Усе перелічене нижче обробляє workflow або про це сказано тут:
| Образ GitHub | Ваш раннер | Що робить workflow / що робите ви |
|---|---|---|
PowerShell 7 (pwsh), PHP, Composer, Git |
часто лише Windows PowerShell 5.1 і Git | кроки виконуються у Windows PowerShell; PHP 8.4 і Composer завантажуються (php.net, getcomposer.org, відбиток перевіряється), якщо їх немає; usr\bin з Git додається до PATH |
| Windows англійською | мова вашого Windows (французька...) | VSLANG=1033 змушує інструменти Visual Studio говорити англійською: configure.js PHP читає вивід компонувальника і інакше зупиняється з помилкою JScript |
| Visual Studio 2022 | встановлюєте ви: Build Tools 2022, робоче навантаження «Розробка класичних застосунків на C++» | єдине, що має бути на раннері Windows (разом із Git for Windows). install-windows-runner.ps1 встановлює обидва |
Швидкий доступ до api.github.com, рідко обмежується |
той самий API відповідає 504 або «rate limit exceeded» |
завантаження StaticPHP повторюються 4 рази й зберігаються в %USERPROFILE%\.spc-downloads між запусками; Composer встановлює з джерел (--prefer-source) |
actions/upload-artifact@v4, download-artifact@v4 |
Forgejo їх не підтримує («not currently supported on GHES») | на форджі завдання Windows саме публікує micro у реліз (github.token завдання, API форджа); завдання release виконується лише на GitHub |
| Docker у завданні Linux | завдання виконується в контейнері без Docker | див. нижче |
| Кінці рядків LF | Git for Windows конвертує в CRLF | git config --global core.autocrlf false перед клонуванням StaticPHP (патч його файлів спирається на їхній текст) |
Docker: де потрібен, а де ні
- Завдання Windows компілює нативно за допомогою Visual Studio. Воно не використовує Docker, а раннер Windows і не зміг би (контейнери Linux під Windows працюють через WSL2). Для цього нічого встановлювати не потрібно.
- Завдання Linux запускає
docker build docker/standalone, потімdocker runStaticPHP. У контейнері завдання Docker немає, якщо тільки раннер його не надає: змонтуйте в завдання сокет Docker хоста (або dind раннера) (container.options/valid_volumesуconfig.ymlраннера) або використайте раннер Linux на WSL2 (ci-runner.md, розділ 4), справжній Linux із Docker. Без цього запускайте зlinux=false:bin/jumphp export:standalone <id> --linuxзбирає micro для Linux на комп'ютері, який експортує (близько 15 хвилин, потім зберігається в~/.jumphp/standalone/). - Який би не був раннер, ніколи не копіюйте й не перейменовуйте micro під іншим ключем: це буде PHP без потрібних розширень,
і виконувані файли ваших користувачів падатимуть (
Call to undefined function SDL_Init()). Якщо ключ змінився, micro треба перезібрати.
Усунення несправностей
Журнали завдань читаються на сторінці запуску у форджі (завдання > червоний крок); API форджа їх не повертає.
| Симптом | Причина / виправлення |
|---|---|
Завдання key падає за 30 с, одразу після «Fetching the repository» |
контейнер завдання не розв'язує ім'я форджа: у Docker-in-Docker раннера немає DNS назовні. Дайте йому: dns: [1.1.1.1, 9.9.9.9] для сервісу dind у compose-файлі раннера. Перевірка: docker run --network <нова мережа> node:20-bookworm getent hosts <forge> |
Cannot find: pwsh in PATH |
workflow вимагає Windows PowerShell (shell: powershell); стара копія вимагала pwsh. Оновіть її |
configure.js ... Erreur d'exécution Microsoft JScript після «Checking for link.exe» |
інструменти Visual Studio пишуть мовою Windows. VSLANG=1033 (у workflow відтоді, як з'явилася ця сторінка) |
ERROR: bison is required |
спостерігається після наполовину виконаної збірки в тому самому каталозі: StaticPHP зберігає інструменти msys2, але не повертає їх у PATH. Видаліть spc/pkgroot, spc/source, spc/buildroot з робочої області й запустіть знову (чиста область, як у нового завдання, працює) |
| Патч StaticPHP «not patched (StaticPHP changed)» або «Failed patch module» | кінці рядків CRLF (core.autocrlf false і клонувати заново) або каталог джерел, уже виправлений попередньою спробою (видаліть spc/source/php-src) |
Failed to get GitHub release API info for madler/zlib / HTTP/2 504 |
api.github.com обмежує або відмовляє для вашої адреси. Workflow повторює спроби; першому запуску на новій машині може знадобитися друга спроба. Завантаження зберігаються: кожна спроба просувається далі |
GHESNotSupportedError: upload-artifact@v4 ... not currently supported |
ви використовуєте Forgejo: візьміть workflow із цього репозиторію (він публікує без артефактів) |
| Завдання macOS залишаються в «waiting», а запуск ніколи не завершується | немає раннера macOS: -f macos=false |
Cannot find path ...\buildroot\bin\micro.sfx |
збирання зазнало невдачі раніше: прочитайте рядки вище (причина в них) |
Для ШІ-агентів
Вас можуть попросити «змусити workflow standalone працювати на моєму раннері». Прочитайте невдалий крок на сторінці запуску (попросіть
користувача вставити його, якщо у вас немає доступу), змінюйте workflow (він має лишатися робочим на GitHub: перевіряйте
github.server_url), а не машину користувача, хіба що бракує однієї з вимог вище (Git, Visual Studio Build Tools,
Docker для завдання Linux): тоді скажіть про це користувачеві й установлюйте лише за його згодою. Ніколи не реєструйте раннер, ніколи не записуйте
токен у файл, ніколи не публікуйте micro, якого ви не зібрали з поточних файлів командами цього workflow, ніколи не переносьте
реліз під інший ключ. Після успішного запуску перевірте файл (gh release view standalone-<ключ>, завантаження, що відповідає 200) і, для micro Windows,
запустіть із ним скрипт на машині раннера (copy /b micro.sfx + test.php test.exe, потім test.exe: версія PHP, extension_loaded('ffi')...).