GitLab CIでFlutterアプリにRenovateを導入する
はじめに
GitLab(Self-hosting)のFlutterアプリレポジトリにRenovateを導入しました。
参考になるまとまった記事が少なく、意外に手間取ったためにこちらにメモとして残しておきます。
環境
- GitLab 15.7.7-ee
- Flutter 3.7.5
- Renovate 34.152.3
導入方法
1. 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"
]
}
設定項目はこちらから確認できます。
-
enabledManagers
は、pub
のみにします。そうしないと、cocoapods
,gradle
,gradle-wrapper
,gitlabci
が検出されて、意図しないMRが発行されてしまいます。 -
ignorePresets
は、お好みで設定してください。デフォルトで入っているpresetはこちらから確認できます。
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を実行する
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"
を参考にさせていただきました。
-
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に対して設定しているオプションです。以下のページで確認できます。
3. GitLabでSchduled pipelineを設定する
詳しくはこちらをご覧ください。
前述のサンプルを使う場合は、Variableに RENOVATE
を追加してください。値は1
です。
動作確認方法
以下の方法を実施したい場合は、baseBranches
にrenovate.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