name: CI on: push: branches: - main pull_request: branches: - main release: branches: - main jobs: lints: name: Run format and clippy tests runs-on: ubuntu-latest steps: - name: Checkout sources uses: actions/checkout@v3 - name: Install fmt & clippy run: rustup component add clippy rustfmt - name: Run cargo fmt run: cargo fmt --all -- --check - name: Run cargo clippy run: cargo clippy --all-targets --all-features -- -D warnings test: name: Test Suite runs-on: ubuntu-latest env: # PG_* variables are used by psql PGDATABASE: db PGHOST: localhost PGUSER: postgres services: postgres: image: postgis/postgis:14-3.1-alpine env: # POSTGRES_* variables are used by the postgis/postgres image POSTGRES_DB: ${{ env.PGDATABASE }} POSTGRES_USER: ${{ env.PGUSER }} POSTGRES_HOST_AUTH_METHOD: trust ports: # will assign a random free host port - 5432/tcp # needed because the postgres container does not provide a healthcheck options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 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: Run tests run: cargo test --all env: DATABASE_URL: postgres://postgres@localhost:${{ job.services.postgres.ports[5432] }}/db - name: Run build run: cargo build - name: Run martin with pg auto-discovery run: ./target/debug/martin --default-srid 900913 & env: DATABASE_URL: postgres://postgres@localhost:${{ job.services.postgres.ports[5432] }}/db - name: Test auto-discovered source responses run: tests/test-auto-sources.sh - name: Run server with config, overriding connection run: pkill martin && ./target/debug/martin --config ./tests/config.yaml "$CONNECTION" & env: CONNECTION: postgres://postgres@localhost:${{ job.services.postgres.ports[5432] }}/db - name: Test pre-configured source responses run: tests/test-configured-sources.sh build: needs: [test] strategy: matrix: os: [ubuntu-latest, macOS-latest, windows-latest] include: - os: ubuntu-latest rust: stable target: x86_64-unknown-linux-gnu bin: martin name: martin-Linux-x86_64.tar.gz - os: windows-latest rust: stable target: x86_64-pc-windows-msvc bin: martin.exe name: martin-Windows-x86_64.zip - os: macOS-latest rust: stable target: x86_64-apple-darwin bin: martin name: martin-Darwin-x86_64.tar.gz runs-on: ${{ matrix.os }} steps: - name: Install stable toolchain uses: dtolnay/rust-toolchain@master with: toolchain: ${{ matrix.rust }} override: true target: ${{ matrix.target }} - name: Checkout uses: actions/checkout@v3 - name: Install OpenSSL if: matrix.os == 'windows-latest' 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 run: cargo build --release --target ${{ matrix.target }} docker: needs: [test] runs-on: ubuntu-latest steps: - name: Checkout sources uses: actions/checkout@v3 # https://github.com/docker/metadata-action - name: Docker meta id: docker_meta uses: docker/metadata-action@v4 with: images: maplibre/martin # https://github.com/docker/setup-qemu-action - name: Set up QEMU uses: docker/setup-qemu-action@v2 # https://github.com/docker/setup-buildx-action - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 with: install: true - name: Login to DockerHub uses: docker/login-action@v2 if: ${{ github.actor != 'dependabot[bot]' && !github.event.pull_request.head.repo.fork }} with: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} - name: Build and push the Docker image uses: docker/build-push-action@v3 with: push: ${{ github.actor != 'dependabot[bot]' && github.event_name != 'pull_request' }} tags: ${{ steps.docker_meta.outputs.tags }} labels: ${{ steps.docker_meta.outputs.labels }} release: if: startsWith(github.ref, 'refs/tags/') needs: [test] strategy: matrix: os: [ubuntu-latest, macOS-latest, windows-latest] include: - os: ubuntu-latest rust: stable target: x86_64-unknown-linux-gnu bin: martin name: martin-Linux-x86_64.tar.gz - os: windows-latest rust: stable target: x86_64-pc-windows-msvc bin: martin.exe name: martin-Windows-x86_64.zip - os: macOS-latest rust: stable target: x86_64-apple-darwin bin: martin name: martin-Darwin-x86_64.tar.gz runs-on: ${{ matrix.os }} steps: - name: Install stable toolchain uses: dtolnay/rust-toolchain@master with: toolchain: ${{ matrix.rust }} override: true target: ${{ matrix.target }} - name: Checkout uses: actions/checkout@v3 - name: Install OpenSSL if: matrix.os == 'windows-latest' 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 run: cargo build --release --target ${{ matrix.target }} - name: Package shell: bash run: | strip target/${{ matrix.target }}/release/${{ matrix.bin }} cd target/${{ matrix.target }}/release if [[ "${{ matrix.os }}" == "windows-latest" ]] then 7z a ../../../${{ matrix.name }} ${{ matrix.bin }} else tar czvf ../../../${{ matrix.name }} ${{ matrix.bin }} fi cd - - name: Generate SHA-256 if: matrix.os == 'macOS-latest' run: shasum -a 256 ${{ matrix.name }} - name: Publish uses: softprops/action-gh-release@v1 with: draft: true files: 'martin*' body_path: CHANGELOG.md env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}