CircleCI で android-docker executor を Renovate でアップデートする

![Notes_220926_185151-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359439/6ade740f-5c92-6f8e-9885-55aec76602e9.jpeg)

CircleCI で Android の CI を行うときは 公式のブログ記事にもあるように、
たいてい謹製で用意されている `circleci/android` Orb を使用すると思います。

https://circleci.com/ja/blog/building-android-on-circleci/

https://circleci.com/developer/ja/orbs/orb/circleci/android

ところで、この Orb にはバージョンが切られているわけですが、
その更新は [Renovate](https://www.mend.io/free-developer-tools/renovate/) を導入して自動化することで
忘れることもなくチェックの手間もなく楽にできます:

https://docs.renovatebot.com/modules/manager/circleci/

しかしながら、この Orb が指定する `executor` のタグに関しては
デフォルトそのままでバージョンアップをしてくれないので、
少しだけ工夫して renovate に面倒をみてもらうことにします。

## サンプル CircleCI config

サンプルに Android Orb を使った最小の config を用意しました:

```yml:.circleci/config.yml
version: 2.1
orbs:
  android: circleci/android@2.0.3
jobs:
  build:
    executor:
      name: android/android-docker
      resource-class: small
      tag: 2022.08.1
    steps:
      - checkout

workflows:
  android-workflow:
    jobs:
      - build
```

ここの `jobs.build.executor` が実行する executor で、その `executor.tag` が executor のイメージのタグですね。

このタグの一覧は `cimg/android` のページで確認することができます:

https://circleci.com/developer/images/image/cimg/android#image-tags

サンプルでは `2022.08.1` を指定していますが、書いている今は `2022.09.2` が出ていますから、既に最新ではなくなっています。

## Renovate で検出可能にする

Renovate の config を用意してみます:

```json:renovate.json
{
  "$schema": "https://docs.renovatebot.com/renovate-schema.json",
  "regexManagers": [

  ]
}
```

ここの `regexManagers` に正規表現のパターンを入れることで、任意のパターンと特定のデータソースの更新というふうに紐づけて更新してもらうことを考えます。

https://docs.renovatebot.com/modules/manager/regex/

今回の例で言うと 次のような正規表現で executor とそのタグを検出することにします:

```json:renovate.json
{
  "$schema": "https://docs.renovatebot.com/renovate-schema.json",
  "regexManagers": [
    {
      "fileMatch": [
        ".circleci/config.yml"
      ],
      "matchStrings": [
        "executor:\\s+name:\\s*android/android-docker(\\s+resource-class:.+)?\\s+tag:\\s*(?<currentValue>[0-9.]+)"
      ],
    }
  ]
}
```

`config.yml` の `executor` 以下の並びなど書き方がプロジェクトによって違う場合は、合うように matchStrings` を調整するとよいでしょう。

https://regex101.com/

正規表現のテストができるサービスを使ったりすると便利です。

![regex101__build__test__and_debug_regex.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359439/bc8b3a27-c3c1-1fce-3276-a96a9e23df25.png)

(※ `renovate.json` では `\` を `\\` とエスケープしていて、逆に regex101 では `/` を `\/` とエスケープしていることに注意しましょう)

## Docker データソースの指定

次に、`cimg/android` を参照していることからわかるように、もとより Docker イメージなので Docker Registry をバージョン情報のソースとして更新してもらいたいと思います:

https://hub.docker.com/r/cimg/android

データソースとして `docker` を指定することで Renovate がよしなに面倒をみてくれるようになります:

https://docs.renovatebot.com/modules/datasource/#docker-datasource

```json:renovate.json
{
  "$schema": "https://docs.renovatebot.com/renovate-schema.json",
  "regexManagers": [
    {
      "fileMatch": [
        ".circleci/config.yml"
      ],
      "matchStrings": [
        "executor:\\s+name:\\s*android/android-docker(\\s+resource-class:.+)?\\s+tag:\\s*(?<currentValue>[0-9.]+)"
      ],
      "depNameTemplate": "cimg/android",
      "datasourceTemplate": "docker",
      "versioningTemplate": "docker"
    }
  ]
}
```

さらに `2022.08.1-node` のようなバリアントイメージを無視して、本流のみを採用できるように `packageRules.allowedVersion` も指定します:

https://docs.renovatebot.com/configuration-options/#allowedversions

```json:renovate.json
{
  "$schema": "https://docs.renovatebot.com/renovate-schema.json",
  "regexManagers": [...省略...],
  "packageRules": [
    {
      "matchDatasources": [
        "docker"
      ],
      "matchPackageNames": [
        "cimg/android"
      ],
      "allowedVersions": "/^[0-9]{4}\\.[0-9]{2}\\.[0-9]+$/"
    }
  ]
}
```

これで Renovate config の記述ができました。

## 確認する

これで今回のパターンを検出できることを確認します。

サンプルのリポジトリをつくってみました:

https://github.com/mangano-ito/circleci-android-docker-sandbox

Renovate Dashboard で結果をみてみると検出され…

![job.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359439/72847521-fdd0-4046-fc2b-8f40ad2e89aa.png)

Renovate が `android-docker` のタグの更新 PR を作ってくれたのでよさそうですね:

![Update_cimg_android_Docker_tag_to_v2022_09_2_by_renovate_bot__·_Pull_Request__2_·_mangano-ito_circleci-android-docker-sandbox.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359439/c6aa8dd4-0e71-bbc4-bed0-c8bc74fb25ff.png)

https://github.com/mangano-ito/circleci-android-docker-sandbox/pull/2

以上です。よき自動化ライフを。