これは何か
GitHub ActionsでGitHub Wikiの更新情報を取得して色々するために試したメモ。最終的にはGitHub Wikiのミラーリングをしたい。
初めてのYAMLなので当たり前のことを書いていたり書くべきことを書いていないかもしれない。また、最低限のコードしか書いていないのでデータチェックの実装なども最低限になっている。
直す余地しかないコードなので、gollumの場合はこうやったら取れるらしいよくらいで読んでほしい。
GitHub Actionsを作る
基本的に公式ドキュメントのCreating a JavaScript action - GitHub Helpに倣って作ったので手順は割愛する。
ディレクトリ構成
新しい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
ファイル名は固定。
name: 'GollumSample'
description: 'GollumSample'
inputs:
event:
description: 'gollum payload'
required: true
runs:
using: 'node12'
main: 'dist/index.js'
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
は指定しなくても動く。ただダッシュボードでファイルパスで表示されてしまうので指定した方が見やすいと思う。下は指定するのを忘れていたときと直した後のダッシュボードのスクショ
event
というパラメータでgithub.event
をJSONにしたものを文字列として渡しているので、JavaScript上で扱うときにはもう一度JSONにパースする。
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の場合は取れなかったのでわざわざパラメータとして渡している。他にも取れないイベントがあるかもしれない。
const github = require('@actions/github');
const payload = JSON.stringify(github.context.payload, undefined, 2);
今回取得したのはタイトル、GitHub Wiki上でのURL、更新か作成かのステータスで、他に取れる要素はEvent Types & Payloads | GitHub Developer Guideを参考にしてほしい。
その他詰まったところ
- そもそも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
- Contexts and expression syntax for GitHub Actions - GitHub Help
- Events that trigger workflows - GitHub Help
- Event Types & Payloads | GitHub Developer Guide
- actions/toolkit: The GitHub ToolKit for developing GitHub Actions.