Zenn 記事の執筆環境を VSCode Remote Containers を使って構築する
やりたいこと
GitHub上で管理する Zenn 記事の執筆環境を VSCode Remote Containers で用意したい
実際にやったこと
ベースイメージ
github.com/microsoft/vscode-remote-try-nodeで使用している mcr.microsoft.com/devcontainers/javascript-nodeを参考に、mcr.microsoft.com/devcontainers/typescript-node使用することとした。
その際、以下の2点を考慮した。
- Zenn CLI は Node.js で動作する
- Zenn 記事を GitHub で管理する
- Git とコミットの Push 等の Git リモートリポジトリの操作ための SSH クライアントが必要
このイメージは devcontainers 管理のイメージで、Development Containerとして使用するために必要十分な設定がされている。
採用したイメージは、nodeをベースイメージとし、開発で最低限必要なgitやopenssh-client等のパッケージはDev Container Featuresのcommon-utilsによって導入された状態で利用を開始できるのが良い。
Remote Containers 設定
以下のように設定した。
{
"name": "zenn-contents",
"build": {
"dockerfile": "Dockerfile",
"cacheFrom": "ghcr.io/nmemoto/zenn-contents"
},
"customizations": {
"vscode": {
"extensions": [
"GitHub.vscode-pull-request-github",
"eamodio.gitlens"
]
}
},
"portsAttributes": {
"8000": {
"label": "Zenn Preview",
"onAutoForward": "openBrowser"
}
},
"features": {
"ghcr.io/devcontainers/features/github-cli:1": {
"version": "latest"
}
},
"postStartCommand": "npm install",
"remoteUser": "node"
}
FROM mcr.microsoft.com/devcontainers/typescript-node:0-16-bullseye
postsAttributes
はコンテナ内で起動するプレビューアプリケーションをホスト側で閲覧するためのデフォルトのポートフォワード設定で、npx zenn preview
のデフォルトの起動ポートの8000を指定した。
"onAutoForward": "openBrowser"
は、ポートフォワードされたタイミングでこのポートを使うアプリケーションをシステムのデフォルトブラウザで開くために設定した。
features
は、2022年9月11日現在、Preview 機能であるDev container featuresのことを指しており、https://github.com/devcontainers/features に記載のあるツールについてはこの記法で該当ツールを導入できるようになる。
ここではgithub-cli
を導入している。
postStartCommand
ではコンテナ起動後に実行されるコマンドを設定できる。
Zennのコンテンツを管理しているこのリポジトリでは、DependabotとGitHub Actionsが勝手にpackage.jsonをアップグレードしてマージしてくれるようにしている。
新しい記事を書くタイミングで最新のmainブランチからブランチを作成すれば、その次にコンテナ起動したタイミングでpostStartCommand
で指定したnpm install
が動作し、自然と最新のzenn-cliを使用できるようになる。
なお、DependabotとGitHub Actionsによる自動マージについてはGitHub ActionsでのDependabotの自動化に詳しく記載されていた。
devcontainer.jsonのそれぞれの設定の詳細については、devcontainer.jsonのリファレンスに記載がある。
まとめ
- ベースイメージは、mcr.microsoft.com/devcontainers/typescript-node:0-16-bullseye を使うとよさげ。
-
.devcontainer/devcontainer.json
のpostsAttributes
を使用し、ポートフォワード時にブラウザでhttp://localhost:8000
を開くようにする。 - DependabotとGitHub Actionsにpackage.jsonの最新化の処理をさせ、マージさせる。postStartCommand
を使用し、コンテナ起動時に毎回
npm install`を実行させると、新しい記事を書くタイミングで最新のzenn-cliを使用することができる。
Discussion