RenovateでPrivate Submodulesを扱う
RenovateはPrivate Submoduleに対応していない
Renovateは独自にcloneしたリポジトリに対して実行されます。
そのためGitHub Actions側でSubmoduleをcloneしても意味がありません。
また残念なことにcloneSubmodules設定はPrivate Submoduleに対応していないと明記されています。
Important: private submodules aren't supported by Renovate, unless the underlying
sshlayer already has the correct permissions.
これではパッケージ管理ツールからSubmoduleをPath指定している場合に困ります。
Submoduleをやめるという方法もありますが、Renovateの都合でプロジェクト構造を制限されるのは避けたいところです。
いろいろ試した結果、解決策が見つかったので共有します。
要件
- Personal access tokenではなくGitHub Appによる認証がしたい。
- 個人のPATを会社で使いたくない。
- Submoduleは複数あり、SSHとHTTPが混在している。
- 上記公式ドキュメントに書かれているようなSSHレイヤーでの解決では不十分。
DependabotもPersonal access tokenでの認証はできないようでした。
Self-hosted Renovate
今まではRenovate GitHub Appを使用してMend-hostedを利用していましたが、今回の設定を適用するにはSelf-hostedに乗り換える必要があります。
ここではGitHub Action Renovateを使用します。
設定
GitHub App
以下の通りRenovateが指定する権限を付与する必要があります。
| Permission | Scope |
|---|---|
| Checks |
read + write
|
| Commit statuses |
read + write
|
| Contents |
read + write
|
| Issues |
read + write
|
| Pull requests |
read + write
|
| Workflows |
read + write
|
| Administration | read |
| Dependabot alerts | read |
| Members | read |
| Metadata | read |
インストール後の権限変更は、インストール画面で権限の追加を承認する必要があります。
GitHub Repository
既存のRenovate GitHub Appは無効化しましょう。
そしてRenovate Actionで使用できるよう、Actions secrets and variablesに以下のように値を追加します。
| 種別 | 値 | 名前 |
|---|---|---|
| Variables | App ID | GH_APP_ID |
| Secrets | Private key | GH_APP_PRIVATE_KEY |
GitHub Actions
以下の内容を.github/workflows/renovate.ymlとしてリポジトリに保存します。
name: Renovate
on:
schedule:
# 15分ごとに実行
- cron: "0/15 * * * *"
workflow_dispatch:
jobs:
renovate:
runs-on: ubuntu-latest
steps:
- name: Generate github token
uses: actions/create-github-app-token@v1
id: app-token
with:
app-id: ${{ vars.GH_APP_ID }}
private-key: ${{ secrets.GH_APP_PRIVATE_KEY }}
owner: ${{ github.repository_owner }}
- uses: actions/checkout@v4
with:
submodules: "recursive"
token: ${{ steps.app-token.outputs.token }}
persist-credentials: false
- name: Self-hosted Renovate
uses: renovatebot/github-action@v41.0.13
with:
configurationFile: self_hosted_renovate.js
token: ${{ steps.app-token.outputs.token }}
env-regex: "^(?:RENOVATE_\\w+|LOG_LEVEL|GITHUB_COM_TOKEN|NODE_OPTIONS|GIT_CONFIG_\\w+)$"
env:
GIT_CONFIG_COUNT: "2"
GIT_CONFIG_KEY_0: "url.https://x-access-token:${{ steps.app-token.outputs.token }}@github.com/.insteadOf"
GIT_CONFIG_VALUE_0: "https://github.com/"
GIT_CONFIG_KEY_1: "url.https://x-access-token:${{ steps.app-token.outputs.token }}@github.com/.insteadOf"
GIT_CONFIG_VALUE_1: "git@github.com:"
env部分のGIT_CONFIG_*がポイントです。Gitのurl.<base>.insteadOf設定を使い、https://github.com/やgit@github.com:で始まるURLを、トークン付きのURLに自動で書き換えます。
これによりRenovateがSubmoduleをcloneする際、認証情報が自動的に付与されます。公式ドキュメントが示唆する「sshレイヤーでの解決」と同様、Renovate外で認証を解決するアプローチです。
Renovate configuration
以下の内容を編集してself_hosted_renovate.jsとしてリポジトリに保存します。
module.exports = {
dependencyDashboard: true,
onboarding: false,
requireConfig: "optional",
branchPrefix: "self-hosted-renovate/",
// 既存のRenovateブランチが邪魔してうまく動かない場合はコメントを外す。
// branchPrefixOld: "ignore-old-renovate/",
platform: "github",
repositories: [
// 適用リポジトリに編集してコメントを外す。
// "org_name/repository"
],
cloneSubmodules: true,
};
最後に
もっとスマートな方法があれば教えてください。
Discussion