Skip to content

Build only what a release needs; verify tap push access - #3

Merged
lwrage merged 1 commit into
mainfrom
pin-tap-branch
Sep 2, 2026
Merged

Build only what a release needs; verify tap push access#3
lwrage merged 1 commit into
mainfrom
pin-tap-branch

Conversation

@lwrage

@lwrage lwrage commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Each release was building all three tools

You spotted this. The build-cli input never skipped anything — it gated the test-count assertion and the artifact upload, while scripts/build-test-release went on building the language server, the extension and the CLI unconditionally. A language-server release was packaging a VSIX and running the CLI integration suite for nothing.

Worse, release-osate-cli.yml called the reusable build workflow and then rebuilt everything in its package job, because packaging needs the dist tree on disk. That was a second full build per release.

  • build-test-release gains --skip-extension (implying --skip-extension-tests) and --skip-cli, so the phases are genuinely selectable.
  • build.yml gains a build-extension input, maps all three inputs onto those flags, and prints the resulting argument list so a run states what it built.
  • release-server.yml builds the language server alone; release-vscode.yml builds the language server and extension; ci.yml still builds everything.
  • release-osate-cli.yml drops the redundant build job — the package job computes the osate2 pin itself for the cache keys and builds once.

Measured locally against a warm OSATE cache: language-server-only drops from ~4 min to 41 s; the CLI path is 2m15s with the dist tree in place for packaging.

The tap check was reporting a pass it hadn't earned

Your verify-credentials run was green, but the tap step had taken its empty-repo branch (warning: You appear to have cloned an empty repository) and only proved the token can read — a read-only token clones fine. Push access, which is the last step of a CLI release and would fail after the GitHub Release already exists, was never exercised.

It now manufactures a throwaway local commit when the tap has no history, so git push --dry-run has something to offer and the server actually authorizes the ref update. Nothing is written. Rehearsed against a local empty repo: unborn HEAD → probe commit → dry run accepted → remote still empty.

Also pins the tap branch to main instead of inheriting the runner's init.defaultBranch. My local rehearsal picked master, and for an empty tap that choice decides which branch the first release creates — the same logic is now used in both the check and the release step so they cannot disagree.

Confirmed working from your run

vsce verify-pat reported "The Personal Access Token verification succeeded for the publisher 'osate'" and ovsx reported "PAT valid to publish at osate" — so the Marketplace publisher exists and both tokens are good. That closes the blocker flagged since the original publish.

🤖 Generated with Claude Code

Each release workflow was building all three deliverables, and the osate-cli one
was building them twice.

The `build-cli` input never skipped anything. It gated the test-count assertion
and the artifact upload, while scripts/build-test-release went on building the
language server, the extension and the CLI unconditionally. So a language-server
release packaged a VSIX and ran the CLI integration suite for nothing.

Worse, release-osate-cli.yml called the reusable build workflow *and* then rebuilt
everything in its package job, because packaging needs the dist tree on disk. That
is a second full build per release.

- scripts/build-test-release gains --skip-extension (implying
  --skip-extension-tests) and --skip-cli, so the phases are actually selectable.
- build.yml gains a build-extension input and maps all three inputs onto those
  flags, printing the resulting argument list so a run says what it built.
- release-server.yml builds the language server alone; release-vscode.yml builds
  the language server and extension; ci.yml still builds everything.
- release-osate-cli.yml drops the redundant build job. The package job computes
  the osate2 pin itself for the cache keys and builds once, skipping the
  extension.

Measured locally against a warm OSATE cache: language-server-only drops from
about four minutes to 41s, and the CLI path is 2m15s with the dist tree in place
for the packaging scripts.
@lwrage
lwrage merged commit 565c68d into main Sep 2, 2026
3 checks passed
@lwrage
lwrage deleted the pin-tap-branch branch September 2, 2026 14:24
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