openwrt-fastbuild-actions
openwrt-fastbuild-actions copied to clipboard
关于添加自定义安装包、patch及修改源代码的方法和已知问题
- 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
修改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~~
哦豁,我是小白。。。你这个比@KFERMercer的要复杂一些哦。。。🤪🤪🤪
本质上都有潜在可能性出现po2lmo的问题,只是我在update_feeds.sh里把所有安装包放在package/feeds目录。你原本的是放在package/openwrt-packages 目录,可能由于名称排序靠后,让你能避免那样的依赖关系错误。
你也不用patch了,直接吧update_feeds.sh的17和18行的package/feeds改成package/openwrt-packages吧
我已经把scripts/update_feeds.sh里用到的目录改成了以z为首字母的名字,似乎不再会出现po2lmo问题 https://github.com/tete1030/openwrt-fastbuild-actions/commit/0c80ea4a1eb50f91364b723702fd9df674d446a7#diff-33e6e534f25e4313d3473f89d1524e40
修改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出来)
修改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
不同于其他项目,这个项目由于每次编译会重复利用先前的编译环境,下一次编译时存在多方面可能性会让自定义脚本的执行结果不可靠:
- 部分已修改的package可能会通过git pull被更新,已修改的文件可能被恢复回原状;新package会加入。这些会导致部分代码已修改,部分代码未修改
- 自定义脚本本身可能会更新
如果每次编译都会再次执行自定义脚本以确保你的自定义得到执行,代码可能会陷入混乱状态。
patch的好处是,已apply的patch可以不再被重复apply,可以做到相对的严格。(当然,如果你修改或删除patch,代码同样不再可靠,这时候你需要“re-create your building environment”)
所有的sed命令和mv命令,可以转化成patch放在patches目录
对于sed和mv,patch该如何写?写在一个patch文件里还是分开写?
如何将mv/cp命令转化成patch文件
举例 : cp或mv orig_folder/myfile.txt new_folder/myfile.txt 注意这里new_folder/myfile.txt是相对于openwrt源码根目录而言的 myfile.txt内容:
abc
123
diff -uN a_fake_file_name orig_folder/myfile.txt > 001-myfile.patch- 这时候得到的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
+
- 将内容第一行中的“file_does_not_exists”改为new_folder/myfile.txt
- 将内容第二行中的“orig_folder/myfile.txt”也改为new_folder/myfile.txt
- 保存,并把001-myfile.patch放到patches目录内,名字中的001可以改成别的数字,如果不依赖于别的patch,也可以不改它,这是patch的执行顺序,patch会严格按从小到大数字执行patch。
多个patch可以堆放在同一个文件,也可以分开放
如何将sed转化为patch
把第一步里的命令替换为
diff -u 修改前文件名 修改后文件名 > 001-myfile.patch
然后把patch文件内的“修改前文件名”和“修改后文件名”都换成目标目录文件名
注意,所有这些步骤是在本地执行的,不是在github actions或docker内
@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,这里是大写。
P.S.: 我初步怀疑是你的名称不一致所致。 你在install_package luci-theme-argon_new 时名字用的是小写。在theme.patch里用的是luci-theme-Argon_new,这里是大写。
确实是这个有错误,我更正后再试试,🙏
P.S.: 我初步怀疑是你的名称不一致所致。
感谢🙏,编译成功了
如何将mv/cp命令转化成patch文件
这样做没法和原git clone过的源码保持同步吧?要想同步必须每次git pull 重新做一份patch
其实增量编译是在你不频繁更新openwrt和packages代码的情况下比较有用和可靠,主要应对的是你想更改编译参数或想添加删除一两个功能时。如果每次都有更新openwrt本身和所有packages,很可能大量代码需要重新编译,花费的时间不一定短。
增量编译的时候默认也不会拉取最新的openwrt或packages源码,仅使用创建base builder时拉取的版本。(除非你指定了update_repo或update_feeds)。
如果你确实每次都想更新所有源码,你的patch文件不一定需要每次更新代码时重做,只要你patch的周边代码没有经历大的变动。相对来说这确实是比较严格的补丁操作,能避免出错,但是也造成在不少情况下你需要重新生成patch。
因为,除了patch,我暂时想不到什么好的办法,能既重复利用旧编译状态,又能安全地多次重复执行自定义脚本。其实patch本身也是不够安全稳定的,现有的方法不能正确做到patch本身前后发生变化时,判断一个文件是否已经patch过。
不知你有什么好的建议
Edit: 想到一个办法,但是仍然问题多多:让docker只保存staging_dir,build和bin目录,其它的目录每次使用全新的。但是问题在于,git不恢复/保存文件本身的modified time(source),已patch文件的mod time也难以记录(除非整个目录用另一个git管理)。没有了这些time,增量编译没法发挥作用啊
有一个办法。把“自定义脚本执行前的源代码”和“build,staging_dir,bin目录”分成两个docker image。这样能保留非patch文件timestamp的一致性。但是这样需要不小的改动
有一个办法。把“自定义脚本执行前的源代码”和“build,staging_dir,bin目录”分成两个docker image。这样能保留非patch文件timestamp的一致性。但是这样需要不小的改动
我能力不行无法给您提供帮助,但我想的是有没有可能尽量做到像本地编译那样,加一个判断:当更新或重新上传 config.diff 时从头开始拉源码编译,当只改变 scripts 或 patches 时只在原来编译过的基础上再次编译
前段花了一些功夫实现了一个方法,现在还在dev分支测试。等测试好了就可以使用script来直接修改代码文件了。先不要尝试dev,还很乱,应该有不少bug
现在头疼的是,变化太多,以前花费了很大精力写的README几乎不适用了😂
前段花了一些功夫实现了一个方法,现在还在dev分支测试。
好的,大佬。。。继续加油,奥力给。。。🤪🤪🤪🤪🤪🤪
修改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出来)
貌似你没再在电报群了,这个项目你成功了吗?
还有人维护吗
不再维护