Files
upstream-tldraw/.github/workflows/publish.yml
upstream-mirror a774ac673a
Some checks failed
Deploy analytics worker / Deploy analytics worker to ${{ (github.ref == 'refs/heads/production' && 'production') || (github.ref == 'refs/heads/main' && 'staging') || 'preview' }} (push) Failing after 1s
i18n upload strings / Upload latest strings (push) Failing after 1s
Deploy bemo / Deploy bemo to ${{ (github.ref == 'refs/heads/bemo-production' && 'production') || (github.ref == 'refs/heads/main' && 'staging') || 'preview' }} (push) Failing after 1s
Deploy grafana resources / ${{ github.event_name == 'push' && 'Deploy grafana resources' || 'Validate grafana resources (dry run)' }} (push) Failing after 0s
End to end tests (dotcom) / Check for relevant changes (push) Failing after 0s
End to end tests (examples) / Check for relevant changes (push) Failing after 0s
End to end tests (mermaid readability) / Check for relevant changes (push) Failing after 1s
End to end tests (perf) / Check for relevant changes (push) Failing after 0s
Publish editor extensions / Publish editor extensions (push) Failing after 1s
Publish SDK packages / Remove the publish-packages label (push) Has been skipped
Checks / Tests & checks (push) Has been cancelled
Checks / Build all projects (push) Has been cancelled
Deploy templates / Deploy templates (push) Has been cancelled
End to end tests (dotcom) / End to end tests (dotcom) (push) Has been cancelled
End to end tests (mermaid readability) / End to end tests (mermaid readability) (push) Has been cancelled
End to end tests (perf) / End to end tests (perf) (push) Has been cancelled
Deploy .com / Deploy dotcom to ${{ (github.ref == 'refs/heads/production' && 'production') || (github.ref == 'refs/heads/main' && 'staging') || 'preview' }} (push) Has been cancelled
End to end tests (examples) / End to end tests (examples) (push) Has been cancelled
Publish SDK packages / Publish SDK packages (push) Has been cancelled
Publish SDK packages / Tell user released version (push) Has been cancelled
Publish SDK packages / Publishes code templates to separate repositories (push) Has been cancelled
Publish SDK packages / Deploys the template demos with the new SDK version (push) Has been cancelled
snapshot of https://github.com/tldraw/tldraw.git (main, 2026-09-23; blobs > 131072B omitted)
2026-09-23 16:12:52 +05:00

331 lines
12 KiB
YAML

name: Publish SDK packages
on:
push:
branches:
- main
- production
- 'v*.*.x'
pull_request:
types: [labeled]
workflow_dispatch:
inputs:
publish_type:
type: choice
description: What to publish
required: true
default: manual
options:
- manual
- new
version:
description: Version to republish (manual only)
required: false
bump_type:
type: choice
description: Version bump type (new release only)
required: false
default: minor
options:
- minor
- major
- override
version_override:
type: string
description: Version override (new release only)
required: false
defaults:
run:
shell: bash
permissions:
contents: read
jobs:
remove-label:
name: Remove the publish-packages label
if: |
github.event_name == 'pull_request' &&
github.event.label.name == 'publish-packages' &&
github.event.pull_request.head.repo.full_name == github.repository
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
- name: Remove the publish-packages label
uses: actions-ecosystem/action-remove-labels@v1
with:
labels: publish-packages
publish:
name: Publish SDK packages
if: |
github.event_name != 'pull_request' ||
(
github.event.label.name == 'publish-packages' &&
github.event.pull_request.head.repo.full_name == github.repository
)
environment: npm deploy
timeout-minutes: 60
runs-on: ubuntu-latest-16-cores-arm-open
concurrency:
group: ${{ (github.event_name == 'workflow_dispatch' || startsWith(github.ref, 'refs/heads/v')) && 'npm-publish' || format('npm-publish-{0}', github.run_id) }}
permissions:
contents: read
id-token: write
outputs:
mode: ${{ steps.publish_mode.outputs.mode }}
version: ${{ steps.version.outputs.value }}
is_latest_version: ${{ steps.publish.outputs.is_latest_version }}
steps:
- name: Determine publish mode
id: publish_mode
env:
EVENT_NAME: ${{ github.event_name }}
EVENT_LABEL_NAME: ${{ github.event.label.name }}
REF: ${{ github.ref }}
REF_NAME: ${{ github.ref_name }}
DISPATCH_PUBLISH_TYPE: ${{ inputs.publish_type }}
DISPATCH_VERSION: ${{ inputs.version }}
DISPATCH_BUMP_TYPE: ${{ inputs.bump_type }}
DISPATCH_VERSION_OVERRIDE: ${{ inputs.version_override }}
run: |
mode=
bemo_url=https://demo.tldraw.xyz
use_huppy=false
case "$EVENT_NAME" in
push)
if [[ "$REF" == "refs/heads/main" ]]; then
mode=canary
bemo_url=https://canary-demo.tldraw.xyz
elif [[ "$REF" == "refs/heads/production" ]]; then
mode=next
bemo_url=https://canary-demo.tldraw.xyz
elif [[ "$REF_NAME" =~ ^v[0-9]+\.[0-9]+\.x$ ]]; then
mode=patch
use_huppy=true
fi
;;
pull_request)
if [[ "$EVENT_LABEL_NAME" == "publish-packages" ]]; then
mode=internal
bemo_url=https://canary-demo.tldraw.xyz
fi
;;
workflow_dispatch)
mode="$DISPATCH_PUBLISH_TYPE"
if [[ "$mode" == "manual" || "$mode" == "new" ]]; then
use_huppy=true
fi
;;
esac
if [[ -z "$mode" ]]; then
echo "ERROR Could not determine publish mode for $EVENT_NAME on $REF."
exit 1
fi
if [[ "$mode" == "manual" && -z "$DISPATCH_VERSION" ]]; then
echo "ERROR You must provide a version when manually republishing packages."
exit 1
fi
if [[ "$mode" == "new" ]]; then
if [[ "$REF_NAME" != "production" ]]; then
echo "ERROR You must be on the production branch to publish a new version."
exit 1
fi
if [[ "$DISPATCH_BUMP_TYPE" != "minor" && "$DISPATCH_BUMP_TYPE" != "major" && "$DISPATCH_BUMP_TYPE" != "override" ]]; then
echo "ERROR New releases must use a minor, major, or override bump type."
exit 1
fi
if [[ "$DISPATCH_BUMP_TYPE" != "override" && -n "$DISPATCH_VERSION_OVERRIDE" ]]; then
echo "ERROR You must set the bump type to override if you supply a custom version number override."
exit 1
fi
if [[ "$DISPATCH_BUMP_TYPE" == "override" && -z "$DISPATCH_VERSION_OVERRIDE" ]]; then
echo "ERROR You must supply a version override when using the override bump type."
exit 1
fi
fi
{
echo "mode=$mode"
echo "bemo_url=$bemo_url"
echo "use_huppy=$use_huppy"
} >> "$GITHUB_OUTPUT"
- name: Generate GH token
id: generate_token
if: steps.publish_mode.outputs.use_huppy == 'true'
uses: tibdex/github-app-token@b62528385c34dbc9f38e5f4225ac829252d1ea92
with:
app_id: ${{ secrets.HUPPY_APP_ID }}
private_key: ${{ secrets.HUPPY_APP_PRIVATE_KEY }}
- name: Check out code
id: checkout
uses: actions/checkout@v6
with:
fetch-depth: 0
persist-credentials: ${{ steps.publish_mode.outputs.use_huppy != 'true' }}
token: ${{ (steps.publish_mode.outputs.use_huppy == 'true' && steps.generate_token.outputs.token) || github.token }}
- name: Configure git credentials
if: steps.publish_mode.outputs.use_huppy == 'true'
run: |
git config --global url."https://x-access-token:${{ steps.generate_token.outputs.token }}@github.com/".insteadOf "https://github.com/"
git config --global user.name 'huppy-bot[bot]'
git config --global user.email '128400622+huppy-bot[bot]@users.noreply.github.com'
- name: Run our setup
uses: ./.github/actions/setup
- name: Publish
id: publish
env:
GH_TOKEN: ${{ (steps.publish_mode.outputs.use_huppy == 'true' && steps.generate_token.outputs.token) || github.token }}
R2_ACCESS_KEY_ID: ${{ secrets.R2_ACCESS_KEY_ID }}
R2_ACCESS_KEY_SECRET: ${{ secrets.R2_ACCESS_KEY_SECRET }}
TLDRAW_BEMO_URL: ${{ steps.publish_mode.outputs.bemo_url }}
TLDRAW_VERSION_STRING: ${{ inputs.version }}
PUBLISH_MODE: ${{ steps.publish_mode.outputs.mode }}
BUMP_TYPE: ${{ inputs.bump_type }}
VERSION_OVERRIDE: ${{ inputs.version_override }}
run: |
case "$PUBLISH_MODE" in
canary | internal | next)
yarn tsx ./internal/scripts/publish-prerelease.ts "$PUBLISH_MODE"
;;
patch)
yarn tsx ./internal/scripts/publish-patch.ts
;;
manual)
yarn tsx ./internal/scripts/publish-manual.ts
;;
new)
bump="${BUMP_TYPE:-minor}"
if [[ "$bump" == "override" ]]; then
bump="$VERSION_OVERRIDE"
fi
yarn tsx ./internal/scripts/publish-new.ts --bump "$bump"
;;
*)
echo "ERROR Unknown publish mode: $PUBLISH_MODE"
exit 1
;;
esac
- name: Get published version
id: version
run: echo "value=$(jq -r .version ./packages/tldraw/package.json)" >> "$GITHUB_OUTPUT"
# Tell tldraw-internal to update its pinned SDK version. Fires only on a
# `next` publish — the prerelease channel the internal monorepo tracks.
# The tldraw-internal "Update tldraw" workflow listens for the
# `tldraw-release` repository_dispatch and resolves the latest `next`
# version itself, so the payload version is informational.
- name: Generate tldraw-internal token
if: steps.publish_mode.outputs.mode == 'next'
id: generate_internal_token
uses: actions/create-github-app-token@v2
with:
app-id: ${{ vars.HUPPY_APP_ID }}
private-key: ${{ secrets.HUPPY_PRIVATE_KEY }}
owner: tldraw
repositories: tldraw-internal
- name: Notify tldraw-internal
if: steps.publish_mode.outputs.mode == 'next'
run: |
curl -X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${{ steps.generate_internal_token.outputs.token }}" \
https://api.github.com/repos/tldraw/tldraw-internal/dispatches \
-d '{"event_type":"tldraw-release","client_payload":{"version":"${{ steps.version.outputs.value }}","tag":"next"}}'
# Preserve the setup action for post-job cleanup when checkout already succeeded.
- name: Check out Discord notify action
if: failure() && steps.checkout.outcome != 'success'
uses: actions/checkout@v6
with:
sparse-checkout: .github/actions/discord-fail-notify
- name: Notify Discord on failure
if: failure()
uses: ./.github/actions/discord-fail-notify
with:
webhook-url: ${{ secrets.DISCORD_DEPLOY_WEBHOOK_URL }}
comment:
name: Tell user released version
if: needs.publish.outputs.mode == 'internal'
needs: publish
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
- name: Tell user released version
uses: actions-ecosystem/action-create-comment@v1
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
body: |
Published version ${{ needs.publish.outputs.version }} to npm.
publish_templates:
name: Publishes code templates to separate repositories
uses: tldraw/tldraw/.github/workflows/publish-templates.yml@main
if: needs.publish.outputs.mode == 'new' || ((needs.publish.outputs.mode == 'patch' || needs.publish.outputs.mode == 'manual') && needs.publish.outputs.is_latest_version == 'true')
secrets:
HUPPY_PRIVATE_KEY: ${{ secrets.HUPPY_PRIVATE_KEY }}
HUPPY_APP_ID: ${{ vars.HUPPY_APP_ID }}
DISCORD_DEPLOY_WEBHOOK_URL: ${{ secrets.DISCORD_DEPLOY_WEBHOOK_URL }}
needs: publish
deploy_templates:
name: Deploys the template demos with the new SDK version
if: needs.publish.outputs.mode == 'new' || ((needs.publish.outputs.mode == 'patch' || needs.publish.outputs.mode == 'manual') && needs.publish.outputs.is_latest_version == 'true')
needs: publish
# CLOUDFLARE_API_TOKEN and CLOUDFLARE_ACCOUNT_ID are secrets on this environment rather than on
# the repository, and a job has to select the environment to see them. Calling deploy-templates.yml
# as a reusable workflow doesn't do it: a called workflow only ever sees the secrets its caller
# hands it, so the v5.4.0 release reached the deploy with both empty (#10636) even though the
# called job selected deploy-production itself. The deploy runs here as a job of its own instead,
# sharing its steps with deploy-templates.yml through the composite action.
environment: deploy-production
timeout-minutes: 60
runs-on: ubuntu-latest-16-cores-arm-open
# same group as deploy-templates.yml: a release deploy and a template-change deploy can otherwise
# race each other onto the same custom domains, and the loser silently wins.
concurrency:
group: deploy-templates
cancel-in-progress: false
steps:
- name: Check out code
uses: actions/checkout@v6
with:
persist-credentials: false
- uses: ./.github/actions/deploy-templates
with:
license-key: ${{ secrets.TEMPLATES_TLDRAW_LICENSE_KEY }}
cloudflare-account-id: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
cloudflare-api-token: ${{ secrets.CLOUDFLARE_API_TOKEN }}
- name: Notify Discord on failure
if: failure()
uses: ./.github/actions/discord-fail-notify
with:
webhook-url: ${{ secrets.DISCORD_DEPLOY_WEBHOOK_URL }}