#あすみかんの上にあすみかん

#たのしいことしかかかないことをここに決意します

Devinで始めるバージョンアップ人生(Node.js, Astro)

zenn.dev

お?意外といけるやん!がリンケージ開発合宿でDevinハンズオンしてくれた。 自分でも動かしてみたいなー手元でなんかいい感じの題材ないかなーって探してPHPカンファレンス小田原2025のサイトのバージョンアップとかいい題材では?となったのでやっていった。

カンファレンスを主催してるとこういうところでネタが落ちてきて便利!

事前情報

技術スタック

Node.jsのv18は2025年4月30日にEOLを迎えているので、やや遅れをとっている。というより作った時のまんまで放置しちゃっていたのであった!

ということでAstroも最新のv5.x系に、それにあわせてNode.jsもv20.x系に上げることにした。

Devin

Coreプラン(個人プラン)で初期に $20 課金(おおよそ10ACU)。 Slackと連携して @Devin にメンションして進めてもらっている。

Slack経由でメンションして聞くとスレッド形式で答えてくれる

ちなみに、私は普段はChat GPTに雑にバンバン聞きまくるというのをやってるのでその感覚でDevinに依頼するとどんどんACUが溶けていく。くだらないことは聞かない方が良い。上記スクショの質問は0.1ACU($0.2)溶けている。

実際にやってみる

Astroを最新に上げたい

Astroを最新に上げたい

  • 結果: 失敗
  • 使用: 6.8 ACU($3.4)

「phpcon-odawara_jp のAstroを最新に上げたい」という雑な依頼を投下した。Repositoryの特定に時間がかかった(「phpcon-odawara_jpプロジェクトが見つからないため、プロジェクトの場所とAstro設定を確認する必要があります。」)ので organization/repository でちゃんと依頼するのが良い...。*1

その後、Node.jsのバージョンアップデートをやる、かつ、Astroのバージョンを上げようとしてくれたが、ひたすらビルドが失敗することになった(理由は後述)。

ンググ〜ってなっている状態で会社の人に相談したら「2つのタスクを1つのセッションでやってるからじゃない?」って言われて確かに、となったので、Node.jsバージョンアップとAstroバージョンアップでセッションを分ける方針にした。 「タスクの依頼がやや雑」「タスク分解ができていなかった」などがうまくいかなかった原因であったように思う。 めちゃくちゃ会話が伸びてきたら1回落ち着いて別セッションにいくことを検討すると良さそう。

Node.jsのバージョンを20にアップデートしてください

Node.jsのバージョンを20にアップデートしてください

  • 結果: 紆余曲折ありつつ成功
  • 使用: 2.3 ACU($1.15)

前述した通りだが、ひたすらビルドが失敗していたのでこっちでも少し時間がかかった。というか、こればDevinに解決してもらったというより自分で解決した。

どのように失敗していたかというと、.node-versionで20を指定しているのに永遠にビルド環境のNode.jsが18.20.4のままなのである...。

22:31:56.914    Using v2 root directory strategy
22:31:56.938    Success: Finished cloning repository files
22:31:58.769    Checking for configuration in a Wrangler configuration file (BETA)
22:32:03.210    
22:32:03.211    Installing node-v18.20.4-linux-x64...
22:32:03.597    Installed node-v18.20.4-linux-x64 to /opt/buildhome/.asdf/installs/nodejs/18.20.4
22:32:03.597    ...
22:32:05.322    npm warn EBADENGINE Unsupported engine {
22:32:05.322    npm warn EBADENGINE   package: 'corepack@0.34.0',
22:32:05.322    npm warn EBADENGINE   required: { node: '^20.10.0 || ^22.11.0 || >=24.0.0' },
22:32:05.322    npm warn EBADENGINE   current: { node: 'v18.20.4', npm: '10.7.0' }
22:32:05.322    npm warn EBADENGINE }
22:32:05.424    ...
22:32:10.926    Error: Exit with error code: 1
22:32:10.927        at ChildProcess.<anonymous> (/snapshot/dist/run-build.js)
22:32:10.927        at Object.onceWrapper (node:events:652:26)
22:32:10.927        at ChildProcess.emit (node:events:537:28)
22:32:10.927        at ChildProcess._handle.onexit (node:internal/child_process:291:12)
22:32:10.936    Failed: build command exited with code: 1
22:32:11.980    Failed: error occurred while running build command

PR側で .node-versionファイルを作っているし、Cloudflare Pages側の"変数とシークレット"にあるNODE_VERSIONの記述を20にしてみたり、そもそも消してみたり、色々してみたが変わらず。エーなんでだろう...と思って100万年経った。経ってない。 ログ的にどう考えても18.20.4がどっかで設定が生きている、マジでわからん......となったけど小さな目をかっぴらいてCloudflareを見てたらあるものを発見。

環境を選択: プロダクション

はゎ・・・はゎゎ・・・これゎ・・・。

環境を選択: プレビュー

はい!!!!普通に節穴かましていた。プロダクション環境の"変数とシークレット"だけいじってプレビュー環境の"変数とシークレット"は何もいじってなかった。 プレビュー環境の"変数とシークレット"にあるNODE_VERSIONの記述を20にしてみたらビルドが通った。イエーイ、マージ!

ちなみにCloudflare Pages側でNODE_VERSIONがあればそちらが適用され、なければ.node-versionが適用されるようであった。

Astroのバージョンを最新にあげてください

Astroのバージョンを最新にあげてください

  • 結果: 成功
  • 使用: 1.2ACU($0.6)

こっちはマジでスッと上がった。 まあそもそもほとんど静的ページなのでほとんど困ることがないというのはある。

所感

勝手にPR作ってくれるのクソ便利

シンプルに。

Slackで「やっといて〜」「ほいよ〜」ができるのが、普段のコミュニケーション体験とほとんど一緒なので嬉しい。 自信度Confidence: Low 🔴Confidence: Medium 🟡Confidence: High 🟢によってどれくらい自分がうまく指示できているかなどもわかって良い。次からこう依頼すればええんやな、とこちらも学習できる。

バージョンアップをいい感じにやってくれるのは嬉しいかもしれない

そもそもRenovateとかDependabotとか入れれば自動でPR作れるのでそれで良いという話はある。 それを入れた上でビルドが落ちて「ダル〜」と思ったやつをDevinに投げつけて解決してもらうのはアリなのかもしれないと思った。

依頼をちゃんと書く

Chat GPTに雑に言語破綻した文章を投げる感覚で使うのではなく(??)、タスクを明確にして投げるとより成功率が上がる。 ......そもそも普段からしっかりプロンプト書いていればこんなことを気にしなくて良さそう(恥)

最初に連携したRepositoryを色濃く持ってる気がする

一番最初に連携したRepositoryをいつまで経っても覚えている感じがする。 organization/reopsitoryで依頼しているのに違うRepositoryを読んで「このRepositoryですか?自信がありません〜」「それじゃなくてだな...organization/reopsitory(再掲)...」っていうのがちょくちょくある。 使い始めてまもないから日が経ったら忘れてくれるのかな?

Repository指定しないで雑に作ってもらったスクリプトの時とかは全然問題ない。

キャラで喋らせるのは得策ではない

ドラえもん

キティちゃん

ビルドがなかなかうまくいってなかった時だったからかもしれないが、所詮偽物は偽物。 あるいはしっかりコンテキストを埋め込めばもっとうまくいくのかもしれないが、キャラに喋らせるのは自分の性に合わなかった。

おわりに

君もDevinを褒めてACUをもらおう

*1:それでも特定に失敗することがあるのは謎だが