name: Rust on: pull_request: push: branches: - master jobs: format: runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - run: cargo fmt --all -- --check build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 # Rust ------------------------------------------------ - name: Install Rust toolchain uses: actions-rs/toolchain@v1 with: toolchain: stable profile: minimal override: true - name: Cache target/ uses: actions/cache@v1 with: path: target key: ${{ runner.os }}-cargo-build-target-${{ hashFiles('**/Cargo.lock') }} # ----------------------------------------------------- # check w/deny warnings in sqlx-core: async-std - working-directory: sqlx-core run: cargo rustc --no-default-features --features 'all-types postgres mysql tls runtime-async-std' -- -D warnings --emit=metadata # check w/deny warnings in sqlx-core: tokio # `cargo rustc -p sqlx-core` ignores `--no-default-features` and builds with `runtime-async-std` anyway # https://github.com/rust-lang/cargo/issues/5364 - working-directory: sqlx-core run: cargo rustc --no-default-features --features 'all-types postgres mysql tls runtime-tokio' -- -D warnings --emit=metadata # check w/deny warnings: async-std - run: cargo rustc --no-default-features --features 'all-types postgres mysql macros tls runtime-async-std' -- -D warnings --emit=metadata # check w/deny warnings: tokio - run: cargo rustc --no-default-features --features 'all-types postgres mysql macros tls runtime-tokio' -- -D warnings --emit=metadata # unit test: async-std - run: cargo test --manifest-path sqlx-core/Cargo.toml --no-default-features --features 'all-types postgres mysql tls runtime-async-std' # unit test: tokio - run: cargo test --manifest-path sqlx-core/Cargo.toml --no-default-features --features 'all-types postgres mysql tls runtime-tokio' # integration test: sqlite + async-std - run: cargo test --no-default-features --features 'runtime-async-std sqlite macros tls' env: # note: absolute path required for UI tests # https://github.com/dtolnay/trybuild/issues/69#issuecomment-620329526 DATABASE_URL: ${{ format('sqlite://{0}/tests/fixtures/sqlite.sqlite', github.workspace) }} # integration test: sqlite + tokio - run: cargo test --no-default-features --features 'runtime-tokio sqlite macros tls' env: DATABASE_URL: ${{ format('sqlite://{0}/tests/fixtures/sqlite.sqlite', github.workspace) }} # Rust ------------------------------------------------ - name: Prepare build directory for cache run: | find ./target/debug -maxdepth 1 -type f -delete \ && rm -fr ./target/debug/{deps,.fingerprint}/*sqlx* \ && rm -f ./target/.rustc_info.json # ----------------------------------------------------- postgres: needs: build runs-on: ubuntu-latest strategy: matrix: postgres: [9.4.25, 10.11, 12.1] services: postgres: image: postgres:${{ matrix.postgres }} env: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: postgres 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: - uses: actions/checkout@v1 # Rust ------------------------------------------------ - name: Install Rust toolchain uses: actions-rs/toolchain@v1 with: toolchain: stable profile: minimal override: true - name: Cache target/ uses: actions/cache@v1 with: path: target key: ${{ runner.os }}-cargo-build-target-${{ hashFiles('**/Cargo.lock') }} # ----------------------------------------------------- # integration test: async-std (chrono) - run: cargo test --no-default-features --features 'runtime-async-std postgres macros uuid chrono bigdecimal json ipnetwork tls' env: DATABASE_URL: postgres://postgres:postgres@localhost:${{ job.services.postgres.ports[5432] }}/postgres # integration test: async-std (time) - run: cargo test --no-default-features --features 'runtime-async-std postgres macros uuid time bigdecimal json ipnetwork tls' env: DATABASE_URL: postgres://postgres:postgres@localhost:${{ job.services.postgres.ports[5432] }}/postgres # integration test: async-std (time + chrono) - run: cargo test --no-default-features --features 'runtime-async-std postgres macros uuid chrono time bigdecimal json ipnetwork tls' env: DATABASE_URL: postgres://postgres:postgres@localhost:${{ job.services.postgres.ports[5432] }}/postgres # integration test: tokio (chrono) - run: cargo test --no-default-features --features 'runtime-tokio postgres macros uuid chrono bigdecimal json ipnetwork tls' env: DATABASE_URL: postgres://postgres:postgres@localhost:${{ job.services.postgres.ports[5432] }}/postgres # integration test: tokio (time) - run: cargo test --no-default-features --features 'runtime-tokio postgres macros uuid time bigdecimal json ipnetwork tls' env: DATABASE_URL: postgres://postgres:postgres@localhost:${{ job.services.postgres.ports[5432] }}/postgres # integration test: tokio (time + chrono) - run: cargo test --no-default-features --features 'runtime-tokio postgres macros uuid chrono time bigdecimal json ipnetwork tls' env: DATABASE_URL: postgres://postgres:postgres@localhost:${{ job.services.postgres.ports[5432] }}/postgres # UI feature gate tests: async-std - run: cargo test --no-default-features --features 'runtime-async-std postgres macros bigdecimal json ipnetwork tls' env: DATABASE_URL: postgres://postgres:postgres@localhost:${{ job.services.postgres.ports[5432] }}/postgres # UI feature gate tests: tokio - run: cargo test --no-default-features --features 'runtime-tokio postgres macros bigdecimal json ipnetwork tls' env: DATABASE_URL: postgres://postgres:postgres@localhost:${{ job.services.postgres.ports[5432] }}/postgres mysql: needs: build runs-on: ubuntu-latest strategy: matrix: mysql: [5.7.28, 8.0.18] services: mysql: image: mysql:${{ matrix.mysql }} env: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: sqlx ports: # will assign a random free host port - 3306/tcp # needed because the container does not provide a healthcheck options: >- --health-cmd "mysqladmin ping --silent" --health-interval 30s --health-timeout 30s --health-retries 10 -v /data/mysql:/var/lib/mysql steps: - uses: actions/checkout@v1 # Rust ------------------------------------------------ - name: Install Rust toolchain uses: actions-rs/toolchain@v1 with: toolchain: stable profile: minimal override: true - name: Cache target/ uses: actions/cache@v1 with: path: target key: ${{ runner.os }}-cargo-build-target-${{ hashFiles('**/Cargo.lock') }} # ----------------------------------------------------- # integration test: async-std (chrono) - run: cargo test --no-default-features --features 'runtime-async-std mysql macros uuid chrono tls bigdecimal' env: # pass the path to the CA that the MySQL service generated # NOTE: Github Actions' YML parser doesn't handle multiline strings correctly DATABASE_URL: mysql://root:password@localhost:${{ job.services.mysql.ports[3306] }}/sqlx?ssl-mode=VERIFY_CA&ssl-ca=%2Fdata%2Fmysql%2Fca.pem # integration test: async-std (time) - run: cargo test --no-default-features --features 'runtime-async-std mysql macros uuid time tls bigdecimal' env: # pass the path to the CA that the MySQL service generated # NOTE: Github Actions' YML parser doesn't handle multiline strings correctly DATABASE_URL: mysql://root:password@localhost:${{ job.services.mysql.ports[3306] }}/sqlx?ssl-mode=VERIFY_CA&ssl-ca=%2Fdata%2Fmysql%2Fca.pem # integration test: async-std (time + chrono) - run: cargo test --no-default-features --features 'runtime-async-std mysql macros uuid time chrono tls bigdecimal' env: # pass the path to the CA that the MySQL service generated # NOTE: Github Actions' YML parser doesn't handle multiline strings correctly DATABASE_URL: mysql://root:password@localhost:${{ job.services.mysql.ports[3306] }}/sqlx?ssl-mode=VERIFY_CA&ssl-ca=%2Fdata%2Fmysql%2Fca.pem # integration test: tokio (chrono) - run: cargo test --no-default-features --features 'runtime-tokio mysql macros uuid chrono tls bigdecimal' env: # pass the path to the CA that the MySQL service generated # NOTE: Github Actions' YML parser doesn't handle multiline strings correctly DATABASE_URL: mysql://root:password@localhost:${{ job.services.mysql.ports[3306] }}/sqlx?ssl-mode=VERIFY_CA&ssl-ca=%2Fdata%2Fmysql%2Fca.pem # integration test: tokio (time) - run: cargo test --no-default-features --features 'runtime-tokio mysql macros uuid time tls bigdecimal' env: # pass the path to the CA that the MySQL service generated # NOTE: Github Actions' YML parser doesn't handle multiline strings correctly DATABASE_URL: mysql://root:password@localhost:${{ job.services.mysql.ports[3306] }}/sqlx?ssl-mode=VERIFY_CA&ssl-ca=%2Fdata%2Fmysql%2Fca.pem # integration test: tokio (time + chrono) - run: cargo test --no-default-features --features 'runtime-tokio mysql macros uuid chrono time tls bigdecimal' env: # pass the path to the CA that the MySQL service generated # NOTE: Github Actions' YML parser doesn't handle multiline strings correctly DATABASE_URL: mysql://root:password@localhost:${{ job.services.mysql.ports[3306] }}/sqlx?ssl-mode=VERIFY_CA&ssl-ca=%2Fdata%2Fmysql%2Fca.pem # UI feature gate tests: async-std - run: cargo test --no-default-features --features 'runtime-async-std mysql macros tls bigdecimal' --test ui-tests env: # pass the path to the CA that the MySQL service generated # NOTE: Github Actions' YML parser doesn't handle multiline strings correctly DATABASE_URL: mysql://root:password@localhost:${{ job.services.mysql.ports[3306] }}/sqlx?ssl-mode=VERIFY_CA&ssl-ca=%2Fdata%2Fmysql%2Fca.pem # UI feature gate tests: tokio - run: cargo test --no-default-features --features 'runtime-tokio mysql macros tls bigdecimal' --test ui-tests env: # pass the path to the CA that the MySQL service generated # NOTE: Github Actions' YML parser doesn't handle multiline strings correctly DATABASE_URL: mysql://root:password@localhost:${{ job.services.mysql.ports[3306] }}/sqlx?ssl-mode=VERIFY_CA&ssl-ca=%2Fdata%2Fmysql%2Fca.pem mariadb: needs: build runs-on: ubuntu-latest strategy: matrix: mariadb: [10.1.43, 10.4.11] services: mariadb: image: mariadb:${{ matrix.mariadb }} env: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: sqlx ports: # will assign a random free host port - 3306/tcp # needed because the container does not provide a healthcheck options: --health-cmd "mysqladmin ping --silent" --health-interval 30s --health-timeout 30s --health-retries 10 steps: - uses: actions/checkout@v1 # Rust ------------------------------------------------ - name: Install Rust toolchain uses: actions-rs/toolchain@v1 with: toolchain: stable profile: minimal override: true - name: Cache target/ uses: actions/cache@v1 with: path: target key: ${{ runner.os }}-cargo-build-target-${{ hashFiles('**/Cargo.lock') }} # ----------------------------------------------------- # integration test: async-std (chrono) - run: cargo test --no-default-features --features 'runtime-async-std mysql macros chrono uuid chrono tls' env: DATABASE_URL: mariadb://root:password@localhost:${{ job.services.mariadb.ports[3306] }}/sqlx # integration test: async-std (time) - run: cargo test --no-default-features --features 'runtime-async-std mysql macros time uuid chrono tls' env: DATABASE_URL: mariadb://root:password@localhost:${{ job.services.mariadb.ports[3306] }}/sqlx # integration test: async-std (time + chrono) - run: cargo test --no-default-features --features 'runtime-async-std mysql macros time chrono uuid chrono tls' env: DATABASE_URL: mariadb://root:password@localhost:${{ job.services.mariadb.ports[3306] }}/sqlx # integration test: tokio (chrono) - run: cargo test --no-default-features --features 'runtime-tokio mysql macros uuid chrono tls' env: DATABASE_URL: mariadb://root:password@localhost:${{ job.services.mariadb.ports[3306] }}/sqlx # integration test: tokio (time) - run: cargo test --no-default-features --features 'runtime-tokio mysql macros uuid time tls' env: DATABASE_URL: mariadb://root:password@localhost:${{ job.services.mariadb.ports[3306] }}/sqlx # integration test: tokio (time + chrono) - run: cargo test --no-default-features --features 'runtime-tokio mysql macros uuid time chrono tls' env: DATABASE_URL: mariadb://root:password@localhost:${{ job.services.mariadb.ports[3306] }}/sqlx # UI feature gate tests: async-std - run: cargo test --no-default-features --features 'runtime-async-std mysql macros tls' env: DATABASE_URL: mariadb://root:password@localhost:${{ job.services.mariadb.ports[3306] }}/sqlx # UI feature gate tests: tokio - run: cargo test --no-default-features --features 'runtime-tokio mysql macros tls' env: DATABASE_URL: mariadb://root:password@localhost:${{ job.services.mariadb.ports[3306] }}/sqlx