電通総研 テックブログ

電通総研が運営する技術ブログ

複数のDev ContainerがあるリポジトリでのGitHub Codespaces起動時のコツ

こんにちは、クロスイノベーション本部エンジニアリングテクノロジーセンターの小澤英泰です。
本記事ではGitHub Codespacesを活用する中で学んだ、複数のDev Containerの設定があるリポジトリにおいて、起動するDev Containerを指定する方法を紹介します。

はじめに

前提知識となるDev ContainerやGitHub Codespacesの概要は本記事では省略します。
適宜、過去に弊社社員が発表の記事や動画を参照してください。

複数のDev Containerの設定方法

複数のDev Containerを設定するには、リポジトリ.devcontainer配下はどのようなディレクトリ構成になるでしょうか。
例えば、VSCodeのドキュメントConnect to multiple containersでは、下記の構成を採っています。

📁 project-root
    📁 .git
    📁 .devcontainer
      📁 python-container
        📄 devcontainer.json
      📁 node-container
        📄 devcontainer.json
    📁 python-src
        📄 hello.py
    📁 node-src
        📄 hello.js
    📄 docker-compose.yml

.devcontainer配下に設定ごとのディレクトpython-containernode-containerを作成しdevcontainer.jsonを置いています。
上記の構成にならって、複数のDev Containerの設定をしました。

.
├── .devcontainer
    ├── DevContainerA
    │   └── devcontainer.json
    └── DevContainerB
        └── devcontainer.json
  • .devcontainer/DevContainerA/devcontainer.jsonの中身
{
  "name": "DevContainerA",
  "image": "mcr.microsoft.com/devcontainers/base:ubuntu"
}
  • .devcontainer/DevContainerB/devcontainer.jsonの中身
{
  "name": "DevContainerB",
  "image": "mcr.microsoft.com/devcontainers/base:ubuntu"
}

それではローカルマシンとGitHub Codespaces上の2つのパターンでDev Containerの起動方法を確認しましょう。

ローカルマシンでのDev Containerの起動

ローカルマシンでのDev Containerの起動手順を確認します。
VSCodeコンテナーで再度開くを選択すると、設定したDev Containerの一覧が表示され、起動対象のDev Containerを選べます。
ローカルマシン_コンテナーで再度開く
ローカルマシン_Dev Containerの選択

GitHub CodespacesでのDev Containerの起動

GitHub CodespacesでのDev Containerの起動手順を確認します。
VSCodeCreate New Codespace... を選択後、起動対象のブランチを選択すると、Dev Containerの一覧が表示されます。
GitHub Codespaces_Create New Codespace...
GitHub Codespaces_ブランチの選択
GitHub Codespaces_Dev Containerの選択
ローカルマシンの場合と異なり、GitHub Codespacesの場合は、一番上にDefault Codespaces configrationが表示されています。Default Codespaces configrationとは、一体何者なのでしょうか。

Default Codespaces configration とは?

Default Codespaces configrationを日本語では既定の開発コンテナー構成と呼びます。
既定の開発コンテナー構成とは、GitHubが用意したDev Containerです。下記の特徴があります。

GitHub によって既定の Linux イメージからコンテナーが作成されます。 この Linux イメージには、Python、Node、PHPJava、Go、C++Ruby、.NET Core/C# などの一般的な言語のランタイム バージョンが多数含まれています。 これらの言語の最新または LTS リリースが使用されます。 JupyterLab や Conda など、データ サイエンスと機械学習をサポートするツールもあります。 既定の開発コンテナー イメージには、Git、GitHub CLI、yarn、openssh、vim などの他の開発者ツールやユーティリティも含まれています。

詳細は既定の開発コンテナー構成の使用を参照してください。

また、Default Codespaces configrationが表示されるのは、.devcontainer直下にdevcontainer.jsonがない場合のGitHubの仕様です。

.devcontainer/devcontainer.json または .devcontainer.json が存在する場合は、codespace を作成するときに使用可能な構成ファイルの一覧でそれが既定の選択になります。 どちらのファイルも存在しない場合は、既定の開発コンテナー構成が既定で選択されます。

詳細はcodespace の作成時における既定の構成の選択を参照してください。

問題

VSCodeからGitHub Codespacesを起動する場合はDev Containerの一覧が表示され起動対象のDev Containerを選べるため、一見問題はなさそうです。しかし、ブラウザのgithub.comからGitHub Codespacesを起動する場合に注意が必要です。

リポジトリを開きCodeをクリックしCodespacesタブを開きます。+ ボタンまたはCreate codespace on mainをクリックすると、自動で既定の開発コンテナー構成で起動します。起動対象のDev Containerを選ぶことはできません。
ブラウザからのGitHub Codespacesの起動方法
起動対象のDev Containerを選ぶには、・・・ ボタンからNew with options... をクリックします。遷移先の画面で他のオプションも含め選択することができます。
New with options...
options
毎回、New with options... から起動するのは面倒です。油断して+ ボタンまたはCreate codespace on mainから起動し、npm run devなどのコマンド実行の失敗後にミスに気づき残念な気持ちにもなります。再作成には時間も費用もかかるので改善しましょう。

解決策1

ディレクトリの構成を変更します。DevContainerA配下のdevcontainer.json.devcontainer直下に移動することでデフォルトのDev ContaienerをDevContainerAの設定とすることができます。

  • 変更前の構成
.
├── .devcontainer
    ├── DevContainerA
    │   └── devcontainer.json
    └── DevContainerB
        └── devcontainer.json
  • 変更後の構成
.
├── .devcontainer
│   ├── DevContainerB
│   │   └── devcontainer.json
│   └── devcontainer.json

変更後はDefault Codespaces configrationが消え、デフォルトでDevContainerAが選択されます。
GitHub Codespaces_変更後のブラウザからの起動
VSCodeから起動する場合もDefault Codespaces configrationが消えています。
GitHub Codespaces_変更後のVSCodeからの起動

なお、ディレクトリ構成を変更してもローカルマシンでのDev Containerの起動方法に影響はありません。
ローカルマシン_変更後のVSCodeからの起動

解決策2

ディレクトリ構成を変えない場合は、READMEにGitHub Codespaces 作成ページへのリンクを置くことで問題を回避できます。設定するURLはShare a deep linkから確認できます。

main_share_a_link
Markdownタブを開くと、READMEに埋め込む値をコピーできます。
[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/Hideyasu-Ozawa/multi-dev-container)
main_url
上記コピーした値をREADMEに貼り付けると、バッジが表示されます。
README
バッチをクリックするとオプションを選択する画面に飛びます。
READEMEからの遷移
各オプションの値もクエリパラメータを変更することで簡単にカスタマイズできます。バッチに設定したURLを下記に変更します。
https://github.com/codespaces/new/Hideyasu-Ozawa/multi-dev-container?skip_quickstart=true&machine=standardLinux32gb&repo=934587189&ref=branchName&devcontainer_path=.devcontainer%2FDevContainerB%2Fdevcontainer.json&geo=UsEast)
バッチをクリックすると、ブランチにbranchName、Dev ContainerにDevContainerB、RegionにUS East、Machine typeに4-coreを設定した状態で開きます。


READMEに配置したバッチからGitHub Codespacesを作成することで、Dev Containerに既定の開発コンテナー構成を使うミスを回避できるようになりました。

さいごに

本記事では、複数のDev Containerの設定があるリポジトリにおいて、GitHub Codespacesで起動するDev Containerを指定する方法を紹介しました。
ローカルマシンとGitHub CodespacesでDev Containerを起動する際の仕様が異なることには注意が要りますが、解決策1のディレクトリ構成を変更しつつ、解決策2のREADMEにリンクを置くことで、GitHub Codespacesの起動時の体験をより良くすることができました。

私たちは一緒に働いてくれる仲間を募集しています!

電通総研 キャリア採用サイト 電通総研 新卒採用サイト

執筆:@ozawa.hideyasu、レビュー:Ishizawa Kento (@kent)
Shodoで執筆されました