Prowコマンドについて

本記事は[Kubernetes3 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/kubernetes3)の15日目のエントリになります。

Kubernetes3 Advent Calendar 2019の他の記事とは少し毛色が違うかもしれません。
少し息抜き的な内容になっています。

この記事で取り上げるのはKubernetesのIssueやPRで見かける`/assign`や`/lgtm`などのコマンドです。これらのコマンドはKubernetes関連リポジトリのIssueやPRでコメントとして発言することで利用でき、[Prow](https://github.com/kubernetes/test-infra/tree/master/prow)が提供しています。
Prow(へさき、船首などの意味)はKubernetesの開発を裏で支えるシステムで、イベントに基づいたジョブの実行やchat-opsの機能などを提供します。
コマンドの一覧は[こちら](https://prow.k8s.io/command-help)で確認できます。

# よく見かけるコマンド
すべてのコマンドを網羅することはできませんが、PRでは(必須のものも含め)以下を良く見ると思います。

| コマンド          | 機能 |
|:---------------- |:------------------|
| `/lgtm`          | lgtmラベルをつける。PRに対するレビュー結果としてOK(Looks Good To Me)である旨を表明する。 |
| `/approve`       | PRをapproveする。(approveされるとk8sのボットによってPRがマージされる。)|
| `/assign`        | GitHubユーザをIssueやPRに割り当てる。 |
| `/cc`            | レビューをリクエストする。GitHubユーザを指定することで相手を指定することも可能。 |

これだけだと使い方が想像できないと思うので、少し脱線してKubernetesの開発における一般的なPR作成〜マージまでのフローを説明します。
Kubernetesの開発ではこれらのコマンドを主にPR上のコメントとして発言してchat-opsな開発が進んでいきます。
流れはざっくりと以下になります。

1. PRを投稿する。
2. 投稿したPRをレビュアが確認して問題なければレビュアが`/lgtm`を発言してlgtmラベルをつける。
3. `/assign <GitHubユーザ名>`と発言して、\<GitHubユーザ名\>さんを割り当てる。
4. \<GitHubユーザ名\>さんは投稿したPRの内容を確認して問題なければ`/approve`を発言してPRをapproveする。
5. approveされたPRはk8sのボットによって自動的にマージされる。

2〜4は厳密にこの順番でなくても良いのですが、[私の過去のPR](https://github.com/kubernetes/website/pull/16564)を見てもらうと大体上記の流れになっていることがわかると思います。

# こんなコマンドも
Kubernetesの開発を支える重要な仕組みであるProwにはこんなコマンドもあります。

| コマンド          | 機能 |
|:---------------- |:------------------|
| `/meow` or `/meowvie`    | :cat:の:camera:を貼り付ける。[こんな感じ](https://github.com/kubernetes-sigs/contributor-playground/pull/447#issuecomment-564859513)。<br> ちなみにmeowvieでは:cat:の:movie_camera:を貼り付けられる。[こんな感じ](https://github.com/kubernetes-sigs/contributor-playground/pull/447#issuecomment-564881251)。 | 
| `/bark` or `/woof`       | :dog:の:camera:を貼り付ける。[こんな感じ](https://github.com/kubernetes-sigs/contributor-playground/pull/447#issuecomment-564859436)。 |
| `/pony`                  | :horse:ポニー(日本人的にはユニコーン?)の:camera:を貼り付ける。[こんな感じ](https://github.com/kubernetes-sigs/contributor-playground/pull/447#issuecomment-564859748)。 |

面白いですよね。
ちょっと気になったのでProwのコードを調べてみると、どうも別サイトの画像を引っ張ってきていますね。
プログラムではすべてJSON形式で画像URLなどを取得しているようです。

| コマンド          | 画像ソース | Prowでの該当コード |
|:---------------- |:------------------|:------------------|
| `/meow` or `/meowvie`    | https://thecatapi.com/ | [prow/plugins/cat/cat.go#L43](https://github.com/kubernetes/test-infra/blob/master/prow/plugins/cat/cat.go#L43) |
| `/bark` or `/woof`       | https://random.dog | [prow/plugins/dog/dog.go#L44](https://github.com/kubernetes/test-infra/blob/master/prow/plugins/dog/dog.go#L44) |
| `/pony`                  | https://theponyapi.com/ | [prow/plugins/pony/pony.go#L49](https://github.com/kubernetes/test-infra/blob/master/prow/plugins/pony/pony.go#L49) |

画像ソースのURLを再読込すると画像が切り替わって癒やされます。

# なんのために？
前節で書いた「面白いですよね」ですが、私は複数の意味を含んで書いてるつもりです。

- 純粋に画像が貼られて面白いという意味。IssueやPRでこれらを見たらクスリとしてリラックスできますよね。
- Kubernetes開発の重要な仕組みの中にこういったコマンドが実装されている面白み。
- これらのコマンドは何が狙いなのか考える面白み。

3つ目の面白みはちょっと(仕事に疲れた)日本人的な考え方かもしれませんが。。

円滑なコミュニケーションを実現するためのツールは特にOSSコミュニティにとって重要です。
これらのコマンドはそういったツールとして重要な役割を担っているのかもしれません。
特に言語圏(英語、日本語、etc..)の違いを意識する必要もなく意味が伝わる画像や動画は積極的に活用するべきなのでしょう。

とはいえ「犬の画像を貼り付けて何を意味したいのか？」という話はあるかもしれませんが。
発言者が犬派か猫派か、あるいはポニー派なのかはわかる気がするので、ディスカッションの中で関連ネタを含めたりとかもできるかもしれませんね。

でも多分「だっておもしろいだろ？」が本質なのだと私は思います。
IssueやPRのディスカッションもどうせなら面白いほうが良いですからねぇ。(ただし濫用して開発の流れを乱すのはよくありませんが。)

ということで、息抜き的な記事になりました。

え、`/honk` ってコマンドもあるじゃないですか。実行すると、、[へぇ、おもしろいｗ](https://github.com/kubernetes-sigs/contributor-playground/pull/447#issuecomment-565597070):bird:

**P.S.**
[本記事で使ったPR](https://github.com/kubernetes-sigs/contributor-playground/pull/447)は[kubernetes-sigs/contributor-playground](https://github.com/kubernetes-sigs/contributor-playground/)というリポジトリに作っています。このリポジトリは、コントリビュータとしてKubernetesの開発フローに慣れるために使えるリポジトリです。
KubeConやその他パブリックイベントなどでKubernetes Upstream TrainingやNew Contributor Workshopと言ったハンズオンのときに利用されることが多く、過去に2回ほど日本の人向けにもトレーニングを開催しています。[1](https://github.com/kubernetes-sigs/contributor-playground/tree/master/cndt-2019) [2](https://github.com/kubernetes-sigs/contributor-playground/tree/master/ood-2019)

# 参考
- https://github.com/kubernetes/test-infra/tree/master/prow
- https://prow.k8s.io/command-help