コンテンツにスキップ

Dartでワークフローを書く

手順も、条件分岐も、関数も。アプリ開発で使っているDartを、そのままCIに。

ワークフローは、リポジトリの openci/ ディレクトリに置くDartファイルです。OpenCI.init でワークフローを初期化し、実行したいコマンドを順番に呼び出します。

import 'package:openci_workflow/openci_workflow.dart';
Future<void> main() async {
final ci = await OpenCI.init(
workflowName: 'Dart checks',
ciTriggers: [CITrigger.push(branch: 'main')],
);
await ci.run('dart pub get');
await ci.run('dart analyze --fatal-infos');
await ci.run('dart test');
}

プランナーが実行前に読み取れるように、ワークフロー名とトリガーのブランチは文字列リテラルで定義してください。

シェルコマンドを実行する

シェルコマンドを実行するへのリンク

ci.run は sh を使ってコマンドを実行します。標準出力・標準エラーがビルドログに表示され、失敗したコマンドの終了コードでワークフローが終了します。

await ci.run('dart format --output=none --set-exit-if-changed .');
await ci.run('dart analyze --fatal-infos');

コマンドに await を付けると、ひとつの処理が完了してから次の処理に進みます。

処理を関数にまとめる

処理を関数にまとめるへのリンク

複数のワークフローで共通する処理は、Dartの関数にできます。

Future<void> checkFlutter(OpenCI ci) async {
await ci.run('flutter pub get');
await ci.flutter.staticAnalysis();
await ci.flutter.unitTests();
}

通常のDartファイルとして切り出し、必要なワークフローからインポートできます。

workingDirectory は、リポジトリルートからの相対パスで指定します。

await ci.run(
'flutter analyze',
workingDirectory: 'apps/mobile',
);

ワークフロー全体の既定のディレクトリには、OpenCI.init の currentWorkingDirectory を使います。Flutterヘルパーは呼び出しごとの dir も指定できます。

await ci.flutter.unitTests(dir: 'apps/mobile');

リポジトリルートからDartファイルを実行します。

ターミナル
dart run openci/flutter_ci.dart

必要なSDKとビルドツールは、実行環境側に用意してください。詳しくはクイックスタートを参照してください。