はいっ、今日もはりきって緑化運動していきましょう。

発端は↓のツイート



先にお断りしておくと、2019/02/22時点のGitHub ActionsでPRのマージイベントは取れないので、上記をやろうとするとActionsの設定を頑張る必要がありそうです。(設定を頑張ったからといってできるとは限らない


ということで、Pull RequestがOpen(Reopen)されたらPixelaに草を生やす、CloseしたらPixelaの草を減らすというGitHub Actionsを作成したいと思います。

手順

  1. Pixelaに記録用のグラフとWebhookを作成する
  2. GitHubのSecretsにWebhookのhashを設定する
  3. GitHub Actionsを作っていく

手順としては、前に上げたエントリ(NetlifyでdeployされたらPixelaに草を生やす)と似たような感じですね。

PixelaにグラフとWebhookを登録

「NetlifyでdeployされたらPixelaに草を生やす」とまったく同じなので省略します。

GitHubにSecretsを登録する

GitHub Actionsはリポジトリ内のコードとして管理するため、Publicリポジトリであれば他の人から丸見えになります。そこにPixelaのユーザー名とWebhookのHashを直接書いてしまうと、他の人がincrement / decrementし放題になるので、Secretsとして登録します。
(なお、リポジトリをForkされた際にSecretsまで引き継がれるのかどうかは不明)

Secretsの登録はActionsを登録したいリポジトリのSettingsページで行います。
今回はPixelaのユーザー名(PIXELA_USERNAME)とIncrement用のWebhook Hash(PIXELA_PR_INCREMENT_HASH)、Decrement用のWebhook Hash(PIXELA_PR_DECREMENT_HASH)を登録しました。
secrets

GitHub Actionsの設定

GitHub Actionsを作成していない場合はActionsのタブを開いて「Create a new workflow」ってボタンを押せばActionsの作成画面に移動します。
new-workflow
右側の黒い「New workflow」ってのがイベントの発火ポイントになります。
まずは「Pull RequestがオープンしたらPixelaに草を生やす」workflowを作成していきます。
Editをクリックしたら右側に編集画面が出るので、名前を適当なものに変更してRunは「on: pull_request」を選択します。
edit-workflow
次は、黒いヤツの下部にある青い丸を矢印方向、「Drag the blue connector here to create your first action.」って書いてあるところまでぴゅーっと引っ張ります(そのままやんけ)。

すると、Actionを選択する画面が出てくるので「Filters for GitHub Actions」を選択します。
choose-filter-action
lableに適当な名前を付けてargsに「action 'opened|reopened'」を指定します。
edit-filter
できたらFilterのActionの下部の青い丸をピューっと引っ張って新しいActionを作ります。
今度は「HTTP client」を選択して、labelに適当な名前を付けて、argsに「["POST", "pixe.la/v1/users/$PIXELA_USERNAME/webhook/$PIXELA_PR_INCREMENT_HASH"]」と入力します。
また、ここでは先ほど作ったSecretsを使用するので、使用するもの(PIXELA_PR_INCREMENT_HASHとPIXELA_USERNAME)にチェックを入れておきます。
edit-http-action

これで「PRがきたらPixelaに草を生やす」workflowができました。
次は「PRを(マージする|しないに関わらず)閉じたらPixelaを除草する」workflowを作ります。

左上の「Create a new workflow」をクリックして新規イベントを作成します。
当初は1つのworkflowで発火ポイントから2本のActionを生やしてて、「PRのopen時にfilter:openは成功するけどfilter:closeが失敗」やその逆でworkflow全体が失敗扱いになって草生えたのでここ重要(実際問題Pixelaには草が生えない)
ここから先のやり方は草を生やすworkflowと同様なのでポイントだけ書きます。
  • workflowの発火ポイントは同様に「on:pull_request」
  • Filterで指定するargsは「action 'closed'」
  • HTTP clientに指定するsecretsはINCREMENT_HASHからDECREMENT_HASHに変更

できたやつ

ryosms/sandbox/.github/main.workflow
pr-graph

はまりポイント

GitHub Actionsのタブは動作ログを確認するページだということを認識しておきましょう。
最初に触った時「ははーん?ここでActionsの編集を行うんだな?」って認識でいたら全然違いました。
1回でもActionsが動いた後はこのページからはActionsの編集はできなくなるようです。

Actionsを作成していない場合にこのタブを開くと↓のような画面になって、workflowファイルの編集ができます。
create-workflow
で、workflowを作って保存した後に再度Actionsのタブを開くとまた↑の画面が出てきます。
で、「Create a new workflow」を押すと、main.workflowの編集画面が開きます。この挙動を見た時は「まだベータ版なのでバグってんのかな?」くらいにしか思ってませんでした。

この時、リポジトリにmain.workflowがなければ(別名のworkflowがあっても)新規でmain.workflowを作成させようとします。この挙動を見た時には「Actionsはmain.workflowって名前しかサポートしてないのかな?」くらいにしか思っていませんでした。

で、workflowファイルをいじって(ぶっ壊れたworkflowファイルの)動作確認をしようと思ってPRを投げたところActionsタブが↓のような表示になりました。

invalid-workflow

workflowファイルを見てみれば確かに変なことを書いてたので直してPushし直しても反映されないのでGitHubサポートに泣きついたけど「別におかしいところはなさそうだけど」で打ち切られました。

workflowファイルを直した後に、PRを投げたら正常に動きましたとさ。

結論

新機能を試す時には、実験用のリポジトリを作成してそこでやるようにしましょう。