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)
436 lines
14 KiB
YAML
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
|