2023-04-09

F#でコマンドレットを書いてる pt.18

krymtkts/pocof の話。

PocofQuery.run のテストをそれなりに足した。 多少テストが増えてきたので CI が欲しくなってきた。ここで以前立てた Issue #34 を回収しておくとことにした。

Issue にも書いてたけど、基本 GitHub Docs に書いてたやつをなぞるだけ。

runner image は今の開発環境に合わせて windows-latest にしておく。 pocof 自体は今後他の OS でも動くことを保証してみたいけど、最初なのでシンプルにいく。 この記事を書いた時点の windows-latest に含まれるツール類は以下を参照した。

runner-images/Windows2022-Readme.md at main · actions/runner-images · GitHub

dotnet のセットアップは必須のよう。 pocof はまだ 6 なのでそれを使う。

PowerShell はデフォで 7.2.10 が入ってるらしい。いろんなバージョンで動くことをチェックするのであれば PowerShell の version で matrix 組むのが妥当だが、これも最初なので簡単に。

pocof のテストに必要な PowerShell モジュール Pester, PSScriptAnalyzer あたりも入ってるが、肝心の psake が入ってない。ならば workflow で全部ひっくるめで force install するようにしておく。 このへんも PSDepend を使うようにしておけば YAML にかき分ける必要もないし良さげか。

ここまでやれば psakefile.ps1 に書いた全テストタスクを実行すれば完了する。キャッシュあった方が速いだろうけど、そもそもそんなに時間かからんので対応しないでおく。

あと一番重要な GitHub Actions の YAML のファイル名と名前の部分、結構いろんな repo みても付け方がバラバラでイケてるパクリ元がない。 ここは GitHub の Pull Request や Actions の画面で見られることを考えてない名称は避けたかった。 最終的に、 FSharp.Formatting の命名規則が気に入ったのでそれを模した。 ファイル名は pull-requests.yml を短縮して pr.yml で、名前は Build and Test on Pull Request だ。これなら GitHub の画面で見ても自然だ。

出来上がった素朴な YAML はこちら。 pocof/pr.yml

name: Build and Test on Pull Request

on:
pull_request:
branches: ["main"]

jobs:
test:
runs-on: windows-latest
steps:
- uses: actions/checkout@v3
- name: Setup .NET
uses: actions/setup-dotnet@v3
with:
dotnet-version: 6.0.x
- name: Install modules from PSGallery
shell: pwsh
run: |
Set-PSRepository PSGallery -InstallationPolicy Trusted
Install-Module Psake,Pester,PSScriptAnalyzer -Scope CurrentUser -Force
- name: Execute All Tests
shell: pwsh
run: Invoke-Psake -taskList TestAll

GitHub Actions の難点としてテストしにくい点があるが、nektos/act を使えば ubuntu-* の runner に限ればテストできる。 仕事では act を使ってるが自機には積んでなかったんで、この際に Chocolaty で入れた。

choco install act-cli

ではテストとばかりに windows-latestubuntu-latest に変えて実行する。

PS> act pull_request --verbose --platform windows-latest=catthehacker/ubuntu:act-latest
# ...省略
| OCI runtime exec failed: exec failed: unable to start container process: exec: "pwsh": executable file not found in $PATH: unknown
# ...省略
Error: Job 'test' failed

なん...だと... pwsh コマンドが無いと言われた... act のセットアップ時に MEDIUM 選んだらどうも入ってないっぽい。 流石は minority の PowerShell 、参ったね。

しかし act が使うイメージを見てたら pwsh というキーワード付きの image があるじゃないの。 catthehacker/docker_images: Docker images

/linux/ubuntu/pwsh - ghcr.io/catthehacker/ubuntu:act-* but with pwsh tools and modules installed

こりゃきたな。試す。

PS> act pull_request --verbose --platform windows-latest=ghcr.io/catthehacker/ubuntu:pwsh-latest
# ...省略
[Build and Test on Pull Request/test] 🏁 Job succeeded

おーいけた。 6 分超かかったけど。 これでなんとか PowerShell の場合でもローカルテストできそう。 Docker Hub に同じイメージ catthehacker/ubuntu:pwsh-latest あったので、これを使っていこう。

act pull_request --verbose --platform windows-latest=catthehacker/ubuntu:pwsh-latest

...でもいちいちこのクソながオプション書きたく無いなあ...設定ファイルとかはなさそう。関数にするか psake のタスクにするしかないか。なんか大げさな気がするけど。

そんなこんなで #45 を作れた。 matrix はまだ設定してないけど、少なくともテスト類は ubuntu でも動くことわかったし、追々対応していく。


おまけ。

DockerDesktop でログインしてると、 act 実行中にある DockerHub から catthehacker/ubuntu:act-latest を pull するのができなかった。ログアウトしてるといける。↓ このへんの関係ぽいが深く追ってない。

m1: act fails to pull with unauthorized: incorrect username or password · nektos/act · Discussion #1165

あとなんか知らんが act 実行後に [45;3R って謎キーワードが terminal の input に出てくる、必ず。 ansi escape sequences ぽいけどよくわからん。