name: CI on: push: branches: [main] pull_request: branches: [main] release: branches: [main] workflow_dispatch: jobs: build: # Don't change this name - it is used by the merge protection rules name: Build ${{ matrix.target }} strategy: fail-fast: true matrix: include: - os: ubuntu-latest target: x86_64-unknown-linux-gnu - os: windows-latest target: x86_64-pc-windows-msvc - os: macOS-latest target: x86_64-apple-darwin - os: macOS-latest target: aarch64-apple-darwin runs-on: ${{ matrix.os }} steps: - name: Checkout uses: actions/checkout@v3 - name: Lint if: matrix.target == 'x86_64-unknown-linux-gnu' shell: bash run: | cargo fmt --all -- --check cargo clippy --all-targets --all-features -- -D warnings - name: Install OpenSSL (Windows) if: runner.os == 'Windows' run: | echo "VCPKG_ROOT=$env:VCPKG_INSTALLATION_ROOT" | Out-File -FilePath $env:GITHUB_ENV -Append vcpkg install openssl:x64-windows-static-md - name: Run build shell: bash run: | if [[ "${{ matrix.target }}" == "aarch64-apple-darwin" ]]; then rustup target add aarch64-apple-darwin # compile without debug symbols RUSTFLAGS='-C link-arg=-s' cargo build --release --target ${{ matrix.target }} --features=vendored-openssl else cargo build --release --target ${{ matrix.target }} fi mkdir target_releases if [[ "${{ runner.os }}" == "Windows" ]]; then mv target/${{ matrix.target }}/release/martin.exe target_releases else mv target/${{ matrix.target }}/release/martin target_releases fi - name: Save build artifact build-${{ matrix.target }} uses: actions/upload-artifact@v3 with: name: build-${{ matrix.target }} path: target_releases/* test: # Don't change this name - it is used by the merge protection rules name: Test & package ${{ matrix.target }} needs: [build] strategy: fail-fast: true matrix: include: - os: ubuntu-latest bin: martin target: x86_64-unknown-linux-gnu name: martin-Linux-x86_64.tar.gz - os: windows-latest bin: martin.exe target: x86_64-pc-windows-msvc name: martin-Windows-x86_64.zip - os: macOS-latest bin: martin target: x86_64-apple-darwin name: martin-Darwin-x86_64.tar.gz - os: ubuntu-latest bin: martin target: aarch64-apple-darwin name: martin-Darwin-aarch64.tar.gz runs-on: ${{ matrix.os }} steps: - name: Checkout sources uses: actions/checkout@v3 - name: Start postgres if: matrix.target != 'aarch64-apple-darwin' uses: nyurik/action-setup-postgis@v1 id: pg with: username: test password: test database: test rights: --superuser - name: Init database if: matrix.target != 'aarch64-apple-darwin' shell: bash run: tests/fixtures/initdb.sh env: DATABASE_URL: ${{ steps.pg.outputs.connection-uri }} - name: Unit Tests (Linux) if: matrix.target == 'x86_64-unknown-linux-gnu' shell: bash run: | cargo test --all rm -rf target env: DATABASE_URL: ${{ steps.pg.outputs.connection-uri }} - uses: actions/download-artifact@v3 with: name: build-${{ matrix.target }} path: target/ - name: Save test output on failure (Linux) if: failure() && matrix.target == 'x86_64-unknown-linux-gnu' uses: actions/upload-artifact@v3 with: name: test-output path: tests/output/* retention-days: 5 - name: Test if: matrix.target != 'aarch64-apple-darwin' shell: bash run: | if [[ "${{ runner.os }}" != "Windows" ]]; then chmod +x target/${{ matrix.bin }} fi tests/test.sh env: DATABASE_URL: ${{ steps.pg.outputs.connection-uri }} MARTIN_BUILD: "-" MARTIN_BIN: target/${{ matrix.bin }} - name: Package shell: bash run: | cd target/ # Symbol stripping does not work cross-platform if [[ "${{ matrix.target }}" != "aarch64-apple-darwin" ]]; then strip ${{ matrix.bin }} fi if [[ "${{ runner.os }}" == "Windows" ]]; then 7z a ../${{ matrix.name }} ${{ matrix.bin }} else tar czvf ../${{ matrix.name }} ${{ matrix.bin }} fi cd - - name: Generate SHA-256 (MacOS) if: matrix.target == 'x86_64-apple-darwin' || matrix.target == 'aarch64-apple-darwin' run: shasum -a 256 ${{ matrix.name }} - name: Publish if: startsWith(github.ref, 'refs/tags/') uses: softprops/action-gh-release@v1 with: draft: true files: 'martin*' body_path: CHANGELOG.md env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}