見出し画像

GitHub Actionsで遊んでみた

こんにちは!
bosyu Advent Calendar 2019 の 8日目の記事です。

JAWS DAYS 2019での発表を見て面白そうだなーと思ってたけど、なかなか触れていなかったので丁度良い機会だなと思い、GitHub Acitonsを触ってみました。

めっちゃ前にtweetしてましたね...
とりあえず今回はどんなGitHub Actionsがどんな感じで使えるのかな、という確認なので、簡単なものを作ってみようかなと思います。

作るもの

Pull Requestの特定のファイル変更に応じて、ラベルを付けたり消したりするactionを作ってみます。

bosyuではマイグレーションがあるPull Requestの場合は マイグレショーン注意 のラベルを手動でつけていて面倒なのと、付け忘れることがあるので自動化したいな〜ぐらいのモチベーションです。

作ってみた

Creating a JavaScript action を参考にして作りました。

かなり雑なのですが、actions/toolkit が便利で簡単に作ることができました。
@actions/github を使うとコンテキスト情報やOctokit RESTクライアントが使えるのでPull Requestの情報を取得して、ラベルの付け外しをよしなにやります。
やっている事をざっと書くと

1. コンテキスト情報からPull Requestの番号を取得

const github = require('@actions/github');
const pullRequestNumber = github.context.payload.pull_request.number;

2. Pull Requestの番号から変更されたファイルリストを取得

const { data } = await octokit.pulls.listFiles({
   owner: github.context.repo.owner,
   repo: github.context.repo.repo,
   pull_number: pullNumber,
});

const changeFiles = data.map((v) => v.filename);

3. パターンに合致したファイルの有無でラベル付け外し

const addLabel = async (octokit, issueNumber, labels) => {
 await octokit.issues.addLabels({
   owner: github.context.repo.owner,
   repo: github.context.repo.repo,
   issue_number: issueNumber,
   labels
 });
};

const removeLabel = async (octokit, issueNumber, name) => {
 await octokit.issues.removeLabel({
   owner: github.context.repo.owner,
   repo: github.context.repo.repo,
   issue_number: issueNumber,
   name
 });
};

for ( { label, patterns } of targetFiles ) {
  if (isFileExists(patterns, changeFiles)) {
    await addLabel(octokit, pullRequestNumber, [label])
  } else if (assignLabels.includes(label)) {
    await removeLabel(octokit, pullRequestNumber, label)
  }
}

みたいな感じです。

使ってみた

適当なRailsアプリを作って使ってみました。
db/schema.rbに変更があったときと、app配下にあるjsファイルに変更があったときにラベルを付けるようにします。
設定は以下みたいな感じです。

# .github/workflows/check-file-changes.yml 

name: "Check File Changes"
on:
 - pull_request

jobs:
 triage:
   runs-on: ubuntu-latest
   steps:
     - name: 'Check File Changes'
       uses: enda1111/pr-label@v1.0.0
       with:
         github-token: "${{ secrets.GITHUB_TOKEN }}"
// .github/pr-label.json

{
 "targets": [
   {
     "label": "マイグレーション注意",
     "patterns": [
       "db/schema.rb"
     ]
   },
   {
     "label": "JavaScript",
     "patterns": [
       "app/**/*.js"
     ]
   }
 ]
}

ファイルを色々変更してpushしてみました。
以下みたいな感じにラベルが付いたり取れたりできました。

スクリーンショット 2019-12-08 11.51.59

ちゃんと、ラベルを付けたり外したりできました!
今までだとWebhook作って、AWS Lambda作ったりして結構面倒でしたが、GitHub内で完結しているし、他のリポジトリでも簡単に再利用できそうで良さそうです!

まとめ

• GitHub内で完結して、別途サーバ等を用意しなくてよいので色々と楽
• Dockerも使えるので色々とできそう
GitHub Actions Toolkit があるので簡単に操作できるようになっていて便利
• actionを作っておけば色々と再利用が簡単そう


いいなと思ったら応援しよう!