GitHub Actions缓存构建后测试仍重新编译应用的问题求助
Swift CI缓存后
swift test重复编译的问题排查与解决 问题本质
swift build默认仅构建主程序目标,而swift test会自动构建主程序+测试目标,当前缓存仅包含主程序编译产物,测试目标无缓存可用,触发全量编译。- 缓存命中时跳过
swift build,但swift test检测到测试目标未编译,会从头构建所有内容。 - GitHub Actions缓存的文件可能存在权限异常,Swift Package Manager误判文件需要重新编译。
解决方案
1. 扩展缓存覆盖范围
修改缓存key,包含测试代码文件的哈希,确保测试目标的产物也被缓存:
- name: Load Swift Build cache uses: actions/cache@v3 id: cached-build with: path: .build key: swift-${{ runner.os }}-${{ env.SWIFT_VERSION }}-${{ hashFiles('**/Package.resolved', 'Sources/**/*.swift', 'Tests/**/*.swift') }} restore-keys: | swift-${{ runner.os }}-${{ env.SWIFT_VERSION }}- swift-${{ runner.os }}- swift-
2. 预构建测试目标
用swift build --build-tests同时构建主程序和测试目标,确保缓存包含测试所需的所有产物:
- name: Build Application and Tests run: swift build --build-tests # 无需判断缓存命中,Swift会自动跳过已编译的目标
3. 测试时跳过构建
确认缓存完整的情况下,直接用--skip-build跳过构建步骤,仅运行测试:
- name: Run tests run: | if [ "${{ steps.cached-build.outputs.cache-hit }}" == "true" ]; then swift test --skip-build else swift test fi
4. 修复缓存文件权限
缓存恢复后修复文件权限,避免Swift误判:
- name: Fix .build permissions if: steps.cached-build.outputs.cache-hit == 'true' run: chmod -R u+w .build
完整优化后的工作流片段
- name: Set up Swift ${{ env.SWIFT_VERSION }} uses: fwal/setup-swift@v1 with: swift-version: ${{ env.SWIFT_VERSION }} - name: Load Swift Build cache uses: actions/cache@v3 id: cached-build with: path: .build key: swift-${{ runner.os }}-${{ env.SWIFT_VERSION }}-${{ hashFiles('**/Package.resolved', 'Sources/**/*.swift', 'Tests/**/*.swift') }} restore-keys: | swift-${{ runner.os }}-${{ env.SWIFT_VERSION }}- swift-${{ runner.os }}- swift- - name: Fix .build permissions (if cached) if: steps.cached-build.outputs.cache-hit == 'true' run: chmod -R u+w .build - name: Build Application and Tests run: swift build --build-tests - name: Run tests run: swift test --skip-build
内容的提问来源于stack exchange,提问作者colin
相关产品推荐
相关产品推荐

