SDK generation on release tag fails: can't open PR with base=tag
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Aptitud para principiantes
- 35/100
Línea de trabajo
Start by reading speakeasy-workflow-executor-v15.yml around lines 185–187 and compare its behavior with the release-tag workflow and PRs #788 and #784. Check how the Speakeasy action receives the source ref and chooses the PR base; the issue describes several possible approaches but leaves the design open. Done means SDK generation uses the exact tag tree and opens a PR against a configurable branch, including for backport releases.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Summary
The "SDK generate on release tag" workflow fails on every real release because Speakeasy tries to open a PR with base=<tag>, which GitHub rejects — tags are not valid PR bases. The current workaround in PR #788 (env.GITHUB_REF = refs/heads/main) is silently ignored by the GitHub Actions runner, because GITHUB_* default env vars cannot be overridden via env:.
Evidence
Error from generate-go / Generate Target:
Error: failed to create PR: POST https://api.github.com/repos/hookdeck/outpost/pulls:
422 Validation Failed [{Resource:PullRequest Field:base Code:invalid Message:}]
Proof the env override didn't apply — Speakeasy's generated branch name:
Creating branch speakeasy-sdk-regen-refs-tags-v0.16.0-1775848605
If GITHUB_REF had been overridden to refs/heads/main, the branch would be speakeasy-sdk-regen-refs-heads-main-…. It isn't.
Root cause
speakeasy-workflow-executor-v15.yml:185-187 sets:
env:
GITHUB_REF: ${{ inputs.pr_base_is_main == true && 'refs/heads/main' || github.ref }}
GITHUB_REF_NAME: ${{ inputs.pr_base_is_main == true && 'main' || github.ref_name }}
Per GitHub docs: "If you try to override the value of a default environment variable named CI or GITHUB_*, the value will be ignored." The runner re-sets GITHUB_REF for every step, so Speakeasy's Docker action still receives refs/tags/<tag> from the container env, passes that as the PR base, and GitHub rejects.
PR #788 merged 2026-03-25 but was never end-to-end tested against a real release tag push.
Why we can't "just dispatch from main"
The earlier approach (#784) dispatched the workflow with ref: main, which naturally gives Speakeasy a valid PR base. #788 reverted that because it broke tag fidelity — SDK was generated from main's tree, not the tag's.
More importantly, running from main precludes releasing non-latest versions:
- Patch / hotfix releases off an older minor line (e.g.
v0.15.3cut fromrelease/v0.15.x) need the SDK generated from that line, not frommain. - If
mainhas moved past the release being cut, SDK content would reflect unreleased changes. - A backport release would need to target a release branch, not
main, as the PR base.
So the fix needs to:
- Generate the SDK from the exact tag tree (whatever branch it was cut from).
- Allow the PR base to be a parameterizable branch (default
main, but e.g.release/v0.15.xfor backports).
Options to explore
- Script Speakeasy via CLI instead of the packaged action. Checkout tag →
speakeasy run→ checkout target branch → copy SDK dir → commit →gh pr create --base <target>. Full control over ref and PR base; loses some action niceties (changelog upload, code samples push, PR templating) — some can be reconstructed via CLI equivalents. - Invoke Speakeasy's Docker image directly via
docker run -e GITHUB_REF=…. Shell-exported env does reach child docker processes, bypassing GitHub'sGITHUB_*protection. Medium complexity; brittle across Speakeasy action upgrades since we'd be replicating the action's docker invocation. - Fork / upstream a
base_branchinput into Speakeasy'ssdk-generation-action. Clean long-term fix; highest upfront cost (fork maintenance or upstream lead time). - Create a transient release branch at the tag SHA (e.g.
release/<tag>), dispatch with that ref, and have Speakeasy PR into it — then a follow-up step opens a PR from the release branch into the configured target branch. Avoids modifying Speakeasy but adds branch/PR churn.
Target branch should be a workflow input (e.g. main or release/v0.15.x) so the flow supports backport releases.
References
- PR #788 — introduced the broken workaround (vendored executor +
pr_base_is_mainenv override) - PR #784 — previous approach (dispatched from
main); reverted by #788 because it didn't generate from the tag tree - GitHub Actions default env vars docs
- Lenguaje dominante
- Go
- Estrellas
- 1.1k
- Forks
- 70
- Merge medio
- 1 d 18 h
- PR fusionados (30 d)
- 56
Preparar el entorno
Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de hookdeck/outpost
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
Los mantenedores suelen responder en 1 día
-
enhancement
Dificultad 4/5 3-5 días Aptitud para principiantes 48/100
hookdeck/outpost#1117 · 1 comentario · 1 reacción ·
Los mantenedores suelen responder en 1 día
-
Dificultad 4/5 3-5 días Aptitud para principiantes 35/100
Los mantenedores suelen responder en 1 día
-
Dificultad 4/5 3-5 días Aptitud para principiantes 45/100
Los mantenedores suelen responder en 1 día
Todos los issues de hookdeck/outpost
Issues similares
-
os: RawConn methods of a closed File return internal/poll.ErrFileClosing instead of ErrClosedAbierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
Los mantenedores suelen responder en 1 día
-
[Bug]: Bedrock invoke-with-response-stream reports `stop_reason: "end_turn"` for tool-use turnsAbierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 86/100
oalders/clodhopper#162 ·
Los mantenedores suelen responder en 1 día
-
component/server severity/minor type/bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
Los mantenedores suelen responder en 1 día
-
diagnose globalnet reports a failure for every exported headless ServicePosiblemente ocupada @kurtyoon la tomó hoy. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
submariner-io/subctl#1948 ·
Los mantenedores suelen responder en 1 día