個人でも便利に使っているRenovateですが正規表現でよしなにできるようだったので記事を書きました
Renovateとは
プロジェクトの依存関係(Dependency)の更新を自動化するツール
よくある事例では「npmモジュールのバージョン更新を自動でやってもらいPRまで出してもらえる」などがある
npmの他にもRubyGemsやDockerイメージなどさまざまな依存に対応している
regex manager
さっそく本題だが正規表現を使って依存対象を特定できるよう
既存のmanagerでは対応していない形式のファイルでも正規表現で頑張ることによって対象の依存の特定とPRの作成まで行ってくれる
これはやってみるしかない!
ドキュメントは下記
設定する前に他にも特有の概念が出てくるので軽く触れておく
manager
公式ドキュメントの内容をそのまま翻訳して引用します
Renovate は、「パッケージマネージャ」、略して「マネージャ」という概念に基づいています。npm、Bundler、Composerのような伝統的なパッケージマネージャから、CircleCIやTravisの設定ファイルのような伝統的ではない概念まで、様々なものがあります。 Renovateの目的は、リポジトリ内のサードパーティの依存関係をすべて検出し、管理することです。
Managers - Renovate Docs | Renovate Docs
どの種類のパッケージを検出するの?というのを扱う概念
datasource
どこからバージョン情報を取ってくるの?という情報を持っている
Datasources - Renovate Docs | Renovate Docs
個人的感想だがgithub-releases
,github-tags
が用意されていて良いと感じた
releaseは作っていないけどタグは打ってあるといったプロジェクトもあったりするのでそういう場合は設定をいじることで使い分けられる
versioning
どのようなフォーマットでバージョン文字列を比較するの?という情報を持っている
Configuration Options | Renovate Docs
基本はsemver
,docker
でチェックするが独自のフォーマットでバージョニングしている場合はversioningを指定することで比較方法を変更できる
公式の例を見てみる
ソースは本記事にも載せておく
- Dockerfile
FROM node:12 ENV YARN_VERSION=1.19.1 RUN curl -o- -L https://yarnpkg.com/install.sh | bash -s -- --version ${YARN_VERSION}
- renovate.json
{ "regexManagers": [ { "fileMatch": ["^Dockerfile$"], "matchStrings": ["ENV YARN_VERSION=(?<currentValue>.*?)\n"], "depNameTemplate": "yarn", "datasourceTemplate": "npm" } ] }
これでこのDockerfile内のyarnのバージョンが補足できるよう
この例だとcurrentValue
のみ取得しているが他にもdatasource
,depName
,versioning
なども名前付きキャプチャで取得すれば利用できる
必須オプション
- fileMatch
- 対象のファイルを指定する
- matchString
- 正規表現を書く
- 名前付きキャプチャを使用する
currentValue
は必ず含める必要がある
オプショナル
- depNameTemplate
matchString
でdepName
をキャプチャしていない場合は必要- もしくは
lookupName
とlookupNameTemplate
でも指定可能
- datasourceTemplate
matchString
でdatasource
をキャプチャしていない場合は必要
- versioningTemplate
- デフォルトは
semver
を使用する
- デフォルトは
ドキュメントにも書いてあるが正規表現と名前付きキャプチャグループ
を活用している
要は正規表現とオプションでcurrentValue
,depName
,datasource
,versioning
をRenovateが把握できるように書いてあげればOK
公式の例を見てみる2
- Dockerfile
ARG IMAGE=node:12@sha256:6e5264cd4cfaefd7174b2bc10c7f9a1c2b99d98d127fc57a802d264da9fb43bd FROM ${IMAGE} # renovate: datasource=github-tags depName=nodejs/node versioning=node ENV NODE_VERSION=10.19.0 # renovate: datasource=github-releases depName=composer/composer ENV COMPOSER_VERSION=1.9.3 # renovate: datasource=docker depName=docker versioning=docker ENV DOCKER_VERSION=19.03.1 # renovate: datasource=npm depName=yarn ENV YARN_VERSION=1.19.1
- renovate.json
{ "regexManagers": [ { "fileMatch": ["^Dockerfile$"], "matchStrings": [ "datasource=(?<datasource>.*?) depName=(?<depName>.*?)( versioning=(?<versioning>.*?))?\\sENV .*?_VERSION=(?<currentValue>.*)\\s" ], "versioningTemplate": "{{#if versioning}}{{versioning}}{{else}}semver{{/if}}" }, { "fileMatch": ["^Dockerfile$"], "matchStrings": [ "ARG IMAGE=(?<depName>.*?):(?<currentValue>.*?)@(?<currentDigest>sha256:[a-f0-9]+)s" ], "datasourceTemplate": "docker" } ] }
regexManager
は配列で指定するのでパターンが複数ある場合は複数設定可能
xxx_VERSION
の箇所は一ヵ所にまとめて設定している(1つ目)
この例だとDockerfileのコメントの内容でdepName
,datasource
,versioning
を指定している
なかなかパワープレイ感ある気もするがともあれこういう使い方ができるのかと感心した
設定してみる
使い方が把握できたので実際に書いて動かしてみる
Renovateの基本的な導入方法などについては割愛する
例の他でありそうなのはAnsibleで特定のツールのバージョンを指定してインストールするためにhoge_version
みたいなdictを用意している場合などが想定される
例2にならってコメント中に名前付きキャプチャできるような情報を入れる
- renovate.json
{ "extends": [ "config:base" ], "regexManagers": [ { "fileMatch": ["ansible_vars.yml"], "matchStrings": [ "datasource=(?<datasource>.*?) depName=(?<depName>.*?)( versioning=(?<versioning>.*?))?\n.*?_version: (?<currentValue>.*)\n" ], "versioningTemplate": "{{#if versioning}}{{versioning}}{{else}}semver{{/if}}" } ] }
- ansible_vars.yml
# datasource=github-releases depName=sharkdp/bat bat_version: v0.15.1
上記設定でしばらく待つとPRが作成されていた
おわり
Renovateで正規表現を使って独自フォーマットのファイルを更新する事例を紹介しました
Renovate自体はファイルの分割がしっかりされているので概念と構成を理解しておけば追うのもそこまでつらくはなさそう
勉強になりました
正規表現力を上げてくぞ!