Release #1
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*' | |
| workflow_dispatch: | |
| env: | |
| CARGO_TERM_COLOR: always | |
| jobs: | |
| build: | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| - os: ubuntu-latest | |
| target: x86_64-unknown-linux-gnu | |
| artifact: cortex-linux-x64 | |
| ext: "" | |
| - os: macos-latest | |
| target: x86_64-apple-darwin | |
| artifact: cortex-darwin-x64 | |
| ext: "" | |
| - os: macos-latest | |
| target: aarch64-apple-darwin | |
| artifact: cortex-darwin-arm64 | |
| ext: "" | |
| - os: windows-latest | |
| target: x86_64-pc-windows-msvc | |
| artifact: cortex-win32-x64 | |
| ext: ".exe" | |
| runs-on: ${{ matrix.os }} | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Install Rust toolchain | |
| uses: dtolnay/rust-toolchain@stable | |
| with: | |
| targets: ${{ matrix.target }} | |
| - name: Cache cargo | |
| uses: actions/cache@v4 | |
| with: | |
| path: | | |
| ~/.cargo/registry | |
| ~/.cargo/git | |
| target | |
| key: ${{ matrix.target }}-cargo-${{ hashFiles('**/Cargo.lock') }} | |
| restore-keys: ${{ matrix.target }}-cargo- | |
| - name: Build release binary | |
| run: cargo build --release --target ${{ matrix.target }} | |
| - name: Package (Unix) | |
| if: runner.os != 'Windows' | |
| shell: bash | |
| run: | | |
| mkdir -p dist | |
| cp target/${{ matrix.target }}/release/cortex dist/cortex | |
| cd dist | |
| tar -czf ${{ matrix.artifact }}.tar.gz cortex | |
| sha256sum ${{ matrix.artifact }}.tar.gz > ${{ matrix.artifact }}.tar.gz.sha256 | |
| - name: Package (Windows) | |
| if: runner.os == 'Windows' | |
| shell: pwsh | |
| run: | | |
| New-Item -ItemType Directory -Force -Path dist | |
| Copy-Item "target\${{ matrix.target }}\release\cortex.exe" "dist\cortex.exe" | |
| Set-Location dist | |
| tar -czf "${{ matrix.artifact }}.tar.gz" "cortex.exe" | |
| $hash = (Get-FileHash "${{ matrix.artifact }}.tar.gz" -Algorithm SHA256).Hash.ToLower() | |
| "$hash ${{ matrix.artifact }}.tar.gz" | Out-File -Encoding ascii "${{ matrix.artifact }}.tar.gz.sha256" | |
| - name: Upload build artifact | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: ${{ matrix.artifact }} | |
| path: dist/${{ matrix.artifact }}.* | |
| release: | |
| needs: build | |
| runs-on: ubuntu-latest | |
| if: startsWith(github.ref, 'refs/tags/') | |
| permissions: | |
| contents: write | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Download all build artifacts | |
| uses: actions/download-artifact@v4 | |
| with: | |
| path: artifacts | |
| merge-multiple: true | |
| - name: List artifacts | |
| run: ls -la artifacts/ | |
| - name: Verify checksums | |
| shell: bash | |
| run: | | |
| echo "=== Binary Verification ===" | |
| echo "" | |
| cd artifacts | |
| for sha_file in *.sha256; do | |
| if [ -f "$sha_file" ]; then | |
| echo "Verifying: $sha_file" | |
| sha256sum -c "$sha_file" | |
| fi | |
| done | |
| echo "" | |
| echo "=== All checksums verified ===" | |
| - name: Extract release notes | |
| shell: bash | |
| run: | | |
| # Get version from tag (strip 'v' prefix) | |
| TAG="${GITHUB_REF#refs/tags/v}" | |
| echo "Looking for version: $TAG" | |
| # Safely extract changelog section using grep + sed (avoids awk regex issues with special chars) | |
| if grep -q "^## \[${TAG}\]" CHANGELOG.md; then | |
| # Extract from the matching header to the next ## [ header | |
| sed -n "/^## \[${TAG}\]/,/^## \[/{ /^## \[${TAG}\]/d; /^## \[/d; p; }" CHANGELOG.md > release_notes.md | |
| fi | |
| # If empty, use the first changelog section | |
| if [ ! -s release_notes.md ]; then | |
| echo "No exact match for $TAG, using first changelog section" | |
| sed -n '/^## \[/{n; :loop; /^## \[/q; p; n; b loop}' CHANGELOG.md > release_notes.md | |
| fi | |
| # If still empty, use a default | |
| if [ ! -s release_notes.md ]; then | |
| echo "Release v${TAG}" > release_notes.md | |
| fi | |
| echo "Release notes:" | |
| cat release_notes.md | |
| - name: Create GitHub Release | |
| uses: softprops/action-gh-release@v2 | |
| with: | |
| files: artifacts/* | |
| body_path: release_notes.md | |
| draft: false | |
| prerelease: false | |
| make_latest: true |