ROMANCE DAWN for the new world

Microsoft Azure を中心とした技術情報を書いています。

GitHub Actions から Azure Static Web Apps へのデプロイが OpenSSL の互換性エラーで失敗していた件

ネクストスケープでは、会社やチームの技術ブログを集約する 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