diff --git a/.ci.yaml b/.ci.yaml index ffb6f200400..c036774df2e 100644 --- a/.ci.yaml +++ b/.ci.yaml @@ -7,6 +7,7 @@ # * https://github.com/flutter/cocoon/blob/main/CI_YAML.md enabled_branches: - main + - release-go_router-\d+\.\d+\.\d+ platform_properties: linux: diff --git a/script/tool/lib/src/repo_package_info_check_command.dart b/script/tool/lib/src/repo_package_info_check_command.dart index bd2ae9cfd72..ff59390bc9b 100644 --- a/script/tool/lib/src/repo_package_info_check_command.dart +++ b/script/tool/lib/src/repo_package_info_check_command.dart @@ -272,6 +272,13 @@ class RepoPackageInfoCheckCommand extends PackageLoopingCommand { ), ); + errors.addAll( + _validateCiYamlEnabledBranches( + packageName, + isBatchRelease: isBatchRelease, + ), + ); + if (isBatchRelease && (package.parsePubspec().version?.isPreRelease ?? false)) { errors.add( @@ -407,4 +414,43 @@ class RepoPackageInfoCheckCommand extends PackageLoopingCommand { } return errors; } + + List _validateCiYamlEnabledBranches( + String packageName, { + required bool isBatchRelease, + }) { + final errors = []; + final File ciYamlFile = _repoRoot.childFile('.ci.yaml'); + if (!ciYamlFile.existsSync()) { + if (isBatchRelease) { + errors.add( + 'Missing .ci.yaml file at the repository root.\n' + 'See https://github.com/flutter/flutter/blob/master/docs/ecosystem/release/README.md#batch-release', + ); + } + return errors; + } + + final String content = ciYamlFile.readAsStringSync(); + final yaml = loadYaml(content) as YamlMap; + + final enabledBranches = yaml['enabled_branches'] as YamlList?; + final bool hasBranchPattern = + enabledBranches != null && + enabledBranches.contains(r'release-' + packageName + r'-\d+\.\d+\.\d+'); + + if (isBatchRelease && !hasBranchPattern) { + errors.add( + 'Missing release branch pattern release-$packageName-\\d+\\.\\d+\\.\\d+ ' + 'in enabled_branches in .ci.yaml\n' + 'See https://github.com/flutter/flutter/blob/master/docs/ecosystem/release/README.md#batch-release', + ); + } else if (!isBatchRelease && hasBranchPattern) { + errors.add( + 'Unexpected release branch pattern release-$packageName-\\d+\\.\\d+\\.\\d+ ' + 'in enabled_branches in .ci.yaml', + ); + } + return errors; + } } diff --git a/script/tool/test/repo_package_info_check_command_test.dart b/script/tool/test/repo_package_info_check_command_test.dart index 0395375d428..6dfd2b6c718 100644 --- a/script/tool/test/repo_package_info_check_command_test.dart +++ b/script/tool/test/repo_package_info_check_command_test.dart @@ -634,11 +634,21 @@ ${readmeTableEntry('a_package')} return package; } - void writeBatchConfig(RepositoryPackage package) { + void writeBatchConfig( + RepositoryPackage package, { + bool validCiYaml = true, + }) { package.ciConfigFile.writeAsStringSync(''' release: batch: true '''); + if (validCiYaml) { + root.childFile('.ci.yaml').writeAsStringSync(r''' +enabled_branches: + - main + - release-a_package-\d+\.\d+\.\d+ +'''); + } } void writeWorkflowFiles({ @@ -948,5 +958,90 @@ jobs: containsAllInOrder([contains('No issues found!')]), ); }); + + test('fails if .ci.yaml file is missing for batch package', () async { + final RepositoryPackage package = setupReleaseStrategyTest(); + writeBatchConfig(package, validCiYaml: false); + writeWorkflowFiles(); + + Error? commandError; + final List output = await runCapturingPrint( + runner, + ['repo-package-info-check'], + errorHandler: (Error e) { + commandError = e; + }, + ); + + expect(commandError, isA()); + expect( + output, + contains(contains('Missing .ci.yaml file at the repository root.')), + ); + }); + + test( + 'fails if branch pattern is missing in .ci.yaml enabled_branches for batch package', + () async { + final RepositoryPackage package = setupReleaseStrategyTest(); + writeBatchConfig(package, validCiYaml: false); + writeWorkflowFiles(); + root.childFile('.ci.yaml').writeAsStringSync(''' +enabled_branches: + - main +'''); + + Error? commandError; + final List output = await runCapturingPrint( + runner, + ['repo-package-info-check'], + errorHandler: (Error e) { + commandError = e; + }, + ); + + expect(commandError, isA()); + expect( + output, + contains( + contains( + r'Missing release branch pattern release-a_package-\d+\.\d+\.\d+ in enabled_branches in .ci.yaml', + ), + ), + ); + }, + ); + + test( + 'fails if branch pattern is unexpectedly present in .ci.yaml for non-batch package', + () async { + setupReleaseStrategyTest(); + writeWorkflowFiles(); + root.childFile('.ci.yaml').writeAsStringSync(r''' +enabled_branches: + - main + - release-a_package-\d+\.\d+\.\d+ +'''); + + Error? commandError; + final List output = await runCapturingPrint( + runner, + ['repo-package-info-check'], + errorHandler: (Error e) { + commandError = e; + }, + ); + + expect(commandError, isA()); + expect( + output, + contains( + contains( + r'Unexpected release branch pattern release-a_package-\d+\.\d+\.\d+ in enabled_branches in .ci.yaml', + ), + ), + ); + }, + ); }); }