はじめに
Kubernetes のリポジトリを眺めていると Github の PR 上で bot に対してコマンドを実行するのをよく見ますよね。例えばこういうものです。
Kubernetes のプロジェクトでは PR 上でのテストやラベル付けなどを行っていますが、自分たちはこれを見て日々の運用作業を PR や issue 上で ChatOps で実現したいと思いました。
Github上で行うと Chat 上に比べて後から探しやすいといったメリットがあると思っており、それを実現できないかと考えていました
これを実現する方法としてまずに思いつくのは Kubernetes プロジェクトで利用している Prow を利用する方法です。ただ Prow で実施する場合 Prow 自体のデプロイ・その後の管理をする必要があり、そのあたりが面倒になってしまいそこまでのコストを掛けて実現するべき運用作業もないため今まで実現には至っていませんでした。。。
手軽に実現できるツールはないかと調べていて Argo Events + Argo Workflow などいくつかを試していましたがあまりしっくりとくるツールが見つからない日々が続きました。そんなときに登場したのが Github Actions です。
Github Actions はよくある CI ツールとは違って Github の細かいイベントでトリガーできるため一つの yaml ファイルを追加するだけで ChatOps ライクなことが実現できそうと思い試してみました。
試してみる
ChatOps で必要なイベントは issue や PR でのコメント作成または編集になります。
公式ドキュメントを眺めてみるとこのように issue_comment
というイベントがあります。
このイベントをトリガーにして、コメントの内容を条件にしてちょっとしたスクリプトを書くことで実現できそうです。
試しに /lgtm とコメントすると LTGM ラベルを付与するようにしてみます。
name: LGTM action
on:
issue_comment:
types: [created, edited]
jobs:
build:
name: LGTM action
runs-on: ubuntu-latest
steps:
- name: Run action
env:
GITHUB_REPOSITORY: ${{ github.repository }}
ISSUE_PAYLOAD: ${{ toJson(github.event.issue) }}
ISSUE_NUMBER: ${{ github.event.issue.number }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
labels=$(echo "${ISSUE_PAYLOAD}" | jq '.labels[]|.name' | jq -s . | jq -c '.|.+["LGTM"]|unique')
curl -X PATCH -d '{"labels": '${labels}'}' -H "Authorization: token ${GITHUB_TOKEN}" https://api.github.com/repos/${GITHUB_REPOSITORY}/issues/${ISSUE_NUMBER}
if: startsWith(github.event.comment.body, '/lgtm')
今回はスクリプトの中身は重要ではないので簡単なものにしています。パーサーやアクションをちゃんと書けば色々なことが実現できると思います
上記のような yaml ファイルをリポジトリのデフォルトブランチ(大抵は master ブランチ)にpushします。1
その後 issue にコメントしてみると
無事ラベルが付与されました
おわりに
この記事では Github Actions を使って yaml ファイル一つで ChatOps を実現する方法を紹介しました。今回は簡易的なものでしたがスクリプト次第で様々なことができると思うので色々試してみたいと思います。現在自分のチームでも cherry-pick や簡単なデプロイを今回の方法で実現していたりします。
-
スケジュールや issue のようなリポジトリに直接紐付かないイベントはGithubのデフォルトブランチに存在する workflow ファイルを見てジョブを実行するようです。 ↩