Files
shimmy/.github/workflows/version-validation.yml
Michael A. Kuykendall 0b0e8e2e29 feat(mlx): implement native Apple Silicon MLX support with pre-commit quality gates
- Add comprehensive MLX engine implementation with Python MLX bindings
- Implement MLX model discovery, loading, and native inference pipeline
- Add MLX feature flag compilation and Apple Silicon hardware detection
- Create dedicated GitHub Actions workflow for MLX testing on macos-14 ARM64
- Add MLX documentation to README and wiki with capability descriptions
- Implement pre-commit hooks enforcing cargo fmt, clippy, and test validation
- Fix GPU backend tests to properly force specific backends instead of auto-detection
- Resolve property test race conditions with serial test execution
- Update release workflow validation and platform-specific test expectations
- Add MLX implementation plan and cross-compilation toolchain support

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-09 20:11:32 -05:00

202 lines
7.7 KiB
YAML
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
name: Version Validation
# Run this workflow on all tags to ensure version consistency before any release
on:
push:
tags:
- 'v*'
workflow_dispatch: # Allow manual trigger for testing
inputs:
tag_name:
description: 'Tag name to validate (optional, defaults to latest tag)'
required: false
type: string
jobs:
validate-version:
runs-on: ubuntu-latest
name: "🔍 Version Consistency Check"
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0 # Need full history for tag comparison
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Determine tag to validate
id: determine_tag
run: |
if [ "${{ github.event_name }}" == "workflow_dispatch" ] && [ -n "${{ inputs.tag_name }}" ]; then
TAG_NAME="${{ inputs.tag_name }}"
elif [ "${{ github.event_name }}" == "push" ] && [ "${{ github.ref_type }}" == "tag" ]; then
TAG_NAME="${{ github.ref_name }}"
else
# Fallback to latest tag
TAG_NAME=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
fi
if [ -z "$TAG_NAME" ]; then
echo "❌ ERROR: No tag found to validate"
exit 1
fi
echo "tag_name=$TAG_NAME" >> $GITHUB_OUTPUT
echo "Validating tag: $TAG_NAME"
- name: Checkout specific tag
run: |
git checkout ${{ steps.determine_tag.outputs.tag_name }}
- name: Version Validation - Cargo.toml vs Git Tag
id: validate_cargo_tag
run: |
TAG_NAME="${{ steps.determine_tag.outputs.tag_name }}"
# Extract version from Cargo.toml - strip all whitespace/newlines
CARGO_VERSION=$(grep '^version = ' Cargo.toml | head -1 | sed 's/version = "\(.*\)"/\1/' | tr -d '\r\n' | xargs)
# Extract version from tag (remove 'v' prefix) - strip whitespace/newlines
TAG_VERSION=$(echo "${TAG_NAME#v}" | tr -d '\r\n' | xargs)
echo "🔍 Version Check Results:"
echo " Cargo.toml version: '$CARGO_VERSION'"
echo " Git tag version: '$TAG_VERSION'"
if [ "$CARGO_VERSION" != "$TAG_VERSION" ]; then
echo "❌ ERROR: Version mismatch detected!"
echo " Cargo.toml shows: $CARGO_VERSION"
echo " Git tag shows: $TAG_VERSION"
echo ""
echo "🛠️ To fix this issue:"
echo " 1. Update Cargo.toml version to match tag: $TAG_VERSION"
echo " 2. OR retag with version: v$CARGO_VERSION"
echo " 3. Commit and push the correction"
exit 1
else
echo "✅ Version consistency check passed!"
fi
echo "cargo_version=$CARGO_VERSION" >> $GITHUB_OUTPUT
echo "tag_version=$TAG_VERSION" >> $GITHUB_OUTPUT
- name: Version Validation - Build Test
run: |
echo "🧪 Testing that binary reports correct version..."
# Build the project
cargo build --release --no-default-features --features "huggingface"
# Test version output
VERSION_OUTPUT=$(./target/release/shimmy --version)
EXPECTED_VERSION="${{ steps.validate_cargo_tag.outputs.cargo_version }}"
echo "Binary version output: $VERSION_OUTPUT"
if echo "$VERSION_OUTPUT" | grep -q "$EXPECTED_VERSION"; then
echo "✅ Binary version check passed!"
else
echo "❌ ERROR: Binary version mismatch!"
echo " Expected to find: $EXPECTED_VERSION"
echo " Binary reported: $VERSION_OUTPUT"
exit 1
fi
- name: Version Validation - Semantic Versioning
run: |
VERSION="${{ steps.validate_cargo_tag.outputs.tag_version }}"
echo "🔍 Validating semantic versioning format..."
# Check semantic versioning pattern (major.minor.patch with optional pre-release/build)
if echo "$VERSION" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9\.-]+)?(\+[a-zA-Z0-9\.-]+)?$'; then
echo "✅ Semantic versioning format is valid: $VERSION"
else
echo "❌ ERROR: Invalid semantic versioning format: $VERSION"
echo " Expected format: MAJOR.MINOR.PATCH[-PRERELEASE][+BUILD]"
echo " Examples: 1.0.0, 1.0.0-alpha.1, 1.0.0+build.1"
exit 1
fi
# Additional check: version should not be 0.1.0 (development placeholder)
if [ "$VERSION" = "0.1.0" ]; then
echo "❌ ERROR: Version 0.1.0 is a development placeholder and should not be released"
echo " Please update to a proper release version"
exit 1
fi
- name: Version Validation - Release Notes Check
run: |
TAG_NAME="${{ steps.determine_tag.outputs.tag_name }}"
echo "🔍 Checking if this tag already has a GitHub release..."
# Check if release already exists
if gh release view "$TAG_NAME" >/dev/null 2>&1; then
echo "⚠️ WARNING: Release $TAG_NAME already exists on GitHub"
echo " This might indicate a re-tag or duplicate release attempt"
echo " Please review if this is intentional"
# Show existing release info
echo ""
echo "📋 Existing release information:"
gh release view "$TAG_NAME" --json name,tagName,publishedAt,isLatest
else
echo "✅ No existing release found for $TAG_NAME - ready for new release"
fi
env:
GH_TOKEN: ${{ github.token }}
- name: Version Validation - Dependency Check
run: |
echo "🔍 Validating dependencies and version consistency..."
# Check that Cargo.lock is consistent
cargo check --locked --no-default-features --features "huggingface"
if [ $? -eq 0 ]; then
echo "✅ Dependency check passed - Cargo.lock is consistent"
else
echo "❌ ERROR: Cargo.lock is inconsistent with Cargo.toml"
echo " Run 'cargo update' and commit the updated Cargo.lock"
exit 1
fi
- name: Version Validation - Changelog Check
run: |
TAG_NAME="${{ steps.determine_tag.outputs.tag_name }}"
echo "🔍 Checking changelog for version entry..."
if [ -f "CHANGELOG.md" ]; then
if grep -q "$TAG_NAME" CHANGELOG.md; then
echo "✅ Changelog entry found for $TAG_NAME"
else
echo "⚠️ WARNING: No changelog entry found for $TAG_NAME"
echo " Consider adding release notes to CHANGELOG.md"
fi
else
echo " No CHANGELOG.md found - skipping changelog check"
fi
- name: Version Validation Summary
run: |
echo ""
echo "🎯 VERSION VALIDATION SUMMARY"
echo "=============================="
echo "✅ Cargo.toml vs Git tag consistency: PASSED"
echo "✅ Binary version output: PASSED"
echo "✅ Semantic versioning format: PASSED"
echo "✅ Dependency consistency: PASSED"
echo ""
echo "🚀 Version ${{ steps.determine_tag.outputs.tag_name }} is ready for release!"
echo ""
echo "📋 This validation prevents:"
echo " • Version mismatches between Cargo.toml and Git tags"
echo " • Binaries reporting wrong version numbers"
echo " • Invalid semantic versioning"
echo " • Dependency inconsistencies"
echo " • Duplicate or conflicting releases"
echo ""
echo "Next step: The release workflow will proceed with building and publishing."