ci: build the prod template on every cluster (foxtrot, juliett, tango) - #338
ci: build the prod template on every cluster (foxtrot, juliett, tango)#338devin-ai-integration[bot] wants to merge 4 commits into
Conversation
Co-Authored-By: mish@e2b.dev <mish@e2b.dev>
🤖 Devin AI EngineerI'll be helping with this pull request! Here's what you should know: ✅ I will automatically:
Note: I can only respond to comments from users who have write access to this repository. ⚙️ Control Options:
|
Co-Authored-By: mish@e2b.dev <mish@e2b.dev>
Co-Authored-By: mish@e2b.dev <mish@e2b.dev>
| group: Release-${{ github.ref }}-${{ matrix.cluster }} | ||
| cancel-in-progress: false | ||
| env: | ||
| E2B_API_KEY: ${{ secrets[matrix.api_key_secret] }} |
| group: Release-${{ github.ref }}-${{ matrix.cluster }} | ||
| cancel-in-progress: false | ||
| env: | ||
| E2B_API_KEY: ${{ secrets[matrix.api_key_secret] }} |
There was a problem hiding this comment.
🔒 Agentic Security Review
Severity: MEDIUM
The reusable cluster-build job selects the API key with a dynamic secrets lookup (secrets[matrix.api_key_secret]). GitHub cannot statically determine which secrets that expression needs, so the runner receives every secret inherited by the called workflow. Both callers pass secrets: inherit, so the release path now exposes unused high-value credentials (PyPI, Docker Hub, version-bumper private key, Slack webhooks, and other clusters’ API keys) to this job. E2B_API_KEY is also set at job scope, so every step—including third-party actions and pip install—sees it.
Impact: Compromise of any step on a template-build runner (hijacked Action, poisoned pip dependency, or later logging of context) can read the full inherited secret set instead of a single cluster API key.
Reviewed by Cursor Security Reviewer for commit f8cb5ab. Configure here.
Co-Authored-By: mish@e2b.dev <mish@e2b.dev>
| group: Release-${{ github.ref }}-${{ matrix.cluster }} | ||
| cancel-in-progress: false | ||
| env: | ||
| E2B_API_KEY: ${{ secrets[matrix.api_key_secret] }} |
There was a problem hiding this comment.
🔒 Agentic Security Review
Severity: MEDIUM
The reusable cluster-build job selects the API key with a dynamic secrets lookup (secrets[matrix.api_key_secret]). GitHub cannot statically determine which secrets that expression needs, so the runner receives every secret inherited by the called workflow. Both callers pass secrets: inherit, so the release path now delivers unused high-value credentials (PyPI, Docker Hub, version-bumper private key, Slack webhooks, and other clusters’ API keys) to this job. E2B_API_KEY is also set at job scope, so every step—including third-party actions and pip install—sees the selected cluster key.
Impact: Compromise of any step on a template-build runner (hijacked Action, poisoned pip dependency, or later logging of context) can read the full inherited secret set instead of a single cluster API key.
Reviewed by Cursor Security Reviewer for commit 6bccfc0. Configure here.




Summary
code-interpreter-v1is now built on every production cluster — foxtrot, juliett and tango — instead of foxtrot only. Clusters are separate tenancies with separate template registries, so a template built on one does not exist on the others.The build moves into a reusable workflow,
build_prod_template_clusters.yml(workflow_call:target,skip_cache;secrets: inherit), which holds the cluster map once and fans out as a matrix:E2B_DOMAINalle2b.dev(wasvars.E2B_DOMAIN)E2B_PROD_API_KEY(existing)e2b-juliett.devE2B_JULIETT_API_KEY(existing)e2b-tango.devE2B_TANGO_API_KEY— new, must be added before merginge2b-staging.devE2B_STAGING_API_KEY(existing)release.yml:build-templatecalls it withtarget: all; a failed leg on any cluster blocks the release (a missing key fails fast withMissing secret <name> for cluster: <cluster>).build_prod_template.yml(manual):target_environmentgainsall(new default) andtango, and is passed straight through astarget; the runtimecasethat resolved domain/key is gone.-foxtrotsuffix (Release-${{ github.ref }}, one release at a time). The per-cluster groupRelease-${{ github.ref }}-<cluster>is now on the matrix job, so a manual build and a release for the same cluster still serialize while different clusters run in parallel. The suffix could not stay on the release workflow itself: a workflow and one of its own jobs sharing a concurrency group would block each other.Companion PR for the desktop template: e2b-dev/desktop#260.
Link to Devin session: https://app.devin.ai/sessions/164235e15a6f4e30bbdc3907d388fbc5
Open in Devin Desktop: https://app.devin.ai/desktop/session/164235e15a6f4e30bbdc3907d388fbc5?variant=devin
Requested by: @mishushakov