diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 1268c94b..247a2326 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -6,6 +6,10 @@ on: - main pull_request: +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + permissions: contents: read @@ -13,6 +17,7 @@ jobs: coverage: name: Generate Combined Coverage runs-on: ubuntu-latest + timeout-minutes: 30 steps: - uses: actions/checkout@v4 @@ -21,7 +26,8 @@ jobs: with: flutter-version: '3.x' channel: 'stable' - + cache: true + - name: Install dependencies run: | dart pub global activate melos diff --git a/.github/workflows/dart-package-test.yml b/.github/workflows/dart-package-test.yml new file mode 100644 index 00000000..c730351a --- /dev/null +++ b/.github/workflows/dart-package-test.yml @@ -0,0 +1,105 @@ +name: Dart Package Test (Reusable) + +on: + workflow_call: + inputs: + package-name: + required: true + type: string + description: 'The name of the package to test (e.g., gotrue, postgrest)' + working-directory: + required: true + type: string + description: 'The working directory for the package (e.g., packages/gotrue)' + needs-docker: + required: false + type: boolean + default: false + description: 'Whether this package needs Docker services to run tests' + docker-compose-dir: + required: false + type: string + description: 'The directory containing docker-compose.yml (e.g., infra/gotrue)' + test-concurrency: + required: false + type: number + default: 0 + description: 'Test concurrency level (0 means no flag, 1 means --concurrency=1)' + +jobs: + test: + name: Test SDK ${{ matrix.sdk }} + timeout-minutes: 20 + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest] + sdk: [stable, beta, dev] + + defaults: + run: + working-directory: ${{ inputs.working-directory }} + + runs-on: ${{ matrix.os }} + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup Dart + uses: dart-lang/setup-dart@v1 + with: + sdk: ${{ matrix.sdk }} + + - name: Cache pub dependencies + uses: actions/cache@v4 + with: + path: | + ${{ env.PUB_CACHE }} + ~/.pub-cache + key: ${{ runner.os }}-pub-${{ matrix.sdk }}-${{ hashFiles('**/pubspec.lock') }} + restore-keys: | + ${{ runner.os }}-pub-${{ matrix.sdk }}- + ${{ runner.os }}-pub- + + - name: Bootstrap workspace + run: | + cd ../../ + dart pub global activate melos + melos bootstrap --no-flutter + + - name: dartfmt + if: ${{ matrix.sdk == 'stable'}} + run: dart format lib test -l 80 --set-exit-if-changed + + - name: analyzer + run: | + if [ "${{ matrix.sdk }}" == "stable" ]; then + dart analyze --fatal-warnings . + else + dart analyze + fi + + - name: Start Docker services + if: ${{ inputs.needs-docker }} + run: | + cd ../../${{ inputs.docker-compose-dir }} + docker compose up -d + + - name: Wait for services to be ready + if: ${{ inputs.needs-docker }} + run: sleep 5 + + - name: Run tests + run: | + if [ "${{ inputs.test-concurrency }}" == "1" ]; then + dart test --concurrency=1 + else + dart test + fi + + - name: Stop Docker services + if: ${{ inputs.needs-docker && always() }} + run: | + cd ../../${{ inputs.docker-compose-dir }} + docker compose down diff --git a/.github/workflows/functions_client.yml b/.github/workflows/functions_client.yml index 8a26ce98..03d01918 100644 --- a/.github/workflows/functions_client.yml +++ b/.github/workflows/functions_client.yml @@ -7,59 +7,26 @@ on: paths: - 'packages/functions_client/**' - '.github/workflows/functions_client.yml' + - '.github/workflows/dart-package-test.yml' - 'packages/yet_another_json_isolate/**' pull_request: paths: - 'packages/functions_client/**' - '.github/workflows/functions_client.yml' + - '.github/workflows/dart-package-test.yml' - 'packages/yet_another_json_isolate/**' +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + permissions: contents: read jobs: test: - name: Test SDK ${{ matrix.sdk }} - - strategy: - fail-fast: false - matrix: - os: [ubuntu-latest] - sdk: [stable, beta, dev] - - defaults: - run: - working-directory: packages/functions_client - - runs-on: ${{ matrix.os }} - - steps: - - name: Checks-out repo - uses: actions/checkout@v4 - - - name: Setup Dart - uses: dart-lang/setup-dart@v1 - with: - sdk: ${{ matrix.sdk }} - - - name: Bootstrap workspace - run: | - cd ../../ - dart pub global activate melos - melos bootstrap --no-flutter - - - name: dartfmt - if: ${{ matrix.sdk == 'stable'}} - run: dart format lib test -l 80 --set-exit-if-changed - - - name: analyzer - if: ${{ matrix.sdk == 'stable'}} - run: dart analyze --fatal-warnings --fatal-infos . - - - name: analyzer - if: ${{ matrix.sdk == 'beta' || matrix.sdk == 'dev' }} - run: dart analyze - - - name: Run tests - run: dart test + uses: ./.github/workflows/dart-package-test.yml + with: + package-name: functions_client + working-directory: packages/functions_client diff --git a/.github/workflows/gotrue.yml b/.github/workflows/gotrue.yml index 0258a2bb..69c9e44d 100644 --- a/.github/workflows/gotrue.yml +++ b/.github/workflows/gotrue.yml @@ -7,67 +7,27 @@ on: paths: - 'packages/gotrue/**' - '.github/workflows/gotrue.yml' + - '.github/workflows/dart-package-test.yml' pull_request: paths: - 'packages/gotrue/**' - '.github/workflows/gotrue.yml' + - '.github/workflows/dart-package-test.yml' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true permissions: contents: read jobs: test: - name: Test SDK ${{ matrix.sdk }} - strategy: - fail-fast: false - matrix: - os: [ubuntu-latest] - sdk: [stable, beta, dev] - - defaults: - run: - working-directory: packages/gotrue - - runs-on: ${{ matrix.os }} - - steps: - - name: Checks-out repo - uses: actions/checkout@v4 - - - name: Setup Dart - uses: dart-lang/setup-dart@v1 - with: - sdk: ${{ matrix.sdk }} - - - name: Bootstrap workspace - run: | - cd ../../ - dart pub global activate melos - melos bootstrap --no-flutter - - - name: dartfmt - if: ${{ matrix.sdk == 'stable'}} - run: dart format lib test -l 80 --set-exit-if-changed - - - name: analyzer - if: ${{ matrix.sdk == 'stable'}} - run: dart analyze --fatal-warnings --fatal-infos . - - - name: analyzer - if: ${{ matrix.sdk == 'beta' || matrix.sdk == 'dev' }} - run: dart analyze - - - name: Build Docker image - run: | - cd ../../infra/gotrue - docker compose down - docker compose up -d - - - name: Sleep for 5 seconds - uses: jakejarvis/wait-action@master - with: - time: '5s' - - - name: Run tests - run: dart test --concurrency=1 + uses: ./.github/workflows/dart-package-test.yml + with: + package-name: gotrue + working-directory: packages/gotrue + needs-docker: true + docker-compose-dir: infra/gotrue + test-concurrency: 1 diff --git a/.github/workflows/postgrest.yml b/.github/workflows/postgrest.yml index 8fd1f155..45a798b2 100644 --- a/.github/workflows/postgrest.yml +++ b/.github/workflows/postgrest.yml @@ -7,69 +7,29 @@ on: paths: - 'packages/postgrest/**' - '.github/workflows/postgrest.yml' + - '.github/workflows/dart-package-test.yml' - 'packages/yet_another_json_isolate/**' pull_request: paths: - 'packages/postgrest/**' - '.github/workflows/postgrest.yml' + - '.github/workflows/dart-package-test.yml' - 'packages/yet_another_json_isolate/**' +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + permissions: contents: read jobs: test: - name: Test SDK ${{ matrix.sdk }} - strategy: - fail-fast: false - matrix: - os: [ubuntu-latest] - sdk: [stable, beta, dev] - - defaults: - run: - working-directory: packages/postgrest - - runs-on: ${{ matrix.os }} - - steps: - - name: Checks-out repo - uses: actions/checkout@v4 - - - name: Setup Dart - uses: dart-lang/setup-dart@v1 - with: - sdk: ${{ matrix.sdk }} - - - name: Bootstrap workspace - run: | - cd ../../ - dart pub global activate melos - melos bootstrap --no-flutter - - - name: dartfmt - if: ${{ matrix.sdk == 'stable'}} - run: dart format lib test -l 80 --set-exit-if-changed - - - name: analyzer - if: ${{ matrix.sdk == 'stable'}} - run: dart analyze --fatal-warnings --fatal-infos . - - - name: analyzer - if: ${{ matrix.sdk == 'beta' || matrix.sdk == 'dev' }} - run: dart analyze - - - name: Build Docker image - run: | - cd ../../infra/postgrest - docker compose down - docker compose up -d - - - name: Sleep for 5 seconds - uses: jakejarvis/wait-action@master - with: - time: '5s' - - - name: Run tests - run: dart test --concurrency=1 + uses: ./.github/workflows/dart-package-test.yml + with: + package-name: postgrest + working-directory: packages/postgrest + needs-docker: true + docker-compose-dir: infra/postgrest + test-concurrency: 1 diff --git a/.github/workflows/realtime_client.yml b/.github/workflows/realtime_client.yml index 144374b0..a3089ef0 100644 --- a/.github/workflows/realtime_client.yml +++ b/.github/workflows/realtime_client.yml @@ -7,56 +7,25 @@ on: paths: - 'packages/realtime_client/**' - '.github/workflows/realtime_client.yml' + - '.github/workflows/dart-package-test.yml' pull_request: paths: - 'packages/realtime_client/**' - '.github/workflows/realtime_client.yml' + - '.github/workflows/dart-package-test.yml' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true permissions: contents: read jobs: test: - name: Test SDK ${{ matrix.sdk }} - strategy: - fail-fast: false - matrix: - os: [ubuntu-latest] - sdk: [stable, beta, dev] - - defaults: - run: - working-directory: packages/realtime_client - - runs-on: ${{ matrix.os }} - - steps: - - name: Checks-out repo - uses: actions/checkout@v4 - - - name: Setup Dart - uses: dart-lang/setup-dart@v1 - with: - sdk: ${{ matrix.sdk }} - - - name: Bootstrap workspace - run: | - cd ../../ - dart pub global activate melos - melos bootstrap --no-flutter - - - name: dartfmt - if: ${{ matrix.sdk == 'stable'}} - run: dart format lib test -l 80 --set-exit-if-changed - - - name: analyzer - if: ${{ matrix.sdk == 'stable'}} - run: dart analyze --fatal-warnings --fatal-infos . - - - name: analyzer - if: ${{ matrix.sdk == 'beta' || matrix.sdk == 'dev' }} - run: dart analyze - - - name: Run tests - run: dart test --concurrency=1 + uses: ./.github/workflows/dart-package-test.yml + with: + package-name: realtime_client + working-directory: packages/realtime_client + test-concurrency: 1 diff --git a/.github/workflows/release-prepare.yml b/.github/workflows/release-prepare.yml index dc6004c8..c3714d7d 100644 --- a/.github/workflows/release-prepare.yml +++ b/.github/workflows/release-prepare.yml @@ -21,6 +21,7 @@ permissions: jobs: prepare-release: runs-on: ubuntu-latest + timeout-minutes: 15 steps: - name: Checkout uses: actions/checkout@v4 @@ -30,6 +31,8 @@ jobs: - name: Setup Flutter uses: subosito/flutter-action@v2 + with: + cache: true - name: Setup Melos uses: bluefireteam/melos-action@v3 diff --git a/.github/workflows/release-publish.yml b/.github/workflows/release-publish.yml index 2f4c5ff9..ce0fdd52 100644 --- a/.github/workflows/release-publish.yml +++ b/.github/workflows/release-publish.yml @@ -10,6 +10,7 @@ permissions: jobs: publish-packages: runs-on: ubuntu-latest + timeout-minutes: 20 steps: - name: Generate token id: app-token @@ -22,7 +23,9 @@ jobs: - name: Setup Flutter uses: subosito/flutter-action@v2 - + with: + cache: true + - name: Publish to pub.dev uses: bluefireteam/melos-action@v3 with: diff --git a/.github/workflows/release-tag.yml b/.github/workflows/release-tag.yml index 27adb97f..10791689 100644 --- a/.github/workflows/release-tag.yml +++ b/.github/workflows/release-tag.yml @@ -5,6 +5,10 @@ on: branches: - main +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: false + permissions: contents: write actions: write @@ -13,6 +17,7 @@ jobs: create-tags: if: ${{ contains(github.event.head_commit.message, 'chore(release):') }} runs-on: ubuntu-latest + timeout-minutes: 15 steps: - name: Generate token id: app-token @@ -27,6 +32,8 @@ jobs: - name: Setup Flutter uses: subosito/flutter-action@v2 + with: + cache: true - name: Setup Melos uses: bluefireteam/melos-action@v3 diff --git a/.github/workflows/storage_client.yml b/.github/workflows/storage_client.yml index 7b49fa04..b25a4f2b 100644 --- a/.github/workflows/storage_client.yml +++ b/.github/workflows/storage_client.yml @@ -7,66 +7,27 @@ on: paths: - 'packages/storage_client/**' - '.github/workflows/storage_client.yml' + - '.github/workflows/dart-package-test.yml' + pull_request: paths: - 'packages/storage_client/**' - '.github/workflows/storage_client.yml' + - '.github/workflows/dart-package-test.yml' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true permissions: contents: read jobs: test: - name: Test SDK ${{ matrix.sdk }} - strategy: - fail-fast: false - matrix: - os: [ubuntu-latest] - sdk: [stable, beta, dev] - - defaults: - run: - working-directory: packages/storage_client - - runs-on: ${{ matrix.os }} - - steps: - - name: Checks-out repo - uses: actions/checkout@v4 - - - name: Setup Dart - uses: dart-lang/setup-dart@v1 - with: - sdk: ${{ matrix.sdk }} - - - name: Bootstrap workspace - run: | - cd ../../ - dart pub global activate melos - melos bootstrap --no-flutter - - - name: dartfmt - if: ${{ matrix.sdk == 'stable'}} - run: dart format lib test -l 80 --set-exit-if-changed - - - name: analyzer - if: ${{ matrix.sdk == 'stable'}} - run: dart analyze --fatal-warnings --fatal-infos . - - - name: analyzer - if: ${{ matrix.sdk == 'beta' || matrix.sdk == 'dev' }} - run: dart analyze - - - name: Build Docker image - run: | - cd ../../infra/storage_client - docker compose down - docker compose up -d - - - name: Sleep for 5 seconds - uses: jakejarvis/wait-action@master - with: - time: '5s' - - - name: Run tests - run: dart test + uses: ./.github/workflows/dart-package-test.yml + with: + package-name: storage_client + working-directory: packages/storage_client + needs-docker: true + docker-compose-dir: infra/storage_client + test-concurrency: 1 diff --git a/.github/workflows/supabase.yml b/.github/workflows/supabase.yml index cb829516..7f853e0e 100644 --- a/.github/workflows/supabase.yml +++ b/.github/workflows/supabase.yml @@ -7,6 +7,7 @@ on: paths: - 'packages/supabase/**' - '.github/workflows/supabase.yml' + - '.github/workflows/dart-package-test.yml' - 'packages/functions_client/**' - 'packages/gotrue/**' - 'packages/postgrest/**' @@ -17,62 +18,24 @@ on: paths: - 'packages/supabase/**' - '.github/workflows/supabase.yml' + - '.github/workflows/dart-package-test.yml' - 'packages/functions_client/**' - 'packages/gotrue/**' - 'packages/postgrest/**' - 'packages/realtime_client/**' - 'packages/storage_client/**' +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + permissions: contents: read jobs: test: - name: Test SDK ${{ matrix.sdk }} - strategy: - fail-fast: false - matrix: - os: [ubuntu-latest] - sdk: [stable, beta, dev] - - defaults: - run: - working-directory: packages/supabase - - runs-on: ${{ matrix.os }} - - steps: - - name: Checks-out repo - uses: actions/checkout@v4 - - - name: Setup Dart - uses: dart-lang/setup-dart@v1 - with: - sdk: ${{ matrix.sdk }} - - - name: Bootstrap workspace - run: | - cd ../../ - dart pub global activate melos - melos bootstrap --no-flutter - - - name: dartfmt - if: ${{ matrix.sdk == 'stable'}} - run: dart format lib test -l 80 --set-exit-if-changed - - - name: analyzer - if: ${{ matrix.sdk == 'stable'}} - run: dart analyze --fatal-warnings --fatal-infos . - - - name: analyzer - if: ${{ matrix.sdk == 'beta' || matrix.sdk == 'dev' }} - run: dart analyze - - - name: Run tests - run: dart test --concurrency=1 - - - name: Build Dart web app - run: | - dart pub global activate webdev - cd example - webdev build + uses: ./.github/workflows/dart-package-test.yml + with: + package-name: supabase + working-directory: packages/supabase + test-concurrency: 1 diff --git a/.github/workflows/supabase_flutter.yml b/.github/workflows/supabase_flutter.yml index cd36b863..3160b947 100644 --- a/.github/workflows/supabase_flutter.yml +++ b/.github/workflows/supabase_flutter.yml @@ -27,12 +27,17 @@ on: - 'packages/supabase/**' - 'packages/yet_another_json_isolate/**' +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + permissions: contents: read jobs: test: name: Test Flutter v${{ matrix.flutter-version }} on ${{ matrix.os }} + timeout-minutes: 30 strategy: fail-fast: false matrix: @@ -54,6 +59,7 @@ jobs: with: flutter-version: ${{ matrix.flutter-version }} channel: 'stable' + cache: true - name: Show Flutter version run: flutter --version @@ -70,7 +76,7 @@ jobs: - name: Run analyzer if: ${{ matrix.flutter-version == '3.x'}} - run: flutter analyze --fatal-warnings --fatal-infos . + run: flutter analyze --fatal-warnings . - name: Run unit tests run: flutter test --concurrency=1 diff --git a/.github/workflows/title-validation.yml b/.github/workflows/title-validation.yml index b0eebcd5..2f322f47 100644 --- a/.github/workflows/title-validation.yml +++ b/.github/workflows/title-validation.yml @@ -8,6 +8,10 @@ on: - edited - synchronize +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + permissions: pull-requests: write contents: read @@ -16,6 +20,7 @@ jobs: main: name: Validate PR title runs-on: ubuntu-latest + timeout-minutes: 5 steps: - uses: amannn/action-semantic-pull-request@v6 env: diff --git a/.github/workflows/yet_another_json_isolate.yml b/.github/workflows/yet_another_json_isolate.yml index db562900..94e0b59f 100644 --- a/.github/workflows/yet_another_json_isolate.yml +++ b/.github/workflows/yet_another_json_isolate.yml @@ -7,56 +7,24 @@ on: paths: - 'packages/yet_another_json_isolate/**' - '.github/workflows/yet_another_json_isolate.yml' + - '.github/workflows/dart-package-test.yml' pull_request: paths: - 'packages/yet_another_json_isolate/**' - '.github/workflows/yet_another_json_isolate.yml' + - '.github/workflows/dart-package-test.yml' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true permissions: contents: read jobs: test: - name: Test SDK ${{ matrix.sdk }} - strategy: - fail-fast: false - matrix: - os: [ubuntu-latest] - sdk: [stable, beta, dev] - - defaults: - run: - working-directory: packages/yet_another_json_isolate - - runs-on: ${{ matrix.os }} - - steps: - - name: Checks-out repo - uses: actions/checkout@v4 - - - name: Setup Dart - uses: dart-lang/setup-dart@v1 - with: - sdk: ${{ matrix.sdk }} - - - name: Bootstrap workspace - run: | - cd ../../ - dart pub global activate melos - melos bootstrap --no-flutter - - - name: dartfmt - if: ${{ matrix.sdk == 'stable'}} - run: dart format lib test -l 80 --set-exit-if-changed - - - name: analyzer - if: ${{ matrix.sdk == 'stable'}} - run: dart analyze --fatal-warnings --fatal-infos . - - - name: analyzer - if: ${{ matrix.sdk == 'beta' || matrix.sdk == 'dev' }} - run: dart analyze - - - name: Run tests - run: dart test + uses: ./.github/workflows/dart-package-test.yml + with: + package-name: yet_another_json_isolate + working-directory: packages/yet_another_json_isolate diff --git a/melos.yaml b/melos.yaml index 2feb7757..c34bbf4e 100644 --- a/melos.yaml +++ b/melos.yaml @@ -27,11 +27,15 @@ scripts: description: Run all static analysis checks. analyze: - exec: dart analyze --fatal-warnings --fatal-infos . + exec: dart analyze --fatal-warnings . format: exec: dart format lib test -l 80 --set-exit-if-changed + test:coverage: + exec: dart test --coverage=coverage + description: Run tests with coverage for all packages + upgrade: exec: dart pub upgrade