GitHub ActionsでGitHub Wikiの更新情報(gollum)を取得する

# これは何か

GitHub ActionsでGitHub Wikiの更新情報を取得して色々するために試したメモ。最終的にはGitHub Wikiのミラーリングをしたい。

初めてのYAMLなので当たり前のことを書いていたり書くべきことを書いていないかもしれない。また、最低限のコードしか書いていないのでデータチェックの実装なども最低限になっている。

直す余地しかないコードなので、gollumの場合はこうやったら取れるらしいよくらいで読んでほしい。

# GitHub Actionsを作る

基本的に公式ドキュメントの[Creating a JavaScript action - GitHub Help](https://help.github.com/en/articles/creating-a-javascript-action)に倣って作ったので手順は割愛する。

## ディレクトリ構成

新しいGitHubリポジトリでGitHub Actionsを作るとこんな感じのディレクトリ構成になるはず。

```
|-.github
|---workflows
|-----main.yml
|-.gitignore
|-README.md
|-dist
|---index.js
|-node_modules
|-package.json
|-action.yml
|-index.js
|-package-lock.json
```

`./dist/index.js`は`ncc`で`./index.js`をコンパイルするので、実際には以下のファイルをよく触ることになる。

- .github/workflows/main.yml
- action.yml
- index.js

## サンプルコード

### actions.yml

ファイル名は固定。

```yaml:actions.yml
name: 'GollumSample'
description: 'GollumSample'
inputs:
  event:
    description: 'gollum payload'
    required: true
runs:
  using: 'node12'
  main: 'dist/index.js'
```

# main.yml

ファイル名は何でもいい。

```yaml:main.yml
name: GollumSample

on: gollum

jobs:
  job:

    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v1
      - name: Dump github.event
        # github.eventの中身を見たい
        env:
          EVENT: ${{ toJson(github.event) }}
        run: echo "${EVENT}"
      - name: Read info edited/created pages
        # JavaScriptにgithub.eventの値を渡す
        uses: ./
        with:
          event: ${{ toJson(github.event) }}
```

冒頭の`name`は指定しなくても動く。ただダッシュボードでファイルパスで表示されてしまうので指定した方が見やすいと思う。下は指定するのを忘れていたときと直した後のダッシュボードのスクショ

![ダッシュボードでの表示の違い](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95607/b133062d-38bd-c2b1-eae2-13800e3c8fff.png)

`event`というパラメータで`github.event`をJSONにしたものを文字列として渡しているので、JavaScript上で扱うときにはもう一度JSONにパースする。

### index.js

```js:index.js
const core = require('@actions/core');

try {
	//// pushだとgithub.context.payloadで実行結果を取れるんだけど
	//// gollumの場合は$GITHUB_EVENT_PATHの中身を持ってくる必要があった
	const event = JSON.parse(core.getInput('event'));
	if (event.pages) { // 最低限のチェックしかしていない
		const pages = event.pages;
		console.log(pages);
		for (const page of pages) {
			console.log(`${page.title}: ${page.html_url} (${page.action})`);
			//// 出力例
			// Home: https://github.com/wifeofvillon/github-wiki-mirror/wiki/Home (edited)
		}
	}
} catch (error) {
	core.setFailed(error.message);
}
```

コード中にも書いたけど、pushの場合は下のようにpayloadを取って来れるんだけど、gollumの場合は取れなかったのでわざわざパラメータとして渡している。他にも取れないイベントがあるかもしれない。

```js
const github = require('@actions/github');
const payload = JSON.stringify(github.context.payload, undefined, 2);
```

今回取得したのはタイトル、GitHub Wiki上でのURL、更新か作成かのステータスで、他に取れる要素は[Event Types & Payloads | GitHub Developer Guide](https://developer.github.com/v3/activity/events/types/#gollumevent)を参考にしてほしい。

# その他詰まったところ

- そもそもGitHub Wikiを個人のリポジトリで使うにはアカウントをアップグレードする必要があった。9.0USD/月だったかな
- actions.ymlでcheckoutのフローを忘れると動かなくなる
- $GITHUB_EVENT_PATH(github.eventの一時ファイルパス)をJS中から読もうとして(当たり前だけど)失敗した
- 複数のGitHub Wikiの更新時の挙動をテストしたいときはWikiを`git clone`して複数ファイルを変更・追加してpushするとできる

# 参考

## GitHub公式

- [Creating a JavaScript action - GitHub Help](https://help.github.com/en/articles/creating-a-javascript-action)
- [Contexts and expression syntax for GitHub Actions - GitHub Help](https://help.github.com/en/articles/contexts-and-expression-syntax-for-github-actions#job-context)
- [Events that trigger workflows - GitHub Help](https://help.github.com/en/articles/events-that-trigger-workflows)
- [Event Types & Payloads | GitHub Developer Guide](https://developer.github.com/v3/activity/events/types/#gollumevent)
- [actions/toolkit: The GitHub ToolKit for developing GitHub Actions.](https://github.com/actions/toolkit)

## 個人

- [新 GitHub Actions 入門 - 生産性向上ブログ](https://www.kaizenprogrammer.com/entry/2019/08/18/205010)
- [GitHub Actionsでリポジトリにスターが付いたらSlackに通知する｜久保田光則(id:anatoo)｜note](https://note.mu/anatoo/n/n16e875c065f9)