notebook

都内でWEB系エンジニアやってます。

Renovateで正規表現を使い独自フォーマットファイルの依存を自動更新をする

個人でも便利に使っているRenovateですが正規表現でよしなにできるようだったので記事を書きました

Renovateとは

プロジェクトの依存関係(Dependency)の更新を自動化するツール

よくある事例では「npmモジュールのバージョン更新を自動でやってもらいPRまで出してもらえる」などがある

npmの他にもRubyGemsやDockerイメージなどさまざまな依存に対応している

regex manager

さっそく本題だが正規表現を使って依存対象を特定できるよう

既存のmanagerでは対応していない形式のファイルでも正規表現で頑張ることによって対象の依存の特定とPRの作成まで行ってくれる

これはやってみるしかない!

ドキュメントは下記

Renovate Docs | Renovate Docs

docs.renovatebot.com

設定する前に他にも特有の概念が出てくるので軽く触れておく

manager

公式ドキュメントの内容をそのまま翻訳して引用します

Renovate は、「パッケージマネージャ」、略して「マネージャ」という概念に基づいています。npm、Bundler、Composerのような伝統的なパッケージマネージャから、CircleCIやTravisの設定ファイルのような伝統的ではない概念まで、様々なものがあります。 Renovateの目的は、リポジトリ内のサードパーティの依存関係をすべて検出し、管理することです。

Managers - Renovate Docs | Renovate Docs

docs.renovatebot.com

どの種類のパッケージを検出するの?というのを扱う概念

datasource

どこからバージョン情報を取ってくるの?という情報を持っている

Datasources - Renovate Docs | Renovate Docs

docs.renovatebot.com

個人的感想だがgithub-releases,github-tagsが用意されていて良いと感じた

releaseは作っていないけどタグは打ってあるといったプロジェクトもあったりするのでそういう場合は設定をいじることで使い分けられる

versioning

どのようなフォーマットでバージョン文字列を比較するの?という情報を持っている

Configuration Options | Renovate Docs

docs.renovatebot.com

基本はsemver,dockerでチェックするが独自のフォーマットでバージョニングしている場合はversioningを指定することで比較方法を変更できる

公式の例を見てみる

Renovate Docs | Renovate Docs

ソースは本記事にも載せておく

  • 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
    • matchStringdepNameをキャプチャしていない場合は必要
    • もしくはlookupNamelookupNameTemplateでも指定可能
  • datasourceTemplate
    • matchStringdatasourceをキャプチャしていない場合は必要
  • 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が作成されていた

f:id:swfz:20200609031135p:plain

f:id:swfz:20200609031142p:plain

おわり

Renovateで正規表現を使って独自フォーマットのファイルを更新する事例を紹介しました

Renovate自体はファイルの分割がしっかりされているので概念と構成を理解しておけば追うのもそこまでつらくはなさそう

勉強になりました

正規表現力を上げてくぞ!