openwrt-fastbuild-actions icon indicating copy to clipboard operation
openwrt-fastbuild-actions copied to clipboard

关于添加自定义安装包、patch及修改源代码的方法和已知问题

Open adaaaaaa opened this issue 5 years ago • 21 comments

  - name: 构建自定义文件结构
    run: |
      cd package
      mkdir openwrt-packages
      cd openwrt-packages
      git clone https://github.com/openwrt-develop/luci-theme-atmaterial.git
      git clone https://github.com/KFERMercer/luci-app-serverchan
      git clone https://github.com/rosywrt/luci-theme-rosy
      git clone https://github.com/apollo-ng/luci-theme-darkmatter
      git clone https://github.com/rosywrt/luci-theme-purple
      git clone https://github.com/rufengsuixing/luci-app-adguardhome.git

adaaaaaa avatar Dec 23 '19 02:12 adaaaaaa

修改upload_feeds https://github.com/tete1030/openwrt-fastbuild-actions/blob/master/scripts/update_feeds.sh

参见最后一行注释。 ~~注意,如果你添加的luci-包出现po2lmo: command not found问题,这是由于你添加的包缺少依赖设置,这可能是luci-app-普遍存在的共性问题,以后会考虑怎么解决更好,目前你需要在patches目录中添加一个patch文件,patch一行:“PKG_BUILD_DEPENDS += lua/host luci-base/host ”,参考我在"sample“分支patches目录中针对luci-app-mentohust的做法:~~

~~https://github.com/tete1030/openwrt-fastbuild-actions/blob/sample/patches/005-luci-app-mentohust-depends-luci.patch~~

tete1030 avatar Dec 23 '19 02:12 tete1030

哦豁,我是小白。。。你这个比@KFERMercer的要复杂一些哦。。。🤪🤪🤪

adaaaaaa avatar Dec 23 '19 02:12 adaaaaaa

本质上都有潜在可能性出现po2lmo的问题,只是我在update_feeds.sh里把所有安装包放在package/feeds目录。你原本的是放在package/openwrt-packages 目录,可能由于名称排序靠后,让你能避免那样的依赖关系错误。

你也不用patch了,直接吧update_feeds.sh的17和18行的package/feeds改成package/openwrt-packages吧

tete1030 avatar Dec 23 '19 03:12 tete1030

我已经把scripts/update_feeds.sh里用到的目录改成了以z为首字母的名字,似乎不再会出现po2lmo问题 https://github.com/tete1030/openwrt-fastbuild-actions/commit/0c80ea4a1eb50f91364b723702fd9df674d446a7#diff-33e6e534f25e4313d3473f89d1524e40

tete1030 avatar Dec 24 '19 04:12 tete1030

修改upload_feeds https://github.com/tete1030/openwrt-fastbuild-actions/blob/master/scripts/update_feeds.sh

参见最后一行注释。

  • https://github.com/RealKiro/build-openwrt/blob/master/before_build.sh 能帮我看看根据build-Actions该如何改吗? 一个是改 IP主题 等内部东西,一个是添加第三方插件(主要是smartinfo需要mv出来)

RealKiro avatar Dec 26 '19 07:12 RealKiro

修改upload_feeds https://github.com/tete1030/openwrt-fastbuild-actions/blob/master/scripts/update_feeds.sh 参见最后一行注释。

  • https://github.com/RealKiro/build-openwrt/blob/master/before_build.sh 能帮我看看根据build-Actions该如何改吗? 一个是改 IP主题 等内部东西,一个是添加第三方插件(主要是smartinfo需要mv出来)

所有的git clone可以用install_package代替,例如: git clone https://github.com/jerrykuku/luci-theme-argon.git package/mine/luci-theme-argon_new 改成 install_package luci-theme-argon_new https://github.com/jerrykuku/luci-theme-argon.git

所有的sed命令和mv命令,可以转化成patch放在patches目录

其他的: cd /home/runner/openwrt 以及 make defconfig 都可以删除

为什么要用patch而不允许自定义脚本直接sed和cp/mv

不同于其他项目,这个项目由于每次编译会重复利用先前的编译环境,下一次编译时存在多方面可能性会让自定义脚本的执行结果不可靠:

  1. 部分已修改的package可能会通过git pull被更新,已修改的文件可能被恢复回原状;新package会加入。这些会导致部分代码已修改,部分代码未修改
  2. 自定义脚本本身可能会更新

如果每次编译都会再次执行自定义脚本以确保你的自定义得到执行,代码可能会陷入混乱状态。

patch的好处是,已apply的patch可以不再被重复apply,可以做到相对的严格。(当然,如果你修改或删除patch,代码同样不再可靠,这时候你需要“re-create your building environment”)

tete1030 avatar Dec 26 '19 10:12 tete1030

所有的sed命令和mv命令,可以转化成patch放在patches目录

对于sedmvpatch该如何写?写在一个patch文件里还是分开写?

RealKiro avatar Dec 26 '19 10:12 RealKiro

如何将mv/cp命令转化成patch文件

举例 : cp或mv orig_folder/myfile.txt new_folder/myfile.txt 注意这里new_folder/myfile.txt是相对于openwrt源码根目录而言的 myfile.txt内容:

abc
123
  1. diff -uN a_fake_file_name orig_folder/myfile.txt > 001-myfile.patch
  2. 这时候得到的001-myfile.patch内容为:
--- a_fake_file_name	1970-01-01 08:00:00.000000000 +0800
+++ orig_folder/myfile.txt 	2019-12-26 18:33:22.000000000 +0800
@@ -0,0 +1,3 @@
+abc
+123
+
  1. 将内容第一行中的“file_does_not_exists”改为new_folder/myfile.txt
  2. 将内容第二行中的“orig_folder/myfile.txt”也改为new_folder/myfile.txt
  3. 保存,并把001-myfile.patch放到patches目录内,名字中的001可以改成别的数字,如果不依赖于别的patch,也可以不改它,这是patch的执行顺序,patch会严格按从小到大数字执行patch。

多个patch可以堆放在同一个文件,也可以分开放

tete1030 avatar Dec 26 '19 11:12 tete1030

如何将sed转化为patch

把第一步里的命令替换为 diff -u 修改前文件名 修改后文件名 > 001-myfile.patch 然后把patch文件内的“修改前文件名”和“修改后文件名”都换成目标目录文件名

注意,所有这些步骤是在本地执行的,不是在github actions或docker内

tete1030 avatar Dec 26 '19 11:12 tete1030

@RealKiro 我看了下你现在编译失败的原因

2019-12-26T17:25:09.2801140Z #24 6173.  * satisfy_dependencies_for: Cannot satisfy the following dependencies for luci-app-autoreboot:
2019-12-26T17:25:09.2801462Z #24 6173.  * 	luci-theme-Argon_new * 
2019-12-26T17:25:09.2801803Z #24 6173.  * opkg_install_cmd: Cannot install package luci-app-autoreboot.

我很好奇,你尝试过其他CI编译,它们正常吗,比如Actions-Openwrt或者Openwrt-CI。如果正常,请把相应的编译日志链接发给我看一下

P.S.: 我初步怀疑是你的名称不一致所致。 你在install_package luci-theme-argon_new 时名字用的是小写。在theme.patch里用的是luci-theme-Argon_new,这里是大写。

tete1030 avatar Dec 27 '19 06:12 tete1030

P.S.: 我初步怀疑是你的名称不一致所致。 你在install_package luci-theme-argon_new 时名字用的是小写。在theme.patch里用的是luci-theme-Argon_new,这里是大写。

确实是这个有错误,我更正后再试试,🙏

RealKiro avatar Dec 27 '19 10:12 RealKiro

P.S.: 我初步怀疑是你的名称不一致所致。

感谢🙏,编译成功了

RealKiro avatar Dec 27 '19 13:12 RealKiro

如何将mv/cp命令转化成patch文件

这样做没法和原git clone过的源码保持同步吧?要想同步必须每次git pull 重新做一份patch

RealKiro avatar Dec 29 '19 01:12 RealKiro

其实增量编译是在你不频繁更新openwrt和packages代码的情况下比较有用和可靠,主要应对的是你想更改编译参数或想添加删除一两个功能时。如果每次都有更新openwrt本身和所有packages,很可能大量代码需要重新编译,花费的时间不一定短。

增量编译的时候默认也不会拉取最新的openwrt或packages源码,仅使用创建base builder时拉取的版本。(除非你指定了update_repoupdate_feeds)。

如果你确实每次都想更新所有源码,你的patch文件不一定需要每次更新代码时重做,只要你patch的周边代码没有经历大的变动。相对来说这确实是比较严格的补丁操作,能避免出错,但是也造成在不少情况下你需要重新生成patch。

因为,除了patch,我暂时想不到什么好的办法,能既重复利用旧编译状态,又能安全地多次重复执行自定义脚本。其实patch本身也是不够安全稳定的,现有的方法不能正确做到patch本身前后发生变化时,判断一个文件是否已经patch过。

不知你有什么好的建议

Edit: 想到一个办法,但是仍然问题多多:让docker只保存staging_dir,build和bin目录,其它的目录每次使用全新的。但是问题在于,git不恢复/保存文件本身的modified time(source),已patch文件的mod time也难以记录(除非整个目录用另一个git管理)。没有了这些time,增量编译没法发挥作用啊

tete1030 avatar Dec 29 '19 09:12 tete1030

有一个办法。把“自定义脚本执行前的源代码”和“build,staging_dir,bin目录”分成两个docker image。这样能保留非patch文件timestamp的一致性。但是这样需要不小的改动

tete1030 avatar Dec 29 '19 11:12 tete1030

有一个办法。把“自定义脚本执行前的源代码”和“build,staging_dir,bin目录”分成两个docker image。这样能保留非patch文件timestamp的一致性。但是这样需要不小的改动

我能力不行无法给您提供帮助,但我想的是有没有可能尽量做到像本地编译那样,加一个判断:当更新或重新上传 config.diff 时从头开始拉源码编译,当只改变 scripts 或 patches 时只在原来编译过的基础上再次编译

RealKiro avatar Jan 06 '20 10:01 RealKiro

前段花了一些功夫实现了一个方法,现在还在dev分支测试。等测试好了就可以使用script来直接修改代码文件了。先不要尝试dev,还很乱,应该有不少bug

现在头疼的是,变化太多,以前花费了很大精力写的README几乎不适用了😂

tete1030 avatar Jan 06 '20 14:01 tete1030

前段花了一些功夫实现了一个方法,现在还在dev分支测试。

好的,大佬。。。继续加油,奥力给。。。🤪🤪🤪🤪🤪🤪

adaaaaaa avatar Jan 06 '20 14:01 adaaaaaa

修改upload_feeds https://github.com/tete1030/openwrt-fastbuild-actions/blob/master/scripts/update_feeds.sh 参见最后一行注释。

  • https://github.com/RealKiro/build-openwrt/blob/master/before_build.sh 能帮我看看根据build-Actions该如何改吗? 一个是改 IP主题 等内部东西,一个是添加第三方插件(主要是smartinfo需要mv出来)

貌似你没再在电报群了,这个项目你成功了吗?

zxlhhyccc avatar Dec 02 '20 05:12 zxlhhyccc

还有人维护吗

zhangguanzhang avatar Jun 03 '22 03:06 zhangguanzhang

不再维护

tete1030 avatar Jun 03 '22 10:06 tete1030