Help us understand the problem. What is going on with this article?

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

これは何か

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

個人

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away