🎨

GitLab CIでFlutterアプリにRenovateを導入する

2023/03/10に公開

はじめに

GitLab(Self-hosting)のFlutterアプリレポジトリにRenovateを導入しました。

参考になるまとまった記事が少なく、意外に手間取ったためにこちらにメモとして残しておきます。

環境

  • GitLab 15.7.7-ee
  • Flutter 3.7.5
  • Renovate 34.152.3

導入方法

1. renovate.jsonを追加する

レポジトリールートに以下のファイルを配置します。

renovate.json
{
  "extends": [
    "config:base"
  ],
  "enabledManagers": ["pub"],
  "timezone": "Asia/Tokyo",
  "labels": ["dependencies"],
  "baseBranches": ["main"],
  "branchPrefix": "renovate/",
  "semanticCommits": "enabled",
  "semanticCommitType": "build",
  "semanticCommitScope": "deps",
  "rangeStrategy": "replace",
  "rebaseWhen": "conflicted",
  "lockFileMaintenance": {
    "enabled": true
  },
  "ignorePresets": [
    ":dependencyDashboard",
    ":semanticPrefixFixDepsChoreOthers",
    ":prHourlyLimit2"
  ]
}

設定項目はこちらから確認できます。
https://docs.renovatebot.com/configuration-options/

  • enabledManagersは、pubのみにします。そうしないと、cocoapods, gradle, gradle-wrapper, gitlabciが検出されて、意図しないMRが発行されてしまいます。
  • ignorePresetsは、お好みで設定してください。デフォルトで入っているpresetはこちらから確認できます。

https://docs.renovatebot.com/presets-config/#configbase

2023/3月現在、config:baseのpresetsはこちらです。

config:base
{
  "extends": [
    ":dependencyDashboard",
    ":semanticPrefixFixDepsChoreOthers",
    ":ignoreModulesAndTests",
    ":autodetectRangeStrategy",
    ":prHourlyLimit2",
    ":prConcurrentLimit10",
    "group:monorepos",
    "group:recommended",
    "workarounds:all"
  ]
}

2. スケジュールビルドのために.gitlab-ci.ymlを追加する

ポイント

  • renovate/renovateのslimイメージを使う
    • slimでないと想定外のflutter versionが使われてしまう可能性ある
  • flutter sdkを適切なバーションでインストールして、PATHを設定する
  • renovateを実行する
.gitlab-ci.yml
stages:
  - dependency

renovate:
  stage: dependency
  image:
    name: renovate/renovate:34.152.3-slim
    entrypoint: [""]
  before_script:
    # Get Flutter SDK
    - git clone --depth 1 --branch ${FLUTTER_VERSION} https://github.com/flutter/flutter.git ${FLUTTER_ROOT}
    - PATH="$PATH:${FLUTTER_ROOT}/bin:/${FLUTTER_ROOT}/bin/cache/dart-sdk/bin"
  script:
    - renovate --platform gitlab --token $API_TOKEN --endpoint $CI_SERVER_URL/api/v4 $CI_PROJECT_PATH
  variables:
    FLUTTER_ROOT: "~/flutter"
    RENOVATE_GITHUB_TOKEN_WARN: "false"
  rules:
    - if: $RENOVATE && $CI_PIPELINE_SOURCE == "schedule"

https://panda-program.com/posts/renovate-gitlab

を参考にさせていただきました。

  • API_TOKENは、Settings > CI/CD > Variablesに設定します。
  • FLUTTER_ROOTは、~/flutterにしないとPermission errorでうまく動きません。
  • 必要に応じて、SSH Keyのセットアップが必要になるかもしれません。
  • $CI_PIPELINE_SOURCE == "schedule"でSchduled pipelineのみで実行されるようにしています。
  • RENOVATEでrenovate用のSchduled pipelineのみで実行されるようにしています。

RENOVATE_GITHUB_TOKEN_WARNは、renovateに対して設定しているオプションです。以下のページで確認できます。

https://docs.renovatebot.com/self-hosted-configuration/

3. GitLabでSchduled pipelineを設定する

詳しくはこちらをご覧ください。
https://docs.gitlab.com/ee/ci/pipelines/schedules.html

前述のサンプルを使う場合は、Variableに RENOVATE を追加してください。値は1です。

動作確認方法

以下の方法を実施したい場合は、baseBranchesrenovate.jsonがないとdry runもできないので、まず入れてしまいましょう。

Local

renovateはnpxで取得できるので以下のように実行できます。環境変数は適当な値を設定します。

$ npm install renovate@34.152.3
$ npx renovate --platform gitlab --token $API_TOKEN --endpoint $CI_SERVER_URL/api/v4  $CI_PROJECT_PATH  --dry-run

GitLab

Schduled pipelineは、次回の実行を待たずに、▷マークで実行できます。このとき、指定するブランチはトピックブランチに変更しても問題ありません。

作成前のこちらで.gitlab-ci.ymlのスクリプトをdry runにするなどテスト用に変更しつつ、実行結果からrenovate.jsonを調整していきます。

困った点

地味に困ったのはrenovate docker imageがlinux/amd64しかないことです。手元のM1 Macでdocker内での実行を簡単に調査できませんでした。
最初、Flutterをインストールする場所を~/flutter以外に設定したのでPermissionエラーが発生しデバックに苦労しました。

最後に

Flutterアプリは依存するpackage/pluginが多くなる傾向にあります。Renovateを導入することで、それらの更新やパッケージ同士の相互依存を把握することが容易になります。

さらに、GitLab CIでflutter test/analyze等を実行できるようにすることで、自動作成されるMRが与える影響をより把握できるようになります。安全なバージョンアップの対策を練ることができます。

Discussion