Haskell AntennaのCI/CDをGitHub Actionsに移行する

Posted by Nobutada MATSUBARA(@matsubara0507) on December 12, 2020Tags: Antenna, GitHub Actions

Haskell-jpのコンテンツの一つとしてHaskell AntennaというWebページの開発・運用をしております。

バイナリのビルドやDockerイメージのビルドにTravisCIを、バイナリを実行してページの更新をするのにDroneCIを使っていました。 しかし、長らく放置していてちゃんと動作しているか怪しかったので、メンテナンスをするついでに昨今はやり(要出典)のGitHub Actionsにこれらを移行することにしました

Link to
here
Stackプロジェクトのビルド

まずはバイナリのビルドを行うように設定します。 Haskell AntennaのプログラムはHaskell Stackを利用しているので、stack buildが実行できれば良いです。

これは、PRが作られたときやmasterがプッシュされたときに実行されることを想定しています。

GitHub ActionsHaskellHaskell Stackを使うには、公式が提供しているactions/setup-haskell haskell/actions/setup を利用します。 元々はactions/haskell-setupがありましたが、どうやらメンテナンスする人がいなくなったっぽくアーカイブされてしまいました。 この記事を書いている時点では移行したばかりでちゃんとタグが切られていないため、mainブランチを指定しています。 ちなみに、StackプロジェクトのGHCバージョンをhaskell/actions/setupでインストールして、stack --system-ghcをすることでキャッシュサイズを減らすことができます。

これまた余談ですが、actions/setup-haskellの方を使っていて次のようなエラーが出る場合はactions/setup-haskellのバージョンが古いです(最新では修正済みです)。haskell/actions/setupの方を使いましょう。

Link to
here
Dockerイメージのビルドとプッシュ

antennaプログラムはDockerイメージにしてDocker Hubに置いてあります(これもGitHub Container Registryに移行したいですね)。 なので、masterの更新に合わせてDockerイメージをビルドしてプッシュするジョブを設定します。 Dockerイメージのビルドとプッシュにはdocker/build-push-actionを使います。

masterブランチへのプッシュのときにだけDockerイメージのプッシュをして欲しいので、push:github.event_name != 'pull_request' を設定しています。 また、Haskell Stackでビルドされたバイナリファイルは--local-bin-path=./binオプションで./binに置いてあります。 これをDockerfileでコピーするようにしている(下記参照)ので、docker buildの引数にlocal_bin_path=./binというのを与える必要がありました。

このように前のstepまでの結果を利用するには context: . を指定する必要があります(デフォルトではgit-contextというのを使うからです)。

Link to
here
antennaプログラムの実行

最後に、masterの更新があったときにantennaプログラムを実行してHaskell Antennaページを更新するような設定をします。 日毎のスケジュール実行も設定したいので、新しいワークフローを切りました。

バイナリをビルドするところまでは一緒です。 Haskell Antennaは同じリポジトリのgh-pagesブランチに置いて、GitHub Pagesを使って公開しています。 なので、同じリポジトリのgh-pagesブランチをgit cloneしなおしてサブディレクトリに置き、そこでantennaプログラムを実行して、更新があった場合にのみプッシュしています。 同じリポジトリであれば、特に設定することなくプッシュできるのがGitHub Actionsのメリットですね。

Link to
here
おまけ:Zennを追加しました!

ついでに最近のアップデートによって、ZennHaskell Antennaに載せるサイトへ追加しましたigrep氏がしてくれました、ありがとうございます)。 アイコンの利用規約などがわからなかったのですが、GitHubPR上で直接聞いてみたところ、問題ないという回答をいただきました。 突然だったのにありがとうございます。