ちょっと間があいてしまいましたが、puppeteer 13.1.2 と 13.1.3 がリリースされました。
まずは 13.1.3 の方からです。
Bug Fixes
・issue with reading versions.js in doclint
・make more files work in strict-mode TypeScript
・page.pdf producing an invalid pdf
https://github.com/puppeteer/puppeteer/releases/tag/v13.1.3
PDFを生成する際に発生する可能性があったバグが修正されています。自分はそのバグを踏んだことがないので、ちょっと正確な条件は分かりませんでした。
一方で重要なのは 13.1.2 の方です。
Bug Fixes
・package.json: update node-fetch package
・types in Browser.ts to be compatible with strict mode Typescript
・types in Connection.ts to be compatible with strict mode Typescript
https://github.com/puppeteer/puppeteer/releases/tag/v13.1.2
この1つ目 package.json が問題でした。実際に1つ前のバージョンである13.1.1をnpmでインストールしてみましょう。
$ npm install puppeteer@13.1.1 --save
changed 2 packages, and audited 58 packages in 12s
8 packages are looking for funding
run `npm fund` for details
2 high severity vulnerabilities
To address all issues, run:
npm audit fix --force
Run `npm audit` for details.
これは puppeteer 13.1.1 が依存している他のnpmパッケージに脆弱性があるものが含まれるというメッセージです。詳細も確認しましょう。
$ npm audit
# npm audit report
node-fetch <2.6.7
Severity: high
node-fetch is vulnerable to Exposure of Sensitive Information to an Unauthorized Actor - https://github.com/advisories/GHSA-r683-j2x4-v87g
fix available via `npm audit fix`
node_modules/node-fetch
puppeteer 10.0.0 - 13.1.1
Depends on vulnerable versions of node-fetch
node_modules/puppeteer
2 high severity vulnerabilities
To address all issues, run:
npm audit fix
puppeteerで使っているnode-fetch 2.6.5に脆弱性があるということが示されました。puppeteer 13.1.1のpackage.jsonも確認してみましょう。
(省略)
"dependencies": {
"debug": "4.3.2",
"devtools-protocol": "0.0.948846",
"extract-zip": "2.0.1",
"https-proxy-agent": "5.0.0",
"node-fetch": "2.6.5",
"pkg-dir": "4.2.0",
"progress": "2.0.3",
"proxy-from-env": "1.1.0",
"rimraf": "3.0.2",
"tar-fs": "2.1.1",
"unbzip2-stream": "1.4.3",
"ws": "8.2.3"
},
(省略)
ここですね。ちなみに puppeteer 13.1.2 では以下のように直っています。
(省略)
"dependencies": {
"debug": "4.3.2",
"devtools-protocol": "0.0.948846",
"extract-zip": "2.0.1",
"https-proxy-agent": "5.0.0",
"node-fetch": "2.6.7",
"pkg-dir": "4.2.0",
"progress": "2.0.3",
"proxy-from-env": "1.1.0",
"rimraf": "3.0.2",
"tar-fs": "2.1.1",
"unbzip2-stream": "1.4.3",
"ws": "8.2.3"
},
(省略)
NodeJSのモジュールは依存するモジュールを npm install --save
で手軽にインストールできます。一方でRedHat/CentOSのRPMやUbuntuのdebのように自動では更新されません。上記のpuppeteerのように依存するNodeJSモジュールのバージョンを固定してしまっていると、そのバージョンに脆弱性があったとしても、そのまま使うことになります。
一方で npm outdated
などで更新できるようにする方法もあります。その場合は package.json のバージョンを固定にしないで「このバージョン以上」とすることです。
"node-fetch": "^2.6.7",
こうすることで仮にnode-fetchの2.6.8がリリースされたら、自動的にそちらをインストールするようにできるのです。
puppeteer 13.1.1 ではこの「^」がなかったことで古い(2.6.5)node-fetchを指定したままとなりました。最終的には新しい(2.6.7)node-fetchを指定したpuppeteer 13.1.2がリリースされましたが、しばらくの間はpuppeteerのビルドが失敗するという状況が続いてしまいました。かくいう自分も、これが原因でしばらくの間CI/CDがエラーになってしまい、puppeteerを使ったテストが行えない状態にありました。もしも上記のように「^」を含めて、自動的に新しいnode-fetchを使うようになっていたらpuppeteerの更新を待つ必要はなかったですし、そもそもpuppeteerも新しいリリースを出す必要もなかったのではないかと思いました。
もちろん、バージョンが上がることで動作が変わったり、互換性がないこともあります。そうした確認をしていないのに、新しいバージョンを使うように指定することに躊躇することもあるでしょう。ですが、マイクロバージョンであれば(一般的には)大きな仕様の変更はないと考えられます。利用者の利便性を考えたら、バージョン固定ではなく、最新版を使うようにpackage.jsonを書く方がよいのでないか?と思ったケースでした。