name: CI on: push: branches: [main, v0.6] pull_request: branches: [main, v0.6] release: types: [published] 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: Rust Versions shell: bash run: | rustc --version cargo --version - 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 -W clippy::pedantic - 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 }} --features=ssl 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: Log DATABASE_URL string shell: bash run: | echo "DATABASE_URL=$DATABASE_URL" echo "And in base64 to bypass Github's obfuscation:" echo "$DATABASE_URL" | base64 env: DATABASE_URL: ${{ steps.pg.outputs.connection-uri }} - 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-targets cargo test --all-targets --all-features cargo test --doc rm -rf target env: DATABASE_URL: ${{ steps.pg.outputs.connection-uri }} - uses: actions/download-artifact@v3 with: name: build-${{ matrix.target }} path: target/ - name: Integration Tests 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: Compare test output results (Linux) if: matrix.target == 'x86_64-unknown-linux-gnu' run: diff --brief --recursive --new-file tests/output tests/expected - 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: 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 }} test-legacy: # Don't change this name - it is used by the merge protection rules name: Test Legacy DB needs: [build] runs-on: ubuntu-latest strategy: fail-fast: true matrix: include: # These must match the versions of postgres used in the docker-compose.yml - image: postgis/postgis:11-3.0-alpine args: postgres sslmode: disable - image: postgis/postgis:14-3.3-alpine args: postgres sslmode: disable # alpine images don't support SSL, so for this we use the debian images - image: postgis/postgis:15-3.3 args: postgres -c ssl=on -c ssl_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem -c ssl_key_file=/etc/ssl/private/ssl-cert-snakeoil.key sslmode: require env: # PG_* variables are used by psql PGDATABASE: test PGHOST: localhost PGUSER: postgres PGPASSWORD: postgres services: postgres: image: ${{ matrix.image }} ports: # will assign a random free host port - 5432/tcp # Sadly there is currently no way to pass arguments to the service image other than this hack # See also https://stackoverflow.com/a/62720566/177275 options: >- -e POSTGRES_DB=test -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=postgres -e PGDATABASE=test -e PGUSER=postgres -e PGPASSWORD=postgres --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 --entrypoint sh ${{ matrix.image }} -c "exec docker-entrypoint.sh ${{ matrix.args }}" steps: - name: Checkout sources uses: actions/checkout@v3 - name: Setup database run: | # sudo apt-get install postgresql-client tests/fixtures/initdb.sh env: PGPORT: ${{ job.services.postgres.ports[5432] }} - name: Unit Tests (Linux) shell: bash run: | echo "Running unit tests, connecting to DATABASE_URL=$DATABASE_URL" echo "Same but as base64 to prevent GitHub obfuscation (this is not a secret):" echo "$DATABASE_URL" | base64 if [[ "${{ matrix.sslmode }}" == "disable" ]]; then # This only works if SSL is not required cargo test --all-targets fi cargo test --all-targets --all-features cargo test --doc rm -rf target env: DATABASE_URL: postgres://${{ env.PGUSER }}:${{ env.PGUSER }}@${{ env.PGHOST }}:${{ job.services.postgres.ports[5432] }}/${{ env.PGDATABASE }}?sslmode=${{ matrix.sslmode }} - name: Save test output on failure if: failure() uses: actions/upload-artifact@v3 with: name: test-output path: tests/output/* retention-days: 5 - uses: actions/download-artifact@v3 with: name: build-x86_64-unknown-linux-gnu path: target/ - name: Integration Tests run: | chmod +x target/martin tests/test.sh env: DATABASE_URL: postgres://${{ env.PGUSER }}:${{ env.PGUSER }}@${{ env.PGHOST }}:${{ job.services.postgres.ports[5432] }}/${{ env.PGDATABASE }}?sslmode=${{ matrix.sslmode }} MARTIN_BUILD: "-" MARTIN_BIN: target/martin