GitHub Workflow搭配Fastlane与Flutter时缓存路径配置问题求助
CICD缓存路径问题修复方案
核心问题根因
你的工作流配置存在4个路径相关的逻辑错误,直接导致缓存命中后依赖找不到:
- Pods缓存路径不匹配:你配置的缓存路径是项目根目录下的
Pods,但pod install命令是在ios/子目录执行的,实际生成的依赖存储路径为ios/Pods,缓存动作根本没有抓取到正确的依赖文件,恢复缓存后自然找不到对应配置。 - Flutter环境未全局生效:你将Flutter安装步骤的触发条件设为缓存未命中,但
subosito/flutter-action除了安装Flutter之外,还负责将Flutter可执行文件路径加入系统PATH变量,缓存命中时这步直接跳过,后续Fastlane调用Flutter命令时就会提示找不到可执行文件。 flutter pub get执行逻辑缺失:当前配置只有Pods缓存未命中时才会执行flutter pub get,一旦Pods缓存命中,该步骤直接跳过,项目的Flutter依赖都未安装,也会导致后续构建失败。- Fastlane安装逻辑冲突:
ruby/setup-ruby已经开启了bundler-cache: true配置,会自动根据Gemfile安装依赖,你额外添加的Fastlane缓存和安装步骤属于多余配置,反而可能导致版本冲突。
路径查询方法
如果需要确认Fastlane执行时的实际路径,可以在你的Fastlane对应lane的开头添加如下代码,执行工作流后即可在日志中查看对应路径:
# 输出当前工作路径 UI.message("Fastlane当前工作路径: #{Dir.pwd}") # 输出Flutter可执行文件的调用路径 UI.message("Flutter可执行文件路径: #{`which flutter`.strip}")
修复后的完整Workflow配置
name: Deploy staging on: workflow_dispatch: inputs: lane: description: "Staging lane to use : alpha or beta" required: true default: "alpha" jobs: deploy-to-ios: runs-on: macos-latest timeout-minutes: 30 steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Flutter Cache id: cache-flutter uses: actions/cache@v3 with: path: /Users/runner/hostedtoolcache/flutter key: ${{ runner.os }}-flutter restore-keys: | ${{ runner.os }}-flutter- - name: Setup Flutter uses: subosito/flutter-action@v2 with: channel: "stable" # 新增缓存判断,命中时跳过安装 cache: ${{ steps.cache-flutter.outputs.cache-hit == 'true' }} - name: 执行flutter pub get(必走步骤,不管缓存是否命中) run: flutter pub get - name: Setup Pods Cache id: cache-pods uses: actions/cache@v3 with: # 修正为实际的Pods路径 path: ios/Pods key: ${{ runner.os }}-pods-${{ hashFiles('ios/Podfile.lock') }} restore-keys: | ${{ runner.os }}-pods- - name: Setup Pods if: steps.cache-pods.outputs.cache-hit != 'true' run: | cd ios/ pod install # Setup Ruby, Bundler, and Gemfile dependencies - name: Setup Ruby uses: ruby/setup-ruby@v1 with: ruby-version: "2.7.4" bundler-cache: true working-directory: ios - name: Build and deploy with Fastlane 🚀 run: bundle exec fastlane ${{ github.event.inputs.lane || 'beta' }} env: MATCH_GIT_BASIC_AUTHORIZATION: ${{ secrets.MATCH_GIT_BASIC_AUTHORIZATION }} MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} APP_STORE_CONNECT_API_KEY_KEY_ID: ${{ secrets.APP_STORE_CONNECT_API_KEY_KEY_ID }} APP_STORE_CONNECT_API_KEY_ISSUER_ID: ${{ secrets.APP_STORE_CONNECT_API_KEY_ISSUER_ID }} APP_STORE_CONNECT_API_KEY_KEY: ${{ secrets.APP_STORE_CONNECT_API_KEY_KEY }} working-directory: ios
内容的提问来源于stack exchange,提问作者Raphaël
相关产品推荐
相关产品推荐

