If you have multiple blocks that are used in multiple places, this can quickly blow up the size of your Payload Config. This will incur a performance hit, as more data is
1. sent to the client (=> bloated `ClientConfig` and large initial html) and
2. processed on the server (permissions are calculated every single time you navigate to a page - this iterates through all blocks you have defined, even if they're duplicative)
This can be optimized by defining your block **once** in your Payload Config, and just referencing the block slug whenever it's used, instead of passing the entire block config. To do this, the block can be defined in the `blocks` array of the Payload Config. The slug can then be passed to the `blockReferences` array in the Blocks Field - the `blocks` array has to be empty for compatibility reasons.
```ts
import { buildConfig } from 'payload'
import { lexicalEditor, BlocksFeature } from '@payloadcms/richtext-lexical'
// Payload Config
const config = buildConfig({
// Define the block once
blocks: [
{
slug: 'TextBlock',
fields: [
{
name: 'text',
type: 'text',
},
],
},
],
collections: [
{
slug: 'collection1',
fields: [
{
name: 'content',
type: 'blocks',
// Reference the block by slug
blockReferences: ['TextBlock'],
blocks: [], // Required to be empty, for compatibility reasons
},
],
},
{
slug: 'collection2',
fields: [
{
name: 'editor',
type: 'richText',
editor: lexicalEditor({
BlocksFeature({
// Same reference can be reused anywhere, even in the lexical editor, without incurred performance hit
blocks: ['TextBlock'],
})
})
},
],
},
],
})
```
## v4.0 Plans
In 4.0, we will remove the `blockReferences` property, and allow string block references to be passed directly to the blocks `property`. Essentially, we'd remove the `blocks` property and rename `blockReferences` to `blocks`.
The reason we opted to a new property in this PR is to avoid breaking changes. Allowing strings to be passed to the `blocks` property will prevent plugins that iterate through fields / blocks from compiling.
## PR Changes
- Testing: This PR introduces a plugin that automatically converts blocks to block references. This is done in the fields__blocks test suite, to run our existing test suite using block references.
- Block References support: Most changes are similar. Everywhere we iterate through blocks, we have to now do the following:
1. Check if `field.blockReferences` is provided. If so, only iterate through that.
2. Check if the block is an object (= actual block), or string
3. If it's a string, pull the actual block from the Payload Config or from `payload.blocks`.
The exception is config sanitization and block type generations. This PR optimizes them so that each block is only handled once, instead of every time the block is referenced.
## Benchmarks
60 Block fields, each block field having the same 600 Blocks.
### Before:
**Initial HTML:** 195 kB
**Generated types:** takes 11 minutes, 461,209 lines
https://github.com/user-attachments/assets/11d49a4e-5414-4579-8050-e6346e552f56
### After:
**Initial HTML:** 73.6 kB
**Generated types:** takes 2 seconds, 35,810 lines
https://github.com/user-attachments/assets/3eab1a99-6c29-489d-add5-698df67780a3
### After Permissions Optimization (follow-up PR)
Initial HTML: 73.6 kB
https://github.com/user-attachments/assets/a909202e-45a8-4bf6-9a38-8c85813f1312
## Future Plans
1. This PR does not yet deduplicate block references during permissions calculation. We'll optimize that in a separate PR, as this one is already large enough
2. The same optimization can be done to deduplicate fields. One common use-case would be link field groups that may be referenced in multiple entities, outside of blocks. We might explore adding a new `fieldReferences` property, that allows you to reference those same `config.blocks`.
530 lines
17 KiB
YAML
530 lines
17 KiB
YAML
name: build
|
|
|
|
on:
|
|
pull_request:
|
|
types:
|
|
- opened
|
|
- reopened
|
|
- synchronize
|
|
push:
|
|
branches:
|
|
- main
|
|
|
|
concurrency:
|
|
# <workflow_name>-<branch_name>-<true || commit_sha if branch is protected>
|
|
group: ${{ github.workflow }}-${{ github.ref }}-${{ github.ref_protected && github.sha || ''}}
|
|
cancel-in-progress: true
|
|
|
|
env:
|
|
NODE_VERSION: 22.6.0
|
|
PNPM_VERSION: 9.7.1
|
|
DO_NOT_TRACK: 1 # Disable Turbopack telemetry
|
|
NEXT_TELEMETRY_DISABLED: 1 # Disable Next telemetry
|
|
|
|
jobs:
|
|
changes:
|
|
runs-on: ubuntu-24.04
|
|
permissions:
|
|
pull-requests: read
|
|
outputs:
|
|
needs_build: ${{ steps.filter.outputs.needs_build }}
|
|
needs_tests: ${{ steps.filter.outputs.needs_tests }}
|
|
templates: ${{ steps.filter.outputs.templates }}
|
|
steps:
|
|
# https://github.com/actions/virtual-environments/issues/1187
|
|
- name: tune linux network
|
|
run: sudo ethtool -K eth0 tx off rx off
|
|
|
|
- uses: actions/checkout@v4
|
|
- uses: dorny/paths-filter@v3
|
|
id: filter
|
|
with:
|
|
filters: |
|
|
needs_build:
|
|
- '.github/workflows/**'
|
|
- 'packages/**'
|
|
- 'test/**'
|
|
- 'pnpm-lock.yaml'
|
|
- 'package.json'
|
|
- 'templates/**'
|
|
needs_tests:
|
|
- '.github/workflows/**'
|
|
- 'packages/**'
|
|
- 'test/**'
|
|
- 'pnpm-lock.yaml'
|
|
- 'package.json'
|
|
templates:
|
|
- 'templates/**'
|
|
- name: Log all filter results
|
|
run: |
|
|
echo "needs_build: ${{ steps.filter.outputs.needs_build }}"
|
|
echo "needs_tests: ${{ steps.filter.outputs.needs_tests }}"
|
|
echo "templates: ${{ steps.filter.outputs.templates }}"
|
|
|
|
lint:
|
|
# Follows same github's ci skip: [skip lint], [lint skip], [no lint]
|
|
if: >
|
|
github.event_name == 'pull_request' &&
|
|
!contains(github.event.pull_request.title, '[skip lint]') &&
|
|
!contains(github.event.pull_request.title, '[lint skip]') &&
|
|
!contains(github.event.pull_request.title, '[no lint]')
|
|
runs-on: ubuntu-24.04
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
with:
|
|
fetch-depth: 0
|
|
|
|
- name: Node setup
|
|
uses: ./.github/actions/setup
|
|
with:
|
|
node-version: ${{ env.NODE_VERSION }}
|
|
pnpm-version: ${{ env.PNPM_VERSION }}
|
|
pnpm-install-cache-key: pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
|
|
|
- name: Lint staged
|
|
run: |
|
|
git diff --name-only --diff-filter=d origin/${GITHUB_BASE_REF}...${GITHUB_SHA}
|
|
npx lint-staged --diff="origin/${GITHUB_BASE_REF}...${GITHUB_SHA}"
|
|
|
|
build:
|
|
needs: changes
|
|
if: ${{ needs.changes.outputs.needs_build == 'true' }}
|
|
runs-on: ubuntu-24.04
|
|
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- name: Node setup
|
|
uses: ./.github/actions/setup
|
|
with:
|
|
node-version: ${{ env.NODE_VERSION }}
|
|
pnpm-version: ${{ env.PNPM_VERSION }}
|
|
pnpm-install-cache-key: pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
|
|
|
- run: pnpm run build:all
|
|
env:
|
|
DO_NOT_TRACK: 1 # Disable Turbopack telemetry
|
|
|
|
- name: Cache build
|
|
uses: actions/cache@v4
|
|
with:
|
|
path: ./*
|
|
key: ${{ github.sha }}-${{ github.run_number }}
|
|
|
|
tests-unit:
|
|
runs-on: ubuntu-24.04
|
|
needs: [changes, build]
|
|
if: ${{ needs.changes.outputs.needs_tests == 'true' }}
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- name: Node setup
|
|
uses: ./.github/actions/setup
|
|
with:
|
|
node-version: ${{ env.NODE_VERSION }}
|
|
pnpm-version: ${{ env.PNPM_VERSION }}
|
|
pnpm-run-install: false
|
|
pnpm-restore-cache: false # Full build is restored below
|
|
pnpm-install-cache-key: pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
|
|
|
- name: Restore build
|
|
uses: actions/cache@v4
|
|
with:
|
|
path: ./*
|
|
key: ${{ github.sha }}-${{ github.run_number }}
|
|
|
|
- name: Unit Tests
|
|
run: pnpm test:unit
|
|
env:
|
|
NODE_OPTIONS: --max-old-space-size=8096
|
|
|
|
tests-types:
|
|
runs-on: ubuntu-24.04
|
|
needs: [changes, build]
|
|
if: ${{ needs.changes.outputs.needs_tests == 'true' }}
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- name: Node setup
|
|
uses: ./.github/actions/setup
|
|
with:
|
|
node-version: ${{ env.NODE_VERSION }}
|
|
pnpm-version: ${{ env.PNPM_VERSION }}
|
|
pnpm-run-install: false
|
|
pnpm-restore-cache: false # Full build is restored below
|
|
pnpm-install-cache-key: pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
|
|
|
- name: Restore build
|
|
uses: actions/cache@v4
|
|
with:
|
|
path: ./*
|
|
key: ${{ github.sha }}-${{ github.run_number }}
|
|
|
|
- name: Types Tests
|
|
run: pnpm test:types --target '>=5.7'
|
|
env:
|
|
NODE_OPTIONS: --max-old-space-size=8096
|
|
|
|
tests-int:
|
|
runs-on: ubuntu-24.04
|
|
needs: [changes, build]
|
|
if: ${{ needs.changes.outputs.needs_tests == 'true' }}
|
|
name: int-${{ matrix.database }}
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
database:
|
|
- mongodb
|
|
- postgres
|
|
- postgres-custom-schema
|
|
- postgres-uuid
|
|
- supabase
|
|
- sqlite
|
|
- sqlite-uuid
|
|
env:
|
|
POSTGRES_USER: postgres
|
|
POSTGRES_PASSWORD: postgres
|
|
POSTGRES_DB: payloadtests
|
|
AWS_ENDPOINT_URL: http://127.0.0.1:4566
|
|
AWS_ACCESS_KEY_ID: localstack
|
|
AWS_SECRET_ACCESS_KEY: localstack
|
|
AWS_REGION: us-east-1
|
|
|
|
services:
|
|
postgres:
|
|
image: ${{ (startsWith(matrix.database, 'postgres') ) && 'postgis/postgis:16-3.4' || '' }}
|
|
env:
|
|
# must specify password for PG Docker container image, see: https://registry.hub.docker.com/_/postgres?tab=description&page=1&name=10
|
|
POSTGRES_USER: ${{ env.POSTGRES_USER }}
|
|
POSTGRES_PASSWORD: ${{ env.POSTGRES_PASSWORD }}
|
|
POSTGRES_DB: ${{ env.POSTGRES_DB }}
|
|
ports:
|
|
- 5432:5432
|
|
# needed because the postgres container does not provide a healthcheck
|
|
options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
|
|
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- name: Node setup
|
|
uses: ./.github/actions/setup
|
|
with:
|
|
node-version: ${{ env.NODE_VERSION }}
|
|
pnpm-version: ${{ env.PNPM_VERSION }}
|
|
pnpm-run-install: false
|
|
pnpm-restore-cache: false # Full build is restored below
|
|
pnpm-install-cache-key: pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
|
|
|
- name: Restore build
|
|
uses: actions/cache@v4
|
|
with:
|
|
path: ./*
|
|
key: ${{ github.sha }}-${{ github.run_number }}
|
|
|
|
- name: Start LocalStack
|
|
run: pnpm docker:start
|
|
|
|
- name: Install Supabase CLI
|
|
uses: supabase/setup-cli@v1
|
|
with:
|
|
version: latest
|
|
if: matrix.database == 'supabase'
|
|
|
|
- name: Initialize Supabase
|
|
run: |
|
|
supabase init
|
|
supabase start
|
|
if: matrix.database == 'supabase'
|
|
|
|
- name: Configure PostgreSQL
|
|
run: |
|
|
psql "postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@localhost:5432/$POSTGRES_DB" -c "CREATE ROLE runner SUPERUSER LOGIN;"
|
|
psql "postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@localhost:5432/$POSTGRES_DB" -c "SELECT version();"
|
|
echo "POSTGRES_URL=postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@localhost:5432/$POSTGRES_DB" >> $GITHUB_ENV
|
|
if: startsWith(matrix.database, 'postgres')
|
|
|
|
- name: Configure PostgreSQL with custom schema
|
|
run: |
|
|
psql "postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@localhost:5432/$POSTGRES_DB" -c "CREATE SCHEMA custom;"
|
|
if: matrix.database == 'postgres-custom-schema'
|
|
|
|
- name: Configure Supabase
|
|
run: |
|
|
echo "POSTGRES_URL=postgresql://postgres:postgres@127.0.0.1:54322/postgres" >> $GITHUB_ENV
|
|
if: matrix.database == 'supabase'
|
|
|
|
- name: Integration Tests
|
|
run: pnpm test:int
|
|
env:
|
|
NODE_OPTIONS: --max-old-space-size=8096
|
|
PAYLOAD_DATABASE: ${{ matrix.database }}
|
|
POSTGRES_URL: ${{ env.POSTGRES_URL }}
|
|
|
|
tests-e2e:
|
|
runs-on: ubuntu-24.04
|
|
needs: [changes, build]
|
|
if: ${{ needs.changes.outputs.needs_tests == 'true' }}
|
|
name: e2e-${{ matrix.suite }}
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
# find test -type f -name 'e2e.spec.ts' | sort | xargs dirname | xargs -I {} basename {}
|
|
suite:
|
|
- _community
|
|
- access-control
|
|
- admin__e2e__general
|
|
- admin__e2e__list-view
|
|
- admin__e2e__document-view
|
|
- admin-root
|
|
- auth
|
|
- auth-basic
|
|
- joins
|
|
- field-error-states
|
|
- fields-relationship
|
|
- fields__collections__Array
|
|
- fields__collections__Blocks
|
|
- fields__collections__Blocks#config.blockreferences.ts
|
|
- fields__collections__Checkbox
|
|
- fields__collections__Collapsible
|
|
- fields__collections__ConditionalLogic
|
|
- fields__collections__CustomID
|
|
- fields__collections__Date
|
|
- fields__collections__Email
|
|
- fields__collections__Indexed
|
|
- fields__collections__JSON
|
|
- fields__collections__Lexical__e2e__main
|
|
- fields__collections__Lexical__e2e__blocks
|
|
- fields__collections__Lexical__e2e__blocks#config.blockreferences.ts
|
|
- fields__collections__Number
|
|
- fields__collections__Point
|
|
- fields__collections__Radio
|
|
- fields__collections__Relationship
|
|
- fields__collections__RichText
|
|
- fields__collections__Row
|
|
- fields__collections__Select
|
|
- fields__collections__Tabs
|
|
- fields__collections__Tabs2
|
|
- fields__collections__Text
|
|
- fields__collections__UI
|
|
- fields__collections__Upload
|
|
- live-preview
|
|
- localization
|
|
- locked-documents
|
|
- i18n
|
|
- plugin-cloud-storage
|
|
- plugin-form-builder
|
|
- plugin-nested-docs
|
|
- plugin-seo
|
|
- versions
|
|
- uploads
|
|
env:
|
|
SUITE_NAME: ${{ matrix.suite }}
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- name: Node setup
|
|
uses: ./.github/actions/setup
|
|
with:
|
|
node-version: ${{ env.NODE_VERSION }}
|
|
pnpm-version: ${{ env.PNPM_VERSION }}
|
|
pnpm-run-install: false
|
|
pnpm-restore-cache: false # Full build is restored below
|
|
pnpm-install-cache-key: pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
|
|
|
- name: Restore build
|
|
uses: actions/cache@v4
|
|
with:
|
|
path: ./*
|
|
key: ${{ github.sha }}-${{ github.run_number }}
|
|
|
|
- name: Start LocalStack
|
|
run: pnpm docker:start
|
|
if: ${{ matrix.suite == 'plugin-cloud-storage' }}
|
|
|
|
- name: Store Playwright's Version
|
|
run: |
|
|
# Extract the version number using a more targeted regex pattern with awk
|
|
PLAYWRIGHT_VERSION=$(pnpm ls @playwright/test --depth=0 | awk '/@playwright\/test/ {print $2}')
|
|
echo "Playwright's Version: $PLAYWRIGHT_VERSION"
|
|
echo "PLAYWRIGHT_VERSION=$PLAYWRIGHT_VERSION" >> $GITHUB_ENV
|
|
|
|
- name: Cache Playwright Browsers for Playwright's Version
|
|
id: cache-playwright-browsers
|
|
uses: actions/cache@v4
|
|
with:
|
|
path: ~/.cache/ms-playwright
|
|
key: playwright-browsers-${{ env.PLAYWRIGHT_VERSION }}
|
|
|
|
- name: Setup Playwright - Browsers and Dependencies
|
|
if: steps.cache-playwright-browsers.outputs.cache-hit != 'true'
|
|
run: pnpm exec playwright install --with-deps chromium
|
|
|
|
- name: Setup Playwright - Dependencies-only
|
|
if: steps.cache-playwright-browsers.outputs.cache-hit == 'true'
|
|
run: pnpm exec playwright install-deps chromium
|
|
|
|
- name: E2E Tests
|
|
run: PLAYWRIGHT_JSON_OUTPUT_NAME=results_${{ matrix.suite }}.json pnpm test:e2e:prod:ci ${{ matrix.suite }}
|
|
env:
|
|
PLAYWRIGHT_JSON_OUTPUT_NAME: results_${{ matrix.suite }}.json
|
|
NEXT_TELEMETRY_DISABLED: 1
|
|
|
|
- uses: actions/upload-artifact@v4
|
|
if: always()
|
|
with:
|
|
name: test-results-${{ matrix.suite }}
|
|
path: test/test-results/
|
|
if-no-files-found: ignore
|
|
retention-days: 1
|
|
|
|
# Disabled until this is fixed: https://github.com/daun/playwright-report-summary/issues/156
|
|
# - uses: daun/playwright-report-summary@v3
|
|
# with:
|
|
# report-file: results_${{ matrix.suite }}.json
|
|
# report-tag: ${{ matrix.suite }}
|
|
# job-summary: true
|
|
|
|
# Build listed templates with packed local packages
|
|
build-templates:
|
|
runs-on: ubuntu-24.04
|
|
needs: build
|
|
strategy:
|
|
matrix:
|
|
include:
|
|
- template: blank
|
|
database: mongodb
|
|
- template: website
|
|
database: mongodb
|
|
- template: with-payload-cloud
|
|
database: mongodb
|
|
- template: with-vercel-mongodb
|
|
database: mongodb
|
|
# Postgres
|
|
- template: with-postgres
|
|
database: postgres
|
|
- template: with-vercel-postgres
|
|
database: postgres
|
|
|
|
- template: plugin
|
|
|
|
# Re-enable once PG conncection is figured out
|
|
# - template: with-vercel-website
|
|
# database: postgres
|
|
|
|
name: ${{ matrix.template }}-${{ matrix.database }}
|
|
|
|
env:
|
|
POSTGRES_USER: postgres
|
|
POSTGRES_PASSWORD: postgres
|
|
POSTGRES_DB: payloadtests
|
|
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- name: Node setup
|
|
uses: ./.github/actions/setup
|
|
with:
|
|
node-version: ${{ env.NODE_VERSION }}
|
|
pnpm-version: ${{ env.PNPM_VERSION }}
|
|
pnpm-run-install: false
|
|
pnpm-restore-cache: false # Full build is restored below
|
|
pnpm-install-cache-key: pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
|
|
|
- name: Restore build
|
|
uses: actions/cache@v4
|
|
with:
|
|
path: ./*
|
|
key: ${{ github.sha }}-${{ github.run_number }}
|
|
|
|
- name: Start PostgreSQL
|
|
uses: CasperWA/postgresql-action@v1.2
|
|
with:
|
|
postgresql version: '14' # See https://hub.docker.com/_/postgres for available versions
|
|
postgresql db: ${{ env.POSTGRES_DB }}
|
|
postgresql user: ${{ env.POSTGRES_USER }}
|
|
postgresql password: ${{ env.POSTGRES_PASSWORD }}
|
|
if: matrix.database == 'postgres'
|
|
|
|
- name: Wait for PostgreSQL
|
|
run: sleep 30
|
|
if: matrix.database == 'postgres'
|
|
|
|
- name: Configure PostgreSQL
|
|
run: |
|
|
psql "postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@localhost:5432/$POSTGRES_DB" -c "CREATE ROLE runner SUPERUSER LOGIN;"
|
|
psql "postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@localhost:5432/$POSTGRES_DB" -c "SELECT version();"
|
|
echo "POSTGRES_URL=postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@localhost:5432/$POSTGRES_DB" >> $GITHUB_ENV
|
|
if: matrix.database == 'postgres'
|
|
|
|
- name: Start MongoDB
|
|
uses: supercharge/mongodb-github-action@1.11.0
|
|
with:
|
|
mongodb-version: 6.0
|
|
if: matrix.database == 'mongodb'
|
|
|
|
- name: Build Template
|
|
run: |
|
|
pnpm run script:pack --dest templates/${{ matrix.template }}
|
|
pnpm run script:build-template-with-local-pkgs ${{ matrix.template }} $POSTGRES_URL
|
|
env:
|
|
NODE_OPTIONS: --max-old-space-size=8096
|
|
|
|
tests-type-generation:
|
|
runs-on: ubuntu-24.04
|
|
needs: [changes, build]
|
|
if: ${{ needs.changes.outputs.needs_tests == 'true' }}
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- name: Node setup
|
|
uses: ./.github/actions/setup
|
|
with:
|
|
node-version: ${{ env.NODE_VERSION }}
|
|
pnpm-version: ${{ env.PNPM_VERSION }}
|
|
pnpm-run-install: false
|
|
pnpm-restore-cache: false # Full build is restored below
|
|
pnpm-install-cache-key: pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
|
|
|
- name: Restore build
|
|
uses: actions/cache@v4
|
|
with:
|
|
path: ./*
|
|
key: ${{ github.sha }}-${{ github.run_number }}
|
|
|
|
- name: Generate Payload Types
|
|
run: pnpm dev:generate-types fields
|
|
|
|
- name: Generate GraphQL schema file
|
|
run: pnpm dev:generate-graphql-schema graphql-schema-gen
|
|
|
|
all-green:
|
|
name: All Green
|
|
if: always()
|
|
runs-on: ubuntu-24.04
|
|
needs:
|
|
- lint
|
|
- build
|
|
- build-templates
|
|
- tests-unit
|
|
- tests-int
|
|
- tests-e2e
|
|
- tests-types
|
|
- tests-type-generation
|
|
|
|
steps:
|
|
- if: ${{ always() && (contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled')) }}
|
|
run: exit 1
|
|
|
|
publish-canary:
|
|
name: Publish Canary
|
|
runs-on: ubuntu-24.04
|
|
if: ${{ needs.all-green.result == 'success' && github.ref_name == 'main' }}
|
|
needs:
|
|
- all-green
|
|
|
|
steps:
|
|
# debug github.ref output
|
|
- run: |
|
|
echo github.ref: ${{ github.ref }}
|
|
echo isV3: ${{ github.ref == 'refs/heads/main' }}
|