Prepares the release builder for packaging runs.

Packaging will filter targets based on scheduler and filter targeting
will now consider the git_ref.

Bug: https://github.com/flutter/flutter/issues/115489
Change-Id: I3d7dd52a2f35ff9ea71fd6b84939bcfebe03e600
Reviewed-on: https://flutter-review.googlesource.com/c/recipes/+/36821
Reviewed-by: Yusuf Mohsinally <mohsinally@google.com>
Commit-Queue: Godofredo Contreras <godofredoc@google.com>
diff --git a/recipes/release/release_builder.expected/basic_linux.json b/recipes/release/release_builder.expected/basic_linux_beta.json
similarity index 91%
copy from recipes/release/release_builder.expected/basic_linux.json
copy to recipes/release/release_builder.expected/basic_linux_beta.json
index 26709ed..531b0da 100644
--- a/recipes/release/release_builder.expected/basic_linux.json
+++ b/recipes/release/release_builder.expected/basic_linux_beta.json
@@ -35,7 +35,6 @@
       "git",
       "fetch",
       "origin",
-      "main",
       "--recurse-submodules",
       "--progress",
       "--tags"
@@ -67,7 +66,7 @@
       "git",
       "checkout",
       "-f",
-      "FETCH_HEAD"
+      "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
     ],
     "cwd": "[START_DIR]/mirrors/engine",
     "infra_step": true,
@@ -266,6 +265,14 @@
       "@@@STEP_LOG_LINE@json.output@        \"release_build\": true@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      \"recipe\": \"engine/something\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    }, @@@",
+      "@@@STEP_LOG_LINE@json.output@    {@@@",
+      "@@@STEP_LOG_LINE@json.output@      \"name\": \"linux packaging one\", @@@",
+      "@@@STEP_LOG_LINE@json.output@      \"properties\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"$flutter/osx_sdk\": \"{\\\"sdk_version\\\": \\\"14a5294e\\\"}\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }, @@@",
+      "@@@STEP_LOG_LINE@json.output@      \"recipe\": \"release/something\", @@@",
+      "@@@STEP_LOG_LINE@json.output@      \"scheduler\": \"release\"@@@",
       "@@@STEP_LOG_LINE@json.output@    }@@@",
       "@@@STEP_LOG_LINE@json.output@  ]@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
@@ -297,7 +304,7 @@
       }
     },
     "name": "launch builds.schedule",
-    "stdin": "{\"requests\": [{\"scheduleBuild\": {\"builder\": {\"bucket\": \"try\", \"builder\": \"Linux Engine Drone\", \"project\": \"proj\"}, \"exe\": {\"cipdVersion\": \"refs/heads/main\"}, \"experimental\": \"NO\", \"experiments\": {\"luci.buildbucket.parent_tracking\": false}, \"fields\": \"builder,createTime,createdBy,critical,endTime,id,infra,input,number,output,startTime,status,updateTime\", \"gerritChanges\": [{\"change\": \"123456\", \"host\": \"flutter-review.googlesource.com\", \"patchset\": \"7\", \"project\": \"mirrors/engine\"}], \"gitilesCommit\": {\"host\": \"flutter.googlesource.com\", \"id\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\", \"project\": \"mirrors/engine\", \"ref\": \"refs/heads/main\"}, \"priority\": 25, \"properties\": {\"$flutter/osx_sdk\": {\"sdk_version\": \"14a5294e\"}, \"build\": {\"name\": \"linux one\", \"properties\": {\"$flutter/osx_sdk\": {\"sdk_version\": \"14a5294e\"}}, \"recipe\": \"engine/something\"}, \"environment\": \"Staging\", \"recipe\": \"engine/something\", \"repository\": \"engine\"}, \"requestId\": \"8945511751514863184-00000000-0000-0000-0000-000000001337\", \"swarming\": {\"parentRunId\": \"fake-task-id\"}, \"tags\": [{\"key\": \"cq_experimental\", \"value\": \"false\"}, {\"key\": \"parent_buildbucket_id\", \"value\": \"8945511751514863184\"}, {\"key\": \"user_agent\", \"value\": \"recipe\"}]}}]}",
+    "stdin": "{\"requests\": [{\"scheduleBuild\": {\"builder\": {\"bucket\": \"try\", \"builder\": \"Linux Engine Drone\", \"project\": \"proj\"}, \"exe\": {\"cipdVersion\": \"refs/heads/main\"}, \"experimental\": \"NO\", \"experiments\": {\"luci.buildbucket.parent_tracking\": false}, \"fields\": \"builder,createTime,createdBy,critical,endTime,id,infra,input,number,output,startTime,status,updateTime\", \"gerritChanges\": [{\"change\": \"123456\", \"host\": \"flutter-review.googlesource.com\", \"patchset\": \"7\", \"project\": \"mirrors/engine\"}], \"gitilesCommit\": {\"host\": \"flutter.googlesource.com\", \"id\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\", \"project\": \"mirrors/engine\", \"ref\": \"refs/heads/beta\"}, \"priority\": 25, \"properties\": {\"$flutter/osx_sdk\": {\"sdk_version\": \"14a5294e\"}, \"build\": {\"name\": \"linux packaging one\", \"properties\": {\"$flutter/osx_sdk\": {\"sdk_version\": \"14a5294e\"}}, \"recipe\": \"release/something\", \"scheduler\": \"release\"}, \"environment\": \"Staging\", \"recipe\": \"release/something\", \"repository\": \"engine\"}, \"requestId\": \"8945511751514863184-00000000-0000-0000-0000-000000001337\", \"swarming\": {\"parentRunId\": \"fake-task-id\"}, \"tags\": [{\"key\": \"cq_experimental\", \"value\": \"false\"}, {\"key\": \"parent_buildbucket_id\", \"value\": \"8945511751514863184\"}, {\"key\": \"user_agent\", \"value\": \"recipe\"}]}}]}",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
@@ -344,7 +351,7 @@
       "@@@STEP_LOG_LINE@request@          \"host\": \"flutter.googlesource.com\", @@@",
       "@@@STEP_LOG_LINE@request@          \"id\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\", @@@",
       "@@@STEP_LOG_LINE@request@          \"project\": \"mirrors/engine\", @@@",
-      "@@@STEP_LOG_LINE@request@          \"ref\": \"refs/heads/main\"@@@",
+      "@@@STEP_LOG_LINE@request@          \"ref\": \"refs/heads/beta\"@@@",
       "@@@STEP_LOG_LINE@request@        }, @@@",
       "@@@STEP_LOG_LINE@request@        \"priority\": 25, @@@",
       "@@@STEP_LOG_LINE@request@        \"properties\": {@@@",
@@ -352,16 +359,17 @@
       "@@@STEP_LOG_LINE@request@            \"sdk_version\": \"14a5294e\"@@@",
       "@@@STEP_LOG_LINE@request@          }, @@@",
       "@@@STEP_LOG_LINE@request@          \"build\": {@@@",
-      "@@@STEP_LOG_LINE@request@            \"name\": \"linux one\", @@@",
+      "@@@STEP_LOG_LINE@request@            \"name\": \"linux packaging one\", @@@",
       "@@@STEP_LOG_LINE@request@            \"properties\": {@@@",
       "@@@STEP_LOG_LINE@request@              \"$flutter/osx_sdk\": {@@@",
       "@@@STEP_LOG_LINE@request@                \"sdk_version\": \"14a5294e\"@@@",
       "@@@STEP_LOG_LINE@request@              }@@@",
       "@@@STEP_LOG_LINE@request@            }, @@@",
-      "@@@STEP_LOG_LINE@request@            \"recipe\": \"engine/something\"@@@",
+      "@@@STEP_LOG_LINE@request@            \"recipe\": \"release/something\", @@@",
+      "@@@STEP_LOG_LINE@request@            \"scheduler\": \"release\"@@@",
       "@@@STEP_LOG_LINE@request@          }, @@@",
       "@@@STEP_LOG_LINE@request@          \"environment\": \"Staging\", @@@",
-      "@@@STEP_LOG_LINE@request@          \"recipe\": \"engine/something\", @@@",
+      "@@@STEP_LOG_LINE@request@          \"recipe\": \"release/something\", @@@",
       "@@@STEP_LOG_LINE@request@          \"repository\": \"engine\"@@@",
       "@@@STEP_LOG_LINE@request@        }, @@@",
       "@@@STEP_LOG_LINE@request@        \"requestId\": \"8945511751514863184-00000000-0000-0000-0000-000000001337\", @@@",
@@ -522,7 +530,7 @@
   },
   {
     "cmd": [],
-    "name": "display builds.linux one",
+    "name": "display builds.linux packaging one",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LINK@8945511751514863186@https://cr-buildbucket.appspot.com/build/8945511751514863186@@@"
diff --git a/recipes/release/release_builder.expected/basic_linux.json b/recipes/release/release_builder.expected/basic_linux_main.json
similarity index 96%
rename from recipes/release/release_builder.expected/basic_linux.json
rename to recipes/release/release_builder.expected/basic_linux_main.json
index 26709ed..a0e9c92 100644
--- a/recipes/release/release_builder.expected/basic_linux.json
+++ b/recipes/release/release_builder.expected/basic_linux_main.json
@@ -266,6 +266,14 @@
       "@@@STEP_LOG_LINE@json.output@        \"release_build\": true@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      \"recipe\": \"engine/something\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    }, @@@",
+      "@@@STEP_LOG_LINE@json.output@    {@@@",
+      "@@@STEP_LOG_LINE@json.output@      \"name\": \"linux packaging one\", @@@",
+      "@@@STEP_LOG_LINE@json.output@      \"properties\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"$flutter/osx_sdk\": \"{\\\"sdk_version\\\": \\\"14a5294e\\\"}\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }, @@@",
+      "@@@STEP_LOG_LINE@json.output@      \"recipe\": \"release/something\", @@@",
+      "@@@STEP_LOG_LINE@json.output@      \"scheduler\": \"release\"@@@",
       "@@@STEP_LOG_LINE@json.output@    }@@@",
       "@@@STEP_LOG_LINE@json.output@  ]@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
diff --git a/recipes/release/release_builder.py b/recipes/release/release_builder.py
index a4dfb55..34b3623 100644
--- a/recipes/release/release_builder.py
+++ b/recipes/release/release_builder.py
@@ -38,6 +38,23 @@
 PROPERTIES = InputProperties
 ENV_PROPERTIES = EnvProperties
 
+RELEASE_CHANNELS = ('refs/heads/beta', 'refs/heads/stable')
+
+
+def ShouldRun(api, git_ref, target):
+  """Validates if a target should run based on platform, channel and repo."""
+  # Postsubmit for engine and flutter repositories.
+  if (target.get('properties', {}).get('release_build', False) and
+      target['name'].lower().startswith(api.platform.name) and
+      (git_ref not in RELEASE_CHANNELS)):
+    return True
+  # Packaging for the flutter repository.
+  if (target.get('scheduler') == 'release' and
+      target["name"].lower().startswith(api.platform.name) and
+      (git_ref in RELEASE_CHANNELS)):
+    return True
+  return False
+
 
 def RunSteps(api, properties, env_properties):
   repository = api.buildbucket.gitiles_commit.project
@@ -60,11 +77,10 @@
   build_results = []
   with api.step.nest('launch builds') as presentation:
     for target in ci_yaml.json.output['targets']:
-      if target.get("properties", {}).get("release_build", False) and (
-          target["name"].lower().startswith(api.platform.name)):
+      if ShouldRun(api, git_ref, target):
         target = api.shard_util_v2.pre_process_properties(target)
         tasks.update(api.shard_util_v2.schedule(
-          [target, ], target["recipe"], presentation))
+          [target, ], target['recipe'], presentation))
   with api.step.nest('collect builds') as presentation:
     build_results = api.shard_util_v2.collect(tasks, presentation)
 
@@ -83,25 +99,41 @@
     status="SUCCESS",
   )
   tasks_dict = {'targets': [
-    {'name': 'linux one', 'recipe': 'engine/something',
-     'properties': {'release_build': True, '$flutter/osx_sdk': '{"sdk_version": "14a5294e"}'}
-    }]
+      {
+          'name': 'linux one',
+          'recipe': 'engine/something',
+          'properties': {
+              'release_build': True,
+              '$flutter/osx_sdk': '{"sdk_version": "14a5294e"}'
+          },
+      },
+      {
+          'name': 'linux packaging one',
+          'recipe': 'release/something',
+          'scheduler': 'release',
+          'properties': {
+              '$flutter/osx_sdk': '{"sdk_version": "14a5294e"}'
+          }
+      }
+    ]
   }
-  yield api.test(
-    'basic_linux',
-    api.platform.name('linux'),
-    api.properties(environment='Staging', repository='engine'),
-    api.buildbucket.try_build(
-      project='proj',
-      builder='try-builder',
-      git_repo='https://flutter.googlesource.com/mirrors/engine',
-      revision='a' * 40,
-      build_number=123,
-    ),
-    api.shard_util_v2.child_build_steps(
-      subbuilds=[try_subbuild1],
-      launch_step="launch builds",
-      collect_step="collect builds",
-    ),
-    api.step_data('read ci yaml.parse', api.json.output(tasks_dict))
+  for git_ref in ['main', 'beta']:
+    yield api.test(
+      'basic_linux_%s' % git_ref,
+      api.platform.name('linux'),
+      api.properties(environment='Staging', repository='engine'),
+      api.buildbucket.try_build(
+        project='proj',
+        builder='try-builder',
+        git_repo='https://flutter.googlesource.com/mirrors/engine',
+        revision='a' * 40,
+        build_number=123,
+        git_ref='refs/heads/%s' % git_ref,
+      ),
+      api.shard_util_v2.child_build_steps(
+        subbuilds=[try_subbuild1],
+        launch_step="launch builds",
+        collect_step="collect builds",
+      ),
+      api.step_data('read ci yaml.parse', api.json.output(tasks_dict))
   )