理系学生日記

おまえはいつまで学生気分なのか

GitHub Actions・blogsync・textlint で実現するはてなブログ投稿のオートメーション

以前、blogsync と textlint を使ったブロク投稿について書きました。

そこに登場したのが、GitHub Actions です。

そこでぼくは考えました。おや、エントリを GitHub のリポジトリで管理しておきさえすれば、以下のようなエントリの PUSH による自動投稿が可能になるのでは…と。

  1. エントリを PUSH
  2. GitHub Actions を使って:
    1. textlint で校正
    2. blogsync で投稿

GitHub Actions

こちらが、PUSH からの自動投稿までをワークフロー化した .github/workflows/blog.yaml です。

name: kiririmode.hatenablog.jp post entry workflow
on:
  push:
    paths:
      - 'kiririmode.hatenablog.jp/entry/**.md'
jobs:
  post:
    name: post entries
    runs-on: ubuntu-latest
    steps:
      - name: Checkout the commit
        uses: actions/checkout@v2
      - name: Setup Node.js environment
        uses: actions/setup-node@v1
      - name: Install dependencies
        run: npm install
      - name: Setup blogsync
        env:
          BLOGSYNC_VER: v0.10.2
        run: |
          mkdir bin
          curl --location --output blogsync.tar.gz --remote-name https://github.com/motemen/blogsync/releases/download/${BLOGSYNC_VER}/blogsync_${BLOGSYNC_VER}_linux_amd64.tar.gz
          tar zxf blogsync.tar.gz -C bin --strip-component 1 blogsync_${BLOGSYNC_VER}_linux_amd64/blogsync
      - name: append blogsync path to PATH
        run: echo "::add-path::./bin"
      - name: post entries
        env:
          TZ: "Asia/Tokyo"
        run: make post

個々の Step は name で記載した通りで、複雑なことはしていません。

ハマりポイントは PATH を操作する方法でした。

PATH を操作する方法

PATH は env では操作できません(たぶん)。これを実現するためには、 run: echo "::add-path::{path}" を使用します。

詳細は GitHub Actionsの開発ツール を参照頂ければ良いのですが、GitHub Actions はいくつかのユーティリティコマンドを用意してくれています。

その実行方法がおもしろくて、特定の Format で echo を行うというものです。たとえば、システムパスを追加するためには以下の echo を実行すれば良いです。

echo "::add-path::/path/to/dir"

上記を実行後、次の Step から path/to/dir が追加された新しい PATH が有効になります。

Makefile

関連する Makefile の箇所を抜粋すると以下の通りです。あまり凝ったことは行っていません。

.PHONY: new-entry
new-entry:
    echo | blogsync post --draft ${BLOG}

.PHONY: check
check:
    npx textlint --fix ${BLOG}/entry/${DATE}/*.md
    npx textlint ${BLOG}/entry/${DATE}/*.md

.PHONY: post
post: check
    blogsync push ${BLOG}/entry/${DATE}/*.md