最近様々なGitHub Actionsのactionsで更新があり、いちいちバージョンを調べるのが大変なので自動でやって欲しい、でもリポジトリにRenovateを本格的に設定するのは少し面倒でやりたくない人向けのメモです。
DockerでRenovateを動作させ、PRを作成させます。
- この記事は人の手で書かれています
- AI(Gemini)に校正をお願いし人手で修正しています
- コードは人手で書き、動作確認したものを整形して掲載しています
事前準備
Dockerのインストール
公式サイトのドキュメントなどを参考に、お使いの環境にインストールしてください。
使うイメージは ghcr.io/renovatebot/renovate:latest
なので、pullしておきましょう。
docker pull ghcr.io/renovatebot/renovate:latest
GitHubリポジトリへの権限
該当リポジトリに対するコミット権限やPRを作成する権限が必須です。
GitHubのトークンの準備
repo
と workflow
のスコープのあるトークンが必要です。
PATの発行は公式ドキュメントを参照してください。
PATは漏出すると大変大きな被害につながります。十分注意してください。
ghコマンドをインストールしている場合
gh auth token
でトークンを取得できます。
gh auth status
で有効になっているスコープを確認できます。
github.com
✓ Logged in to github.com account k-kojima-yumemi (keyring)
- Active account: true
- Git operations protocol: ssh
- Token: gho_************************************
- Token scopes: 'gist', 'read:user', 'repo', 'workflow'
Token scopesの箇所に有効になっているスコープが記載されています。
もしスコープが有効になっていない場合は gh auth refresh -s workflow,repo
で再ログインすると有効にできます。
署名設定 (必要な場合)
Renovateを手元から動かす場合には、クラウドで動作しているRenovateのようにgitのコミットに署名してはくれません。
そのため、署名が必須のリポジトリでは手元のRenovateでも署名させる必要があります。
こちらに gitPrivateKey
オプションについての記載があります。
dockerでRenovateを実行しGPGでの署名の場合、上記docsに記載の通りパスワードによる保護がかかっている場合は使用できません。(かかってない場合は使用できます)
headlessでない環境では使用できるようですが、試してはいないです。
自分はGPGにパスワードの保護をかけているため、新しくSSHによるコミット署名の設定をGitHubに追加しました。
の方法でコミット署名用のSSHキーを追加しています。
Dry run
いきなり実行して意図しないPRが作成されてしまうと掃除が大変です。
Dry runして更新される内容を確認しましょう。
以下コマンドでDry runできます。
docker run -it --rm \
-e LOG_LEVEL=info \
ghcr.io/renovatebot/renovate:latest \
--dry-run="full" \
--token="$(gh auth token)" \
--onboarding=false \
--platform="github" \
--require-config="optional" \
<対象リポジトリ>
-
--dry-run
には "full" と指定して下さい -
--token
は事前準備で準備したものを使用してください。今回のコマンドではgh
コマンドを使用して取得しています- https://docs.renovatebot.com/self-hosted-configuration/#token
- Dry runであってもGitHubからクローンして実行するため、tokenが必須です
-
--onboarding
はfalseにすることでRenovateのオンボーディングをスキップできます。リポジトリとしてRenovateを導入していないこと前提なので、trueだとオンボーディングのPRが作成されてしまいます -
--platform
は明示的にgithubを指定していますが、他プラットフォームを使用している場合は変更してください -
--require-config
はoptionalにしておくとリポジトリにRenovateの設定ファイルがある場合そちらも読み取ってくれます。ない場合はデフォルトの設定が使用されます
Pythonのプロジェクトで動かした場合以下の結果が得られました。
INFO: Repository started (repository=k-kojima-yumemi/test_repo)
"renovateVersion": "41.93.3"
INFO: Dependency extraction complete (repository=k-kojima-yumemi/test_repo, baseBranch=develop)
"stats": {
"managers": {
"docker-compose": {"fileCount": 1, "depCount": 0},
"dockerfile": {"fileCount": 1, "depCount": 1},
"github-actions": {"fileCount": 4, "depCount": 13},
"pip_requirements": {"fileCount": 2, "depCount": 6}
},
"total": {"fileCount": 8, "depCount": 20}
}
INFO: DRY-RUN: Would commit files to branch renovate/pytest-7.x (repository=k-kojima-yumemi/test_repo, branch=renovate/pytest-7.x)
INFO: DRY-RUN: Would commit files to branch renovate/black-24.x (repository=k-kojima-yumemi/test_repo, branch=renovate/black-24.x)
INFO: DRY-RUN: Would commit files to branch renovate/isort-5.x (repository=k-kojima-yumemi/test_repo, branch=renovate/isort-5.x)
INFO: DRY-RUN: Would commit files to branch renovate/pyproject-flake8-6.x (repository=k-kojima-yumemi/test_repo, branch=renovate/pyproject-flake8-6.x)
INFO: DRY-RUN: Would commit files to branch renovate/python-3.x (repository=k-kojima-yumemi/test_repo, branch=renovate/python-3.x)
INFO: DRY-RUN: Would create PR: Update dependency python to 3.13 (repository=k-kojima-yumemi/test_repo, branch=renovate/python-3.x)
INFO: DRY-RUN: Would commit files to branch renovate/public.ecr.aws-docker-library-python-3.x (repository=k-kojima-yumemi/test_repo, branch=renovate/public.ecr.aws-docker-library-python-3.x)
INFO: DRY-RUN: Would commit files to branch renovate/aws-actions-configure-aws-credentials-5.x (repository=k-kojima-yumemi/test_repo, branch=renovate/aws-actions-configure-aws-credentials-5.x)
INFO: DRY-RUN: Would commit files to branch renovate/black-25.x (repository=k-kojima-yumemi/test_repo, branch=renovate/black-25.x)
INFO: DRY-RUN: Would commit files to branch renovate/isort-6.x (repository=k-kojima-yumemi/test_repo, branch=renovate/isort-6.x)
INFO: DRY-RUN: Would commit files to branch renovate/pyproject-flake8-7.x (repository=k-kojima-yumemi/test_repo, branch=renovate/pyproject-flake8-7.x)
INFO: DRY-RUN: Would commit files to branch renovate/pytest-8.x (repository=k-kojima-yumemi/test_repo, branch=renovate/pytest-8.x)
INFO: DRY-RUN: Would close Dependency Dashboard (repository=k-kojima-yumemi/test_repo)
"title": "Dependency Dashboard"
INFO: DRY-RUN: Would save repository cache. (repository=k-kojima-yumemi/test_repo)
INFO: Repository finished (repository=k-kojima-yumemi/test_repo)
"cloned": true,
"durationMs": 23690
INFO: Renovate was run at log level "info". Set LOG_LEVEL=debug in environment variables to see extended debug logs.
のような結果が得られます。
"DRY-RUN: Would commit files to branch" のメッセージ部分に着目すると、どのパッケージがアップデートされるのかわかります。
今回はGitHub Actionsの依存関係のみアップデートしたいので、ここからフィルタリングしていきます。
--enabled-managers
のCLIオプションでmanagersを選択します。一覧は以下のdocsに記載されています。
--enabled-managers="github-actions"
と指定して再度Dry runします。
docker run -it --rm \
-e LOG_LEVEL=info \
ghcr.io/renovatebot/renovate:latest \
--dry-run="full" \
--token="$(gh auth token)" \
--onboarding=false \
--platform="github" \
--enabled-managers="github-actions" \
--require-config="optional" \
<対象リポジトリ>
INFO: Repository started (repository=k-kojima-yumemi/test_repo)
"renovateVersion": "41.93.3"
INFO: Dependency extraction complete (repository=k-kojima-yumemi/test_repo, baseBranch=develop)
"stats": {
"managers": {"github-actions": {"fileCount": 4, "depCount": 13}},
"total": {"fileCount": 4, "depCount": 13}
}
INFO: DRY-RUN: Would commit files to branch renovate/python-3.x (repository=k-kojima-yumemi/test_repo, branch=renovate/python-3.x)
INFO: DRY-RUN: Would create PR: Update dependency python to 3.13 (repository=k-kojima-yumemi/test_repo, branch=renovate/python-3.x)
INFO: DRY-RUN: Would commit files to branch renovate/aws-actions-configure-aws-credentials-5.x (repository=k-kojima-yumemi/test_repo, branch=renovate/aws-actions-configure-aws-credentials-5.x)
INFO: DRY-RUN: Would close Dependency Dashboard (repository=k-kojima-yumemi/test_repo)
"title": "Dependency Dashboard"
INFO: DRY-RUN: Would save repository cache. (repository=k-kojima-yumemi/test_repo)
INFO: Repository finished (repository=k-kojima-yumemi/test_repo)
"cloned": true,
"durationMs": 15352
INFO: Renovate was run at log level "info". Set LOG_LEVEL=debug in environment variables to see extended debug logs.
GitHub Actionsのファイルのみの更新になりました。
ただ、setup-python
で指定しているPythonのバージョンは変更したくないので、さらに絞り込みます。
RENOVATE_CONFIG
の環境変数を指定すると設定ファイルのJSONを読み込ませることができるので、そこでpackageRulesを記載します。
世に出ているRenovateの設定はJSONに記載する内容が多いので、紹介されている内容をそのまま使いやすくする目的もあります。
CLI形式でどのように指定するか分かりにくいオプションもあるため、そのような場合は RENOVATE_CONFIG
に記載するのが簡単です。
以下コマンドで実行します。読み込まれている設定を把握するためログはdebugにしています。ここでは大雑把にmatchDepNamesにpythonが含まれるものを弾くようにしています。必要な場合にはDry runを活用し意図した結果が得られるまで調整してください。それかオープンされたPRを手動でクローズするくらいでもいいかと思います。
docker run -it --rm \
-e LOG_LEVEL=debug \
-e RENOVATE_CONFIG='{"packageRules": [{"matchDepNames": "*python*", "enabled": false}]}' \
ghcr.io/renovatebot/renovate:latest \
--dry-run="full" \
--token="$(gh auth token)" \
--onboarding=false \
--platform="github" \
--enabled-managers="github-actions" \
--require-config="optional" \
<対象リポジトリ>
長いのでログは省略しますが、これで更新したいパッケージのみのPRを作成する準備が整いました。
本実行
Dry runで指定したオプションに加え、コミット関連の設定も追加します。
docker run -it --rm \
-e LOG_LEVEL=debug \
-e RENOVATE_CONFIG='{"packageRules": [{"matchDepNames": "*python*", "enabled": false}]}' \
-e RENOVATE_GIT_PRIVATE_KEY="$(awk 'ORS="\\n"' < <秘密鍵ファイルのパス>)" \
ghcr.io/renovatebot/renovate:latest \
--token="$(gh auth token)" \
--onboarding=false \
--platform="github" \
--enabled-managers="github-actions" \
--require-config="optional" \
--git-author 'k-kojima-yumemi <125636684+k-kojima-yumemi@users.noreply.github.com>'
<対象リポジトリ>
RENOVATE_GIT_PRIVATE_KEY
と --git-author
を追加しました。
-
RENOVATE_GIT_PRIVATE_KEY
はこちらに改行を\n
に書き換えるように指示があります- 改行の変換のため
awk 'ORS="\\n"'
を追加しています - GPG鍵であれば
gpg --export-secret-keys --armor
といったコマンドを使用することになるかと思います - SSH鍵なら秘密鍵ファイルを読み込ませれば大丈夫です
- 明示的にGitで署名を使わせる設定は不要です。Renovate側で設定しておいてくれます
- 改行の変換のため
-
--git-author
は署名をするためGitHubアカウントに登録されているメールアドレスにしています
この実行により以下のようにPRが作成されます。コミットも問題なくverifiedになっています。
上記のPRはグルーピングの設定を入れているので複数パッケージが更新されています。
RENOVATE_CONFIG
として
{
"packageRules": [
{
"matchDepNames": "*python*",
"enabled": false
},
{
"groupName": "gh",
"matchManagers": [
"github-actions"
]
}
]
}
を一行で指定していました。
まとめ
RenovateをDockerで動かし、PRを作成する方法を記載しました。
この方法はリポジトリにRenovateをインストールすることなく実行できるので、オンデマンドで1回だけ実行したいときに使えるかと思います。
毎週実行するのであれば普通にRenovateの設定をしたほうがいいです。