YAMLで記述するGo製のビルドツールTaskをGitHub Actionsと連携してみた
Goの開発現場では、ビルドやテストをビルドツールのMake(Makefile)で実行することがよくあります(例: $ make test
)。たとえば、Mobyプロジェクト(Dockerの主要コンポーネント)やTerraformもそうです。
Makefileは一度書いてしまえば変更の頻度は少ないとはいえ、最近では configure; make; make install
といった手順でMakefileと触れる機会も減少しています。また、JSONやYAMLに慣れた人には、1970年代から存在するMakeの書式をとっつきにくく感じることもあり、保守性に課題が生じる場合もあります。
そこで登場するのがTaskです。Taskは、Makeの主要なユースケースをシンプルかつ簡単にYAML形式で記述できるツールです。
本記事では、Goプロジェクト向けにTaskを使用してGitHub Actionsを実行する方法を紹介します。なお、Task自体もGoで開発されています。
Taskの特徴
Taskは、GNU Makeをシンプルかつ使いやすくしたタスクランナー兼ビルドツールです。設定はYAMLで記述し、クロスプラットフォームで動作します。また、TaskはGoで開発されているため、シングルバイナリで簡単にインストールできます。
Taskのインストール
TaskはGoで書かれているため、各プラットフォーム向けのシングルバイナリが用意されています。
Macからはbrew
を使ってインストールできます
$ brew install go-task/tap/go-task
また、cURL
からインストールスクリプトを実行することも可能です。
$ sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d
VSCodeの公式エクステンションも提供されています。
ローカル環境で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を提供しています。
書式
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が利用されています。
この arduino/arduino-cli レポジトリにインスパイアされて、GitHub ActionsとTaskを連携させたミニマルなGoプロジェクトを用意しました。
Task発展編
Taskを導入する上で必要になる公式情報をいくつか紹介します。
Taskの解説ブログ
Taskに関する企業や企業のブログをいくつか紹介します。
- Makefile警察「ぐぬぬぬ…」 #taskfile - Qiita
- モノレポの開発環境でDocker ComposeをやめてTaskfileを導入した話
- go-taskでストレスフリーな開発体験 - Retty Tech Blog
- GitHub - devlights/try-gotask: Task (go-task)の使い方についてのメモです。
Makefileの解説ブログ
比較のために、Make(Makefile)に関するブログもいくつか紹介します。
- タスクランナーとしてのmakeを使う際の工夫と注意点 - KAYAC Engineers' Blog
- Makefile覚書: Goアプリ開発に役立ちそうな基礎知識 | フューチャー技術ブログ
- Makefile Tutorial By Example
まとめ
本記事では、YAMLで記述できる現代的なビルドツール・タスクランナーのTaskを紹介しました。
TaskはMakeを意識して設計されていますが、機能的に互換性を持ってMakeを置き換えるわけではなく、すべてのMakeのユースケースを置き換えるわけでもありません。
ただし、Makefileの記述や運用に課題を感じているなら、Taskを試してみるのはいかがでしょうか。