使用CCACHE优化Flutter iOS构建
#github #cicd #flutter #ios

问题

我一直在使用firebase依赖性进行颤动。 (云存储,云存储,cloud_function等...)

构建时间一直很痛苦。在我本地的机器(MacBook Pro 16英寸带有32GB RAM,Intel)上,需要10分钟才能进行干净的版本。重建2-5分钟。(缓慢,但也许不错。

当我从CI/CD的github动作中运行构建时,它需要将近一个小时的时间没有缓存。不仅耗时,而且还要$$$$(Macos Runner每分钟$ 0.08 * 60 = 4.8 $构建)

两年前,为了解决这个问题,我找到了这个问题并应用了:https://github.com/invertase/firestore-ios-sdk-frameworks
这有助于节省40分钟的CI/CD,但更新相关的依赖性总是很痛苦。由于我已修复了iOS SDK版本,因此当它与Flutter的Firebase依赖关系匹配时,它很容易引入回归或构建失败。

目前,预编译的SDK无法与最新的Flutter Firebase库一起使用:https://github.com/firebase/flutterfire/issues/9761
因此,在GitHub Action中构建我的项目需要一个小时。我不能忍受!

解决方案:ccache!

经过一些研究,我从React Native Doc中发现了有关iOS构建的缓存:https://reactnative.dev/docs/build-speed#use-a-compiler-cache
我立即以为我也可以将其应用于我的Flutter Project。

这是简单的步骤完成的。

对于本地机器(与React Native Doc相同)

  1. 安装ccache brew install ccache
  2. 添加symlinks

    ln -s ccache /usr/local/bin/gcc
    ln -s ccache /usr/local/bin/g++
    ln -s ccache /usr/local/bin/cc
    ln -s ccache /usr/local/bin/c++
    ln -s ccache /usr/local/bin/clang
    ln -s ccache /usr/local/bin/clang++
    
  3. 确保已使用

    $ which gcc
    /usr/local/bin/gcc
    

    如果它不显示/usr/local/bin/gcc,请确保在.profile.bashrc.zshrc中调整$路径。

  4. 更新podfile

    post_install do |installer|
        react_native_post_install(installer)
    
        # ...possibly other post_install items here
    
        installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            # Using the un-qualified names means you can swap in different implementations, for example ccache
            config.build_settings["CC"] = "clang"
            config.build_settings["LD"] = "clang"
            config.build_settings["CXX"] = "clang++"
            config.build_settings["LDPLUSPLUS"] = "clang++"
        end
        end
    
        __apply_Xcode_12_5_M1_post_install_workaround(installer)
    end
    
  5. 在构建之前导出CCACHE配置

    export CCACHE_SLOPPINESS=clang_index_store,file_stat_matches,include_file_ctime,include_file_mtime,ivfsoverlay,pch_defines,modules,system_headers,time_macros
    export CCACHE_FILECLONE=true
    export CCACHE_DEPEND=true
    export CCACHE_INODECACHE=true
    
  6. 测试您的构建:flutter build ios

    由于尚未生成缓存,因此第一个构建仍然很慢。

  7. 检查是否创建了缓存。

    $ ccache -s
    Summary:
    Hits:             196 /  3068 (6.39 %)
        Direct:           0 /  3068 (0.00 %)
        Preprocessed:   196 /  3068 (6.39 %)
    Misses:          2872
        Direct:        3068
        Preprocessed:  2872
    Uncacheable:        1
    Primary storage:
    Hits:             196 /  6136 (3.19 %)
    Misses:          5940
    Cache size (GB): 0.60 / 20.00 (3.00 %)
    
  8. 重新运行构建:flutter build ios

现在,在本地机器上,构建时间应该更快。

对于github动作

与本地机器相同的步骤。我们需要使用ccache-action轻松安装CCACHE,并让其自动存储和还原缓存:https://github.com/hendrikmuhs/ccache-action

  1. 将此添加到工作流文件

      - name: Install Ccache
        uses: hendrikmuhs/ccache-action@v1.2
        with:
          max-size: 5G
    

    默认情况下,最大高速缓存尺寸为500m,但对于我的项目来说太小了。使用默认设置,它没有达到缓存,因此我必须将其增加到5G。

  2. 更新构建命令

      - name: Build flutter app
        run: |
          export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"
          export CCACHE_SLOPPINESS=clang_index_store,file_stat_matches,include_file_ctime,include_file_mtime,ivfsoverlay,pch_defines,modules,system_headers,time_macros
          export CCACHE_FILECLONE=true
          export CCACHE_DEPEND=true
          export CCACHE_INODECACHE=true
          ccache -s
          flutter build ipa --export-options-plist=ios/exportOptions.plist --release
    

像本地机器一样,第一个构建仍然很慢,但是从第二个构建中,您会看到它更快的速度。

您可以检查缓存命中的操作。
Post ccache

这样,我就可以在不使用预编译的Firestore SDK的情况下达到几乎相同的构建时间(约20分钟)。