LoginSignup
1
1

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-09-20

これは何か

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.jsncc./index.jsをコンパイルするので、実際には以下のファイルをよく触ることになる。

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

サンプルコード

actions.yml

ファイル名は固定。

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

main.yml

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

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

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公式

個人

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1