Actions: Share dependency cache between runners
diff --git a/.github/workflows/dart.yml b/.github/workflows/dart.yml index f2227b9..0237203 100644 --- a/.github/workflows/dart.yml +++ b/.github/workflows/dart.yml
@@ -2,7 +2,7 @@ on: push: - branches: [ main ] + branches: [ main, ci-improvements ] pull_request: schedule: # Make sure everything is still working by running the CI weekly. @@ -20,13 +20,31 @@ - uses: dart-lang/setup-dart@v1 with: sdk: ${{ matrix.dart-sdk }} - - uses: actions/cache@v4 + - name: "Setup local pub cache folder" + # Make pub cache folder consistent across OSes, so that we can share the cache. + run: "echo PUB_CACHE=.dart_tool/pub-cache/ >> $GITHUB_ENV" + shell: bash + # We need to update the cache whenever the pubspec.lock changes, as that + # indicates a changed dependency after `pub upgrade`. However, we can't + # include the pubspec.lock in the cache key as it's not part of the repository. + # So, we explicitly restore from and update to the cache as needed. + - uses: actions/cache/restore@v4 + id: restore with: path: | ${{ env.PUB_CACHE }} pubspec.lock - key: dart-tool-${{ matrix.dart-sdk }}-${{ hashFiles('pubspec.yaml') }} + key: dart-deps-${{ matrix.dart-sdk }}-${{ hashFiles('pubspec.yaml') }} + restore-keys: + dart-deps-${{ matrix.dart-sdk }} + dart-deps- + enableCrossOsArchive: true + - name: "Hash pubspec lockfiles before pub upgrade" + id: deps-before + run: | + echo "lockfiles=${{ hashFiles('**/pubspec.lock') }}" >> $GITHUB_OUTPUT + shell: bash - name: "Install dependencies" run: dart pub upgrade @@ -36,6 +54,16 @@ - name: "Analyze project" run: dart analyze --fatal-infos + - name: "Update cache due to changed pubspec.lock" + if: ${{ hashFiles('**/pubspec.lock') != steps.deps-before.outputs.lockfiles || !steps.restore.outputs.cache-hit }} + uses: actions/cache/save@v4 + with: + path: | + ${{ env.PUB_CACHE }} + pubspec.lock + key: dart-deps-${{ matrix.dart-sdk }}-${{ hashFiles('pubspec.yaml') }} + enableCrossOsArchive: true + test: strategy: matrix: @@ -46,17 +74,27 @@ needs: analyze steps: + - run: git config --global core.autocrlf false + if: runner.os == 'Windows' - uses: actions/checkout@v4 - uses: dart-lang/setup-dart@v1 with: sdk: ${{ matrix.dart-sdk }} - - uses: actions/cache@v4 + - name: "Setup local pub cache folder" + run: "echo PUB_CACHE=.dart_tool/pub-cache/ >> $GITHUB_ENV" + shell: bash + - uses: actions/cache/restore@v4 with: - path: ${{ env.PUB_CACHE }} - key: dart-tool-${{ matrix.dart-sdk }}-${{ hashFiles('pubspec.yaml') }} + path: | + ${{ env.PUB_CACHE }} + pubspec.lock + key: dart-deps-${{ matrix.dart-sdk }}-${{ hashFiles('pubspec.yaml') }} + # Should be created by analyze run + fail-on-cache-miss: true + enableCrossOsArchive: true - name: "Get dependencies" - run: dart pub get + run: dart pub get --offline - name: "Download 7za" run: dart run tool/download_7za.dart