Publishing means two things: mirroring the Step into its own public repository
(the StepLib references a git URL whose root holds step.yml), and adding a
step.yml to the Bitrise StepLib via a pull request.
Three kinds of repository are involved, and all of them now exist:
| Repository | Role | Notes |
|---|---|---|
testingbot/testingbot-bitrise |
this monorepo — where the work happens | public, main |
testingbot/bitrise-step-testingbot-app-upload |
mirror of steps/testingbot-upload-app |
predates the rest: default branch is master, and it carries the published 0.0.1 tag |
testingbot/bitrise-step-testingbot-{espresso,xcuitest,maestro,tunnel,tunnel-stop} |
the other five mirrors | public, empty until the first git subtree push |
testingbot/bitrise-steplib |
fork of the StepLib that bitrise share writes into |
synced to upstream |
scripts/publish.sh asks each mirror for its own default branch, so the
master/main split between the old repo and the new ones is handled for you.
Resync the StepLib fork, or bitrise share builds its pull request against
stale history:
gh repo sync testingbot/bitrise-steplib --source bitrise-io/bitrise-steplib
export MY_STEPLIB_REPO_FORK_GIT_URL=https://github.com/testingbot/bitrise-steplib.git- The Bitrise CLI:
brew install bitrise && bitrise setup - Push access to the mirrors and the fork.
scripts/audit-all.sh # fast checks, no credentials needed
cd steps/<step-id> && bitrise run check # the full linter StepLib CI runs
cd steps/<step-id> && bitrise run test # live check, needs credentialsbitrise run check is the one that matters for the submission: it runs
yamllint, validates step.yml against
the official JSON schema,
and checks step.yml against the README. Things it rejects that are easy to get
wrong:
xamarinis no longer a validproject_type_tagsvalue.- An input declaring
value_optionsmust have a non-empty default. If the input is genuinely optional, dropvalue_optionsand document the accepted values in itssummaryinstead. summarymust be a single line of 1-100 characters — usesummary: |-, notsummary: |, or the trailing newline fails the pattern.- The
websitefield must be agithub.com/<owner>/<repo>URL, orsteps-readme-generatorcrashes on it.
Set BITRISE_STEP_VERSION in steps/<step-id>/bitrise.yml. scripts/publish.sh
refuses to run if it disagrees with the version you pass on the command line.
Semver, and breaking changes — including renaming or removing an input — only in a major version.
README.md is generated from step.yml plus docs/examples.md and
docs/contributing.md by Bitrise's own generator:
scripts/gen-readme.sh <step-id> # or with no argument, for every Stepscripts/publish.sh <step-id> <version> # dry run, prints what it would do
scripts/publish.sh <step-id> <version> --push # mirror, then tag in the mirrorThe tag lives in the mirror, because that is the repository the StepLib
resolves --tag against. publish.sh refuses to overwrite an existing tag.
Never move a tag that has already been shared. The StepLib pins a commit SHA per version; re-tagging silently changes what published Workflows run. If something is wrong after sharing, bump the version.
bitrise share start -c "$MY_STEPLIB_REPO_FORK_GIT_URL"
bitrise share create --stepid <step-id> --tag <version> --git <mirror-url>
bitrise share audit -c "$MY_STEPLIB_REPO_FORK_GIT_URL"
bitrise share finishshare create writes steps/<step-id>/<version>/step.yml into your fork, adding
the auto-generated published_at and source (git URL + commit) fields. Never
hand-write those.
Against bitrise-io/bitrise-steplib, titled <step-id>-<version>.
The StepLib PR rules that catch people out:
- One Step per pull request, one file changed (plus an icon).
- Contributors can't see the StepLib CI results. First submissions often show failures the maintainers resolve — don't churn on it.
- If reviewers request changes you cannot amend the PR: close it, delete the share branch on the fork, fix the Step, tag a new version, and redo the flow in a new PR.
After the Step is merged, open a separate PR adding
steps/<step-id>/assets/icon.svg: 256×256 SVG, opaque background, 60 px margin.
There is nothing to submit separately — the integrations page is generated from the StepLib repository once the pull request is merged. Each field comes from a specific place:
| On the page | Comes from |
|---|---|
URL bitrise.io/integrations/steps/<step-id> |
the steps/<step-id>/ directory name |
| Icon | steps/<step-id>/assets/icon.svg (the separate PR above) |
| Title, one-line blurb | title, summary in step.yml |
| Category badge | type_tags |
| "Github Source" link | source_code_url |
| Long body | description (Markdown, and it drives search ranking) |
| Official / Verified / Community badge | maintainer: in steps/<step-id>/step-info.yml |
testingbot-upload-app already has a page, so republishing under the same ID
updates it in place rather than creating a second one. The five new Steps get
their pages when their first version merges.
The Workflow Editor's step picker also filters by that maintainer field, which is the practical reason to pursue Verified: it is the difference between appearing under "Verified" next to BrowserStack and LambdaTest, or under "Community".
TestingBot owns the service, so these Steps qualify for the Verified badge. Applying requires submitting a Workflow Recipe showing the Step in use, and accepting the maintainer SLA: first response within 5 business days, resolution within 10 days (critical bug) / 15 (bug) / 20 (feature request).
Two consequences worth knowing before applying:
- Never delete a mirror repository or its issue tracker. Published
step.ymlfiles carry permanent links to them. - Under the Abandoned Step policy, a Step left unmaintained can be deprecated or
replaced by Bitrise. If we ever stop maintaining one, open an issue on
bitrise-io/bitrise-steplibrather than deleting anything.