diff --git a/dev/conductor/bin/conductor b/dev/conductor/bin/conductor index 3a5735a53e8..3cf839a40ef 100755 --- a/dev/conductor/bin/conductor +++ b/dev/conductor/bin/conductor @@ -38,6 +38,6 @@ REPO_DIR="$BIN_DIR/../../.." DART_BIN="$REPO_DIR/bin/dart" # Ensure pub get has been run in the repo before running the conductor -(cd "$REPO_DIR/dev/conductor/core"; "$DART_BIN" pub get 1>&2) +(cd "$REPO_DIR/dev/conductor/core"; "$DART_BIN" pub get >/dev/null) exec "$DART_BIN" --enable-asserts "$REPO_DIR/dev/conductor/core/bin/cli.dart" "$@" diff --git a/dev/conductor/core/lib/src/next.dart b/dev/conductor/core/lib/src/next.dart index 5ab02f00820..394ffc983d9 100644 --- a/dev/conductor/core/lib/src/next.dart +++ b/dev/conductor/core/lib/src/next.dart @@ -141,7 +141,7 @@ class NextContext extends Context { if (!autoAccept) { final bool response = await prompt( 'Has CI passed for the engine PR?\n\n' - '${state_import.luciConsoleLink(state.releaseChannel, 'engine')}' + '${state_import.luciConsoleLink(state.engine.candidateBranch, 'engine')}' ); if (!response) { stdio.printError('Aborting command.'); diff --git a/dev/conductor/core/lib/src/state.dart b/dev/conductor/core/lib/src/state.dart index fa0fc303a82..08e04fbdca4 100644 --- a/dev/conductor/core/lib/src/state.dart +++ b/dev/conductor/core/lib/src/state.dart @@ -47,21 +47,19 @@ const String stablePostReleaseMsg = """ // * `String presentState(pb.ConductorState state)` - pretty print the state file. // This is a little easier to read than the raw JSON. -String luciConsoleLink(String channel, String groupName) { +String luciConsoleLink(String candidateBranch, String repoName) { assert( - globals.kReleaseChannels.contains(channel), - 'channel "$channel" not recognized', + globals.releaseCandidateBranchRegex.hasMatch(candidateBranch), + 'Malformed candidateBranch argument passed: "$candidateBranch"', ); assert( - ['flutter', 'engine', 'packaging'].contains(groupName), - 'group named $groupName not recognized', + ['flutter', 'engine', 'packaging'].contains(repoName), + 'group named $repoName not recognized', ); - final String consoleName = - channel == 'master' ? groupName : '${channel}_$groupName'; - if (groupName == 'packaging') { + if (repoName == 'packaging') { return 'https://luci-milo.appspot.com/p/dart-internal/g/flutter_packaging/console'; } - return 'https://ci.chromium.org/p/flutter/g/$consoleName/console'; + return 'https://flutter-dashboard.appspot.com/#/build?repo=$repoName&branch=$candidateBranch'; } String defaultStateFilePath(Platform platform) { @@ -93,7 +91,7 @@ String presentState(pb.ConductorState state) { buffer.writeln('\tCurrent git HEAD: ${state.engine.currentGitHead}'); buffer.writeln('\tPath to checkout: ${state.engine.checkoutPath}'); buffer.writeln( - '\tPost-submit LUCI dashboard: ${luciConsoleLink(state.releaseChannel, 'engine')}'); + '\tPost-submit LUCI dashboard: ${luciConsoleLink(state.engine.candidateBranch, 'engine')}'); if (state.engine.cherrypicks.isNotEmpty) { buffer.writeln('${state.engine.cherrypicks.length} Engine Cherrypicks:'); for (final pb.Cherrypick cherrypick in state.engine.cherrypicks) { @@ -111,7 +109,7 @@ String presentState(pb.ConductorState state) { buffer.writeln('\tCurrent git HEAD: ${state.framework.currentGitHead}'); buffer.writeln('\tPath to checkout: ${state.framework.checkoutPath}'); buffer.writeln( - '\tPost-submit LUCI dashboard: ${luciConsoleLink(state.releaseChannel, 'flutter')}'); + '\tPost-submit LUCI dashboard: ${luciConsoleLink(state.framework.candidateBranch, 'flutter')}'); if (state.framework.cherrypicks.isNotEmpty) { buffer.writeln( '${state.framework.cherrypicks.length} Framework Cherrypicks:'); @@ -180,7 +178,7 @@ String phaseInstructions(pb.ConductorState state) { case ReleasePhase.VERIFY_ENGINE_CI: if (!requiresEnginePR(state)) { return 'You must verify engine CI has passed: ' - '${luciConsoleLink(state.releaseChannel, 'engine')}'; + '${luciConsoleLink(state.engine.candidateBranch, 'engine')}'; } // User's working branch was pushed to their mirror, but a PR needs to be // opened on GitHub. @@ -189,11 +187,12 @@ String phaseInstructions(pb.ConductorState state) { repoName: 'engine', state: state, ); + final String consoleLink = luciConsoleLink(state.engine.candidateBranch, 'engine'); return [ 'Your working branch ${state.engine.workingBranch} was pushed to your mirror.', 'You must now open a pull request at $newPrLink, verify pre-submit CI', 'builds on your engine pull request are successful, merge your pull request,', - 'validate post-submit CI, and then codesign the binaries on the merge commit.', + 'validate post-submit CI at $consoleLink.', ].join('\n'); case ReleasePhase.APPLY_FRAMEWORK_CHERRYPICKS: final List outstandingCherrypicks = @@ -232,7 +231,7 @@ String phaseInstructions(pb.ConductorState state) { 'pull request, validate post-submit CI.', ].join('\n'); case ReleasePhase.VERIFY_RELEASE: - return 'Release archive packages must be verified on cloud storage: ${luciConsoleLink(state.releaseChannel, 'packaging')}'; + return 'Release archive packages must be verified on cloud storage: ${luciConsoleLink(state.framework.candidateBranch, 'packaging')}'; case ReleasePhase.RELEASE_COMPLETED: if (state.releaseChannel == 'beta') { return [ diff --git a/dev/conductor/core/test/next_test.dart b/dev/conductor/core/test/next_test.dart index 82933a474a6..dcdceed04d8 100644 --- a/dev/conductor/core/test/next_test.dart +++ b/dev/conductor/core/test/next_test.dart @@ -239,6 +239,7 @@ void main() { ..trunkRevision = 'abc123' ..state = pb.CherrypickState.PENDING ) + ..candidateBranch = 'flutter-1.0-candidate.0' ) ..currentPhase = ReleasePhase.VERIFY_ENGINE_CI );