CI用ワークフローを毎回手書きするのは手間

【mise】mise-actionの基本的な使い方 ではjdx/mise-actionのセットアップ方法を紹介した。

【mise】mise-actionのセットアップ後にmise runでタスクを実行する では、セットアップ後にmise runでタスクを実行する方法を紹介した。

これらを組み合わせたワークフローファイルを、新しいリポジトリを作るたびに手書きするのは手間である。mise generate github-actionを使うと、mise run <タスク名>を実行するGitHub Actionsワークフローの雛形を生成できる。

mise generate github-actionの基本

mise.tomlciタスクを定義したリポジトリで実行する。

$ mise generate github-action
name: ci

on:
  workflow_dispatch:
  pull_request:
  push:
    tags: ["*"]
    branches: ["master"]

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

env:
  MISE_EXPERIMENTAL: true

jobs:
  ci:
    runs-on: ubuntu-latest
    timeout-minutes: 10
    steps:
      - uses: actions/checkout@v6
      - uses: jdx/mise-action@v3
      - run: mise run ci

workflow_dispatch(手動実行)、pull_request、タグ・ブランチへのpushをトリガーに、jdx/mise-actionをセットアップしてからmise run ciを実行するワークフローが出力される。既定では標準出力に表示するだけで、ファイルへの書き込みは行わない。

–writeでファイルに書き込む

-w(--write)を付けると、.github/workflows/$name.ymlに書き込まれる。

$ mise generate github-action --write
Wrote to /path/to/project/.github/workflows/ci.yml

–taskと–nameでカスタマイズする

実行するタスク名やワークフロー名を変えたい場合は-t(--task)と--nameを指定する。

$ mise generate github-action --task=test --name=test-workflow --write
Wrote to /path/to/project/.github/workflows/test-workflow.yml
name: test-workflow
# ...
jobs:
  test-workflow:
    # ...
    steps:
      - uses: actions/checkout@v6
      - uses: jdx/mise-action@v3
      - run: mise run test

ワークフロー名・出力ファイル名・ジョブ名が--nameの値に、実行されるタスクが--taskの値にそれぞれ揃って反映される。

branchesトリガーは実行時のブランチ名がそのまま入る

pushセクションのbranchesには、コマンドを実行した時点でのカレントブランチ名がそのまま書き込まれる。作業用ブランチで実行すると、そのブランチ名がpushトリガーの対象になってしまう。

$ git branch --show-current
feature/foo
$ mise generate github-action | grep branches
    branches: ["feature/foo"]

mastermain向けのCIワークフローとして使いたい場合は、デフォルトブランチにチェックアウトした状態で実行する必要がある。

実際にGitHub Actions上で動作確認する

生成したワークフローをリポジトリにpushして動作を確認した。jqのバージョンを表示するだけのciタスクを定義し、pushをトリガーに実行させた結果である。

Run mise run ci
[ci] $ jq --version
jq-1.8.2

mise run ciが実行され、タスクの内容どおりjqのバージョンが出力された。生成されたワークフローの環境変数にはMISE_EXPERIMENTAL: trueが含まれており、mise generateコマンド自体にこの設定は不要だが、生成物には既定でこの値が入る。