Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

pull request preview action の導入 #569

Open
wants to merge 4 commits into
base: master
Choose a base branch
from

Conversation

amatsuda
Copy link
Collaborator

About

PRごとにビルド結果をpreviewするアクションを導入してみます。
https://x.com/neko314_/status/1890755774680351004

モノとしては、 https://github.com/rossjrw/pr-preview-action を利用していて、まだ初期バージョンなのでちょっと荒削りながらだいたい動いてくれるんで、まあこれでいいんじゃないかな、と思ってます。

この pr-preview-action ってやつは、デフォルトでは同一リポジトリ内のどっかにプレビュー用のコンテンツをpushしてくれる、っていう単純な作りになってるんですが、GitHub Pages の場合は、1つのリポジトリには1つの名前(ドメイン名)しかつけられないので、それだとうまくいかないような気がしていて、そこで、rubima organization配下に、previewをデプロイするためだけの新たなリポジトリを作って、そちらにpushするようにしています。
という具合に、ちょっとだけ構成が無駄に複雑になってるところはあるんですが、そのぶんpreviewのゴチャゴチャでproductionのるびまが汚されたり、なんかの間違いでproductionのコンテンツをぶっ壊しちゃったり、みたいなことがなくなって、安全に運用できるはずです。

Action詳細

さて、このアクションの処理の流れとしては、ざっくり以下のようになっています。

  1. PRのソースをチェックアウトする
  2. あとの工程でmasterからの差分を取得したいので、masterっぽいものをfetchする
  3. Jekyll でコンテンツをビルドする
  4. 容量節約のため、今回のPRで編集されたarticle以外のarticleに含まれる画像ファイルをビルド結果から削除する
  5. rubima/rubima-preview の gh-pages にビルド結果をpushする
  6. PR側にプレビューへのリンクをコメントする

このうち、2と4は少しトリッキーなのでちょっと説明すると、まず2のコードは actions/checkout#438 (comment) から拾ってきました。actions/checkout にデフォルトでこの機能が入ってないの不便だよなぁ、とは思いつつ、なんかだいぶアドホックな実装ではあるので、これに名前をつけたレベルのものを標準に取り込んでリリースするべきか、というと、ちょっと疑問かもしれません。とりあえずここではこれで動くといいな。

4はさらにアドホックで、writing_process.md とか script/checker.rb あたりから仕様を解読するにたぶんこんな感じだろうと推測してワンライナーを書き殴ってみたものになります。master から変更があったファイルたちの中から articles/.*-号数-記事名.md なファイル名を抜き出して、その 号数-記事名 以外の画像ディレクトリを全て削除してて、article自体も消しといてもいいんだけど、そんなにデカくなさそうだからなんとなくそのまま残しちゃってます。
なんかとりあえず力技でてきとうにゴリッと解決しました、という感じだし、shell scriptぢからがよわすぎてRubyに逃げてたりして、なんかすいません……とか思いつつ、まず仕様の解釈がこれで合ってるのか疑問だし、たぶんもっとキレイに書けるんじゃないかと思うので、識者のツッコミをお待ちしています。

あと最後に、5の工程で別repoにpushするためにGHの personal access token が必要で、いったん僕のアカウントで rubima/rubima-preview への write のみを許可した fine-graind なPATを作って、そいつをこっちのrepoの Actions secrets に、PREVIEW_TOKEN っていう名前で登録してあります。PATの賞味期限は1年に設定してあるので、1年後になんかpreviewが見れなくなったらこいつのことを思い出してあげてください。

デプロイ先のディレクトリ構成

rubima/rubima-preview のほうがどういう状態になるかなんですが、rubima側にPRが立つごとにこのアクションが走って、rubima/rubima-previewリポジトリの gh-pages ブランチにビルド結果がpushされます。複数PRの結果を並行して保持したいので上書きしちゃったらダメなわけで、ルートディレクトリ直下に

pr-1/
pr-2
...

みたいに、こっちのぷるりの番号に対応したサブディレクトリが掘られて、その中にpushされます。画像を全部こぴったら巨大になりすぎるのでPRで触ってる記事に関連してなさそうな画像は削除してからpushしてます、というのは上記のとおりです。
これは、特に削除する機能はどこにも実装されてないので、PRがマージされたりクローズされたりしても消えたりはしません。どうやって消すかはまた後日考えればいいかな、と。

制約(というかTODO)

rossjrw/pr-preview-action の現行バージョンにはひとつ残念な制約があって、READMEにも書かれてるんだけど、なんと、forkされたリポジトリからのPRに対してはpreviewが表示できません!
なにそれダメじゃん!って感じなんだけど、

This Action does not currently support deploying previews for PRs from forks, but will do so in the upcoming v2.

とのことなので、v2のリリースを待つ。待っても出てこないようなら自力でなんとかする(同リポジトリの pull/6 から実装をこぴってきてなんとかする)。というTODOがあります。

copied from README at https://github.com/rossjrw/pr-preview-action
and configured to build jekyll
so we can perform git-diff to know which files has been changed in the
patch.
because the whole build result for 20 years of Rubima is too huge, and
most of the size is taken up by images.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant