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してみました。
以下みたいな感じにラベルが付いたり取れたりできました。
ちゃんと、ラベルを付けたり外したりできました!
今までだとWebhook作って、AWS Lambda作ったりして結構面倒でしたが、GitHub内で完結しているし、他のリポジトリでも簡単に再利用できそうで良さそうです!
まとめ
• GitHub内で完結して、別途サーバ等を用意しなくてよいので色々と楽
• Dockerも使えるので色々とできそう
• GitHub Actions Toolkit があるので簡単に操作できるようになっていて便利
• actionを作っておけば色々と再利用が簡単そう