tblsをセットアップするGitHub Actionとしてsetup-tbls(を作るツールとしてgh-setup)を作った

タイトルが何を言っているのかよくわからないと思いますので順を追って紹介したいと思います。

tblsをセットアップするGitHub Actionとしてsetup-tbls を作った

setup-tblsはtblsをインストールしてくれるGitHub Actionです。

github.com

各所で「ないの?」とは言われており(最近Issueもたった)、いつか作らないとなと思っていたのですが、いろいろ重なって作りました。

github.com

私はGoで作ったツールのActionはDocker container actionを使うのですが、tblsでそうするとDockerコンテナ上で動くtblsからデータベースサーバの名前解決ができなかったりして、それも手を鈍らせている原因でした。

今回作成した setup-tbls はComposite actionで作っているので上記のような心配もありません。

なお余談ですが、ActionというかRunner上のJobの実行環境については次の資料にまとめてあります。

speakerdeck.com

使い方は簡単で紹介するまでもないですが、 uses: k1low/setup-tbls@v1 で呼び出せば終わりです。

# .github/workflows/doc.yml
name: Document

on:
  push:
    branches:
      - main

jobs:
  doc:
    runs-on: ubuntu-latest
    steps:
      -
        name: Checkout .tbls.yml
        uses: actions/checkout@v3
      -
        uses: k1low/setup-tbls@v1
      -
        name: Run tbls for generate database document
        run: tbls doc

setup-*GitHub Actionを作るためのツールとして gh-setup を作った

setup-*install-* というActionは、大抵は実行ファイルをPATHに設置してくれるものです。

Goであれば本当にバイナリポン置きでいいのですし、そのバイナリは大抵GitHub Releasesにあるのであとは設置するだけなのですが、意外にこれが面倒なのです。

  1. まず実行環境を特定する(OSやArch)
  2. GitHub Releasesから特定バージョンもしくはlatestなリリースを特定
  3. 1の実行環境に適したリリースアセットを特定
  4. 3のリリースアセットが圧縮ファイルだったら展開
  5. 4の展開したファイルから必要なもの(今回は実行ファイル)だけ取得
  6. 実行環境のPATHを特定し5のファイルを設置

また、GitHub Releasesへのアセットの置き方も開発者によって、リポジトリによって千差万別です。私個人でもバラバラです(その時々でマイブームがある)。

それをいい感じにしてくれるツールとして gh-setup を作りました。

github.com

使い方はいくつかあるのですが、今回はGitHub Actionとしての使い方を紹介します*1

例えば、tblsをインストールする場合は以下のように書けます。

# .github/workflows/doc.yml
[...]
    steps:
      -
        name: Setup k1LoW/tbls
        run: k1LoW/gh-setup@v1
        with:
          repo: k1LoW/tbls

これだけで、煩わしい「GitHub Releaseからアセットを取得して実行ファイルをPATHに設置」をやってくれます。 中身は結構泥臭い実装が入っています。気になる方は是非 gh-setup のソースコードをご覧ください。

また、泥臭い実装を信用できない人にもいろいろオプションを用意していますので、詳しくは action.ymlのinputs:セクション をご覧ください。

さて、ここまで来たら勘のいい方はわかるかと思いますが、setup-tblsはgh-setupを組み込んで作っています。

setup-tblsのaction.ymlは次のとおりです。

name: 'Setup tbls'
description: 'GitHub Action for tbls, a CI-Friendly tool for document a database, written in Go.'
branding:
  icon: 'box'
  color: 'blue'
inputs:
  github-token:
    description: The GitHub token
    default: ${{ github.token }}
    required: false
  version:
    description: Version of tbls
    default: latest
    required: false
  force:
    description: Enable force setup
    default: ''
    required: false
runs:
  using: 'composite'
  steps:
    -
      uses: k1LoW/gh-setup@v1
      with:
        repo: github.com/k1LoW/tbls
        github-token: ${{ inputs.github-token }}
        version: ${{ inputs.version }}
        bin-match: tbls
        strict: true
        force: ${{ inputs.force }}

これだけです。ほとんどの処理はgh-setupの中にあります。

setup-* というGitHub Actionを作りたい方へ

是非 gh-setup をご検討ください。うまく動かない、気に食わない挙動についてはフィードバックいただけると嬉しいです。

これで setup-* は作りたい放題!

*1:実はGitHub CLI extensionとしてもスタンドアローンCLIツールとしても使えます