朝から突然ズキズキー!と不定期に頭痛が発生するという感じだったので、ロキソニンは飲みつつ東京Ruby会議12の前夜祭はお休みして家でたんぽぽワークスというか盆栽ワークスみたいなことをやることにした。
というわけでやっと GA になった GitHub Actions の ARM runner を試しつつ、qemu でヒイヒイ言いながらビルドしている docker image の build ワークフローを書き換えた。
この docker-images はもともと Circle CI で動いていて、GitHub Actions 以外に時間を使いたくないなあと雑に migrate を行って、その後にRubyのリリースと同時にイメージビルドをするような repository_dispatch を追加、という経緯があり以下の3つが主要な workflow だった。
午前中にとりあえず1つ目をベースに2つ目にある amd64/arm64 の両方で使えるイメージを作るというのをガチャガチャやっていたけど、色々いじってみると 2つ目をベースにして3つとも1つの workflow にできるんでないか?となってきたのでやってみたらできた。
https://github.com/ruby/docker-images/blob/master/.github/workflows/build.yml
結構ハマったのが docker manifest
コマンドで、これは amd64 と arm64 なイメージを仮想的な名前をつけて1つのイメージタグとして扱えるようにする、みたいなもので、具体的には podman run --rm -it ghcr.io/ruby/ruby:master /bin/bash
などとやるだけで Apple Silicon な macOS なら aarch64-linux
になるし、x86 な Windows なら x86_64-linux
になる。大変便利。
で、master ならいいのだが、3.4.1 のイメージを 3.4 とか latest としても呼び出したくて、cp とかないんか?と思い調べたもののないので、いちいち全部 manifest create
しないといけなくてややだるかった。さらにこの manifest
コマンドを呼ぶと 1 回ずつ docker pull するっぽく、すぐに docker hub の rate limit に引っかかるなどの制限があってなかなか厳しかった。とりあえず毎日定期実行する限りはギリギリ収まったけど、どこかでエコになるようにしないとダメだろうなあ。
Rack が 3.1 で 3.0 以上の非互換をガンガン突っ込んでいて、tDiary でも対応しないとなあと放ったらかしにしていたのを、重い腰を上げて真面目に調べて動くようにした。
目立った対応としては rack/files
とか rack/server
などが消えてしまったので、非常に雑な patch を tDiary の方に入れて対応したのと env
から rack.input
が無いときは key/value としても入らなくなったので、そのへんを回避するようなコードを入れていた。
2024 年にもなるのに FCGI で動かしている tDiary なのでこういう変更も別に対応するけど、仕事でこういうのをやらんといかん、みたいになったら相当にだるいので、もうちょい何とかならんのかなとは思う。