110 lines
5.7 KiB
Markdown
110 lines
5.7 KiB
Markdown
# Noridoc: scripts
|
|
|
|
Path: @/scripts
|
|
|
|
### Overview
|
|
|
|
The `scripts` directory contains build and release automation utilities for the beads project. These scripts handle version management, installation with embedded build info, and release orchestration across multiple distribution channels.
|
|
|
|
Key scripts include version bumping, installation helpers that inject git information at build time, and release coordination across GitHub, Homebrew, PyPI, and npm.
|
|
|
|
### How it fits into the larger codebase
|
|
|
|
- **Build Integration**: The `install.sh` script is referenced in documentation and release processes as the primary user-facing installation mechanism. It integrates directly with the Go build system to ensure full version information is embedded.
|
|
|
|
- **Version Pipeline**: Works alongside the version infrastructure in `@/cmd/bd/version.go` by extracting and passing git information at build time via ldflags.
|
|
|
|
- **Release Automation**: The `release.sh` and `bump-version.sh` scripts orchestrate the release process documented in `@/RELEASING.md`, ensuring version consistency across all components (CLI, plugin, MCP server, npm package).
|
|
|
|
- **CI/CD Integration**: Goreleaser (configured in `@/.goreleaser.yml`) uses the same ldflag patterns established by these scripts, ensuring consistency across all installation methods.
|
|
|
|
- **Multi-Channel Distribution**: These scripts ensure that whether a user installs via Homebrew, npm, GitHub releases, or direct `go install`, they get consistent version reporting with full git information.
|
|
|
|
### Core Implementation
|
|
|
|
**install.sh** (GitHub issue #503 fix):
|
|
|
|
The script simplifies local installation from source while ensuring full version information is available in the resulting binary:
|
|
|
|
1. **Usage** (lines 1-6):
|
|
- Can be invoked from source checkout with optional custom install directory
|
|
- `./scripts/install.sh` installs to `$(go env GOPATH)/bin`
|
|
- `./scripts/install.sh /usr/local/bin` installs to custom location
|
|
|
|
2. **Git Information Extraction** (lines 12-14):
|
|
- Extracts full commit hash via `git rev-parse HEAD`
|
|
- Extracts branch name via `git rev-parse --abbrev-ref HEAD`
|
|
- Gracefully handles missing git info (returns empty strings in non-git environments)
|
|
|
|
3. **Build Information Display** (lines 16-18):
|
|
- Shows user where installation will occur
|
|
- Displays the 12-character short commit hash
|
|
- Displays the branch name for context
|
|
|
|
4. **Installation with Ldflags** (line 20):
|
|
- Calls `go install` with explicit `-ldflags` to set `main.Commit` and `main.Branch`
|
|
- These ldflags inject values that are then picked up by `resolveCommitHash()` and `resolveBranch()` in `@/cmd/bd/version.go`
|
|
|
|
5. **Post-Install Verification** (lines 22-24):
|
|
- Immediately runs `bd version` to show the user that installation succeeded
|
|
- User sees commit and branch info in the output, confirming full version info is present
|
|
|
|
**Makefile Integration** (`@/Makefile`, lines 37-41):
|
|
|
|
The Makefile's `install` target uses identical logic:
|
|
- Extracts git info at build time
|
|
- Passes to `go install` via ldflags
|
|
- Ensures that standard `make install` produces binaries with full version info, not just `make build`
|
|
|
|
**Goreleaser Configuration** (`@/.goreleaser.yml`):
|
|
|
|
All 5 platform builds (linux-amd64, linux-arm64, darwin-amd64, darwin-arm64, windows-amd64) use goreleaser's built-in git variables:
|
|
- `-X main.Commit={{.Commit}}` uses goreleaser's detected commit
|
|
- `-X main.Branch={{.Branch}}` uses goreleaser's detected branch
|
|
- Ensures released binaries have full version info without requiring manual extraction
|
|
|
|
**Version Bumping** (`bump-version.sh` and `release.sh`):
|
|
|
|
- Coordinates version updates across multiple files (CLI version, plugin metadata, MCP server, npm package)
|
|
- Ensures all distribution channels report consistent version numbers
|
|
- Integrates with release process documented in `@/RELEASING.md`
|
|
|
|
### Things to Know
|
|
|
|
**Why Explicit Ldflags Are Necessary**:
|
|
- `go install` does not automatically embed VCS information like `go build` does (even though Go supports it)
|
|
- Without explicit ldflags, binaries lack commit and branch information regardless of installation method
|
|
- The Makefile and goreleaser configurations compensate for this limitation
|
|
|
|
**Installation Path Resolution**:
|
|
- The script uses `$(go env GOPATH)/bin` as the default installation target
|
|
- This respects the user's Go configuration and matches standard Go tooling behavior
|
|
- Allows overriding for system-wide installations (e.g., `/usr/local/bin`)
|
|
|
|
**Git Information Fallbacks**:
|
|
- The script silently handles missing git info (returns empty strings)
|
|
- This allows installation in non-git environments or git-less distributions
|
|
- The version command in `@/cmd/bd/version.go` has its own fallback chain
|
|
|
|
**Testing the Version Pipeline**:
|
|
- After running `./scripts/install.sh`, users should immediately see full version info via `bd version`
|
|
- The text output shows format like: `bd version 0.29.0 (dev: main@7e70940)`
|
|
- JSON output includes both `commit` and `branch` fields
|
|
|
|
**Release Coordination**:
|
|
- The `install.sh` script is independent of release automation
|
|
- Users can run it locally to build from any source branch
|
|
- Release scripts (`release.sh`, `update-homebrew.sh`) handle orchestration across channels and are documented separately in `@/RELEASING.md`
|
|
|
|
**Platform Compatibility**:
|
|
- All scripts use POSIX shell constructs (bash on all platforms)
|
|
- Git operations work identically on macOS, Linux, and Windows (with Git for Windows)
|
|
- The go install command behaves consistently across all platforms
|
|
|
|
**Security Considerations**:
|
|
- Scripts use `set -e` to fail fast on any errors
|
|
- Git commands are defensive (using `2>/dev/null` to suppress errors)
|
|
- No shell injection risks as git values are passed as structured arguments
|
|
|
|
Created and maintained by Nori.
|