[Go] Dagger でテストを呼び出す

2025-07-05
Dagger は CI/CD をポータブルにするツール。
スクリプトを Docker コンテナに閉じ込めることで、どこでも実行できるようになります。

気になったのでサンプルアプリを作ってみました。
flow.png
公式サイト
インストール
Mac では Homebrew でインストールできます。
</>
$ brew install dagger/tap/dagger

$ dagger version
dagger v0.18.12 (docker-image://registry.dagger.io/engine:v0.18.12) darwin/arm64
サンプルアプリ
Go でサンプルアプリを作りました。

ディレクトリ構造は次の通りです。
</>
$ tree -a -L 2
.
├── .dagger
│   ├── dagger.gen.go
│   ├── go.mod
│   ├── internal
│   └── main.go          // Dagger のスクリプト
├── .gitignore
├── dagger.json          // Dagger の設定ファイル
├── db
├── docker-compose.yml
├── Dockerfile           // Dockerfile
├── go.mod
└── main.go
.dagger/main.go に Dagger のスクリプトを記述します。
コード
</>
1
メモ
アプリのコンテナです

Dagger ではベースイメージを指定してゼロから組み立てるケースが多いですが、私は Dockerfile ベースにしました
MySQL のコンテナです。テストで使います
リント
`dagger call lint` で呼び出せます
テスト
`dagger call test` で呼び出せます
テストする前に、マグレーションをします
テストを呼び出す
`dagger call test` で呼び出せます
</>
$ dagger call test

▶ connect 0.2s
▶ load module: . 2.3s

● app: App! 0.0s
▶ .test: String! 34.1s

● parsing command line arguments 0.0s

=== RUN   TestGetTasksHandler
--- PASS: TestGetTasksHandler (0.00s)
PASS
ok  	github.com/enuesaa/lab/data/dagger-go-echo	0.003s
?   	github.com/enuesaa/lab/data/dagger-go-echo/db	[no test files]
test.gif
GitHub Actions
Actions で dagger call するには `dagger/dagger-for-github` を使います。
</>
name: ci

on:
  push:
    branches:
      - '**'
  workflow_dispatch:

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - uses: dagger/[email protected]
        with:
          call: lint

      - uses: dagger/[email protected]
        with:
          call: test
感想
往々にして、テストのセットアップ処理やコマンドは長くなりがちであり、それらが CI に散らばるのを課題に感じてました。
その意味で、Dagger を使えば DRY になります。

一方で、何をどこまで Dagger 経由にするかは考える必要がありそうで、
例えば `go fmt ./...` は、ふつうに直接呼び出したほうが楽でした。