fix(macros): smarter .env loading, caching, and invalidation
#2643
Workflow file for this run
This file contains hidden or 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: Examples | |
| on: | |
| pull_request: | |
| push: | |
| branches: | |
| - main | |
| - '*-dev' | |
| jobs: | |
| sqlx-cli: | |
| name: Build SQLx CLI | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 30 | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Setup Rust | |
| run: | | |
| rustup show active-toolchain || rustup toolchain install | |
| rustup override set stable | |
| - uses: Swatinem/rust-cache@v2 | |
| - run: > | |
| cargo build | |
| -p sqlx-cli | |
| --release | |
| --no-default-features | |
| --features mysql,postgres,sqlite,sqlx-toml | |
| - uses: actions/upload-artifact@v4 | |
| with: | |
| name: sqlx-cli | |
| path: | | |
| target/release/sqlx | |
| target/release/cargo-sqlx | |
| mysql: | |
| name: MySQL Examples | |
| runs-on: ubuntu-latest | |
| needs: sqlx-cli | |
| timeout-minutes: 30 | |
| strategy: | |
| matrix: | |
| offline: ['', 'offline'] | |
| services: | |
| mysql: | |
| image: mysql:latest | |
| env: | |
| MYSQL_ROOT_PASSWORD: password | |
| ports: | |
| - 3306:3306 | |
| steps: | |
| - name: Get SQLx-CLI | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: sqlx-cli | |
| # $HOME is interpreted differently by the shell | |
| path: /home/runner/.local/bin | |
| - run: | | |
| ls -R /home/runner/.local/bin | |
| chmod +x /home/runner/.local/bin/sqlx /home/runner/.local/bin/cargo-sqlx | |
| echo /home/runner/.local/bin >> $GITHUB_PATH | |
| sleep 10 | |
| - uses: actions/checkout@v4 | |
| - name: Setup Rust | |
| run: rustup show active-toolchain || rustup toolchain install | |
| - uses: Swatinem/rust-cache@v2 | |
| - name: Todos (Setup) | |
| working-directory: examples/mysql/todos | |
| env: | |
| DATABASE_URL: mysql://root:password@localhost:3306/todos?ssl-mode=disabled | |
| run: sqlx db setup | |
| - name: Todos (Prepare) | |
| if: ${{ matrix.offline }} | |
| working-directory: examples/mysql/todos | |
| env: | |
| DATABASE_URL: mysql://root:password@localhost:3306/todos?ssl-mode=disabled | |
| run: cargo sqlx prepare | |
| - name: Todos (Check Offline) | |
| if: ${{ matrix.offline }} | |
| run: | | |
| cargo clean -p sqlx-example-mysql-todos | |
| cargo check -p sqlx-example-mysql-todos | |
| - name: Todos (Prepare from .env) | |
| if: ${{ matrix.offline }} | |
| working-directory: examples/mysql/todos | |
| run: | | |
| echo "DATABASE_URL=mysql://root:password@localhost:3306/todos?ssl-mode=disabled" > .env | |
| cargo clean -p sqlx-example-mysql-todos | |
| cargo sqlx prepare | |
| rm .env | |
| - name: Todos (Run) | |
| env: | |
| DATABASE_URL: mysql://root:password@localhost:3306/todos?ssl-mode=disabled | |
| SQLX_OFFLINE: ${{ matrix.offline == 'offline' }} | |
| run: cargo run -p sqlx-example-mysql-todos | |
| postgres: | |
| name: PostgreSQL Examples | |
| runs-on: ubuntu-latest | |
| needs: sqlx-cli | |
| timeout-minutes: 30 | |
| strategy: | |
| matrix: | |
| offline: ['', 'offline'] | |
| services: | |
| postgres: | |
| image: postgres:latest | |
| env: | |
| POSTGRES_PASSWORD: password | |
| ports: | |
| - 5432:5432 | |
| steps: | |
| - name: Get SQLx-CLI | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: sqlx-cli | |
| path: /home/runner/.local/bin | |
| - run: | | |
| ls -R /home/runner/.local/bin | |
| chmod +x $HOME/.local/bin/sqlx | |
| chmod +x $HOME/.local/bin/cargo-sqlx | |
| echo $HOME/.local/bin >> $GITHUB_PATH | |
| sleep 10 | |
| - uses: actions/checkout@v4 | |
| - name: Setup Rust | |
| run: rustup show active-toolchain || rustup toolchain install | |
| - name: Axum Social with Tests (Setup) | |
| working-directory: examples/postgres/axum-social-with-tests | |
| env: | |
| DATABASE_URL: postgres://postgres:password@localhost:5432/axum-social | |
| run: sqlx db setup | |
| # Test `cargo sqlx prepare` setting `DATABASE_URL` both directly and in `.env` | |
| # This doesn't need to be done for every single example here, but should at least cover potential problem cases. | |
| - name: Axum Social with Tests (Prepare) | |
| if: ${{ matrix.offline }} | |
| env: | |
| DATABASE_URL: postgres://postgres:password@localhost:5432/axum-social | |
| run: cargo sqlx prepare -- -p sqlx-example-postgres-axum-social | |
| - name: Axum Social with Tests (Check Offline) | |
| if: ${{ matrix.offline }} | |
| run: | | |
| cargo clean -p sqlx-example-postgres-axum-social | |
| cargo check -p sqlx-example-postgres-axum-social | |
| - name: Axum Social with Tests (Prepare from .env) | |
| if: ${{ matrix.offline }} | |
| run: | | |
| echo "DATABASE_URL=postgres://postgres:password@localhost:5432/axum-social" > .env | |
| cargo clean -p sqlx-example-postgres-axum-social | |
| cargo sqlx prepare -- -p sqlx-example-postgres-axum-social | |
| rm .env | |
| - name: Axum Social with Tests (Test) | |
| env: | |
| DATABASE_URL: postgres://postgres:password@localhost:5432/axum-social | |
| SQLX_OFFLINE: ${{ matrix.offline == 'offline' }} | |
| run: cargo test -p sqlx-example-postgres-axum-social | |
| # The Chat example has an interactive TUI which is not trivial to test automatically, | |
| # so we only check that it compiles. | |
| - name: Chat (Check) | |
| run: cargo check -p sqlx-example-postgres-chat | |
| - name: Files (Setup) | |
| working-directory: examples/postgres/files | |
| env: | |
| DATABASE_URL: postgres://postgres:password@localhost:5432/files | |
| run: sqlx db setup | |
| - name: Files (Run) | |
| env: | |
| DATABASE_URL: postgres://postgres:password@localhost:5432/files | |
| run: cargo run -p sqlx-example-postgres-files | |
| - name: JSON (Setup) | |
| working-directory: examples/postgres/json | |
| env: | |
| DATABASE_URL: postgres://postgres:password@localhost:5432/json | |
| run: sqlx db setup | |
| - name: JSON (Run) | |
| env: | |
| DATABASE_URL: postgres://postgres:password@localhost:5432/json | |
| run: cargo run -p sqlx-example-postgres-json | |
| - name: Listen (Setup) | |
| working-directory: examples/postgres/listen | |
| env: | |
| DATABASE_URL: postgres://postgres:password@localhost:5432/listen | |
| run: sqlx db create | |
| - name: Listen (Run) | |
| env: | |
| DATABASE_URL: postgres://postgres:password@localhost:5432/listen | |
| run: cargo run -p sqlx-example-postgres-listen | |
| - name: Mockable TODOs (Setup) | |
| working-directory: examples/postgres/mockable-todos | |
| env: | |
| DATABASE_URL: postgres://postgres:password@localhost:5432/mockable-todos | |
| run: sqlx db setup | |
| - name: Mockable TODOs (Run) | |
| env: | |
| DATABASE_URL: postgres://postgres:password@localhost:5432/mockable-todos | |
| run: cargo run -p sqlx-example-postgres-mockable-todos | |
| - name: Multi-Database (Setup) | |
| working-directory: examples/postgres/multi-database | |
| env: | |
| DATABASE_URL: postgres://postgres:password@localhost:5432/multi-database | |
| ACCOUNTS_DATABASE_URL: postgres://postgres:password@localhost:5432/multi-database-accounts | |
| PAYMENTS_DATABASE_URL: postgres://postgres:password@localhost:5432/multi-database-payments | |
| run: | | |
| (cd accounts && sqlx db setup) | |
| (cd payments && sqlx db setup) | |
| sqlx db setup | |
| - name: Multi-Database (Prepare) | |
| if: ${{ matrix.offline }} | |
| env: | |
| DATABASE_URL: postgres://postgres:password@localhost:5432/multi-database | |
| ACCOUNTS_DATABASE_URL: postgres://postgres:password@localhost:5432/multi-database-accounts | |
| PAYMENTS_DATABASE_URL: postgres://postgres:password@localhost:5432/multi-database-payments | |
| run: | | |
| cargo clean -p sqlx-example-postgres-multi-database-accounts | |
| cargo clean -p sqlx-example-postgres-multi-database-payments | |
| cargo clean -p sqlx-example-postgres-multi-database | |
| # should include -accounts and -payments | |
| cargo sqlx prepare -- -p sqlx-example-postgres-multi-database | |
| - name: Multi-Database (Check Offline) | |
| if: ${{ matrix.offline }} | |
| run: | | |
| cargo clean -p sqlx-example-postgres-multi-database | |
| cargo check -p sqlx-example-postgres-multi-database | |
| - name: Multi-Database (Prepare from .env) | |
| if: ${{ matrix.offline }} | |
| run: | | |
| echo >.env <<EOF | |
| DATABASE_URL=postgres://postgres:password@localhost:5432/multi-database | |
| ACCOUNTS_DATABASE_URL=postgres://postgres:password@localhost:5432/multi-database-accounts | |
| PAYMENTS_DATABASE_URL=postgres://postgres:password@localhost:5432/multi-database-payments | |
| EOF | |
| cargo clean -p sqlx-example-postgres-multi-database-accounts | |
| cargo clean -p sqlx-example-postgres-multi-database-payments | |
| cargo clean -p sqlx-example-postgres-multi-database | |
| cargo sqlx prepare -- -p sqlx-example-postgres-multi-database | |
| rm .env | |
| - name: Multi-Database (Run) | |
| env: | |
| DATABASE_URL: postgres://postgres:password@localhost:5432/multi-database | |
| ACCOUNTS_DATABASE_URL: postgres://postgres:password@localhost:5432/multi-database-accounts | |
| PAYMENTS_DATABASE_URL: postgres://postgres:password@localhost:5432/multi-database-payments | |
| SQLX_OFFLINE: ${{ matrix.offline == 'offline' }} | |
| run: cargo run -p sqlx-example-postgres-multi-database | |
| - name: Multi-Tenant (Setup) | |
| working-directory: examples/postgres/multi-tenant | |
| env: | |
| DATABASE_URL: postgres://postgres:password@localhost:5432/multi-tenant | |
| run: | | |
| (cd accounts && sqlx db setup) | |
| (cd payments && sqlx migrate run) | |
| sqlx migrate run | |
| - name: Multi-Tenant (Prepare) | |
| if: ${{ matrix.offline }} | |
| env: | |
| DATABASE_URL: postgres://postgres:password@localhost:5432/multi-tenant | |
| run: | | |
| cargo sqlx clean -p sqlx-example-postgres-multi-tenant-accounts | |
| cargo sqlx clean -p sqlx-example-postgres-multi-tenant-payments | |
| cargo sqlx clean -p sqlx-example-postgres-multi-tenant | |
| # should include -accounts and -payments | |
| cargo sqlx prepare -- -p sqlx-example-postgres-multi-tenant | |
| - name: Multi-Tenant (Check Offline) | |
| if: ${{ matrix.offline }} | |
| run: cargo check -p sqlx-example-postgres-multi-tenant | |
| - name: Multi-Tenant (Prepare from .env) | |
| if: ${{ matrix.offline }} | |
| run: | | |
| echo "postgres://postgres:password@localhost:5432/multi-tenant" > .env | |
| cargo sqlx clean -p sqlx-example-postgres-multi-tenant-accounts | |
| cargo sqlx clean -p sqlx-example-postgres-multi-tenant-payments | |
| cargo sqlx clean -p sqlx-example-postgres-multi-tenant | |
| # should include -accounts and -payments | |
| cargo sqlx prepare -- -p sqlx-example-postgres-multi-tenant | |
| rm .env | |
| - name: Multi-Tenant (Run) | |
| env: | |
| DATABASE_URL: postgres://postgres:password@localhost:5432/multi-tenant | |
| SQLX_OFFLINE: ${{ matrix.offline == 'offline' }} | |
| run: cargo run -p sqlx-example-postgres-multi-tenant | |
| - name: Preferred-Crates (Setup) | |
| working-directory: examples/postgres/preferred-crates | |
| env: | |
| DATABASE_URL: postgres://postgres:password@localhost:5432/preferred-crates | |
| run: sqlx db setup | |
| - name: Preferred-Crates (Run) | |
| env: | |
| DATABASE_URL: postgres://postgres:password@localhost:5432/preferred-crates | |
| run: cargo run -p sqlx-example-postgres-preferred-crates | |
| - name: TODOs (Setup) | |
| working-directory: examples/postgres/todos | |
| env: | |
| DATABASE_URL: postgres://postgres:password@localhost:5432/todos | |
| run: sqlx db setup | |
| - name: TODOs (Run) | |
| env: | |
| DATABASE_URL: postgres://postgres:password@localhost:5432/todos | |
| # TODO: test full CLI | |
| run: cargo run -p sqlx-example-postgres-todos | |
| - name: Transaction (Setup) | |
| working-directory: examples/postgres/transaction | |
| env: | |
| DATABASE_URL: postgres://postgres:password@localhost:5432/txn | |
| run: sqlx db setup | |
| - name: Transaction (Run) | |
| env: | |
| DATABASE_URL: postgres://postgres:password@localhost:5432/txn | |
| run: cargo run -p sqlx-example-postgres-transaction | |
| sqlite: | |
| name: SQLite Examples | |
| runs-on: ubuntu-latest | |
| needs: sqlx-cli | |
| timeout-minutes: 30 | |
| steps: | |
| - name: Get SQLx-CLI | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: sqlx-cli | |
| path: /home/runner/.local/bin | |
| - run: | | |
| ls -R /home/runner/.local/bin | |
| chmod +x /home/runner/.local/bin/sqlx | |
| echo /home/runner/.local/bin >> $GITHUB_PATH | |
| - uses: actions/checkout@v4 | |
| - name: Setup Rust | |
| run: rustup show active-toolchain || rustup toolchain install | |
| - uses: Swatinem/rust-cache@v2 | |
| - name: TODOs (Setup) | |
| env: | |
| DATABASE_URL: sqlite://todos.sqlite | |
| run: sqlx db setup --source=examples/sqlite/todos/migrations | |
| - name: TODOs (Run) | |
| env: | |
| DATABASE_URL: sqlite://todos.sqlite | |
| run: cargo run -p sqlx-example-sqlite-todos |