PHP micro'sunu kendi runner'larınızda derlemek (standalone workflow'u)
bin/jumphp export:standalone ve app:export, bir oyunu ya da uygulamayı bir micro'ya yapıştırır: JumPHP'nin ihtiyaç duyduğu eklentilerle
statik olarak derlenmiş bir PHP (StaticPHP). Micro'lar .github/workflows/standalone.yml workflow'u tarafından derlenir ve
standalone-<anahtar> sürümü olarak yayımlanır (anahtar; PHP sürümünün, eklenti listesinin, StaticPHP'nin commit'inin
ve JumPHP'nin kayıt defterinin ve yamalarının parmak izidir: tools/standalone-key.sh). Bu nedenle bir micro yalnızca bu öğelerden biri
değişirse yeniden derlenir. Bu sayfa, bu workflow'u kendi runner'larınızda nasıl çalıştıracağınızı (ci-runner.md kurulum için) ve
GitHub'ın makinelerinin size ücretsiz verdiği, ama sizinkilerde olmayabilecek şeyleri anlatır.
Başlatmak
Forge > depo > Actions > standalone > Run workflow, ya da bir terminalden (bir JumPHP projesinde gh, forge'unkidir):
gh workflow run standalone.yml -f extensions=tools/app-extensions.txt -f macos=false -f linux=false
| Girdi | Değerler | |
|---|---|---|
extensions |
tools/standalone-extensions.txt (oyunlar: SDL, OpenGL, OpenAL), tools/app-extensions.txt (masaüstü uygulamaları, IDE), tools/hybrid-extensions.txt |
derlenen micro = kendi anahtarı |
linux |
true / false |
false: Linux micro'su yok (aşağıdaki « Docker » bölümüne bakın); export:standalone o zaman Linux micro'sunu kullanıcının bilgisayarında derler |
macos |
true / false |
false: Mac micro'su yok (yalnızca masaüstü uygulamaları); macOS runner'ı yoksa işler sonsuza dek beklerdi |
Windows işi, indirmeler önbellekteyken yaklaşık 10 dakika, en ilk seferde 30 ila 60 dakika sürer. Çıktısı:
https://<forge>/<sahip>/<depo>/releases/download/standalone-<anahtar>/micro-windows-x86_64.sfx.
GitHub'ın makinelerinde olup sizinkilerde olmayabilecekler
GitHub'da aynı workflow « kendi kendine çalışıyordu », çünkü windows-latest ve ubuntu-latest GitHub tarafından hazırlanmış imajlardır.
Sizin runner'ınız çıplak bir makinedir. Aşağıdakilerin hepsi ya workflow tarafından yönetilir ya da burada belirtilir:
| GitHub'ın imajı | Sizin runner'ınız | Workflow'un yaptığı / sizin yapacağınız |
|---|---|---|
PowerShell 7 (pwsh), PHP, Composer, Git |
çoğunlukla yalnızca Windows PowerShell 5.1 ve Git | adımlar Windows PowerShell'de çalışır; eksikse PHP 8.4 ve Composer indirilir (php.net, getcomposer.org, parmak izi doğrulanır); Git'in usr\bin dizini PATH'e eklenir |
| İngilizce Windows | Windows'unuzun dili (Fransızca...) | VSLANG=1033, Visual Studio araçlarını İngilizce konuşturur: PHP'nin configure.js dosyası bağlayıcının çıktısını okur ve aksi halde bir JScript hatasıyla durur |
| Visual Studio 2022 | sizin kurmanız gerekir: Build Tools 2022, « C++ ile masaüstü geliştirme » iş yükü | bir Windows runner'ının sahip olması gereken tek şey (Git for Windows ile birlikte). install-windows-runner.ps1 ikisini de kurar |
api.github.com'a hızlı erişim, nadiren sınırlanır |
aynı API 504 ya da « rate limit exceeded » döndürür |
StaticPHP indirmeleri 4 kez yeniden denenir ve iki çalıştırma arasında %USERPROFILE%\.spc-downloads içinde saklanır; Composer kaynaklardan kurar (--prefer-source) |
actions/upload-artifact@v4, download-artifact@v4 |
Forgejo bunları desteklemez (« not currently supported on GHES ») | bir forge'da Windows işi micro'yu sürüme kendisi yayımlar (işin github.token'ı, forge'un API'si); release işi yalnızca GitHub'da çalışır |
| Linux işinde Docker | iş, Docker'sız bir konteynerde çalışır | aşağıya bakın |
| LF satır sonları | Git for Windows bunları CRLF'ye çevirir | StaticPHP'yi klonlamadan önce git config --global core.autocrlf false (dosyalarına uygulanan bir yama metinlerine dayanır) |
Docker: nerede gerekli, nerede değil
- Windows işi Visual Studio ile yerel olarak derler. Docker kullanmaz ve bir Windows runner'ı bunu yapamazdı (Windows altındaki Linux konteynerleri WSL2 üzerinden çalışır). Bunun için kurulacak bir şey yok.
- Linux işi
docker build docker/standalonekomutunu, ardından StaticPHP'nindocker runkomutunu çalıştırır. Bir iş konteynerinde Docker yoktur, runner bir tane vermedikçe: ana makinenin Docker soketini (ya da runner'ın dind'ini) işe bağlayın (runner'ınconfig.ymldosyasındacontainer.options/valid_volumes), ya da WSL2 Linux runner'ını kullanın (ci-runner.md bölüm 4), Docker'lı gerçek bir Linux. Bunlar olmadanlinux=falseile çalıştırın:bin/jumphp export:standalone <id> --linux, Linux micro'sunu dışa aktaran bilgisayarda derler (yaklaşık 15 dakika, ardından~/.jumphp/standalone/içinde saklanır). - Hangi runner olursa olsun, bir micro'yu asla başka bir anahtar altında kopyalamayın ya da yeniden adlandırmayın: bu, doğru eklentileri olmayan bir PHP olurdu
ve kullanıcılarınızın çalıştırılabilir dosyaları çökerdi (
Call to undefined function SDL_Init()). Anahtar değiştiyse micro yeniden derlenmelidir.
Sorun giderme
İş günlükleri forge'daki çalıştırma sayfasında okunur (iş > kırmızı adım); forge'un API'si bunları döndürmez.
| Belirti | Neden / çözüm |
|---|---|
key işi, « Fetching the repository » hemen sonrasında 30 sn içinde başarısız olur |
iş konteyneri forge'un adını çözemiyor: runner'ın Docker-in-Docker'ının dışarıya DNS'i yok. Ona bir tane verin: runner'ın compose dosyasındaki dind servisinde dns: [1.1.1.1, 9.9.9.9]. Test: docker run --network <yeni bir ağ> node:20-bookworm getent hosts <forge> |
Cannot find: pwsh in PATH |
workflow Windows PowerShell ister (shell: powershell); eski bir kopya pwsh istiyordu. Güncelleyin |
« Checking for link.exe » sonrasında configure.js ... Erreur d'exécution Microsoft JScript |
Visual Studio araçları Windows'un diliyle yazar. VSLANG=1033 (bu sayfadan beri workflow'da) |
ERROR: bison is required |
aynı klasörde yarım kalmış bir derlemeden sonra görülür: StaticPHP msys2 araçlarını saklar ama PATH'e geri koymaz. Çalışma alanından spc/pkgroot, spc/source, spc/buildroot dizinlerini silin ve yeniden başlatın (yeni bir işinki gibi temiz bir alan çalışır) |
| Bir StaticPHP yaması « not patched (StaticPHP changed) » ya da « Failed patch module » | CRLF satır sonları (core.autocrlf false ve yeniden klonlama), ya da önceki bir denemeyle zaten yamalanmış bir kaynak klasörü (spc/source/php-src dizinini silin) |
Failed to get GitHub release API info for madler/zlib / HTTP/2 504 |
api.github.com adresiniz için sınırlıyor ya da başarısız oluyor. Workflow yeniden dener; yeni bir makinedeki ilk çalıştırma ikinci bir deneme gerektirebilir. İndirmeler saklanır: her deneme biraz daha ileri gider |
GHESNotSupportedError: upload-artifact@v4 ... not currently supported |
Forgejo kullanıyorsunuz: bu deponun workflow'unu alın (artifact olmadan yayımlar) |
| macOS işleri « waiting » durumunda kalır ve çalıştırma hiç bitmez | macOS runner'ı yok: -f macos=false |
Cannot find path ...\buildroot\bin\micro.sfx |
derleme daha önce başarısız oldu: üstündeki satırları okuyun (neden onlardır) |
Yapay zekâ ajanları için
Sizden « standalone workflow'unu runner'ımda çalıştırmanız » istenebilir. Çalıştırma sayfasında başarısız olan adımı okuyun (erişemiyorsanız
kullanıcıdan yapıştırmasını isteyin), workflow'u değiştirin (GitHub'da geçerli kalmalıdır: github.server_url'yi test edin),
kullanıcının makinesini değil; eksik olan yukarıdaki ön koşullardan biri değilse (Git, Visual Studio Build Tools,
Linux işi için Docker): o durumda bunu kullanıcıya söyleyin ve yalnızca evet derse kurun. Asla bir runner kaydetmeyin, asla
bir dosyaya belirteç yazmayın, bu workflow'un komutlarıyla mevcut dosyalardan kendi derlemediğiniz bir micro'yu asla yayımlamayın, bir sürümü asla başka bir anahtar altına taşımayın. Başarılı bir çalıştırmadan sonra dosyayı doğrulayın
(gh release view standalone-<anahtar>, 200 yanıtı veren bir indirme) ve bir Windows micro'su için, runner'ın makinesinde onunla bir betik çalıştırın
(copy /b micro.sfx + test.php test.exe, ardından test.exe: PHP sürümü, extension_loaded('ffi')...).