GitHub Actions で Haxe コードをビルドするために setup-haxe を作成した

はじめに

Haxe ビルド環境をセットアップするための krdlab/setup-haxe を作成して Marketplace に公開しました.

github.com

github.com

背景

仕事の方で Haxe を使っているリポジトリ*1があって,このリポジトリから共通ライブラリが生成されている状況にあるのですが,これまではこの生成作業が手動で行われていました.

しかし作業自体はコマンド化されていること,またリリースのタイミングに規則性があることから自動化が可能であると判断し,関係者と相談した上で GitHub Actions を利用して自動化することにしました.

このとき setup アクションの Haxe 版があると便利なのですが,あいにくと Marketplace ではみつからなかったため,自宅に戻ってから調べて作成してみました.

アクションの作り方

krdlab/setup-haxe は TypeScript で記述した JavaScript アクションです.公式の情報が大分充実しているため,基本的にはそれほど詰まらずに作成できます.

@zeit/ncc が便利

今回初めて使ったのですが,単純にコードをまとめたいだけならばとても便利でした.ncc build とするだけで package.jsonmain フィールドを読み取って必要な依存関係をすべてまとめて,dist/index.js として出力してくれます.

github.com

Haxe release asset の解凍

Haxe binaries の *.tar.gz*.zip を解凍すると haxe_20191217082701_67feacebc のような圧縮ファイル名からは推測しにくい名前のディレクトリが出現します.なので extractTarextractZip の後に execls を呼び出してディレクトリ名を解決させています*2

https://github.com/krdlab/setup-haxe/blob/0781874a0f6b861eab826f8098bbb8710deed955/src/setup.ts#L73-L85

Windows 環境におけるコマンドの実行

Windows Server 2019 にインストール済のソフトウェア一覧 からはぱっと見分からなかったのですが,実行ログに出力されたパスからすると Git for Windows が入っているみたいです.

あと extract 系の処理は ubuntu-latestmacos-latest だとコマンドが実行されるのですが,windows-latest では PowerShell から .Net のクラスを利用して処理されていました.なるほど.

C:\windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoLogo -Sta -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -Command "$ErrorActionPreference = 'Stop' ; try { Add-Type -AssemblyName System.IO.Compression.FileSystem } catch { } ; [System.IO.Compression.ZipFile]::ExtractToDirectory('D:\a\_temp\6253d2a8-f1a0-4596-8e12-7b7dbcf71ad8', 'haxe-3.4.7-win64')"
"C:\Program Files\Git\usr\bin\ls.exe" -1 haxe-3.4.7-win64

動作確認の方法

Linux 環境に対する動作確認であれば Docker イメージを利用して簡単に実施可能です.

$ docker run -it --rm -v $PWD:/work ubuntu bash
root@xxx:/# cd work
#=> 必要なツールがあれば事前に apt-get install

root@xxx:/# env INPUT_HAXE-VERSION=4.0.5 node dist/index.js

アクション内部で @actions/coregetInput から値を取得している場合は,例えばキーが "haxe-version" であれば環境変数として INPUT_HAXE-VERSION を与えるとアクション側のコードでその値が取得できます.

Windows 環境対応がうまくいかない……

現時点で krdlab/setup-haxeruns-on: windows-* に対応していません.以前対応を試みたとき,Haxe コマンドにパスは通るのですが haxelib setup すると以下のようなエラーが発生してしまうため一旦対応コードを削除しました.

C:\hostedtoolcache\windows\haxe\3.4.7\x64\haxelib.exe setup C:\hostedtoolcache\windows\haxe\3.4.7\x64\lib
##[error]The process 'C:\hostedtoolcache\windows\haxe\3.4.7\x64\haxelib.exe' failed with exit code 3221225595

32212255950xC000007B なので STATUS_INVALID_IMAGE_FORMAT ですかね?ここは日を改めて再調査予定です*3

おわりに

krdlab/setup-haxe を作成したことで Haxe コードのビルドを GitHub Actions で手軽に実行できるようになりました.

Windows 環境向けにはまだ問題が残っている状態ですが,いずれは解決したいと考えています.

*1:私はビルド周りで少し関わっていた程度

*2:もっと簡単な方法があったりするんでしょうかね?

*3:私の単純なミスだと思う