ネクストスケープでは、会社やチームの技術ブログを集約する Hub のようなサイト(Team Blog Hub)を作って公開しています。
このサイトは Azure Static Web Apps 上で運用しており、GitHub Actions からデプロイしているのですが、OpenSSL の互換性エラーに遭遇したので顛末をまとめておきます。
gooner.hateblo.jp
現象
最新の投稿を取得するために Schedule トリガーでパイプラインを毎日実行させていますが、2024/8/15 からエラーが発生するようになりました。
エラーが発生していたのは、yarn build を実行したタイミングでした。
詳細なエラーメッセージをこちらです。
Error: error:0308010C:digital envelope routines::unsupported at new Hash (node:internal/crypto/hash:79:19) at Object.createHash (node:crypto:139:10) at module.exports (C:\develop\team-blog-hub\node_modules\webpack\lib\util\createHash.js:135:53) at NormalModule._initBuildHash (C:\develop\team-blog-hub\node_modules\webpack\lib\NormalModule.js:417:16) at handleParseError (C:\develop\team-blog-hub\node_modules\webpack\lib\NormalModule.js:471:10) at C:\develop\team-blog-hub\node_modules\webpack\lib\NormalModule.js:503:5 at C:\develop\team-blog-hub\node_modules\webpack\lib\NormalModule.js:358:12 at C:\develop\team-blog-hub\node_modules\loader-runner\lib\LoaderRunner.js:373:3 at iterateNormalLoaders (C:\develop\team-blog-hub\node_modules\loader-runner\lib\LoaderRunner.js:214:10) at Array. (C:\develop\team-blog-hub\node_modules\loader-runner\lib\LoaderRunner.js:205:4) { opensslErrorStack: [ 'error:03000086:digital envelope routines::initialization error', 'error:0308010C:digital envelope routines::unsupported' ], library: 'digital envelope routines', reason: 'unsupported', code: 'ERR_OSSL_EVP_UNSUPPORTED'
ローカルの開発環境でビルドを実行した際にも、エラーが再現しました。
原因
エラーメッセージをインターネットで検索してみると、OpenSSL の互換性エラーだと分かりました。
Node.js 17.x 以降から OpenSSL の v3.0.0 がデフォルトで使われるようになり、サイトで使われている OpenSSL のバージョンと互換性が取れなくなっていました。
nodejs.org
対応
環境変数を設定することで、OpenSSL のレガシープロバイダーを有効にできます。
$ export NODE_OPTIONS=--openssl-legacy-provider
package.json で環境変数を設定すると、ローカルの開発環境でビルドが成功しました。
{ "name": "my-app", "version": "0.1.0", "private": true, "scripts": { "dev": "set NODE_OPTIONS=--openssl-legacy-provider && next dev", "build": "run-s build:posts build:next", "build:posts": "ts-node --project tsconfig.builder.json ./src/builder/posts.ts", "build:next": "set NODE_OPTIONS=--openssl-legacy-provider && next build && next export", "start": "set NODE_OPTIONS=--openssl-legacy-provider && next start" }, }
この修正だけでは GitHub Actions 内でのビルドは成功しなかったので、workflow の yml でも環境変数を設定しました。
name: Azure Static Web Apps CI/CD Timer Trigger on: schedule: - cron: '0 6 * * *' jobs: build_and_deploy_job: runs-on: ubuntu-latest name: Build and Deploy Job env: NODE_OPTIONS: --openssl-legacy-provider steps: - uses: actions/checkout@v2 with: submodules: true
まとめ
GitHub Actions から Azure Static Web Apps へのデプロイが OpenSSL の互換性エラーで失敗していたので、環境変数を設定して対応しました。
インフラ(Azure)やアプリには変更を加えていなかったので、GitHub Actions が実行される環境にアップデートが入ったのかもしれません。
修正内容の詳細は、こちらの Pull Request を参照してください。
github.com