name: CI on: push: branches: [ main ] paths-ignore: - '**.md' - 'demo/**' - 'docs/**' - 'homebrew-formula/**' pull_request: branches: [ main ] paths-ignore: - '**.md' - 'demo/**' - 'docs/**' - 'homebrew-formula/**' 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: | set -x cargo fmt --all -- --check cargo clippy --package martin-tile-utils -- -D warnings cargo clippy --package martin-mbtiles -- -D warnings cargo clippy --package martin-mbtiles --no-default-features --features native-tls -- -D warnings cargo clippy --package martin-mbtiles --no-default-features --features rustls -- -D warnings cargo clippy --package martin -- -D warnings cargo clippy --package martin --features vendored-openssl -- -D warnings cargo clippy --package martin --features bless-tests -- -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: Install cargo-deb if: matrix.os == 'ubuntu-latest' run: | sudo apt install -y dpkg dpkg-dev liblzma-dev cargo install cargo-deb - 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 --package martin RUSTFLAGS='-C link-arg=-s' cargo build --release --target ${{ matrix.target }} --features=cli --package martin-mbtiles else cargo build --release --target ${{ matrix.target }} --features=ssl --package martin cargo build --release --target ${{ matrix.target }} --features=cli --package martin-mbtiles fi mkdir target_releases if [[ "${{ runner.os }}" == "Windows" ]]; then mv target/${{ matrix.target }}/release/martin.exe target_releases mv target/${{ matrix.target }}/release/mbtiles.exe target_releases else mv target/${{ matrix.target }}/release/martin target_releases mv target/${{ matrix.target }}/release/mbtiles target_releases fi - name: Run build (debian package) if: matrix.os == 'ubuntu-latest' shell: bash run: | cargo deb -v -p martin --output target/debian/martin.deb mv target/debian/martin.deb target_releases - 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 ext: '' target: x86_64-unknown-linux-gnu name: martin-Linux-x86_64.tar.gz - os: windows-latest ext: '.exe' target: x86_64-pc-windows-msvc name: martin-Windows-x86_64.zip - os: macOS-latest ext: '' target: x86_64-apple-darwin name: martin-Darwin-x86_64.tar.gz - os: ubuntu-latest ext: '' 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: | set -x cargo test --package martin-tile-utils cargo test --package martin-mbtiles cargo test --package martin-mbtiles --no-default-features --features rustls cargo test --package martin --features vendored-openssl 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/martin${{ matrix.ext }} chmod +x target/mbtiles${{ matrix.ext }} fi tests/test.sh env: DATABASE_URL: ${{ steps.pg.outputs.connection-uri }} MARTIN_BUILD: "-" MARTIN_BIN: target/martin${{ matrix.ext }} MBTILES_BUILD: "-" MBTILES_BIN: target/mbtiles${{ matrix.ext }} - name: Integration Tests (with debian package) if: matrix.target == 'x86_64-unknown-linux-gnu' shell: bash run: | sudo dpkg -i target/martin.deb tests/test.sh env: DATABASE_URL: ${{ steps.pg.outputs.connection-uri }} MARTIN_BUILD: "-" MARTIN_BIN: /usr/bin/martin MBTILES_BUILD: "-" MBTILES_BIN: target/mbtiles${{ matrix.ext }} - 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: failed-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 martin${{ matrix.ext }} strip mbtiles${{ matrix.ext }} fi if [[ "${{ runner.os }}" == "Windows" ]]; then 7z a ../${{ matrix.name }} martin${{ matrix.ext }} mbtiles${{ matrix.ext }} else tar czvf ../${{ matrix.name }} martin${{ matrix.ext }} mbtiles${{ matrix.ext }} fi cd - - name: Package (debian) if: matrix.target == 'x86_64-unknown-linux-gnu' shell: bash run: | cd target/ tar czvf ../martin-debian-x86_64.tar.gz martin.deb 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 set -x cargo test --package martin-tile-utils cargo test --package martin-mbtiles cargo test --package martin-mbtiles --no-default-features --features rustls cargo test --package martin --features vendored-openssl 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 target/mbtiles 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 MBTILES_BUILD: "-" MBTILES_BIN: target/mbtiles