Jesús Pérez 9cef9b8d57 refactor: consolidate configuration directories
Merge _configs/ into config/ for single configuration directory.
Update all path references.

Changes:
- Move _configs/* to config/
- Update .gitignore for new patterns
- No code references to _configs/ found

Impact: -1 root directory (layout_conventions.md compliance)
2025-12-26 18:36:23 +00:00

436 lines
14 KiB
YAML

name: Release - Build & Distribute Bundles
on:
push:
tags:
- 'v*'
workflow_dispatch:
inputs:
version:
description: 'Version to build (e.g., 0.1.0)'
required: true
type: string
targets:
description: 'Targets to build (comma-separated, or "all")'
required: false
default: 'all'
type: string
env:
CARGO_TERM_COLOR: always
RUST_BACKTRACE: 1
jobs:
prepare:
name: Prepare Release
runs-on: ubuntu-latest
outputs:
version: ${{ steps.version.outputs.version }}
tag: ${{ steps.version.outputs.tag }}
steps:
- name: Determine version
id: version
run: |
if [[ "${{ github.ref }}" == refs/tags/* ]]; then
VERSION="${{ github.ref_name }}"
VERSION="${VERSION#v}"
else
VERSION="${{ inputs.version }}"
fi
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "tag=v$VERSION" >> $GITHUB_OUTPUT
echo "Building release: $VERSION"
build-matrix:
name: Build for ${{ matrix.target }}
needs: prepare
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
# Linux x86_64 (glibc)
- os: ubuntu-latest
target: x86_64-unknown-linux-gnu
artifact_name: syntaxis-x86_64-linux
use_cross: false
# Linux ARM64 (glibc)
- os: ubuntu-latest
target: aarch64-unknown-linux-gnu
artifact_name: syntaxis-aarch64-linux
use_cross: true
# macOS Intel (x86_64)
- os: macos-latest
target: x86_64-apple-darwin
artifact_name: syntaxis-x86_64-macos
use_cross: false
# macOS ARM64 (Apple Silicon)
- os: macos-latest
target: aarch64-apple-darwin
artifact_name: syntaxis-aarch64-macos
use_cross: false
# Windows x86_64
- os: windows-latest
target: x86_64-pc-windows-msvc
artifact_name: syntaxis-x86_64-windows
use_cross: false
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.target }}
- name: Setup cross (for ARM builds)
if: matrix.use_cross
run: cargo install cross
- name: Cache cargo registry
uses: actions/cache@v3
with:
path: ~/.cargo/registry
key: cargo-registry-${{ matrix.target }}-${{ hashFiles('**/Cargo.lock') }}
- name: Cache cargo index
uses: actions/cache@v3
with:
path: ~/.cargo/git
key: cargo-git-${{ matrix.target }}-${{ hashFiles('**/Cargo.lock') }}
- name: Cache cargo build
uses: actions/cache@v3
with:
path: target
key: cargo-build-${{ matrix.target }}-${{ hashFiles('**/Cargo.lock') }}
- name: Build binaries
run: |
if [[ "${{ matrix.use_cross }}" == "true" ]]; then
cross build --release --target ${{ matrix.target }} \
--workspace \
--exclude syntaxis-dashboard
else
cargo build --release --target ${{ matrix.target }} \
--workspace \
--exclude syntaxis-dashboard
fi
shell: bash
- name: Create bundle directory
run: |
mkdir -p dist
mkdir -p bundles
shell: bash
- name: Prepare bundle artifacts
run: |
TARGET_DIR="target/${{ matrix.target }}/release"
BUNDLE_NAME="${{ matrix.artifact_name }}-v${{ needs.prepare.outputs.version }}"
BUNDLE_DIR="bundles/$BUNDLE_NAME"
mkdir -p "$BUNDLE_DIR/bin"
mkdir -p "$BUNDLE_DIR/configs"
mkdir -p "$BUNDLE_DIR/docs"
# Copy binaries (with platform-specific extension)
if [[ "${{ runner.os }}" == "Windows" ]]; then
cp "$TARGET_DIR/syntaxis-cli.exe" "$BUNDLE_DIR/bin/" || true
cp "$TARGET_DIR/syntaxis-tui.exe" "$BUNDLE_DIR/bin/" || true
cp "$TARGET_DIR/syntaxis-api.exe" "$BUNDLE_DIR/bin/" || true
else
cp "$TARGET_DIR/syntaxis-cli" "$BUNDLE_DIR/bin/" || true
cp "$TARGET_DIR/syntaxis-tui" "$BUNDLE_DIR/bin/" || true
cp "$TARGET_DIR/syntaxis-api" "$BUNDLE_DIR/bin/" || true
fi
# Copy configs
cp configs/provisioning.toml "$BUNDLE_DIR/configs/" || true
cp configs/database-default.toml "$BUNDLE_DIR/configs/" || true
cp -r configs/cli "$BUNDLE_DIR/configs/" || true
cp -r configs/tui "$BUNDLE_DIR/configs/" || true
cp -r configs/api "$BUNDLE_DIR/configs/" || true
# Copy docs
cp README.md "$BUNDLE_DIR/docs/" || true
cp CLAUDE.md "$BUNDLE_DIR/docs/" || true
# Copy installer script
cp scripts/provisioning/install.sh "$BUNDLE_DIR/" || true
chmod +x "$BUNDLE_DIR/install.sh" || true
echo "Bundle prepared: $BUNDLE_DIR"
ls -la "$BUNDLE_DIR/bin/" || true
shell: bash
- name: Generate manifest
run: |
BUNDLE_NAME="${{ matrix.artifact_name }}-v${{ needs.prepare.outputs.version }}"
BUNDLE_DIR="bundles/$BUNDLE_NAME"
TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
cat > "$BUNDLE_DIR/manifest.toml" << EOF
[bundle]
version = "${{ needs.prepare.outputs.version }}"
target = "${{ matrix.target }}"
created_at = "$TIMESTAMP"
format = "tar.gz"
[artifacts]
binaries = ["syntaxis-cli", "syntaxis-tui", "syntaxis-api"]
configs = ["provisioning.toml", "database-default.toml"]
docs = ["README.md", "CLAUDE.md"]
[checksums]
EOF
# Add checksums for binaries
cd "$BUNDLE_DIR/bin"
for binary in *; do
if [[ -f "$binary" ]]; then
if command -v sha256sum &> /dev/null; then
CHECKSUM=$(sha256sum "$binary" | awk '{print $1}')
else
CHECKSUM=$(shasum -a 256 "$binary" | awk '{print $1}')
fi
echo "\"bin/$binary\" = \"$CHECKSUM\"" >> ../manifest.toml
fi
done
shell: bash
- name: Create archive (tar.gz for Unix)
if: runner.os != 'Windows'
run: |
cd bundles
BUNDLE_NAME="${{ matrix.artifact_name }}-v${{ needs.prepare.outputs.version }}"
tar -czf "../dist/${BUNDLE_NAME}.tar.gz" "$BUNDLE_NAME"
echo "Created: dist/${BUNDLE_NAME}.tar.gz"
shell: bash
- name: Create archive (zip for Windows)
if: runner.os == 'Windows'
run: |
cd bundles
$BUNDLE_NAME = "${{ matrix.artifact_name }}-v${{ needs.prepare.outputs.version }}"
Compress-Archive -Path $BUNDLE_NAME -DestinationPath "..\dist\${BUNDLE_NAME}.zip"
Write-Output "Created: dist/${BUNDLE_NAME}.zip"
shell: pwsh
- name: Generate checksums
run: |
cd dist
if command -v sha256sum &> /dev/null; then
sha256sum * > SHA256SUMS
else
shasum -a 256 * > SHA256SUMS
fi
cat SHA256SUMS
shell: bash
- name: Upload artifacts
uses: actions/upload-artifact@v3
with:
name: bundle-${{ matrix.target }}
path: dist/*
retention-days: 30
create-release:
name: Create GitHub Release
needs: [prepare, build-matrix]
runs-on: ubuntu-latest
if: startsWith(github.ref, 'refs/tags/')
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Download all artifacts
uses: actions/download-artifact@v3
with:
path: release-artifacts
- name: Prepare release files
run: |
mkdir -p release
find release-artifacts -type f -name "*.tar.gz" -o -name "*.zip" -o -name "SHA256SUMS" | while read file; do
cp "$file" release/
done
# Combine all checksums
cat release-artifacts/*/SHA256SUMS > release/SHA256SUMS 2>/dev/null || true
ls -lah release/
shell: bash
- name: Create Release Notes
run: |
cat > RELEASE_NOTES.md << 'EOF'
# syntaxis v${{ needs.prepare.outputs.version }}
## Download
Pre-built binaries for multiple platforms:
| Platform | File | SHA256 |
|----------|------|--------|
| Linux x86_64 | [syntaxis-x86_64-linux-v${{ needs.prepare.outputs.version }}.tar.gz](./releases/download/${{ needs.prepare.outputs.tag }}/syntaxis-x86_64-linux-v${{ needs.prepare.outputs.version }}.tar.gz) | Check SHA256SUMS |
| macOS Intel | [syntaxis-x86_64-macos-v${{ needs.prepare.outputs.version }}.tar.gz](./releases/download/${{ needs.prepare.outputs.tag }}/syntaxis-x86_64-macos-v${{ needs.prepare.outputs.version }}.tar.gz) | Check SHA256SUMS |
| macOS ARM64 | [syntaxis-aarch64-macos-v${{ needs.prepare.outputs.version }}.tar.gz](./releases/download/${{ needs.prepare.outputs.tag }}/syntaxis-aarch64-macos-v${{ needs.prepare.outputs.version }}.tar.gz) | Check SHA256SUMS |
| Linux ARM64 | [syntaxis-aarch64-linux-v${{ needs.prepare.outputs.version }}.tar.gz](./releases/download/${{ needs.prepare.outputs.tag }}/syntaxis-aarch64-linux-v${{ needs.prepare.outputs.version }}.tar.gz) | Check SHA256SUMS |
| Windows x86_64 | [syntaxis-x86_64-windows-v${{ needs.prepare.outputs.version }}.zip](./releases/download/${{ needs.prepare.outputs.tag }}/syntaxis-x86_64-windows-v${{ needs.prepare.outputs.version }}.zip) | Check SHA256SUMS |
## Installation
### Quick Install (Offline Bundle)
1. Download the appropriate bundle for your platform
2. Extract: `tar -xzf bundle.tar.gz` or `unzip bundle.zip`
3. Install: `cd bundle && ./install.sh`
### Verify Integrity
```bash
# Download checksums
curl -O https://github.com/syntaxis/syntaxis/releases/download/${{ needs.prepare.outputs.tag }}/SHA256SUMS
# Verify bundles
sha256sum -c SHA256SUMS
```
## What's Included
Each bundle contains:
- ✅ Compiled binaries: `syntaxis-cli`, `syntaxis-tui`, `syntaxis-api`
- ✅ Configuration files: provisioning.toml, database configs, feature configs
- ✅ Documentation: README, CLAUDE.md, installation guide
- ✅ Offline installer: install.sh for systems without NuShell
- ✅ SHA256 checksums for integrity verification
## Changelog
See [CHANGELOG.md](./CHANGELOG.md) for detailed changes in this release.
## Support
- 📖 Documentation: https://github.com/syntaxis/syntaxis/blob/main/README.md
- 🐛 Issues: https://github.com/syntaxis/syntaxis/issues
- 💬 Discussions: https://github.com/syntaxis/syntaxis/discussions
EOF
cat RELEASE_NOTES.md
shell: bash
- name: Create Release
uses: softprops/action-gh-release@v1
with:
files: release/*
body_path: RELEASE_NOTES.md
draft: false
prerelease: false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
publish-docs:
name: Publish Documentation
needs: [prepare, create-release]
runs-on: ubuntu-latest
if: startsWith(github.ref, 'refs/tags/')
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Pages
uses: actions/configure-pages@v3
- name: Build documentation site
run: |
mkdir -p site
# Copy main docs
cp README.md site/index.md
cp CLAUDE.md site/CLAUDE.md
cp scripts/provisioning/README.md site/PROVISIONING.md
# Create release index
cat > site/releases.md << 'EOF'
# Releases
## Latest Release: v${{ needs.prepare.outputs.version }}
[Download from GitHub Releases](https://github.com/syntaxis/syntaxis/releases/tag/${{ needs.prepare.outputs.tag }})
All releases include:
- Pre-built binaries for Linux, macOS, and Windows
- Complete configuration files
- Offline documentation
- Installation scripts
- SHA256 checksums for integrity verification
EOF
ls -la site/
shell: bash
- name: Upload Pages artifact
uses: actions/upload-pages-artifact@v2
with:
path: 'site'
deploy-pages:
name: Deploy GitHub Pages
needs: publish-docs
runs-on: ubuntu-latest
if: startsWith(github.ref, 'refs/tags/')
permissions:
pages: write
id-token: write
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- name: Deploy to Pages
id: deployment
uses: actions/deploy-pages@v2
notify:
name: Release Notification
needs: [prepare, create-release]
runs-on: ubuntu-latest
if: startsWith(github.ref, 'refs/tags/')
steps:
- name: Release Summary
run: |
cat << 'EOF'
╔════════════════════════════════════════════════════════╗
║ syntaxis v${{ needs.prepare.outputs.version }} Released ║
╚════════════════════════════════════════════════════════╝
✅ Build completed for all platforms:
• Linux x86_64 (glibc)
• Linux ARM64 (glibc)
• macOS x86_64 (Intel)
• macOS ARM64 (Apple Silicon)
• Windows x86_64 (MSVC)
📦 Bundles created with:
• Compiled binaries
• Configuration files
• Documentation
• Installation scripts
🔗 GitHub Release: https://github.com/syntaxis/syntaxis/releases/tag/${{ needs.prepare.outputs.tag }}
📖 Documentation: https://github.com/syntaxis/syntaxis
🚀 Installation:
1. Download bundle for your platform
2. Extract: tar -xzf bundle.tar.gz
3. Install: cd bundle && ./install.sh
EOF
shell: bash