🔄

【Flutter × GitHub Actions】 GitHub Actionsで指定するバージョンとプロジェクトのバージョンは揃えよう

2025/02/15に公開

2022年に作ったflutterのプロジェクトで久しぶりにメンテナンスをしたら色々仕様が変わってて困惑しました。
中でもGitHub ActionsでCIがこけていた。このことについて解消した際の知見をまとめようと思います。

先に結論を2つ

  • GitHub actionsで動かすミドルウェアのバージョン値とプロダクトで動かすミドルウェアのバージョン値は合わせよう
  • flutterではpubspec.yamlで記載されているバージョン値をGitHub actionsで使用することが可能

エラーの内容

github actionsでエラーが起きた。テストを実行するジョブを組んでいたが、テストではなく、実行環境構築でこけている

LVR: Version solving took 0:00:00.830334 seconds.
    | Tried 1 solutions.
FINE: Resolving dependencies finished (0.8s).
ERR : The current Flutter SDK version is 3.0.2.
    | 
    | Because mytodoapp depends on flutter_slidable >=3.0.0 which requires Flutter SDK version >=3.7.0, version solving failed.
FINE: Exception type: SolveFailure
FINE: package:pub/src/solver/version_solver.dart 311:5               VersionSolver._resolveConflict
    | package:pub/src/solver/version_solver.dart 132:27              VersionSolver._propagate
    | package:pub/src/solver/version_solver.dart 96:11               VersionSolver.solve.<fn>
    | ===== asynchronous gap ===========================
    | dart:async                                                     Future.catchError
    | package:pub/src/utils.dart 109:52                              captureErrors.wrappedCallback
    | package:stack_trace                                            Chain.capture
    | package:pub/src/utils.dart 122:11                              captureErrors
    | package:pub/src/command.dart 183:13                            PubCommand.run
    | package:args/command_runner.dart 209:27                        CommandRunner.runCommand
    | package:pub/src/command_runner.dart 174:24                     PubCommandRunner.runCommand
    | package:pub/src/command_runner.dart 159:20                     PubCommandRunner.run
    | package:dartdev/dartdev.dart 45:56                             runDartdev
    | /b/s/w/ir/cache/builder/sdk/pkg/dartdev/bin/dartdev.dart 11:9  main
---- End log transcript ----
pub get failed (1; ---- End log transcript ----)
Error: Process completed with exit code 1.

エラーの原因は、現在使用している Flutter SDK のバージョン (3.0.2) が、flutter_slidable >=3.0.0 の必要とする Flutter SDK バージョン (>=3.7.0) を満たしていないためだった

解決策は?

現在のバージョンを確かめてみる

// 現在のバージョン
 ❯❯❯ flutter --version
Flutter 3.19.5 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 300451adae (11 months ago)2024-03-27 21:54:07 -0500
Engine • revision e76c956498
Tools • Dart 3.3.3 • DevTools 2.31.1

CIで定義するバージョンを確認する

- name: CIジョブを動かすためのflutterの環境構築
  uses: subosito/flutter-action@v2
  with:
    flutter-version: '3.0.2'
    channel: 'stable'
  • flutter-version: '3.0.2'3.19.5で指定すれば解決しそう

でも今後のメンテナンスがめんどくさそう

flutter-version: '3.0.2'3.19.5で指定すれば解決しそうだが、flutterのバージョンアップのたびにここを修正するのは少し面倒
私が使っている flutter-action ではflutter-version-fileを指定することが可能だったのでこれを使おうと思う

https://github.com/subosito/flutter-action?tab=readme-ov-file

- name: CIジョブを動かすためのflutterの環境構築
  uses: subosito/flutter-action@v2
  with:
    flutter-version-file: pubspec.yaml ## pubspec.yamlのパスを指定
    channel: 'stable'
    cache: true ## つけていなかったので、つけた

ここで大事なのはpubspec.yamlにバージョン値を指定しておくこと。こうしないと、どこを呼んで良いかわからなくなる

name: flutter-app
description: A new Flutter project.

environment:
  sdk: ">=2.17.3 <3.0.0"
  flutter: "3.19.5" ## ここを指定しておく必要がある

これで動くと思います

最後に

github actionsは様々なワークフロー自動化する便利なツールです。しかしメンテナンスも必要になってきます
このようにメンテナンスを少しでも減らして、開発に集中する仕組みを作っていきたいですね

Discussion