LoginSignup
34
19

More than 3 years have passed since last update.

Github Actionsで始める ChatOps

Last updated at Posted at 2019-12-05

はじめに

Kubernetes のリポジトリを眺めていると Github の PR 上で bot に対してコマンドを実行するのをよく見ますよね。例えばこういうものです。

スクリーンショット 2019-11-27 19.27.02.png

Kubernetes のプロジェクトでは PR 上でのテストやラベル付けなどを行っていますが、自分たちはこれを見て日々の運用作業を PR や issue 上で ChatOps で実現したいと思いました。
Github上で行うと Chat 上に比べて後から探しやすいといったメリットがあると思っており、それを実現できないかと考えていました :thinking:

これを実現する方法としてまずに思いつくのは Kubernetes プロジェクトで利用している Prow を利用する方法です。ただ Prow で実施する場合 Prow 自体のデプロイ・その後の管理をする必要があり、そのあたりが面倒になってしまいそこまでのコストを掛けて実現するべき運用作業もないため今まで実現には至っていませんでした。。。

手軽に実現できるツールはないかと調べていて Argo Events + Argo Workflow などいくつかを試していましたがあまりしっくりとくるツールが見つからない日々が続きました。そんなときに登場したのが Github Actions です。

Github Actions はよくある CI ツールとは違って Github の細かいイベントでトリガーできるため一つの yaml ファイルを追加するだけで ChatOps ライクなことが実現できそうと思い試してみました。

試してみる

ChatOps で必要なイベントは issue や PR でのコメント作成または編集になります。
公式ドキュメントを眺めてみるとこのように issue_comment というイベントがあります。
このイベントをトリガーにして、コメントの内容を条件にしてちょっとしたスクリプトを書くことで実現できそうです。

試しに /lgtm とコメントすると LTGM ラベルを付与するようにしてみます。

github/workflows/lgtm.yaml
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 にコメントしてみると

スクリーンショット 2019-12-03 13.50.06.png

無事ラベルが付与されました :tada:

おわりに

この記事では Github Actions を使って yaml ファイル一つで ChatOps を実現する方法を紹介しました。今回は簡易的なものでしたがスクリプト次第で様々なことができると思うので色々試してみたいと思います。現在自分のチームでも cherry-pick や簡単なデプロイを今回の方法で実現していたりします。


  1. スケジュールや issue のようなリポジトリに直接紐付かないイベントはGithubのデフォルトブランチに存在する workflow ファイルを見てジョブを実行するようです。 

34
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
19