JA

自分のランナーで PHP の micro をビルドする(standalone ワークフロー)

bin/jumphp export:standalone と app:export は、ゲームやアプリケーションを micro に貼り付けます。micro とは、JumPHP が必要とする拡張を含めて 静的にビルドされた PHP(StaticPHP)です。micro は .github/workflows/standalone.yml ワークフローでビルドされ、 standalone-<キー> リリースとして公開されます(キーは、PHP のバージョン、拡張のリスト、StaticPHP のコミット、 そして JumPHP のレジストリとパッチのフィンガープリントです:tools/standalone-key.sh)。そのため micro は、これらのいずれかが 変わった場合にだけ再ビルドされます。このページでは、このワークフローを自分のランナーで実行する方法(インストールは ci-runner.md を参照)と、 GitHub のマシンが無料で提供していたもので、あなたのマシンにはないかもしれないものを説明します。

実行する

フォージ > リポジトリ > Actions > standalone > Run workflow、またはターミナルから(JumPHP プロジェクトでは gh はフォージのものです):

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:Linux の micro を作らない(下の「Docker」を参照)。その場合 export:standalone はユーザーのコンピューター上で Linux の micro をビルドします
macos true / false false:Mac の micro を作らない(デスクトップアプリのみ)。macOS のランナーがないと、ジョブは永遠に待ち続けます

Windows のジョブは、ダウンロードがキャッシュされていれば約10分、最初の1回は30〜60分かかります。成果物: https://<フォージ>/<オーナー>/<リポジトリ>/releases/download/standalone-<キー>/micro-windows-x86_64.sfx。

GitHub のマシンにあって、あなたのマシンにはないかもしれないもの

GitHub では同じワークフローが「ひとりでに動いて」いました。windows-latest と ubuntu-latest は GitHub が用意したイメージだからです。 自分のランナーは何も入っていないマシンです。以下はすべて、ワークフローが処理するか、ここで説明しています。

GitHub のイメージ 自分のランナー ワークフローが行うこと / あなたが行うこと
PowerShell 7(pwsh)、PHP、Composer、Git Windows PowerShell 5.1 と Git だけのことが多い 手順は Windows PowerShell で実行されます。PHP 8.4 と Composer は、なければダウンロードされます(php.net、getcomposer.org、フィンガープリントを検証)。Git の usr\bin が PATH に追加されます
英語版の Windows お使いの Windows の言語(フランス語など) VSLANG=1033 で Visual Studio のツールが英語で出力します。PHP の configure.js はリンカーの出力を読むため、そうしないと 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 でのみ実行されます
Linux ジョブの Docker ジョブは Docker のないコンテナ内で実行される 下記を参照
LF の改行 Git for Windows が CRLF に変換する StaticPHP をクローンする前に git config --global core.autocrlf false(そのファイルへのパッチはテキストに依存します)

Docker:必要な場所と不要な場所

  • Windows のジョブは Visual Studio でネイティブにコンパイルします。Docker は使わず、Windows のランナーには使えません(Windows 上の Linux コンテナは WSL2 経由です)。そのためにインストールするものはありません。
  • Linux のジョブは docker build docker/standalone を実行し、続いて StaticPHP の docker run を実行します。ジョブのコンテナには Docker がありません。 ランナーが提供する場合を除きます。ホストの Docker ソケット(またはランナーの dind)をジョブにマウントする(ランナーの config.yml の container.options / valid_volumes)か、WSL2 の Linux ランナー(ci-runner.md のセクション4)を使ってください。 Docker 付きの本物の Linux です。どちらもない場合は linux=false で実行します。bin/jumphp export:standalone <id> --linux が、エクスポートを行う コンピューター上で Linux の micro をビルドします(約15分、その後 ~/.jumphp/standalone/ に保持されます)。
  • どのランナーでも、micro を別のキーでコピーしたり名前を変えたりしないでください。正しい拡張のない PHP になり、 ユーザーの実行ファイルがクラッシュします(Call to undefined function SDL_Init())。キーが変わったなら、micro は 再ビルドが必要です。

トラブルシューティング

ジョブのログは、フォージの実行ページで読めます(ジョブ > 赤い手順)。フォージの API はログを返しません。

症状 原因 / 対処
key ジョブが「Fetching the repository」の直後、30秒で失敗する ジョブのコンテナがフォージの名前を解決できません。ランナーの Docker-in-Docker に外部への DNS がないためです。DNS を与えてください:ランナーの compose ファイルの dind サービスに dns: [1.1.1.1, 9.9.9.9]。テスト:docker run --network <新しいネットワーク> node:20-bookworm getent hosts <フォージ>
Cannot find: pwsh in PATH ワークフローは Windows PowerShell を要求します(shell: powershell)。古いコピーは pwsh を要求していました。更新してください
「Checking for link.exe」の後に configure.js ... Erreur d'exécution Microsoft JScript Visual Studio のツールが Windows の言語で出力しています。VSLANG=1033(このページ以降、ワークフローに含まれています)
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 があなたのアドレスに対して制限または失敗しています。ワークフローは再試行します。新しいマシンでの初回実行は、2回目が必要な場合があります。ダウンロードは保持されるため、試行のたびに先へ進みます
GHESNotSupportedError: upload-artifact@v4 ... not currently supported Forgejo を使っています:このリポジトリのワークフローを使ってください(アーティファクトなしで公開します)
macOS のジョブが「waiting」のままで、実行が終わらない macOS のランナーがありません:-f macos=false
Cannot find path ...\buildroot\bin\micro.sfx ビルドがその前に失敗しています。上の行を読んでください(原因はそこにあります)

AI エージェントへ

「standalone ワークフローを自分のランナーで動くようにして」と頼まれることがあります。実行ページで失敗した手順を読み(アクセスできない場合は ユーザーに貼り付けてもらってください)、ユーザーのマシンではなくワークフローを修正してください(GitHub でも有効なままである必要があります: github.server_url をテストしてください)。ただし、足りないのが上記の前提条件(Git、Visual Studio Build Tools、 Linux ジョブ用の Docker)である場合は、ユーザーに伝え、ユーザーが承諾した場合にのみインストールしてください。ランナーを登録したり、 トークンをファイルに書いたり、このワークフローのコマンドで現在のファイルからビルドしていない micro を公開したり、リリースを別のキーに移したりしてはいけません。実行が成功したら、ファイルを確認し (gh release view standalone-<キー>、200 を返すダウンロード)、Windows の micro の場合は、ランナーのマシン上でそれを使ってスクリプトを実行してください (copy /b micro.sfx + test.php test.exe、続いて test.exe:PHP のバージョン、extension_loaded('ffi') など)。