🎃

Renovate でプライベートリポジトリにあるライブラリをインストールできるようにする

2024/08/19に公開

はじめに

私が参画しているプロダクトでは、ライブラリのアップデートを積極的に行い、常に最新バージョンを使用する方針を採っています。その一環として、ライブラリのアップデート管理に Renovate を使用しています。

https://docs.renovatebot.com/

しかし、ある時から Renovate が定期的に作成するライブラリアップデート用のプルリクエストで実行されている CI が失敗するようになりました。今回の記事では、その原因と対処法について振り返りを兼ねて解説します。

CI が落ちていた原因

CI 実行時に yarn install --mode=update-lockfile が実行されますが、この際にプライベートリポジトリからライブラリを取得する処理が失敗していました。

具体的には、プライベートリポジトリからライブラリをインストールするために、 yarn の設定ファイルで環境変数 TIPTAP_PRO_TOKEN を使用してトークンを渡すようにしていましたが、CI 上でこの環境変数が設定されていなかったことが原因です。

.yarnrc.yml
yarnPath: .yarn/releases/yarn-4.1.1.cjs

npmScopes:
  tiptap-pro:
    npmRegistryServer: 'https://registry.tiptap.dev'

npmRegistries:
  'https://registry.tiptap.dev':
    npmAuthToken: ${TIPTAP_PRO_TOKEN}

この問題に対処するため、Renovate を CI で実行する際に環境変数を設定する方法を試みましたが、うまくいきませんでした。

環境変数を渡せなかった理由

この問題の主な原因は、 Renovate が Mend cloud 上で実行されていたことにあります。

Renovate 実行時に、環境変数を渡すためにenv オプションを以下のように設定しました。

renovate.json5
{
  "env": {
    "TIPTAP_PRO_TOKEN": "xxxxxxxxxxx"
  }
}

しかし、env オプションの説明には次のような警告が記載されています。

つまり、env オプションで設定した環境変数を使用するには、 allowedEnv に同名の値を設定する必要がありますが、これは「self-hosted」環境でのみ利用可能なオプションです。そのため、 Mend cloud では env オプション自体が使用できませんでした。

[解決策] hostRules オプションを利用して、npmRegistries の設定を上書き

他のアプローチを模索していたところ、ドキュメント内に適切な解決策が記載されている箇所を見つけました。

https://docs.renovatebot.com/getting-started/private-packages/#yarn-2

以下に yarn の設定ファイルを再掲します。

.yarnrc.yml
yarnPath: .yarn/releases/yarn-4.1.1.cjs

npmScopes:
  tiptap-pro:
    npmRegistryServer: 'https://registry.tiptap.dev'

npmRegistries:
  'https://registry.tiptap.dev':
    npmAuthToken: ${TIPTAP_PRO_TOKEN}

この設定にある npmRegistries の設定を、hostRules オプションに適切な値を設定することで、yarn 実行前に npmRegistries を更新できることが分かりました。

そこで、Renovate の設定ファイルに以下の設定を追加しました。

renovate.json5
{
  hostRules: [
    {
      matchHost: 'https://registry.tiptap.dev',
      hostType: 'npm',
      token: '{{ secrets.TIPTAP_PRO_TOKEN }}',
    },
  ],
}

{{ secrets.xxxxx }} と設定することで、 Renovate 実行時に事前に設定した秘匿情報でトークンを置き換えてくれます。秘匿情報の設定は、 Mend cloud 上で実行している場合はダッシュボードから以下のように設定できます。

https://docs.renovatebot.com/getting-started/private-packages/#encrypting-secrets

この設定変更により、yarn install --mode=update-lockfile が期待通りに動作し、 CI も落ちなくなりました 🎉

最後に

CI が失敗していたことが原因で、一時的に Renovate が作成したブランチを手元に pull して、ローカル環境でライブラリをアップデートし、再度リモートブランチにマージするという手間のかかるフローを強いられていました。今回の修正により、これらの問題が解決され、作業効率が大幅に改善されたことを嬉しく思います。

しくみのテックブログ

Discussion