Minor refactor and cleanup #1523
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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: | | |
cargo fmt --all -- --check | |
cargo clippy --workspace --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 --package martin | |
RUSTFLAGS='-C link-arg=-s' cargo build --release --target ${{ matrix.target }} --features=tools --package martin-mbtiles | |
else | |
cargo build --release --target ${{ matrix.target }} --features=ssl --package martin | |
cargo build --release --target ${{ matrix.target }} --features=tools --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: 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: | | |
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/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: 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 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: 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 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 |