TypeDialog/docs/build.md

874 lines
16 KiB
Markdown
Raw Normal View History

2025-12-24 03:11:32 +00:00
<div align="center">
<img src="../assets/typedialog_logo_h_s.svg" alt="TypeDialog Logo" width="600" />
</div>
# Building & Distribution Guide
Complete guide for building, packaging, and releasing TypeDialog.
## Overview
Two main workflows:
1. **Building** - Compile binaries for your platform
2. **Distribution** - Package with configs and installers for release
## Critical Dependencies
TypeDialog requires several critical dependencies for building and running. These include both **internal dependencies** (git submodules or external projects) and **external tools**.
### Internal Dependencies
#### prov-ecosystem
**What:** Provisioning ecosystem library for infrastructure generation (used by `typedialog-prov-gen`)
**Location:** Expected as sibling directory or git submodule
**Installation:**
```bash
# Option 1: Clone as sibling directory (recommended)
cd /path/to/projects
git clone https://github.com/your-org/prov-ecosystem.git
git clone https://github.com/your-org/typedialog.git
# Option 2: Git submodule
cd typedialog
git submodule add https://github.com/your-org/prov-ecosystem.git deps/prov-ecosystem
git submodule update --init --recursive
```
**Path Configuration:**
If `prov-ecosystem` is in a non-standard location, update `Cargo.toml`:
```toml
[dependencies]
prov-ecosystem = { path = "../prov-ecosystem" } # Adjust path as needed
```
Or use environment variable:
```bash
export PROV_ECOSYSTEM_PATH=/custom/path/to/prov-ecosystem
```
**Verify:**
```bash
# Check if prov-ecosystem is found
cargo metadata --format-version=1 | grep prov-ecosystem
```
#### secretumvault
**What:** Unified encryption vault library (used by encryption features)
**Location:** Expected as sibling directory or git submodule
**Installation:**
```bash
# Option 1: Clone as sibling directory (recommended)
cd /path/to/projects
git clone https://github.com/your-org/secretumvault.git
git clone https://github.com/your-org/typedialog.git
# Option 2: Git submodule
cd typedialog
git submodule add https://github.com/your-org/secretumvault.git deps/secretumvault
git submodule update --init --recursive
```
**Path Configuration:**
If `secretumvault` is in a non-standard location, update `Cargo.toml`:
```toml
[dependencies]
secretumvault = { path = "../secretumvault" } # Adjust path as needed
```
Or use environment variable:
```bash
export SECRETUMVAULT_PATH=/custom/path/to/secretumvault
```
**Verify:**
```bash
# Check if secretumvault is found
cargo metadata --format-version=1 | grep secretumvault
```
### External Dependencies
#### just (Command Runner)
**What:** Command orchestration tool for running build recipes
**Required:** Yes (for all build workflows)
**Installation:**
```bash
# macOS (Homebrew)
brew install just
# Linux (cargo)
cargo install just
# Linux (from source)
curl --proto '=https' --tlsv1.2 -sSf https://just.systems/install.sh | bash -s -- --to /usr/local/bin
# Arch Linux
pacman -S just
# Verify
just --version
```
**Configuration:**
No configuration needed. Justfiles are included in the project.
**Verify:**
```bash
# List available recipes
just --list
# Test a recipe
just build::cli
```
#### Nickel (Configuration Language)
**What:** Programmable configuration language for infrastructure validation
**Required:** Yes (for `typedialog-prov-gen` and Nickel validation features)
**Installation:**
```bash
# macOS (Homebrew)
brew install nickel
# Linux (cargo)
cargo install nickel-lang-cli
# From source
git clone https://github.com/tweag/nickel.git
cd nickel
cargo build --release
sudo cp target/release/nickel /usr/local/bin/
# Verify
nickel --version
```
**Path Configuration:**
If `nickel` is not in PATH, set the binary location:
```bash
# Add to ~/.bashrc or ~/.zshrc
export NICKEL_BIN=/custom/path/to/nickel
# Or set for current session
export PATH="/custom/path/to/nickel:$PATH"
```
**Verify:**
```bash
# Test Nickel evaluation
echo '{ x = 1 + 1 }' | nickel eval
# Test with TypeDialog
cargo test -p typedialog-prov-gen --lib
```
#### shellcheck (Bash Linter)
**What:** Shell script analysis tool for linting bash scripts
**Required:** Yes (for linting 142 bash scripts)
**Installation:**
```bash
# macOS (Homebrew)
brew install shellcheck
# Linux (apt)
sudo apt-get install shellcheck
# Arch Linux
sudo pacman -S shellcheck
# From source (Haskell)
cabal update
cabal install ShellCheck
# Verify
shellcheck --version
```
**Verify:**
```bash
# Test shellcheck
echo '#!/bin/bash\necho "test"' | shellcheck -
# Lint project scripts
just dev::lint-bash
```
#### markdownlint-cli2 (Markdown Linter)
**What:** Markdown linting and style checking for documentation
**Required:** Yes (for linting docs/ folder)
**Installation:**
```bash
# Global install (requires Node.js)
npm install -g markdownlint-cli2
# Verify
markdownlint-cli2 --version
```
**Path Configuration:**
Ensure Node.js is installed and npm global bin is in PATH:
```bash
# Check Node.js
node --version
npm --version
# Add npm global bin to PATH (if needed)
export PATH="$(npm config get prefix)/bin:$PATH"
```
**Verify:**
```bash
# Test markdownlint
echo '# Test' | markdownlint-cli2 --stdin
# Lint project docs
just dev::lint-markdown
```
### Dependency Quick Check
Run this script to verify all critical dependencies:
```bash
#!/bin/bash
echo "=== Checking Critical Dependencies ==="
# Check just
if command -v just &> /dev/null; then
echo "✓ just $(just --version)"
else
echo "✗ just - NOT FOUND"
echo " Install: cargo install just"
fi
# Check nickel
if command -v nickel &> /dev/null; then
echo "✓ nickel $(nickel --version)"
else
echo "✗ nickel - NOT FOUND"
echo " Install: cargo install nickel-lang-cli"
fi
# Check prov-ecosystem (path dependency)
if cargo metadata --format-version=1 2>/dev/null | grep -q prov-ecosystem; then
echo "✓ prov-ecosystem - FOUND"
else
echo "✗ prov-ecosystem - NOT FOUND"
echo " Clone to: ../prov-ecosystem"
fi
# Check secretumvault (path dependency)
if cargo metadata --format-version=1 2>/dev/null | grep -q secretumvault; then
echo "✓ secretumvault - FOUND"
else
echo "✗ secretumvault - NOT FOUND"
echo " Clone to: ../secretumvault"
fi
```
Save as `scripts/check_deps.sh` and run:
```bash
chmod +x scripts/check_deps.sh
./scripts/check_deps.sh
```
### Troubleshooting Dependencies
#### prov-ecosystem or secretumvault not found
**Error:**
```text
error: no matching package named `prov-ecosystem` found
location searched: /path/to/typedialog/../prov-ecosystem
```
**Solutions:**
1. **Clone to expected location:**
```bash
cd /path/to/typedialog/..
git clone https://github.com/your-org/prov-ecosystem.git
git clone https://github.com/your-org/secretumvault.git
```
2. **Update Cargo.toml paths:**
```toml
# In typedialog/Cargo.toml (workspace level)
prov-ecosystem = { path = "/absolute/path/to/prov-ecosystem" }
secretumvault = { path = "/absolute/path/to/secretumvault" }
```
3. **Use git submodules:**
```bash
git submodule add https://github.com/your-org/prov-ecosystem.git deps/prov-ecosystem
# Update Cargo.toml to use deps/prov-ecosystem
```
#### Nickel binary not found
**Error:**
```text
Error: nickel command not found
```
**Solutions:**
1. **Install via cargo:**
```bash
cargo install nickel-lang-cli
```
2. **Add to PATH:**
```bash
export PATH="$HOME/.cargo/bin:$PATH"
```
3. **Set explicit path in environment:**
```bash
export NICKEL_BIN=/usr/local/bin/nickel
```
#### just command not found
**Error:**
```text
just: command not found
```
**Solutions:**
1. **Install via cargo:**
```bash
cargo install just
```
2. **Install via package manager:**
```bash
# macOS
brew install just
# Arch Linux
sudo pacman -S just
```
3. **Add to PATH:**
```bash
export PATH="$HOME/.cargo/bin:$PATH"
```
## Building Binaries
### Single Platform Build
Build for your current platform:
```bash
# Debug build (default)
just distro::build-all
# Release build (optimized)
just distro::build-release
```
**Output**: Binaries in `target/release/`
```bash
# Check binaries
ls -la target/release/typedialog*
```
### Build by Backend
Build specific backend only:
```bash
just build::cli # CLI backend
just build::tui # TUI backend
just build::web # Web backend
just build::all # All backends
```
### Development Build
Quick build for development:
```bash
just build::default
```
## Cross-Compilation
Build for multiple platforms:
### Using cargo-cross
Cross-compile to different targets:
```bash
# All supported targets
just distro::cross
# Specific target
just distro::cross-target x86_64-unknown-linux-gnu
```
**Supported targets:**
- `x86_64-unknown-linux-gnu` - Linux x86_64
- `aarch64-unknown-linux-gnu` - Linux ARM64
- `x86_64-apple-darwin` - macOS Intel
- `aarch64-apple-darwin` - macOS Apple Silicon
- `x86_64-pc-windows-gnu` - Windows x86_64
**Requires:** `cargo install cross`
### Using Docker
Docker-based cross-compilation:
```bash
# Docker cross-compile
just distro::cross-docker x86_64-unknown-linux-gnu
```
**Requires:** Docker installed
**Dockerfile:** See `.woodpecker/Dockerfile.cross`
## Creating Distribution Packages
Distribution packages include binaries, configs, and installers.
### Create Package
```bash
# From existing binaries
just distro::create-package
# With specific version
just distro::create-package-version v0.1.0
```
**Output:** `distribution/typedialog-0.1.0/`
```text
typedialog-0.1.0/
├── bin/
│ ├── typedialog # CLI binary
│ ├── typedialog-tui # TUI binary
│ └── typedialog-web # Web binary
├── config/
│ ├── cli/ # 3 configs: default, dev, production
│ ├── tui/ # 3 configs
│ └── web/ # 3 configs
├── installers/
│ ├── install.sh # Linux/macOS installer
│ ├── install.ps1 # Windows installer
│ └── README.md # Installation guide
└── MANIFEST.json # Package metadata
```
### Generate Checksums
```bash
just distro::create-checksums
```
**Output:** `SHA256SUMS` file
Verify integrity:
```bash
sha256sum -c SHA256SUMS
```
### Full Package Workflow
```bash
# 1. Build release
just distro::build-release
# 2. Create package
just distro::create-package
# 3. Generate checksums
just distro::create-checksums
# Or all together:
just distro::package-all
```
## Distribution Structure
### Package Contents
**bin/** - Compiled binaries
- `typedialog` - CLI backend
- `typedialog-tui` - TUI backend
- `typedialog-web` - Web backend
**config/** - Configuration templates
- CLI configs (default, dev, production)
- TUI configs (default, dev, production)
- Web configs (default, dev, production)
**installers/** - Installation scripts
- `install.sh` - For Linux/macOS
- `install.ps1` - For Windows
- `README.md` - Installation guide
**MANIFEST.json** - Package metadata
```json
{
"name": "typedialog",
"version": "0.1.0",
"created": "...",
"binaries": [...],
"configs": {...},
"installers": {...}
}
```
### Configuration Management
Pre-configured settings for each backend and environment:
**CLI Backend:**
- `default.toml` - Standard settings
- `dev.toml` - Development (debug enabled)
- `production.toml` - Hardened production
**TUI Backend:**
- `default.toml` - Interactive settings
- `dev.toml` - Development features
- `production.toml` - Optimized production
**Web Backend:**
- `default.toml` - Standard web server
- `dev.toml` - Development (hot reload)
- `production.toml` - Hardened web server
See [configuration.md](configuration.md) for details.
## Build Scripts
All build automation uses bash scripts in `scripts/`:
### build_all.sh
Build all workspace targets:
```bash
./scripts/build_all.sh [debug|release]
```
### build_cross.sh
Cross-compile for multiple platforms:
```bash
./scripts/build_cross.sh [target]
```
### create_distro.sh
Create distribution package:
```bash
./scripts/create_distro.sh [version]
```
### package_release.sh
Prepare release with checksums and notes:
```bash
./scripts/package_release.sh [version]
```
## Docker Build
### .woodpecker/Dockerfile.cross
Multi-platform Docker build:
```bash
# Build image for specific target
docker build -f .woodpecker/Dockerfile.cross \
--build-arg TARGET=x86_64-unknown-linux-gnu \
-t typedialog-builder:latest \
.
# Run compilation
docker run --rm \
-v $(pwd)/distribution:/output \
typedialog-builder:latest
```
## Complete Release Workflow
Prepare a release for GitHub:
```bash
# 1. Build release binaries
just distro::build-release
# 2. Create distribution package
just distro::create-package
# 3. Generate checksums
just distro::create-checksums
# 4. Prepare release (with notes)
just distro::package-release
# 5. Verify contents
just distro::list-packages
# 6. Create GitHub release (see release.md)
gh release create v0.1.0 \
release/typedialog-0.1.0.tar.gz \
release/SHA256SUMS \
--title "TypeDialog 0.1.0" \
--notes-file release/RELEASE_NOTES.md
```
## Utilities
### List packages
```bash
just distro::list-packages
```
### Generate manifest
```bash
just distro::generate-manifest
```
### Clean distribution
```bash
just distro::clean-distro
```
## Troubleshooting
### Build fails
Clear cache and rebuild:
```bash
cargo clean
just distro::build-release
```
### Cross-compilation fails
Ensure Docker is running:
```bash
docker --version
docker run hello-world
```
### Missing dependencies
Check all dependencies:
```bash
./scripts/check_deps.sh
```
Install required tools:
```bash
cargo install cross # For cross-compilation
cargo install just # For command orchestration
cargo install nickel-lang-cli # For Nickel validation
```
Clone internal dependencies:
```bash
cd /path/to/typedialog/..
git clone https://github.com/your-org/prov-ecosystem.git
git clone https://github.com/your-org/secretumvault.git
```
### Checksum verification fails
Regenerate checksums:
```bash
just distro::create-checksums
```
## Platform Support
| Platform | Arch | Status |
| ---------- | ------ | -------- |
| Linux (glibc) | x86_64 | ✓ Stable |
| Linux (glibc) | ARM64 | ✓ Stable |
| macOS | x86_64 | ✓ Stable |
| macOS | ARM64 | ✓ Stable |
| Windows | x86_64 | ✓ Stable |
## Performance Tips
### Faster builds
```bash
# Use all CPU cores
export CARGO_BUILD_JOBS=$(nproc)
export CARGO_INCREMENTAL=1
# Then build
just distro::build-release
```
### Parallel testing
```bash
cargo test -- --test-threads=4
```
## Compliance & SBOM Generation
Generate Software Bill of Materials (SBOM) for supply chain transparency using [`cargo-sbom`](https://crates.io/crates/cargo-sbom).
### Regenerate SBOMs
When dependencies change (new crates, version updates, Cargo.lock changes):
```bash
just distro::generate-sbom
```
This regenerates:
- **SBOM.spdx.json** - SPDX 2.3 standard format (ISO/IEC 5962:2021)
- **SBOM.cyclonedx.json** - CycloneDX 1.4 format (ECMA standard)
### Audit Dependencies
Check for known security vulnerabilities:
```bash
just ci::audit
```
### Verify SBOMs in CI
Verify SBOMs are up-to-date during CI pipeline:
```bash
just ci::verify-sbom
```
Included automatically in full CI run:
```bash
just ci::full
```
### SBOM Files
**SBOM.spdx.json** (~350-400 KB)
- SPDX 2.3 format (ISO/IEC 5962:2021)
- Complete component inventory with unique identifiers
- Compatible with SPDX validators, GitHub Dependabot, and osv-scanner
- Generated by [cargo-sbom](https://crates.io/crates/cargo-sbom)
**SBOM.cyclonedx.json** (~280-320 KB)
- CycloneDX 1.4 format (ECMA standard)
- Complete component inventory with Package URLs (pURL)
- Compatible with vulnerability scanners and SCA tools (Dependabot, Snyk)
- Generated by [cargo-sbom](https://crates.io/crates/cargo-sbom)
### Supply Chain Security
All dependencies are:
- Permissive or compatible licenses ✓
- Regularly audited for vulnerabilities ✓
- Tracked in version-controlled SBOMs ✓
- Included in releases ✓
---
## Next Steps
- [release.md](release.md) - Release workflow
- [configuration.md](configuration.md) - Configuration options
- [installation.md](installation.md) - User installation
- [development.md](development.md) - Development setup
---
**Build complete!** Ready for distribution.