Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Github Actionsで始める ChatOps

More than 1 year has passed since last update.

はじめに

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 ファイルを見てジョブを実行するようです。 

zlab
技術で新しい世界へシフトする。
https://zlab.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away