YAMLで記述するGo製のビルドツールTaskをGitHub Actionsと連携してみた

YAMLで記述するGo製のビルドツールTaskをGitHub Actionsと連携してみた

Makefileとおさらば。YAMLで記述できる現代的なビルドツール・タスクランナーTaskの紹介。
Clock Icon2024.10.21

Goの開発現場では、ビルドやテストをビルドツールのMake(Makefile)で実行することがよくあります(例: $ make test)。たとえば、Mobyプロジェクト(Dockerの主要コンポーネント)やTerraformもそうです。

Makefileは一度書いてしまえば変更の頻度は少ないとはいえ、最近では configure; make; make install といった手順でMakefileと触れる機会も減少しています。また、JSONやYAMLに慣れた人には、1970年代から存在するMakeの書式をとっつきにくく感じることもあり、保守性に課題が生じる場合もあります。

そこで登場するのがTaskです。Taskは、Makeの主要なユースケースをシンプルかつ簡単にYAML形式で記述できるツールです。

https://taskfile.dev/

本記事では、Goプロジェクト向けにTaskを使用してGitHub Actionsを実行する方法を紹介します。なお、Task自体もGoで開発されています。

Taskの特徴

Taskは、GNU Makeをシンプルかつ使いやすくしたタスクランナー兼ビルドツールです。設定はYAMLで記述し、クロスプラットフォームで動作します。また、TaskはGoで開発されているため、シングルバイナリで簡単にインストールできます。

Taskのインストール

TaskはGoで書かれているため、各プラットフォーム向けのシングルバイナリが用意されています。

https://github.com/go-task/task/releases

Macからはbrewを使ってインストールできます

$ brew install go-task/tap/go-task

また、cURLからインストールスクリプトを実行することも可能です。

$ sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d

VSCodeの公式エクステンションも提供されています。

https://marketplace.visualstudio.com/items?itemName=task.vscode-task

ローカル環境でTaskを実行

TaskのタスクはYAMLで定義します。

'Hello World from Task!'と表示するだけのタスクを定義しましょう。以下のTaskfile.ymlファイルを用意します。

cmds 属性でシェルコマンドを記述します

version: '3'

tasks:
  hello:
    cmds:
      - echo 'Hello World from Task!'

Taskをインストールしたら、次のコマンドでタスクを実行できます。

$ task --version
Task version: 3.39.2 ()

$ task hello
task: [hello] echo 'Hello World from Task!'
Hello World from Task!

簡単ですね

GitHub Actionsと連携

Taskの公式GitHub Actionsは存在しませんが、Arduino(あのワンボードマイコンで有名な"Arduino"です)がサードパーティー製のActionを提供しています。

https://github.com/marketplace/actions/arduino-setup-task

書式

GitHub ActionsのYAMLファイル内(.github/workflows/xxx.yml)で以下のように記述します。

デフォルトバージョンを指定

- name: Install Task
  uses: arduino/setup-task@v2

ワイルドーカード(.x)でメジャー、あるいは、マイナーバージョンでピン留め

- name: Install Task
  uses: arduino/setup-task@v2
  with:
    version: 3.39.x

明示的にフルバージョンを指定

- name: Install Task
  uses: arduino/setup-task@v2
  with:
    version: 3.39.2

GitHub Actions YAML ファイル例

以下は、GitHub ActionsでTaskを使ってGoプロジェクトをビルドする際のYAMLファイルの一例です。

name: task go
on: [push]

env:
  GO_VERSION: "1.23"
  TASK_VERSION: "3.39.x"

jobs:
  task-hello:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Install Task
        uses: arduino/setup-task@v2
        with:
          version: ${{ env.TASK_VERSION}}
      - name: Run Task
        run: task hello

  task-go:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Set up Go ${{ env.GO_VERSION}}
        uses: actions/setup-go@v5
        with:
          go-version: ${{ env.GO_VERSION}}

      - name: Install Task
        uses: arduino/setup-task@v2
        with:
          version: ${{ env.TASK_VERSION}}
      - name: Run tests
        run: task go:test

Taskを利用したGitHub Actionsのレポジトリ例

TaskのサードパーティーGitHub Actionsを提供しているArduinoは自社レポジトリでこのアクションを活用しています。

例えば、次のレポジトリではGoプロジェクトでTaskが利用されています。

https://github.com/arduino/arduino-cli/blob/master/.github/workflows/check-go-task.yml

この arduino/arduino-cli レポジトリにインスパイアされて、GitHub ActionsとTaskを連携させたミニマルなGoプロジェクトを用意しました。

https://github.com/quiver/go-task-template

Task発展編

Taskを導入する上で必要になる公式情報をいくつか紹介します。

Taskの解説ブログ

Taskに関する企業や企業のブログをいくつか紹介します。

Makefileの解説ブログ

比較のために、Make(Makefile)に関するブログもいくつか紹介します。

Goタスクツールの比較

調査の中で、GopherのMakefile愛がひしひしと伝わりました

その内容を Fukuoka.go#20 で登壇させていただきました

まとめ

本記事では、YAMLで記述できる現代的なビルドツール・タスクランナーのTaskを紹介しました。

TaskはMakeを意識して設計されていますが、機能的に互換性を持ってMakeを置き換えるわけではなく、すべてのMakeのユースケースを置き換えるわけでもありません。

ただし、Makefileの記述や運用に課題を感じているなら、Taskを試してみるのはいかがでしょうか。

参考

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.