はじめに
以前の記事にCrystalのライブラリは壊れやすいのではないかと書きました。これに対する定番の対策を見つけたので記事にします。
Crystalでは品質保証に定期的なビルドが求められる
Crystalの素晴らしいライブラリを集めたキュレーションリストawesome-crystalに、マンデルブロ集合の描写で利用した、CrystalVipsを追加しようと思い、プルリクエスト作成したところ、次のチェックリストが表示されました。
Checklist
- - Shard is at least 30 days old.
- - Shard has CI implemented.
- - Shard has daily/weekly periodic builds (ideally with Crystal latest and nightly).
3番めの項目は、日本語では
- シャードには毎日/毎週定期的にビルドがある(最新版およびナイトリーのCrystalが理想)
っていう感じになると思います。
つまり、Awesome Crystalでは、リスト掲載に「定期的なビルド」が行われていることを求めているのです。
私の知識不足かもしれませんが、RubyのGemでは定期的なビルドを行っているものは多くないと思います。GitHub Actionsで定期的にビルドを行えば、動作しなくなったときに早期に気がつくことができそうです。例えリポジトリが放置されていても、過去の結果を追跡すればどこで動作しなくなったのか、修正にどの程度の手間がかかりそうか見積もることもできるでしょう。
実際に CI に定期的なビルドを追加してみた
練習のため、前回の記事で紹介したdeepl-cliに定期的なビルドをつけてみました。
やり方は簡単で、on:
に schedule:
を追加して cron:
で時間を指定すればよいです。
name: build
on:
push:
pull_request:
schedule:
- cron: '51 3 * * 6' # Runs at 03:51, only on Saturday
ここでは、なるべく利用者が少なそうな時間を狙って、土曜日の3時51分にビルドするように設定してみました。
残りの部分はこんな感じです。Crystalのバージョンとして latest
を指定しました。これによって、毎週最新のCrystalによってビルドできるかのチェックが行われます。
jobs:
build:
name: ${{ matrix.os }}
runs-on: ${{ matrix.os }}-latest
strategy:
matrix:
os: ["ubuntu", "macos", "windows"]
steps:
- uses: actions/checkout@v3
with:
submodules: true
- uses: crystal-lang/install-crystal@v1
with:
crystal: latest
- name: Install dependencies
run: shards install --without-development --release
- name: Build executable
run: shards build --release
- uses: actions/upload-artifact@v3
with:
name: deepl-cli-${{ matrix.os }}
path: bin/${{ matrix.os == 'windows' && 'deepl.exe' || 'deepl' }}
おわりに
Crystal言語ではツールやライブラリが動作しなくなるケースが多いと感じていました。しかし、定期的にCIを回し続けていれば不具合の検出が容易になります。コンピュータを使う上で感じる痛みを、道具を上手に使うことで緩和すればよいという話でした。
この記事は以上です。