Adapters and native runtimes version independently. See 0008 and compatibility.md.
bash tool/ci/run-image-core-tests.shbash tool/ci/build-android-runtime.sh— publishes.local-mavenbash tool/ci/run-flutter-tests.shbash tool/ci/verify-native-capture-pigeon.shbash tool/ci/check-license.shbash tool/ci/verify-android-runtime-api.shBASE_SHA=<pr-base> bash tool/ci/check-version-policy.sh
Do not make native capture the default until privacy and performance gates
pass. Flutter tugboat / tugboat_dio 0.8.x already publish to pub.dev.
Production replay acceptance is an internal canary, not a public docs
procedure.
- Documentation-only and C++ test/fuzz-only changes do not bump Flutter.
- Public Kotlin API or C ABI header changes bump
capture-runtime(VERSION_NAMEinplatforms/android/gradle.properties). - Flutter adapter source (
lib/,android/,ios/,pigeons/,pubspec.yaml) bumpstugboatand updates this compatibility table. - A runtime public API change that adapters consume also updates the table.
- The Flutter plugin's
capture-runtimeMaven pin must not be newer thanVERSION_NAME. Changing the pin requires it to equalVERSION_NAME. Runtime-only PRs may leave the pin lagging until Central has the new AAR. - The Flutter plugin's
TugboatCaptureRuntimeCocoaPods pin must not be newer than the root podspecs.version. Changing the pin requires it to equal that version. Runtime-only PRs may leave the pin lagging until trunk has the new pod.
Merging a Flutter version bump to main creates tag v<version> and
publishes tugboat and tugboat_dio from
sdks/flutter/packages/. pub.dev GitHub Actions must be enabled on both
package Admin tabs with repository blendto/tugboat-flutter, tag pattern
v{{version}}, and both push and workflow_dispatch events. Hosts should
depend on the hosted packages, not a GitHub git dependency.
Merging a VERSION_NAME bump to main creates tag capture-runtime-v<version>
and publishes com.gettugboat.sdk:capture-runtime from platforms/android.
GITHUB_TOKEN tag pushes do not start other workflows, so the tag job
dispatches publish-android.yml on that tag (same pattern as pub.dev).
No extra secrets. The publish job uploads to
https://maven.pkg.github.com/blendto/tugboat-flutter
After the first successful publish, open the package on GitHub and set visibility to public if native Android hosts should resolve it with only a token. GitHub Packages still requires credentials for downloads.
The Blend org must allow GitHub Actions to create packages for this
repository (packages: write is already on the workflow).
Consumers need a GitHub token even for a public package:
repositories {
maven {
url = uri("https://maven.pkg.github.com/blendto/tugboat-flutter")
credentials {
username = providers.gradleProperty("gpr.user").orElse(System.getenv("GITHUB_ACTOR")).get()
password = providers.gradleProperty("gpr.key").orElse(System.getenv("GITHUB_TOKEN")).get()
}
}
}
dependencies {
implementation("com.gettugboat.sdk:capture-runtime:0.1.0")
}The Flutter plugin depends on Maven Central
com.gettugboat.sdk:capture-runtime:0.1.0. Do not point it at GitHub
Packages; pub.dev hosts cannot supply GitHub credentials. iOS native capture
depends on CocoaPods TugboatCaptureRuntime 0.1.0 and requires iOS 15.
- Runtime PR: bump
VERSION_NAME(for example0.1.1) and merge. Wait untilpublish-android.ymlhas put that version on Maven Central (repo1 POM returns 200). - Flutter PR: pin
implementation("com.gettugboat.sdk:capture-runtime:<that version>"), bumptugboat/tugboat_dio, and merge. That publishes to pub.dev.
Do not merge a Flutter pin for a version that is not on repo1 yet. After a
capture-runtime-v* tag publish, publish-android.yml waits for repo1 and
opens chore/pin-capture-runtime-<version> when the plugin still lags. That
job is a no-op if the pin already matches VERSION_NAME or the branch/PR
already exists. Recovery: re-run Publish Android runtime on the tag.
The repository must allow GitHub Actions to create pull requests.
Required before the Flutter plugin can depend on the AAR from pub.dev.
- Create a Central Portal account at central.sonatype.com.
- Verify namespace
com.gettugboatwith a DNS TXT record on gettugboat.com. That namespace coverscom.gettugboat.sdk. - Generate a user token and a signing GPG key.
- Add repository secrets:
MAVEN_CENTRAL_USERNAMEMAVEN_CENTRAL_PASSWORDMAVEN_GPG_KEY(ASCII-armored private key)MAVEN_GPG_PASSPHRASE
- Re-run
publish-android.ymlon tagcapture-runtime-v0.1.0(or merge a version bump). The job skips GitHub Packages if that version already exists and publishes Central when the secrets are present.
Merging to main when trunk does not have the root podspec s.version creates
tag apple-runtime-v<version> and runs publish-apple.yml (macOS pod lib lint + pod trunk push). s.source uses that same tag. Trunk 0.1.0 was
published from capture-runtime-v0.1.0 before this alignment; later versions
clone apple-runtime-v<version>. The tag is still created when trunk already
has the version so the git source exists.
Add repository secret COCOAPODS_TRUNK_TOKEN (from pod trunk me after
pod trunk register). Without it the job lints and skips the push.
The Flutter plugin depends on TugboatCaptureRuntime 0.1.0 from trunk and
sets the plugin floor to iOS 15. The example app path-overrides the pod to
this repository for unpublished runtime work.
- Runtime PR: bump
TugboatCaptureRuntime.podspecs.versionand merge. Wait until trunk has that version. - Flutter PR: pin
s.dependency 'TugboatCaptureRuntime', '<that version>', bumptugboat/tugboat_dio, and merge.
Do not merge a Flutter pin for a version that is not on trunk yet. After an
apple-runtime-v* publish, publish-apple.yml waits for trunk and opens
chore/pin-tugboat-capture-runtime-<version> when the plugin still lags.
Recovery: re-run Publish Apple runtime on the tag or via
workflow_dispatch.
- Confirm
capture-runtime0.1.0is on Maven Central (done for 0.8.14). - Point the Flutter Android plugin at the published coordinate (done in 0.8.14).
- Publish Apple
TugboatCaptureRuntime0.1.0to CocoaPods (0.8.15) and keep native capture opt-in until gates pass, then consider making it the default. - Bump Flutter to
0.9.0when native capture becomes the default. - Tag
v0.9.0(same pattern as 0.8.x) so GitHub Actions publishes the pub packages.