Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
52 changes: 52 additions & 0 deletions script/tool/lib/src/repo_package_info_check_command.dart
Original file line number Diff line number Diff line change
Expand Up @@ -272,6 +272,13 @@ class RepoPackageInfoCheckCommand extends PackageLoopingCommand {
),
);

errors.addAll(
_validateCiYamlEnabledBranches(
packageName,
isBatchRelease: isBatchRelease,
),
);

if (isBatchRelease &&
(package.parsePubspec().version?.isPreRelease ?? false)) {
errors.add(
Expand Down Expand Up @@ -407,4 +414,49 @@ class RepoPackageInfoCheckCommand extends PackageLoopingCommand {
}
return errors;
}

List<String> _validateCiYamlEnabledBranches(
String packageName, {
required bool isBatchRelease,
}) {
final errors = <String>[];
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 YamlMap yaml;
try {
yaml = loadYaml(content) as YamlMap;
} catch (e) {
errors.add('Invalid YAML in .ci.yaml: $e');
return errors;
}

final enabledBranches = yaml['enabled_branches'] as YamlList?;
Comment thread
chunhtai marked this conversation as resolved.
Outdated
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\n',
Comment thread
chunhtai marked this conversation as resolved.
Outdated
);
}
return errors;
}
}
97 changes: 96 additions & 1 deletion script/tool/test/repo_package_info_check_command_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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({
Expand Down Expand Up @@ -948,5 +958,90 @@ jobs:
containsAllInOrder(<Matcher>[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<String> output = await runCapturingPrint(
runner,
<String>['repo-package-info-check'],
errorHandler: (Error e) {
commandError = e;
},
);

expect(commandError, isA<ToolExit>());
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<String> output = await runCapturingPrint(
runner,
<String>['repo-package-info-check'],
errorHandler: (Error e) {
commandError = e;
},
);

expect(commandError, isA<ToolExit>());
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<String> output = await runCapturingPrint(
runner,
<String>['repo-package-info-check'],
errorHandler: (Error e) {
commandError = e;
},
);

expect(commandError, isA<ToolExit>());
expect(
output,
contains(
contains(
r'Unexpected release branch pattern release-a_package-\d+\.\d+\.\d+ in enabled_branches in .ci.yaml',
),
),
);
},
);
});
}
Loading