😇

Dagger Shell x Runme でドキュメントを実行環境に

に公開

はじめに

リポジトリの README や技術ドキュメントに記載された環境構築のシェルコマンド。それを読みながら、実際にその場で実行できたら、効率的ですよね。本記事では、そんなインタラクティブな体験を提供する Dagger ShellRunme というツールとその連携についてご紹介します。

Dagger Shellとは?

そもそもDaggerとは?

Dagger は、コンテナ技術を活用して、CI/CD パイプライン、開発環境、その他の自動化タスクを定義・実行するためのポータブルな開発プラットフォームです。Docker コンテナ、ファイルシステム、ネットワークなどのインフラストラクチャを抽象化し、プラットフォームに依存しない形でワークフローを構築できます。これにより、環境に左右されない、再現性の高い自動化処理を実現します。

Dagger の CI/CD ワークフローは、Go、Python、TypeScript などの言語で記述できます。

Dagger Shellとは

Dagger Shell は、Dagger の機能の一つで、Dagger が管理するコンテナイメージに基づいたインタラクティブなシェル環境を提供します。特定の設定が施されたコンテナ内でコマンドを実行できるため、ローカル環境への依存を減らし、プロジェクトに必要なツールや環境が整った状態で作業を開始できます。

Dagger Shell の登場により、以前は Go や Python などの言語で記述する必要があったワークフローを、シェルスクリプトのみで手軽に実行できるようになりました。

セットアップ方法

Dagger Shell を利用するには、Dagger CLI のインストールが必要です。

インストールに必要なもの

  • Docker: Dagger はコンテナ技術を利用するため、Docker がインストールされている必要があります。

  • Dagger CLI: Dagger のコマンドラインインターフェースです。

インストール方法

macOS の場合は、Homebrew を利用して簡単にインストールできます。

brew install dagger/tap/dagger

インストール後、ターミナルで dagger version を実行し、インストールを確認してください。

コンテナ化したシェルを実行

Dagger Shell は、ターミナルで dagger コマンドを実行することで対話モードで利用できます。

dagger

対話モードで以下のように入力することで、alpine コンテナを起動し、そのターミナルに接続できます。

container | from alpine | terminal

起動したターミナル内では、通常の Docker コンテナと同様にコマンドを実行でき、exit コマンドでコンテナから抜けることができます。

Runmeとは?

Runme は、Visual Studio Code (VSCode) の拡張機能で、Markdown ドキュメント内のコードブロックをインタラクティブに実行できるツールです。ドキュメントを読みながら、そこに記述されたコマンドやスクリプトをその場で実行し、結果を確認できるため、学習や問題解決の効率を高めます。

同様のツールとして Jupyter Notebook がありますが、Runme は一般的な Markdown ドキュメント上で同様の機能を提供することが特徴です。

VSCode拡張をインストール

Runme を利用するには、VSCode に拡張機能をインストールする必要があります。詳細は以下の公式ドキュメントを参照してください。

https://docs.runme.dev/installation/vscode

frontmatter設定

Runme で Dagger Shell を連携させるためには、Markdown ファイルの frontmatter に Dagger 関連の設定を記述します。VSCode のコマンドパレットから「Runme: Lifecycle Identity - Document」を実行すると、Markdown ファイルの先頭に frontmatter が追加されます。

Dagger Shell を利用するための frontmatter の設定例は以下の通りです。

---
cwd: .
runme:
  id: 01JRYZYW1230QTEY7CP58DFD62
  version: v3
shell: dagger shell
terminalRows: 20
---

ドキュメント上で実行してみる

以下は、Runme を使用して Markdown ドキュメント上で Dagger Shell を起動し、Node.js コンテナ上で React のビルドを実行するシェルの例です。

container |
    from node:latest |
    with-exec -- npm install -g pnpm@latest |
    with-directory /src . --exclude node_modules | # node_modules を除外
    with-workdir /src |
    with-exec -- pnpm install --frozen-lockfile |
    with-exec pnpm run build |
    directory ./dist |
    export ./dist # ビルドしたものをホスト環境の./distにエクスポート

このコードブロックの再生ボタンをクリックして実行すると、VSCode の出力ウィンドウに Dagger Shell を通じたコンテナの実行ログが表示されます。ドキュメント上で実際の処理を検証できるため、理解を深めるのに役立ちます。

おまけ

Github ActionsでDagger Shellを実行

Dagger は Github Actions との連携も可能です。CI/CD パイプライン内で Dagger Shell を起動し、テストやビルドなどのタスクを実行することで、一貫性のある実行環境を構築できます。

name: dagger-ci
on:
  push:
    branches: [main]

jobs:
  typecheck-lint:
    name: typecheck-lint
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
      - name: Set up Dagger
        uses: dagger/dagger-for-github@8.0.0
        with:
          version: 'latest'
      - name: Check TypeScript and Lint
        run: container |
          from node:latest |
          with-exec -- npm install -g pnpm@latest |
          with-directory /src . --exclude node_modules |
          with-workdir /src |
          with-exec -- pnpm install --frozen-lockfile |
          with-exec -- pnpm run ts:check |
          with-exec -- pnpm run lint
        shell: dagger {0}

このワークフローは、Dagger Shell を利用して Node.js 環境での型チェックとリンティングを実行する例です。

以下は今回試した内容を記載したサンプルリポジトリとなります。
https://github.com/takemo101/dagger-shell-example

まとめ

Dagger Shell と Runme の連携は、開発ドキュメントをインタラクティブな実行環境へと変え、学習効率の向上、環境構築の簡略化、そしてチーム内の知識共有を促進します。ぜひこの組み合わせを試してみてください。

株式会社ソニックムーブ

Discussion