blob: f56785a4c54fd9d55f9ccd3fadf52fa9759ac7ec [file] [log] [blame] [view]
# Scheduling tasks in a Monorepo
## Presubmits
### Pre Monorepo
Before the monorepo; Cocoon scheduled task for each repository it was 'watching'
via the GitHub flutter-dashboard app. There is only one required check to pass
at this point: `ci.yaml validation`. If this validation check fails, then PR
cannot be submitted, likely signalling a failure in the `.ci.yaml` files or a
failure in the infrastructure.
What can be noted here is that anyone with commit access can bypass presubmit
checks as soon as `ci.yaml validation` completes succesfully - and before any
actual testing completes. The usage of the `autosubmit` label will wait for all
checks to pass before merging.
At a very high level, presubmits looked like:
```mermaid
sequenceDiagram
github --) +cocoon: pr opened
note over cocoon: pubsub loop here
cocoon ->> cocoon: cancel presubmits
cocoon ->> github: createCheckRun('ci.yaml validation')
cocoon ->> cocoon: getPresubmitTargets('/.ci/yaml')
cocoon ->> cocoon: getTriggerList([targets], [filters?])
cocoon ->> luci: scheduleTryBuilds(filteredTargets)
loop over targets
luci ->> github: createCheckRun(sha,target)
luci ->> pubsub: requests.shard(maxShardSize)
end
alt all scheduled
cocoon ->> github: updateCheckRun('ci.yaml validation', success)
else exception
cocoon ->> github: updateCheckRun('ci.yaml validation', failure)
end
deactivate cocoon
```
### Monorepo Scheduling
There will be multiple `.ci.yaml` files in the repository now that the engine is
present. Pull requests can contain framework, engine, or both changes. In this
world: if any parts of the engine are changed, we need to schedule
**and wait for** all engine builds to be present to test from source. This means
either `ci.yaml validation` is kept from completing; or another check is
created that will block progress.
```mermaid
sequenceDiagram
github --) +cocoon: pr openned
note over cocoon: pubsub loop here
cocoon ->> cocoon: cancel presubmits
cocoon ->> github: createCheckRun('ci.yaml validation')
alt is engine build
cocoon ->> cocoon: getEngineBuilds('/engine/src/flutter/.ci/yaml')
cocoon ->> github: createCheckRun('engine sentinel')
cocoon ->> luci: scheduleTryBuilds(engineBuilds)
deactivate cocoon
end
note over cocoon: waiting for checkruns, either:<br/>luci presubmit sub or github 'check_run' status update.
loop signaled engineBuilds.length
github --) cocoon: check_run action: completed
activate cocoon
end
cocoon -->> github: githubChecksService.allCheckRuns()
alt all completed successful
cocoon ->> github: updateCheckRun('engine sentinel', success)
cocoon ->> cocoon: getPresubmitTargets('/.ci/yaml') &&<br/> getPresubmitTargets('/engine/src/flutter/.ci/yaml')
cocoon ->> cocoon: getTriggerList([targets], [filters?])
cocoon ->> luci: scheduleTryBuilds(filteredTargets - engineBuilds)
loop over targets
luci ->> github: createCheckRun(sha,target)
luci ->> pubsub: requests.shard(maxShardSize)
end
alt all scheduled
cocoon ->> github: updateCheckRun('ci.yaml validation', success)
else exception
cocoon ->> github: updateCheckRun('ci.yaml validation', failure)
end
else some failed
cocoon ->> github: updateCheckRun('engine sentinel', failure)
cocoon ->> github: updateCheckRun('ci.yaml validation', failure)
end
deactivate cocoon
```
## Postsubmits
### Merge Queue
* Schedule all engine builds in the prod pool
* Wait for them to complete
* Schedule all tests