mirror of
https://github.com/maplibre/martin.git
synced 2024-12-21 05:41:55 +03:00
275 lines
9.3 KiB
YAML
275 lines
9.3 KiB
YAML
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
|