Skip to content

chore(ci): parallelize independent workflow tasks - #76651

Merged
trunk-io[bot] merged 4 commits into
masterfrom
posthog-code/parallelize-ci-workflows
Aug 3, 2026
Merged

trunk-io[bot] merged 4 commits into
masterfrom
posthog-code/parallelize-ci-workflows

Conversation

@benjackwhite

Copy link
Copy Markdown
Contributor

Problem

Independent setup, validation, test, and image-build steps currently run serially on Depot runners. This adds avoidable wall-clock time to CI and deployment workflows even when the tasks do not share state.

Changes

  • run independent frontend, backend, Python, Node.js, Rust, DeltaLite, and metrics-agent tasks in parallel
  • build independent sandbox images concurrently while preserving the base-image dependency boundary
  • keep actionlint and custom workflow policy checks effective by flattening parallel groups for actionlint and traversing nested tasks in the custom parser

Before:

flowchart LR
    A[setup] --> B[check one] --> C[check two] --> D[check three]
    classDef phBlue fill:#1d4aff,stroke:#1d4aff,color:#fff;
    classDef phYellow fill:#f9bd2b,stroke:#f9bd2b,color:#000;
    class A phYellow;
    class B,C,D phBlue;
Loading

After:

flowchart LR
    A[setup] --> B[parallel task group]
    B --> C[next dependency boundary]
    classDef phBlue fill:#1d4aff,stroke:#1d4aff,color:#fff;
    classDef phYellow fill:#f9bd2b,stroke:#f9bd2b,color:#000;
    class A,C phYellow;
    class B phBlue;
Loading

How did you test this code?

  • ran actionlint v1.7.12 against all workflows after compatibility flattening
  • ran all 99 workflow-lint tests; the new case prevents nested parallel tasks from escaping policy checks
  • ran hogli lint:workflows across all workflows
  • ran git diff --check

Automatic notifications

  • Publish to changelog?
  • Alert Sales and Marketing teams?

Docs update

No user-facing documentation change is needed.

🤖 Agent context

Autonomy: Human-driven (agent-assisted)

Codex implemented the workflow changes after reviewing the parallel-task pattern in PostHog/burrow#22. It invoked /writing-tests and /writing-code-comments for the workflow parser coverage and documentation. Stateful database operations, generated-file prerequisites, cache publication, artifact upload, and dependent sandbox image builds remain ordered.


Created with PostHog Code

Run independent validation, setup, test, and image-build steps concurrently on Depot runners. Teach workflow validation to inspect the new parallel task groups.

Generated-By: PostHog Code
Task-Id: ae135e02-f600-48a0-8a0b-b36452335ef5
@trunk-io

trunk-io Bot commented Aug 3, 2026 •

Copy link
Copy Markdown

😎 Merged successfully - details.

@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Hey @benjackwhite! 👋

It looks like your git author email on this PR isn't your @posthog.com address (ben@benjackwhite.co.uk). Since you're on the PostHog team, it's worth pointing your local git author email at your @posthog.com address. Why it matters:

  • Consistent work identity in git history — internal tooling that attributes commits to team members keys off your @posthog.com address.
  • Keeps team contributions easy to tell apart from external community ones when scanning history.

You can fix it for this repo with:

git config user.email "you@posthog.com"

Or set it globally with git config --global user.email "you@posthog.com". No need to redo this PR — just a nudge for next time. 🙂

Mirror backend parallel groups into the Depot shadow workflow and preserve the actionlint runner-label configuration when linting transformed workflow copies.

Generated-By: PostHog Code
Task-Id: ae135e02-f600-48a0-8a0b-b36452335ef5
@github-actions

github-actions Bot commented Aug 3, 2026 •

Copy link
Copy Markdown
Contributor

🤖 CI report

⚠️ Bundle size — 🔺 +13.0 KiB (+0.0%)

Uncompressed size of every built .js bundle, compared against the base branch.

Total: 65.53 MiB · 🔺 +13.0 KiB (+0.0%)

File Size Δ vs base
posthog-app/_parent/products/logs/frontend/scenes/LogsRetentionDetailScene/LogsRetentionDetailScene.js 5.9 KiB 🔺 +5.9 KiB (new)
posthog-app/_parent/products/logs/frontend/scenes/LogsRetentionNewScene/LogsRetentionNewScene.js 4.4 KiB 🔺 +4.4 KiB (new)
render-query/src/render-query/render-query.js 21.31 MiB 🔺 +1.2 KiB (+0.0%)

Posted automatically by build-bundle-size-report · uncompressed bytes from dist-report

✅ Eager graph — within budget

How much code each root ships on the eager path — downloaded and parsed before the surface is interactive. Measured from the esbuild output chunks (post-tree-shake, static imports only); lazy import() / React.lazy chunks are not counted.

Root Eager (shipped) Δ vs base Budget
entry (logged-out pages, app bootstrap)
src/index.tsx
1.25 MiB · 22 files no change ███░░░░░░░ 27.7% of 4.51 MiB
authenticated shell (every logged-in page)
src/scenes/AuthenticatedShell.tsx
8.14 MiB · 3,035 files 🔺 +1.2 KiB (+0.0%) ████████░░ 83.8% of 9.71 MiB

🟢 node_modules/monaco-editor/ stays out of src/index.tsx
🟢 src/lib/components/ActivityLog/describers stays out of src/index.tsx
🟢 [object Object] stays out of src/index.tsx
🟢 [object Object] stays out of src/index.tsx
🟢 node_modules/monaco-editor/ stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/lib/components/ActivityLog/describers stays out of src/scenes/AuthenticatedShell.tsx
🟢 [object Object] stays out of src/scenes/AuthenticatedShell.tsx
🟢 [object Object] stays out of src/scenes/AuthenticatedShell.tsx

Largest files eagerly shipped from src/index.tsx
Size File
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
24.6 KiB ../node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.js
6.3 KiB ../node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react.production.min.js
4.5 KiB ../node_modules/.pnpm/@jspm+core@2.1.0/node_modules/@jspm/core/nodelibs/browser/process.js
3.9 KiB ../node_modules/.pnpm/scheduler@0.23.2/node_modules/scheduler/cjs/scheduler.production.min.js
1.4 KiB ../node_modules/.pnpm/base64-js@1.5.1/node_modules/base64-js/index.js
1.3 KiB src/RootErrorBoundary.tsx
912 B ../node_modules/.pnpm/ieee754@1.2.1/node_modules/ieee754/index.js
789 B src/scenes/ChunkLoadErrorBoundary.tsx
762 B src/index.tsx
Largest files eagerly shipped from src/scenes/AuthenticatedShell.tsx
Size File
285.5 KiB ../node_modules/.pnpm/posthog-js@1.410.1/node_modules/posthog-js/dist/rrweb.js
267.7 KiB ../node_modules/.pnpm/@posthog+icons@0.38.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
235.5 KiB src/taxonomy/core-filter-definitions-by-group.json
231.5 KiB ../node_modules/.pnpm/posthog-js@1.410.1/node_modules/posthog-js/dist/module.js
154.3 KiB ../node_modules/.pnpm/re2js@0.4.1/node_modules/re2js/build/index.esm.js
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
105.3 KiB src/lib/api.ts
94.7 KiB ../packages/quill/packages/quill/dist/index.js
93.3 KiB ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/dist/index.js
90.6 KiB ../node_modules/.pnpm/@tiptap+core@3.20.6_@tiptap+pm@3.20.6/node_modules/@tiptap/core/dist/index.js

Posted automatically by check-eager-graph · sizes are eager output bytes (shipped, post-tree-shake) from the esbuild metafile · part of #32479

✅ Toolbar bundle — eager 2.19 MiB within budget

What the toolbar ships to customer pages, measured from the esbuild output (minified, post-tree-shake). The eager set is the entry plus everything statically imported from it — fetched before any feature runs; deferred chunks load lazily. The eager guardrail is 5.72 MiB. Each output file must also stay below 10 MB, where CloudFront stops compressing it. The module boundary is enforced separately by check-toolbar-graph.

Metric Size Δ vs base Budget
Eager (shipped)
entry + static imports
2.19 MiB · 17 files 🔺 +82 B (+0.0%) ████░░░░░░ 38.3% of 5.72 MiB
Deferred (lazy) 2.08 MiB · 33 files no change n/a — loads on demand
Loader dist/toolbar.js 1.1 KiB no change █░░░░░░░░░ 5.8% of 19.5 KiB
Largest eagerly-shipped chunks
Size File
718.3 KiB dist/toolbar/toolbar-app-FT4UJ3IP.css
551.4 KiB dist/toolbar/chunk-chunk-LAPLJ63F.js
484.6 KiB dist/toolbar/chunk-chunk-T44C2V5C.js
133.6 KiB dist/toolbar/chunk-chunk-4LAZHOWF.js
131.8 KiB dist/toolbar/chunk-chunk-T5KY5WYR.js
71.0 KiB dist/toolbar/toolbar-app-FUQGG7FC.js
69.0 KiB dist/toolbar/chunk-chunk-27JL52RE.js
35.6 KiB dist/toolbar/chunk-chunk-CBV5FHJP.js
20.9 KiB dist/toolbar/chunk-chunk-TC3UP4LX.js
12.2 KiB dist/toolbar/chunk-chunk-PIK3PADE.js

Posted automatically by check-toolbar-size · sizes are toolbar output bytes (shipped, post-tree-shake) from the esbuild metafile

✅ Dist folder size — 🔺 +5.09 MiB (+0.4%)

Total size of the built frontend/dist folder (all assets), compared against the base branch.

Total: 1388.98 MiB · 🔺 +5.09 MiB (+0.4%)

@trunk-io

trunk-io Bot commented Aug 3, 2026 •

Copy link
Copy Markdown

Static Badge   Static Badge   Static Badge

View Full Report ↗︎ ⋅ Docs

@benjackwhite
benjackwhite marked this pull request as ready for review August 3, 2026 13:12
@benjackwhite
benjackwhite requested a review from a team August 3, 2026 13:12
@greptile-apps

greptile-apps Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Reviews (1): Last reviewed commit: "fix(ci): keep parallel workflow validati..." | Re-trigger Greptile

Keep ty and mypy sequential so whole-repository typechecking does not compete with parallel lint and test processes for runner memory.

Generated-By: PostHog Code
Task-Id: ae135e02-f600-48a0-8a0b-b36452335ef5
Calculate the actionlint compatibility dedent from the first nested task so valid YAML formatting changes do not produce malformed transformed workflows.

Generated-By: PostHog Code
Task-Id: ae135e02-f600-48a0-8a0b-b36452335ef5
Comment on lines +50 to +57
mkdir -p /tmp/actionlint-workflows
for workflow in .github/workflows/*.yml .github/workflows/*.yaml; do
[ -e "$workflow" ] || continue
awk -f .github/scripts/flatten-parallel-steps-for-actionlint.awk "$workflow" \
> "/tmp/actionlint-workflows/$(basename "$workflow")"
done
./.bin/actionlint -config-file .github/actionlint.yaml \
-format '{{json .}}' /tmp/actionlint-workflows/* > actionlint.json

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hmm I think flattening this to /tmp drops actionlint project context. potential solution would be writing the flattened copies inside the repo instead?

@rnegron rnegron left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

let's give it a shot! thanks 👍🏻

@rnegron

rnegron commented Aug 3, 2026

Copy link
Copy Markdown
Member

referencing for historical context: #66300

@trunk-io
trunk-io Bot merged commit 34745cd into master Aug 3, 2026
297 checks passed
@trunk-io
trunk-io Bot deleted the posthog-code/parallelize-ci-workflows branch August 3, 2026 16:10
@deployment-status-posthog

deployment-status-posthog Bot commented Aug 3, 2026 •

Copy link
Copy Markdown

Deploy status

Environment Status Deployed At Workflow
dev ✅ Deployed 2026-08-03 16:53 UTC Run
prod-us ✅ Deployed 2026-08-03 17:11 UTC Run
prod-eu ✅ Deployed 2026-08-03 17:09 UTC Run

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants