diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..de148ba --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,150 @@ +name: Build executables + +"on": + push: + branches: + - main + tags: + - "v*" + pull_request: + workflow_dispatch: + +permissions: + contents: read + +env: + BIN_NAME: git-sync + CARGO_TERM_COLOR: always + +jobs: + windows-x86_64: + name: Windows x86_64 + runs-on: windows-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install Rust + uses: dtolnay/rust-toolchain@stable + with: + targets: x86_64-pc-windows-msvc + + - name: Cache Rust builds + uses: Swatinem/rust-cache@v2 + with: + key: windows-x86_64 + + - name: Build + run: cargo build --release --locked --target x86_64-pc-windows-msvc + + - name: Package + shell: pwsh + run: | + New-Item -ItemType Directory -Force dist | Out-Null + Copy-Item target/x86_64-pc-windows-msvc/release/${env:BIN_NAME}.exe dist/${env:BIN_NAME}.exe + Compress-Archive -Path dist/${env:BIN_NAME}.exe -DestinationPath ${env:BIN_NAME}-windows-x86_64.zip -Force + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: git-sync-windows-x86_64 + path: git-sync-windows-x86_64.zip + if-no-files-found: error + + macos-universal: + name: macOS universal + runs-on: macos-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install Rust + uses: dtolnay/rust-toolchain@stable + with: + targets: x86_64-apple-darwin,aarch64-apple-darwin + + - name: Cache Rust builds + uses: Swatinem/rust-cache@v2 + with: + key: macos-universal + + - name: Build x86_64 + run: cargo build --release --locked --target x86_64-apple-darwin + + - name: Build arm64 + run: cargo build --release --locked --target aarch64-apple-darwin + + - name: Create universal binary + run: | + mkdir -p dist + lipo -create \ + target/x86_64-apple-darwin/release/${BIN_NAME} \ + target/aarch64-apple-darwin/release/${BIN_NAME} \ + -output dist/${BIN_NAME} + chmod +x dist/${BIN_NAME} + lipo -info dist/${BIN_NAME} + + - name: Package + run: tar -C dist -czf ${BIN_NAME}-macos-universal.tar.gz ${BIN_NAME} + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: git-sync-macos-universal + path: git-sync-macos-universal.tar.gz + if-no-files-found: error + + linux-musl: + name: Linux ${{ matrix.arch }} musl static + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + include: + - arch: x86_64 + target: x86_64-unknown-linux-musl + - arch: arm64 + target: aarch64-unknown-linux-musl + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install Rust + uses: dtolnay/rust-toolchain@stable + with: + targets: ${{ matrix.target }} + + - name: Install Zig + uses: mlugg/setup-zig@v2 + + - name: Install cargo-zigbuild + uses: taiki-e/install-action@v2 + with: + tool: cargo-zigbuild + + - name: Cache Rust builds + uses: Swatinem/rust-cache@v2 + with: + key: linux-${{ matrix.target }} + + - name: Build static musl binary + run: cargo zigbuild --release --locked --target ${{ matrix.target }} + + - name: Verify static binary + run: | + file target/${{ matrix.target }}/release/${BIN_NAME} | tee binary-info.txt + grep -Eiq 'static|statically' binary-info.txt + + - name: Package + run: | + mkdir -p dist + cp target/${{ matrix.target }}/release/${BIN_NAME} dist/${BIN_NAME} + chmod +x dist/${BIN_NAME} + tar -C dist -czf ${BIN_NAME}-linux-${{ matrix.arch }}-musl.tar.gz ${BIN_NAME} + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: git-sync-linux-${{ matrix.arch }}-musl + path: git-sync-linux-${{ matrix.arch }}-musl.tar.gz + if-no-files-found: error