mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-05-04 21:22:07 +00:00
## Summary
Adds a unified manual-trigger release flow for the `apps/website`
package
(careers/marketing site at comfy.org), mirroring how main-app releases
work.
**User-facing flow:**
```
workflow_dispatch ──► fresh Ashby pull ──► auto-PR with snapshot bump
│
▼
existing CI / Vercel preview deploy
│
▼
human merges ──► auto prod deploy
```
The careers data on comfy.org comes from Ashby and is fetched at build
time by
`apps/website/src/utils/ashby.ts`. Without `WEBSITE_ASHBY_API_KEY`, the
build
falls back to a committed snapshot at
`apps/website/src/data/ashby-roles.snapshot.json`. That snapshot has
been
going stale because no CI workflow was passing the API key. This PR
fixes
both: a manual refresh workflow + day-to-day secrets wiring.
## Files
**Added**
- `.github/actions/ashby-pull/action.yaml` — composite action that runs
`pnpm --filter @comfyorg/website ashby:refresh-snapshot` with the Ashby
secrets piped in. Uses the existing `setup-frontend` composite for
pnpm/Node setup.
- `.github/workflows/release-website.yaml` — `workflow_dispatch`-only
release workflow. Checks out `main`, refreshes the snapshot via the
composite action, opens a PR labelled `Release:Website` via
`peter-evans/create-pull-request@c0f553fe…` (the same SHA pin used by
`release-version-bump.yaml`).
**Modified**
- `.github/workflows/ci-website-build.yaml` — adds
`WEBSITE_ASHBY_API_KEY`
and `WEBSITE_ASHBY_JOB_BOARD_NAME` env to the `Build website` step.
- `.github/workflows/ci-vercel-website-preview.yaml` — adds the same env
to both `vercel build` steps (preview + production).
## Snapshot fallback preserved
`apps/website/src/utils/ashby.ts` keeps using the committed snapshot
when
the API key is absent (e.g. fork PRs, secret rotation). Verified
locally:
```
$ pnpm --filter @comfyorg/website ashby:refresh-snapshot
Snapshot refresh aborted. Outcome: stale; reason: missing WEBSITE_ASHBY_API_KEY...
```
The release workflow surfaces this as a job failure, which is the
desired
behavior for a manual release trigger.
## Validation
- `yamllint --config-file .yamllint` on all changed YAML — clean
- `./scripts/cicd/check-yaml.sh` — clean
- `pinact run --check` on new files — clean (matches `.pinact.yaml`
policy)
- `pnpm install --frozen-lockfile` — works with `.nvmrc` Node 24
- Husky pre-commit hooks (eslint + typecheck + lint-staged) passed
## Caveats
- **Cannot fully end-to-end test until merged.** `workflow_dispatch`
workflows only run from branches that exist on `main`. The first
manual run can only happen after this PR lands. The pieces that
*can* be tested pre-merge — yamllint, pinact pin validation, and
the existing `CI: Website Build` / `CI: Vercel Website Preview`
workflows now picking up the secret — will run on this PR.
- **`Release:Website` label needs to be created** in the repo before
the auto-PR step will successfully apply it.
`peter-evans/create-pull-request`
will warn but not fail if the label doesn't exist. Suggested color:
`#4f6ef5` (matches `cloud/*` family in `release-branch-create.yaml`).
- The release workflow uses `secrets.PR_GH_TOKEN` (matching
`release-version-bump.yaml`) so the auto-PR can be authored by a
PAT and trigger downstream CI workflows. Without `PR_GH_TOKEN` it
will fall back behavior is up to GitHub Actions defaults — confirm
the secret exists before the first run.
## Context
Came out of work on `comfy-router#22` + `ComfyUI_frontend#11823`
(comfy.org/countdown subpage / website refresh). Discovered the
8+-day-stale snapshot while auditing the website build path.
┆Issue is synchronized with this [Notion
page](https://app.notion.com/p/PR-11829-feat-ci-add-Release-Website-workflow-to-refresh-Ashby-snapshot-3546d73d3650811eb300d8bcb593c652)
by [Unito](https://www.unito.io)
165 lines
5.3 KiB
YAML
165 lines
5.3 KiB
YAML
---
|
|
name: 'CI: Vercel Website Preview'
|
|
|
|
on:
|
|
pull_request:
|
|
types: [opened, synchronize, reopened]
|
|
paths:
|
|
- 'apps/website/**'
|
|
- 'packages/design-system/**'
|
|
- 'packages/tailwind-utils/**'
|
|
push:
|
|
branches: [main]
|
|
paths:
|
|
- 'apps/website/**'
|
|
- 'packages/design-system/**'
|
|
- 'packages/tailwind-utils/**'
|
|
|
|
env:
|
|
VERCEL_ORG_ID: ${{ secrets.VERCEL_WEBSITE_ORG_ID }}
|
|
VERCEL_PROJECT_ID: ${{ secrets.VERCEL_WEBSITE_PROJECT_ID }}
|
|
VERCEL_TOKEN: ${{ secrets.VERCEL_WEBSITE_TOKEN }}
|
|
VERCEL_SCOPE: comfyui
|
|
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
jobs:
|
|
deploy-preview:
|
|
if: github.event_name == 'pull_request'
|
|
runs-on: ubuntu-latest
|
|
permissions:
|
|
contents: read
|
|
env:
|
|
ALIAS_HOST: comfy-website-preview-pr-${{ github.event.pull_request.number }}.vercel.app
|
|
steps:
|
|
- name: Checkout repository
|
|
uses: actions/checkout@v6
|
|
|
|
- name: Install pnpm
|
|
uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v4.4.0
|
|
|
|
- name: Setup Node
|
|
uses: actions/setup-node@v6
|
|
with:
|
|
node-version-file: '.nvmrc'
|
|
|
|
- name: Install Vercel CLI
|
|
run: npm install --global vercel@latest
|
|
|
|
- name: Pull Vercel environment information
|
|
run: vercel pull --yes --environment=preview
|
|
|
|
- name: Build project artifacts
|
|
env:
|
|
WEBSITE_ASHBY_API_KEY: ${{ secrets.WEBSITE_ASHBY_API_KEY }}
|
|
WEBSITE_ASHBY_JOB_BOARD_NAME: ${{ secrets.WEBSITE_ASHBY_JOB_BOARD_NAME }}
|
|
run: vercel build
|
|
|
|
- name: Fetch head commit metadata
|
|
id: head-commit
|
|
uses: actions/github-script@v8
|
|
with:
|
|
script: |
|
|
const { data } = await github.rest.repos.getCommit({
|
|
owner: context.repo.owner,
|
|
repo: context.repo.repo,
|
|
ref: context.payload.pull_request.head.sha,
|
|
})
|
|
const author = data.author?.login || data.commit.author?.name || ''
|
|
const message = (data.commit.message || '').split('\n', 1)[0]
|
|
core.setOutput('author', author)
|
|
core.setOutput('message', message)
|
|
|
|
- name: Deploy project artifacts to Vercel
|
|
id: deploy
|
|
env:
|
|
GIT_COMMIT_REF: ${{ github.event.pull_request.head.ref }}
|
|
GIT_COMMIT_SHA: ${{ github.event.pull_request.head.sha }}
|
|
GIT_AUTHOR_LOGIN: ${{ steps.head-commit.outputs.author }}
|
|
GIT_COMMIT_MESSAGE: ${{ steps.head-commit.outputs.message }}
|
|
GIT_PR_ID: ${{ github.event.pull_request.number }}
|
|
GIT_REPO: ${{ github.repository }}
|
|
run: |
|
|
URL=$(vercel deploy --prebuilt \
|
|
--meta githubCommitRef="$GIT_COMMIT_REF" \
|
|
--meta githubCommitSha="$GIT_COMMIT_SHA" \
|
|
--meta githubCommitAuthorLogin="$GIT_AUTHOR_LOGIN" \
|
|
--meta githubCommitMessage="$GIT_COMMIT_MESSAGE" \
|
|
--meta githubPrId="$GIT_PR_ID" \
|
|
--meta githubRepo="$GIT_REPO")
|
|
echo "url=$URL" >> "$GITHUB_OUTPUT"
|
|
|
|
- name: Alias deployment to stable PR hostname
|
|
id: alias-set
|
|
continue-on-error: true
|
|
env:
|
|
DEPLOY_URL: ${{ steps.deploy.outputs.url }}
|
|
run: |
|
|
vercel alias set "$DEPLOY_URL" "$ALIAS_HOST" --scope="$VERCEL_SCOPE"
|
|
|
|
- name: Publish preview outputs
|
|
env:
|
|
DEPLOY_URL: ${{ steps.deploy.outputs.url }}
|
|
ALIAS_OK: ${{ steps.alias-set.outcome == 'success' }}
|
|
run: |
|
|
if [[ "$ALIAS_OK" == "true" ]]; then
|
|
STABLE_URL="https://$ALIAS_HOST"
|
|
else
|
|
STABLE_URL="$DEPLOY_URL"
|
|
fi
|
|
mkdir -p temp/vercel-preview
|
|
echo "$DEPLOY_URL" > temp/vercel-preview/url.txt
|
|
echo "$STABLE_URL" > temp/vercel-preview/stable-url.txt
|
|
{
|
|
echo "**Preview:** $STABLE_URL"
|
|
if [[ "$ALIAS_OK" == "true" ]]; then
|
|
echo "**This commit:** $DEPLOY_URL"
|
|
else
|
|
echo "_Stable alias update failed — URL reflects this commit only._"
|
|
fi
|
|
} >> "$GITHUB_STEP_SUMMARY"
|
|
|
|
- name: Upload preview metadata
|
|
uses: actions/upload-artifact@v6
|
|
with:
|
|
name: vercel-preview
|
|
path: temp/vercel-preview
|
|
|
|
deploy-production:
|
|
if: github.event_name == 'push'
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Checkout repository
|
|
uses: actions/checkout@v6
|
|
|
|
- name: Install pnpm
|
|
uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v4.4.0
|
|
|
|
- name: Setup Node
|
|
uses: actions/setup-node@v6
|
|
with:
|
|
node-version-file: '.nvmrc'
|
|
|
|
- name: Install Vercel CLI
|
|
run: npm install --global vercel@latest
|
|
|
|
- name: Pull Vercel environment information
|
|
run: vercel pull --yes --environment=production
|
|
|
|
- name: Build project artifacts
|
|
env:
|
|
WEBSITE_ASHBY_API_KEY: ${{ secrets.WEBSITE_ASHBY_API_KEY }}
|
|
WEBSITE_ASHBY_JOB_BOARD_NAME: ${{ secrets.WEBSITE_ASHBY_JOB_BOARD_NAME }}
|
|
run: vercel build --prod
|
|
|
|
- name: Deploy project artifacts to Vercel
|
|
id: deploy
|
|
run: |
|
|
URL=$(vercel deploy --prebuilt --prod)
|
|
echo "url=$URL" >> "$GITHUB_OUTPUT"
|
|
|
|
- name: Add deployment URL to summary
|
|
run: echo "**Production:** ${{ steps.deploy.outputs.url }}" >> "$GITHUB_STEP_SUMMARY"
|