name: Release on: push: tags: - 'v*' workflow_dispatch: inputs: tag: description: 'Release tag (e.g., v1.0.0)' required: true default: 'v0.1.0' env: CARGO_TERM_COLOR: always jobs: build: name: Build ${{ matrix.target }} runs-on: ${{ matrix.os }} strategy: matrix: include: - target: x86_64-unknown-linux-gnu os: ubuntu-latest artifact_name: ailog asset_name: ailog-linux-x86_64 - target: x86_64-unknown-linux-musl os: ubuntu-latest artifact_name: ailog asset_name: ailog-linux-x86_64-musl - target: aarch64-unknown-linux-gnu os: ubuntu-latest artifact_name: ailog asset_name: ailog-linux-aarch64 - target: x86_64-apple-darwin os: macos-latest artifact_name: ailog asset_name: ailog-macos-x86_64 - target: aarch64-apple-darwin os: macos-latest artifact_name: ailog asset_name: ailog-macos-aarch64 - target: x86_64-pc-windows-msvc os: windows-latest artifact_name: ailog.exe asset_name: ailog-windows-x86_64.exe steps: - uses: actions/checkout@v4 - name: Setup Rust uses: dtolnay/rust-toolchain@stable with: targets: ${{ matrix.target }} - name: Install cross-compilation tools (Linux) if: matrix.os == 'ubuntu-latest' run: | sudo apt-get update sudo apt-get install -y gcc-multilib if [[ "${{ matrix.target }}" == "aarch64-unknown-linux-gnu" ]]; then sudo apt-get install -y gcc-aarch64-linux-gnu fi if [[ "${{ matrix.target }}" == "x86_64-unknown-linux-musl" ]]; then sudo apt-get install -y musl-tools fi - name: Configure cross-compilation (Linux ARM64) if: matrix.target == 'aarch64-unknown-linux-gnu' run: | echo '[target.aarch64-unknown-linux-gnu]' >> ~/.cargo/config.toml echo 'linker = "aarch64-linux-gnu-gcc"' >> ~/.cargo/config.toml - name: Cache cargo registry uses: actions/cache@v4 with: path: | ~/.cargo/registry ~/.cargo/git key: ${{ runner.os }}-${{ matrix.target }}-cargo-${{ hashFiles('**/Cargo.lock') }} - name: Cache target directory uses: actions/cache@v4 with: path: target key: ${{ runner.os }}-${{ matrix.target }}-target-${{ hashFiles('**/Cargo.lock') }} - name: Build run: cargo build --release --target ${{ matrix.target }} - name: Prepare binary shell: bash run: | cd target/${{ matrix.target }}/release if [[ "${{ matrix.os }}" == "windows-latest" ]]; then strip ${{ matrix.artifact_name }} || true else strip ${{ matrix.artifact_name }} fi if [[ "${{ matrix.target }}" == *"windows"* ]]; then 7z a ../../../${{ matrix.asset_name }}.zip ${{ matrix.artifact_name }} else tar czvf ../../../${{ matrix.asset_name }}.tar.gz ${{ matrix.artifact_name }} fi - name: Upload binary uses: actions/upload-artifact@v4 with: name: ${{ matrix.asset_name }} path: | ${{ matrix.asset_name }}.tar.gz ${{ matrix.asset_name }}.zip release: name: Create Release needs: build runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Download all artifacts uses: actions/download-artifact@v4 with: path: artifacts - name: Generate release notes run: | echo "## What's Changed" > release_notes.md echo "" >> release_notes.md echo "### Features" >> release_notes.md echo "- AI-powered static blog generator" >> release_notes.md echo "- AtProto OAuth integration" >> release_notes.md echo "- Automatic translation support" >> release_notes.md echo "- AI comment system" >> release_notes.md echo "" >> release_notes.md echo "### Platforms" >> release_notes.md echo "- Linux (x86_64, aarch64, musl)" >> release_notes.md echo "- macOS (Intel, Apple Silicon)" >> release_notes.md echo "- Windows (x86_64)" >> release_notes.md echo "" >> release_notes.md echo "### Installation" >> release_notes.md echo "\`\`\`bash" >> release_notes.md echo "# Linux/macOS" >> release_notes.md echo "tar -xzf ailog-linux-x86_64.tar.gz" >> release_notes.md echo "chmod +x ailog" >> release_notes.md echo "sudo mv ailog /usr/local/bin/" >> release_notes.md echo "" >> release_notes.md echo "# Windows" >> release_notes.md echo "# Extract ailog-windows-x86_64.zip and add to PATH" >> release_notes.md echo "\`\`\`" >> release_notes.md - name: Get tag name id: tag_name run: | if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then echo "tag=${{ github.event.inputs.tag }}" >> $GITHUB_OUTPUT else echo "tag=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT fi - name: Create Release uses: softprops/action-gh-release@v1 with: tag_name: ${{ steps.tag_name.outputs.tag }} name: ailog ${{ steps.tag_name.outputs.tag }} body_path: release_notes.md draft: false prerelease: ${{ contains(steps.tag_name.outputs.tag, 'alpha') || contains(steps.tag_name.outputs.tag, 'beta') || contains(steps.tag_name.outputs.tag, 'rc') }} files: | artifacts/*/ailog-*.tar.gz artifacts/*/ailog-*.zip env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}