lede icon indicating copy to clipboard operation
lede copied to clipboard

使用github actions cache缓存工具链, 加速你的云编译项目,让你做更快的男人

Open stupidloud opened this issue 3 years ago • 104 comments

壁画不多直接上效果,最短25分钟完成 简单原理就是, github给actions提供了5gb的高速缓存空间, 使用这个空间缓存工具链的编译进度, 可以节省掉不必要的40多分钟耗时。

食用方法:(参考pr) 在你的openwrt-ci.yml actions/checkout段尾部加入

          fetch-depth: 0

(因为工具使用了tools和toolchain的commit id决定是否更新缓存,所以需要全量拉取代码)

随后添加工具调用,即可

      - name: cache
        uses: klever1988/cachewrtbuild@main

第一次编译不会有变化,因为你的仓库还没有缓存,随后的编译作业就会从你仓库拉去第一次编译生成的缓存,跳过无意义的工具链编译时间。 可用参数和默认值:

      - name: cache
        uses: klever1988/cachewrtbuild@main
        with:
          #是否一并缓存.ccache目录,如果你启用了ccache。这是唯一的常用参数,其他三个用于除错,一般不需要调整
          ccache: false

          #是否缓存工具链目录
          toolchain: true

          #是否跳过工具链编译
          skip: true

          #清空缓存
          clean: false

建议在make menuconfig或者

echo -e 'CONFIG_DEVEL=y\nCONFIG_CCACHE=y' >> .config; make defconfig

开启ccache获得进一步的加速时间。

使用P3TERX/Actions-OpenWrt编译的筒子们,因为你们yml的checkout段并不是检出openwrt源代码,而是检出你们的编译脚本。所以应该把uses段放在真正的clone openwrt源码代码段之后,并且用prefix参数声明openwrt源码路径,比如

    - name: Clone source code
      working-directory: /workdir
      run: |
        df -hT $PWD
        git clone $REPO_URL -b $REPO_BRANCH openwrt
        ln -sf /workdir/openwrt $GITHUB_WORKSPACE/openwrt
    - name: Cache
      uses: klever1988/cachewrtbuild@main
      with:
        ccache: 'true'
        prefix: ${{ github.workspace }}/openwrt

stupidloud avatar Sep 02 '21 01:09 stupidloud

Unexpected value 'ccache: 'true' image

smallprogram avatar Sep 02 '21 02:09 smallprogram

Unexpected value 'ccache: 'true'

😢 with 加了 | 改好了

stupidloud avatar Sep 02 '21 02:09 stupidloud

Google Chrome-add Cache Toolchain · deplivesOpenWrt-CI@3e44766-20210902140011 Code-Build-OpenWrt yml — OpenWrt-CI-20210902140254

bob-zebedy avatar Sep 02 '21 06:09 bob-zebedy

跟楼上一样的报错

xcf13363175 avatar Sep 02 '21 06:09 xcf13363175

https://github.com/smallprogram/OpenWrtAction/blob/main/.github/workflows/build-openwrt_X64.yml
@deplives @xcf13363175 参考我这个,经过 @klever1988 调整过的 ,没毛病。

smallprogram avatar Sep 02 '21 06:09 smallprogram

@smallprogram 使用你的这个出现这个错误,如何修复。 Clone source code

Run df -hT $PWD Filesystem Type Size Used Avail Use% Mounted on /dev/root ext4 84G 29G 55G 35% / fatal: destination path '.' already exists and is not an empty directory. Error: Process completed with exit code 128.

jarod360 avatar Sep 02 '21 07:09 jarod360

尴尬,又是和楼上一样。

xcf13363175 avatar Sep 02 '21 07:09 xcf13363175

也许可以写个触发,这样大版本更新的时候可以重新缓存保险一点?

ZeaKyX avatar Sep 02 '21 07:09 ZeaKyX

@jarod360 我在你的repositories里转了一圈也没找着,不行你fork我的,改config文件夹里的x64.config文件,改成你自己的,然后跑Action编译把。你这个报错之前都已经解决了。 @xcf13363175

smallprogram avatar Sep 02 '21 07:09 smallprogram

@smallprogram fork后可以通过。

xcf13363175 avatar Sep 02 '21 08:09 xcf13363175

也许可以写个触发,这样大版本更新的时候可以重新缓存保险一点?

支持。

dpy013 avatar Sep 02 '21 08:09 dpy013

也许可以写个触发,这样大版本更新的时候可以重新缓存保险一点?

有 fetch-depth: 0就行

smallprogram avatar Sep 02 '21 08:09 smallprogram

也许可以写个触发,这样大版本更新的时候可以重新缓存保险一点?

有 fetch-depth: 0就行

才看懂,谢谢指示

ZeaKyX avatar Sep 02 '21 09:09 ZeaKyX

疑问:如果有缓存的话,会不会导致源码更新却没同步到action呢?

Cathgao avatar Sep 02 '21 09:09 Cathgao

使用p3terx大佬编译脚本的要改一下 main改成test分支 uses: klever1988/cachewrtbuild@main with: ccache: 'true' prefix: ${{ github.workspace }}/openwrt

并且应该放置到你clone openwrt源码之后 不是checkout

stupidloud avatar Sep 02 '21 09:09 stupidloud

@klever1988 大佬按您说的改了,出现这个报错。Error: ENOENT: no such file or directory, chdir '/home/runner/work/Redmi_AX6/Redmi_AX6' -> '/openwrt' 详见https://github.com/jarod360/Redmi_AX6/runs/3494622549?check_suite_focus=true

jarod360 avatar Sep 02 '21 10:09 jarod360

@jarod360

prefix: '/workdir/openwrt'

stupidloud avatar Sep 02 '21 10:09 stupidloud

@klever1988 改了prefix: '/workdir/openwrt' Error: ENOENT: no such file or directory, chdir '/home/runner/work/OpenWrtAction/OpenWrtAction' -> '/workdir/openwrt' 还是报错

xcf13363175 avatar Sep 02 '21 11:09 xcf13363175

疑问:如果有缓存的话,会不会导致源码更新却没同步到action呢?

不会的,只是缓存了工具链的编译目录和二进制文件而已,kernel和package每次都会重新编译 而且工具链的源码如果有更新,也是会再次编译,刷新缓存,因为缓存记录了工具链源码的commit id

stupidloud avatar Sep 02 '21 16:09 stupidloud

使用p3terx大佬编译脚本的要改一下 main改成test分支 uses: klever1988/cachewrtbuild@test with: ccache: 'true' prefix: ${{ github.workspace }}/openwrt

并且应该放置到你clone openwrt源码之后 不是checkout

这个对使用P3TERX/Actions-OpenWrt脚本在线编译的用户是有效的 我开了2个脚本 测试下用脚本前后的差异 看看快了多少

ghost avatar Sep 03 '21 05:09 ghost

image P3TERX/Actions-OpenWrt脚本 进行编译,测试的确快了不少。

ababwbq avatar Sep 03 '21 06:09 ababwbq

@klever1988 大佬你好,我使用的P3TERX/Actions-OpenWrt编译,在clone openwrt源码代码段之后加入了 - name: Cache uses: klever1988/cachewrtbuild@test with: ccache: 'true' prefix: ${{ github.workspace }}/openwrt

请问还需要在actions/checkout段尾部加入fetch-depth: 0吗? 另外Download package代码段里是否还要修改成echo -e 'CONFIG_DEVEL=y\nCONFIG_CCACHE=y' >> .config; make defconfig 谢谢

felixxiao99 avatar Sep 03 '21 07:09 felixxiao99

@klever1988 大佬你好,我使用的P3TERX/Actions-OpenWrt编译,在clone openwrt源码代码段之后加入了

  • name: Cache uses: klever1988/cachewrtbuild@test with: ccache: 'true' prefix: ${{ github.workspace }}/openwrt

请问还需要在actions/checkout段尾部加入fetch-depth: 0吗? 另外Download package代码段里是否还要修改成echo -e 'CONFIG_DEVEL=y\nCONFIG_CCACHE=y' >> .config; make defconfig 谢谢

不要用test分支了,可以直接用main,klever1988/cachewrtbuild@main 用P3TERX的脚本编译不需要加fetch-depth CONFIG_CCACHE加不加都可以,加了编译速度更快,不过有时候编译出错可以去掉它,排除出错原因

stupidloud avatar Sep 03 '21 07:09 stupidloud

缓存必须要actions过程全通过了才有效,只能在第1次通过了以后再重新开始就能用缓存了。

解开多线程编译才是最有效的加速。

ghost avatar Sep 04 '21 04:09 ghost

缓存必须要actions过程全通过了才有效,只能在第1次通过了以后再重新开始就能用缓存了。

解开多线程编译才是最有效的加速。

make -jnproc 难道不是多线程编译了吗

stupidloud avatar Sep 04 '21 05:09 stupidloud

解开多线程编译才是最有效的加速。

actions (linux) 一共就给2个核,还能再多点?

EnnawYang avatar Sep 04 '21 06:09 EnnawYang

不是特别懂,请教个问题。这个缓存是每个workflow单独缓存的,还是所有workflow共享缓存的?我不同的workflow中编译机型的CPU架构不一样,不能共用toolchain。这种情况会有影响吗?

HiGarfield avatar Sep 04 '21 08:09 HiGarfield

不是特别懂,请教个问题。这个缓存是每个workflow单独缓存的,还是所有workflow共享缓存的?我不同的workflow中编译机型的CPU架构不一样,不能共用toolchain。这种情况会有影响吗?

GitHub 将删除 7 天内未被访问的任何缓存条目。 可以存储的缓存数没有限制,但存储库中所有缓存的总大小限制为 5 GB。 如果超过此限制,GitHub 将保存缓存,但会开始收回缓存,直到总大小小于 5 GB。 https://docs.github.com/cn/actions/guides/caching-dependencies-to-speed-up-workflows?query=cache#example-of-search-priority

EnnawYang avatar Sep 04 '21 08:09 EnnawYang

不是特别懂,请教个问题。这个缓存是每个workflow单独缓存的,还是所有workflow共享缓存的?我不同的workflow中编译机型的CPU架构不一样,不能共用toolchain。这种情况会有影响吗?

GitHub 将删除 7 天内未被访问的任何缓存条目。 可以存储的缓存数没有限制,但存储库中所有缓存的总大小限制为 5 GB。 如果超过此限制,GitHub 将保存缓存,但会开始收回缓存,直到总大小小于 5 GB。 https://docs.github.com/cn/actions/guides/caching-dependencies-to-speed-up-workflows?query=cache#example-of-search-priority

我的意思是,我同一个repo中,一个ci编译ath79,另一个ci编译ramips,这两个会共享工具链缓存吗?如果共享缓存的话,是有问题的。

HiGarfield avatar Sep 04 '21 09:09 HiGarfield

我的意思是,我同一个repo中,一个ci编译ath79,另一个ci编译ramips,这两个会共享工具链缓存吗?如果共享缓存的话,是有问题的。

https://github.com/actions/cache 好像是一个库共用5G缓存,新的缓存会替换掉旧的缓存(超出5G的情况下),但储存的数量不限制,这块不是很了解,还是问1988吧

EnnawYang avatar Sep 04 '21 09:09 EnnawYang