Release #32
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Release | |
| on: | |
| push: | |
| tags: | |
| - 'v*.*.*' | |
| branches: | |
| - main | |
| schedule: | |
| # Run nightly at 2 AM UTC | |
| - cron: '0 2 * * *' | |
| workflow_dispatch: | |
| inputs: | |
| version: | |
| description: 'Release version (e.g., v1.0.0 or nightly-2025-07-20)' | |
| required: true | |
| type: string | |
| prerelease: | |
| description: 'Mark as pre-release' | |
| required: false | |
| type: boolean | |
| default: false | |
| release_type: | |
| description: 'Release type' | |
| required: false | |
| type: choice | |
| options: | |
| - stable | |
| - nightly | |
| default: stable | |
| env: | |
| ZIG_VERSION: 0.14.1 | |
| permissions: | |
| contents: write | |
| jobs: | |
| create-release: | |
| name: Create Release | |
| runs-on: ubuntu-latest | |
| outputs: | |
| version: ${{ steps.version.outputs.version }} | |
| prerelease: ${{ steps.version.outputs.prerelease }} | |
| is_nightly: ${{ steps.version.outputs.is_nightly }} | |
| upload_url: ${{ steps.create_release.outputs.upload_url }} | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| with: | |
| submodules: recursive | |
| fetch-depth: 0 | |
| - name: Determine version and release type | |
| id: version | |
| run: | | |
| # Determine if this is a nightly release | |
| if [ "${{ github.event_name }}" = "schedule" ] || | |
| [ "${{ github.event_name }}" = "push" -a "${{ github.ref }}" = "refs/heads/main" ] || | |
| [ "${{ github.event.inputs.release_type }}" = "nightly" ]; then | |
| # Nightly release | |
| DATE=$(date -u +%Y%m%d) | |
| SHORT_SHA=$(git rev-parse --short HEAD) | |
| VERSION="nightly-${DATE}-${SHORT_SHA}" | |
| IS_PRERELEASE="true" | |
| IS_NIGHTLY="true" | |
| echo "version=$VERSION" >> $GITHUB_OUTPUT | |
| echo "prerelease=$IS_PRERELEASE" >> $GITHUB_OUTPUT | |
| echo "is_nightly=$IS_NIGHTLY" >> $GITHUB_OUTPUT | |
| echo "🌙 Creating nightly release: $VERSION" | |
| elif [ "${{ github.event_name }}" = "workflow_dispatch" ]; then | |
| # Manual release | |
| VERSION="${{ github.event.inputs.version }}" | |
| echo "version=$VERSION" >> $GITHUB_OUTPUT | |
| echo "prerelease=${{ github.event.inputs.prerelease }}" >> $GITHUB_OUTPUT | |
| echo "is_nightly=false" >> $GITHUB_OUTPUT | |
| echo "🚀 Creating manual release: $VERSION" | |
| else | |
| # Tag-based release | |
| VERSION="${GITHUB_REF#refs/tags/}" | |
| echo "version=$VERSION" >> $GITHUB_OUTPUT | |
| echo "prerelease=false" >> $GITHUB_OUTPUT | |
| echo "is_nightly=false" >> $GITHUB_OUTPUT | |
| echo "🏷️ Creating tag-based release: $VERSION" | |
| fi | |
| # Debug output | |
| echo "Final version: $VERSION" | |
| - name: Cleanup old nightly releases | |
| if: steps.version.outputs.is_nightly == 'true' | |
| run: | | |
| echo "🧹 Cleaning up old nightly releases..." | |
| # Keep only the last 7 nightly releases | |
| gh release list --limit 50 | grep "nightly-" | tail -n +8 | while read line; do | |
| tag=$(echo "$line" | awk '{print $1}') | |
| echo "🗑️ Deleting old nightly release: $tag" | |
| gh release delete "$tag" --yes || echo "⚠️ Failed to delete $tag" | |
| done || echo "ℹ️ No old nightly releases to clean up" | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Generate changelog | |
| id: changelog | |
| run: | | |
| VERSION="${{ steps.version.outputs.version }}" | |
| IS_NIGHTLY="${{ steps.version.outputs.is_nightly }}" | |
| echo "📝 Generating changelog for $VERSION..." | |
| if [ "$IS_NIGHTLY" = "true" ]; then | |
| # Nightly release changelog | |
| { | |
| echo "# Nightly Build $VERSION" | |
| echo "" | |
| echo "🌙 **This is a nightly development build** - use at your own risk!" | |
| echo "" | |
| echo "## 📅 Build Information" | |
| echo "- **Build Date**: $(date -u '+%Y-%m-%d %H:%M:%S UTC')" | |
| echo "- **Commit**: \`$(git rev-parse HEAD)\`" | |
| echo "- **Branch**: \`main\`" | |
| echo "" | |
| echo "## 🔄 Recent Changes" | |
| echo "" | |
| # Show last 10 commits | |
| git log --pretty=format:"- %s (%h)" -10 | sed 's/^/ /' | |
| echo "" | |
| echo "" | |
| echo "## ⚠️ Important Notes" | |
| echo "" | |
| echo "- This is an **unstable development build**" | |
| echo "- Features may be incomplete or broken" | |
| echo "- Use stable releases for production" | |
| echo "- Report issues on [GitHub Issues](https://github.com/${{ github.repository }}/issues)" | |
| echo "" | |
| echo "## 📦 Download" | |
| echo "" | |
| echo "Choose the appropriate binary for your platform:" | |
| echo "- **Linux (x86_64)**: \`ora-linux-x86_64\`" | |
| echo "- **macOS (x86_64)**: \`ora-macos-x86_64\`" | |
| echo "- **macOS (ARM64)**: \`ora-macos-arm64\`" | |
| echo "" | |
| echo "---" | |
| echo "" | |
| echo "**Next Stable Release**: Coming soon with v0.0.1" | |
| } > CHANGELOG.md | |
| else | |
| # Stable release changelog (original logic) | |
| PREVIOUS_TAG=$(git describe --tags --abbrev=0 HEAD^ 2>/dev/null || echo "") | |
| { | |
| echo "# Release $VERSION" | |
| echo "" | |
| echo "## 🚀 Features" | |
| echo "" | |
| if [ -n "$PREVIOUS_TAG" ]; then | |
| echo "### Changes since $PREVIOUS_TAG" | |
| echo "" | |
| git log --pretty=format:"- %s (%h)" $PREVIOUS_TAG..HEAD | grep -E "feat|add|new" | head -10 || echo "- No major feature changes" | |
| else | |
| echo "- Initial release of Ora compiler" | |
| echo "- Complete Zig-based compilation pipeline" | |
| echo "- HIR (High-level Intermediate Representation)" | |
| echo "- Yul code generation with optimizations" | |
| echo "- Formal verification capabilities" | |
| echo "- Type checking and semantic analysis" | |
| fi | |
| echo "" | |
| echo "## 🐛 Bug Fixes" | |
| echo "" | |
| if [ -n "$PREVIOUS_TAG" ]; then | |
| git log --pretty=format:"- %s (%h)" $PREVIOUS_TAG..HEAD | grep -E "fix|bug|issue" | head -5 || echo "- No bug fixes in this release" | |
| else | |
| echo "- Initial stable release" | |
| fi | |
| echo "" | |
| echo "## 📦 Download" | |
| echo "" | |
| echo "Choose the appropriate binary for your platform:" | |
| echo "- **Linux (x86_64)**: \`ora-linux-x86_64\`" | |
| echo "- **macOS (x86_64)**: \`ora-macos-x86_64\`" | |
| echo "- **macOS (ARM64)**: \`ora-macos-arm64\`" | |
| echo "" | |
| echo "## 🔧 Installation" | |
| echo "" | |
| echo "1. Download the binary for your platform" | |
| echo "2. Make it executable: \`chmod +x ora-*\`" | |
| echo "3. Add to your PATH or run directly" | |
| echo "" | |
| echo "## 📖 Usage" | |
| echo "" | |
| echo "\`\`\`bash" | |
| echo "# Compile an Ora source file" | |
| echo "./ora-linux-x86_64 my_contract.ora" | |
| echo "" | |
| echo "# Show help" | |
| echo "./ora-linux-x86_64 --help" | |
| echo "\`\`\`" | |
| echo "" | |
| echo "## 🔍 Verification" | |
| echo "" | |
| echo "You can verify the integrity of downloaded binaries using the provided checksums." | |
| echo "" | |
| echo "---" | |
| echo "" | |
| echo "**Full Changelog**: https://github.com/${{ github.repository }}/compare/${PREVIOUS_TAG:-initial}...$VERSION" | |
| } > CHANGELOG.md | |
| fi | |
| echo "📋 Changelog generated" | |
| cat CHANGELOG.md | |
| - name: Create Release | |
| id: create_release | |
| run: | | |
| VERSION="${{ steps.version.outputs.version }}" | |
| IS_PRERELEASE="${{ steps.version.outputs.prerelease }}" | |
| IS_NIGHTLY="${{ steps.version.outputs.is_nightly }}" | |
| if [ "$IS_NIGHTLY" = "true" ]; then | |
| echo "🌙 Creating nightly release $VERSION..." | |
| TITLE="Nightly Build $VERSION" | |
| else | |
| echo "🚀 Creating stable release $VERSION..." | |
| TITLE="Ora Compiler $VERSION" | |
| fi | |
| # Create release using gh CLI | |
| if [ "$IS_PRERELEASE" = "true" ]; then | |
| gh release create "$VERSION" \ | |
| --title "$TITLE" \ | |
| --notes-file CHANGELOG.md \ | |
| --prerelease | |
| else | |
| gh release create "$VERSION" \ | |
| --title "$TITLE" \ | |
| --notes-file CHANGELOG.md | |
| fi | |
| echo "✅ Release created successfully: $VERSION" | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| build-binaries: | |
| name: Build ${{ matrix.platform }} | |
| runs-on: ${{ matrix.os }} | |
| needs: create-release | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| - os: ubuntu-latest | |
| platform: linux-x86_64 | |
| target: x86_64-linux | |
| - os: macos-latest | |
| platform: macos-x86_64 | |
| target: x86_64-macos | |
| - os: macos-latest | |
| platform: macos-arm64 | |
| target: aarch64-macos | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| with: | |
| submodules: recursive | |
| - name: Setup Zig | |
| uses: goto-bus-stop/setup-zig@v2 | |
| with: | |
| version: ${{ env.ZIG_VERSION }} | |
| - name: Install system dependencies | |
| run: | | |
| echo "🔧 Installing system dependencies for ${{ runner.os }}..." | |
| case "${{ runner.os }}" in | |
| Linux) | |
| sudo apt-get update -qq | |
| # Install C++ build tools with proper standard library | |
| sudo apt-get install -y \ | |
| build-essential \ | |
| cmake \ | |
| ninja-build \ | |
| libboost-all-dev \ | |
| libssl-dev \ | |
| pkg-config \ | |
| git \ | |
| libc++-dev \ | |
| libc++abi-dev | |
| echo "✅ Linux dependencies installed" | |
| # Set CMake to use system default C++ stdlib instead of forcing libc++ | |
| echo "CMAKE_CXX_FLAGS=-stdlib=libstdc++" >> $GITHUB_ENV | |
| echo "CC=gcc" >> $GITHUB_ENV | |
| echo "CXX=g++" >> $GITHUB_ENV | |
| ;; | |
| macOS) | |
| brew update | |
| brew install boost openssl cmake ninja | |
| echo "✅ macOS dependencies installed" | |
| # Use default Clang on macOS (which has proper libc++ support) | |
| echo "CC=clang" >> $GITHUB_ENV | |
| echo "CXX=clang++" >> $GITHUB_ENV | |
| ;; | |
| esac | |
| - name: Cache build dependencies | |
| uses: actions/cache@v4 | |
| with: | |
| path: | | |
| ~/.cache/zig | |
| .zig-cache | |
| vendor/solidity/build | |
| key: ${{ runner.os }}-${{ matrix.target }}-deps-${{ hashFiles('build.zig', 'build.zig.zon') }} | |
| restore-keys: | | |
| ${{ runner.os }}-${{ matrix.target }}-deps- | |
| ${{ runner.os }}-deps- | |
| - name: Configure Solidity build | |
| run: | | |
| echo "🔧 Configuring Solidity build..." | |
| cd vendor/solidity | |
| case "${{ runner.os }}" in | |
| Linux) | |
| # Use system default compiler and standard library | |
| cmake -S . -B build \ | |
| -DCMAKE_BUILD_TYPE=Release \ | |
| -DCMAKE_CXX_COMPILER=g++ \ | |
| -DCMAKE_C_COMPILER=gcc \ | |
| -DCMAKE_CXX_STANDARD=20 \ | |
| -DUSE_CVC4=OFF \ | |
| -DUSE_Z3=OFF \ | |
| -DTESTS=OFF \ | |
| -DSTRICT=OFF \ | |
| -DSOLC_LINK_STATIC=ON \ | |
| -GNinja | |
| ;; | |
| macOS) | |
| # Use Clang with proper macOS settings | |
| cmake -S . -B build \ | |
| -DCMAKE_BUILD_TYPE=Release \ | |
| -DCMAKE_CXX_COMPILER=clang++ \ | |
| -DCMAKE_C_COMPILER=clang \ | |
| -DCMAKE_CXX_STANDARD=20 \ | |
| -DUSE_CVC4=OFF \ | |
| -DUSE_Z3=OFF \ | |
| -DTESTS=OFF \ | |
| -DSTRICT=OFF \ | |
| -DSOLC_LINK_STATIC=ON \ | |
| -GNinja | |
| ;; | |
| esac | |
| - name: Build Solidity libraries | |
| run: | | |
| echo "🔨 Building Solidity libraries..." | |
| cd vendor/solidity/build | |
| # Determine number of parallel jobs based on OS | |
| case "${{ runner.os }}" in | |
| Linux) | |
| JOBS=$(nproc) | |
| ;; | |
| macOS) | |
| JOBS=$(sysctl -n hw.logicalcpu) | |
| ;; | |
| *) | |
| JOBS=2 # Fallback for unknown OS | |
| ;; | |
| esac | |
| echo "Using $JOBS parallel jobs for build..." | |
| # Build only the libraries we need | |
| ninja -j${JOBS} solutil langutil smtutil evmasm yul | |
| echo "✅ Solidity libraries built successfully" | |
| - name: Build release binary | |
| run: | | |
| echo "🔨 Building Ora compiler for ${{ matrix.platform }}..." | |
| # Build optimized release version | |
| zig build -Doptimize=ReleaseFast -Dtarget=${{ matrix.target }} | |
| # Verify the binary was created | |
| if [ -f "zig-out/bin/ora" ]; then | |
| echo "✅ Binary built successfully" | |
| ls -la zig-out/bin/ | |
| # Show binary info | |
| file zig-out/bin/ora | |
| du -h zig-out/bin/ora | |
| else | |
| echo "❌ Binary not found" | |
| ls -la zig-out/ | |
| exit 1 | |
| fi | |
| - name: Test binary | |
| run: | | |
| echo "🧪 Testing binary..." | |
| if [ -f "zig-out/bin/ora" ]; then | |
| # Test basic functionality | |
| chmod +x zig-out/bin/ora | |
| echo "Testing --version..." | |
| ./zig-out/bin/ora --version 2>/dev/null || echo "⚠️ Version check failed (expected for now)" | |
| echo "Testing --help..." | |
| ./zig-out/bin/ora --help 2>/dev/null || echo "⚠️ Help check failed (expected for now)" | |
| echo "Testing compilation..." | |
| echo 'contract Test { pub fn init() {} }' > test.ora | |
| ./zig-out/bin/ora compile test.ora 2>/dev/null || echo "⚠️ Compilation test failed" | |
| rm -f test.ora | |
| echo "✅ Binary test completed" | |
| else | |
| echo "❌ No binary to test" | |
| exit 1 | |
| fi | |
| - name: Create binary package | |
| run: | | |
| echo "📦 Creating binary package..." | |
| # Create package directory | |
| mkdir -p release-package | |
| # Copy binary with platform-specific name | |
| cp zig-out/bin/ora release-package/ora-${{ matrix.platform }} | |
| # Add documentation | |
| cp LICENSE release-package/ 2>/dev/null || echo "LICENSE not found" | |
| cp README.md release-package/ 2>/dev/null || echo "README not found" | |
| # Create simple README for the package | |
| { | |
| echo "Ora Compiler - ${{ matrix.platform }}" | |
| echo "================================" | |
| echo "" | |
| echo "This is the Ora compiler binary for ${{ matrix.platform }}." | |
| echo "" | |
| echo "Usage:" | |
| echo " ./ora-${{ matrix.platform }} [options] <file.ora>" | |
| echo "" | |
| echo "Options:" | |
| echo " --help Show help information" | |
| echo " --version Show version information" | |
| echo "" | |
| echo "For more information, visit:" | |
| echo "https://github.com/${{ github.repository }}" | |
| } > release-package/README.txt | |
| ls -la release-package/ | |
| echo "Package contents:" | |
| du -sh release-package/* | |
| - name: Generate checksums | |
| run: | | |
| echo "🔍 Generating checksums..." | |
| cd release-package | |
| # Generate SHA256 checksums | |
| shasum -a 256 "ora-${{ matrix.platform }}" > "checksums-${{ matrix.platform }}.txt" | |
| echo "📋 Checksums for ${{ matrix.platform }}:" | |
| cat "checksums-${{ matrix.platform }}.txt" | |
| - name: Upload binary to release | |
| run: | | |
| echo "📤 Uploading binary to release..." | |
| VERSION="${{ needs.create-release.outputs.version }}" | |
| echo "Using version: $VERSION" | |
| # Check if release exists | |
| if gh release view "$VERSION" >/dev/null 2>&1; then | |
| echo "✅ Release $VERSION found" | |
| # Upload binary | |
| gh release upload "$VERSION" \ | |
| "release-package/ora-${{ matrix.platform }}" \ | |
| --clobber | |
| echo "✅ Binary uploaded successfully" | |
| else | |
| echo "❌ Release $VERSION not found" | |
| echo "Available releases:" | |
| gh release list --limit 10 | |
| exit 1 | |
| fi | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Upload checksums to release | |
| run: | | |
| echo "📤 Uploading checksums to release..." | |
| VERSION="${{ needs.create-release.outputs.version }}" | |
| # Upload checksums | |
| gh release upload "$VERSION" \ | |
| "release-package/checksums-${{ matrix.platform }}.txt" \ | |
| --clobber | |
| echo "✅ Checksums uploaded successfully" | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Upload build artifacts | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: ora-${{ matrix.platform }} | |
| path: release-package/ | |
| retention-days: 30 | |
| post-release: | |
| name: Post-Release Tasks | |
| runs-on: ubuntu-latest | |
| needs: [create-release, build-binaries] | |
| if: always() && needs.create-release.result == 'success' | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Post-release summary | |
| run: | | |
| VERSION="${{ needs.create-release.outputs.version }}" | |
| IS_NIGHTLY="${{ needs.create-release.outputs.is_nightly }}" | |
| if [ "$IS_NIGHTLY" = "true" ]; then | |
| echo "🌙 Nightly build pipeline completed!" | |
| echo "📦 Nightly Build: $VERSION" | |
| echo "⚠️ This is a development build - use with caution" | |
| else | |
| echo "🚀 Release pipeline completed successfully!" | |
| echo "📦 Release: $VERSION" | |
| fi | |
| echo "🔗 Release URL: https://github.com/${{ github.repository }}/releases/tag/$VERSION" | |
| echo "" | |
| echo "📊 Pipeline Summary:" | |
| echo "✅ Release created: $VERSION" | |
| echo "✅ Binaries built for all platforms" | |
| echo "✅ Checksums generated and uploaded" | |
| echo "✅ Release assets uploaded" | |
| echo "🎯 Next steps:" | |
| echo "- Test the release binaries" | |
| echo "- Update documentation if needed" | |
| echo "- Announce the release" |