coolsnowwolf / lede

Lean's LEDE source
Other
29.85k stars 19.53k forks source link

OpenWrt CI 在线集成编译环境使用教程 #2200

Closed KFERMercer closed 4 years ago

KFERMercer commented 4 years ago

借助 GitHub Actions 的 OpenWrt 在线集成自动编译.

项目地址

实时编译状态: Build

支持自动定制固件, 自动调整依赖及生成配置文件, 无需上传配置. 兼容 coolsnowwolf/lede 以及 OpenWrt trunk.

同时支持自动合并推送上游提交 (也就是自动更新), 直接把merge-upstream.yml放入.github/workflows/即可 (默认上游为 coolsnowwolf/lede, 高级玩家请自行改写).

感谢P3TERX珠玉在前.


这个CI脚本和P3TERX/Actions-OpenWrt的同样是云编译, 有什么不同?

这个 CI 脚本可以帮助你在你的 OpenWrt 分支下构建当前库的Op固件, 无需上传配置文件, 不依赖外挂配置脚本, 真正的一次配置终生使用.

P3TERX/Actions-OpenWrt 的优势在于, 其可以独立于文件库存在, 可以快速搭建起可用的编译配置; 同时对新手极其友好. 但是由于 OpenWrt make configure 自身机制的缘故, 生成的配置文件鲁棒性较差, 需要经常重新生成上传配置, 有形中加重了维护负担, 使得使用起来不是很优雅, 但是强烈建议基础薄弱的玩家使用.

这个CI脚本适合哪些人?

使用教程:

在一切开始前, 你需要的是:

相关文章: 作者-糖炒栗子

1. 注册GitHub账号并开启GitHub Actions (自行搜索方法).

2. fork coolsnowwolf/lede 或者 OpenWrt trunk.

3. 上传openwrt-ci.ymlmerge-upstream.yml/.github/workflows/下.

4. 定制固件:

如果你希望定制你的固件:

代码里的注释部分详细介绍了如何在脚本中客制化你的固件. 简单来说, 你只需要解除注释相应行即可.

我已经准备一个正确的编写示例, 此配置基于 Lean 最新代码, 开启了所有预先写好的定制选项, 同时已经经过测试可用. 如果你缺乏对自己的信心, 可以随意借鉴.

5. 大功告成.

集成编译环境会自动开始编译. 现在返回你的库首页, 点击页面上方的Actions按钮就可以查看进度.

如何下载到编译完成的固件?

进入Actions标签页后, 如果相应的集成活动顺利完成 (显示为绿色), 点击页面右上方的Artifacts即可看到你的固件 (通常是一个压缩包). 点击即可开始下载.

pingod commented 4 years ago

我的workflow一直显示 (Unnamed workflow),不知道为啥,GitHub官方问题??

KFERMercer commented 4 years ago

我的workflow一直显示 (Unnamed workflow),不知道为啥,GitHub官方问题??

你改了什么地方?

pingod commented 4 years ago

添加了一个workflow示例模板文件,我把这个文件添加或者删除都不行,都是显示Unnamed workflow

d975xbx commented 4 years ago

感谢大神,可以删除虚拟机了。

ghost commented 4 years ago

大佬,我不用X64,你的实例脚本里的x64怎么替换别的CPU(就是给个其他的CPU设备的TARGET_参数列表吧。)不知道哪里有TARGTE_的不同参数。

ghost commented 4 years ago

image 我想要修改x64为A53处理器的架构,但是这里貌似没有arm v8

redchenjs commented 4 years ago

armv8就是aarch64

KFERMercer commented 4 years ago

我想要修改x64为A53处理器的架构,但是这里貌似没有arm v8

建议直接复制config.seed或者.config最开始的target部分

ghost commented 4 years ago

image 我想要修改x64为A53处理器的架构,但是这里貌似没有arm v8

建议直接复制config.seed或者.config最开始的target部分

我强烈建议您再写一个文档,列出不同设备的这个部分: image

ghost commented 4 years ago

image 只需要这三项对吗?其他的像这样的要吗? CONFIG_TARGET_BOARD="sunxi" CONFIG_TARGET_SUBTARGET="cortexa53" CONFIG_TARGET_PROFILE="DEVICE_sun50i-h5-nanopi-neo2" CONFIG_TARGET_ARCH_PACKAGES="aarch64_cortex-a53"

ghost commented 4 years ago

CONFIG_TARGET_PREINIT_IFNAME="" CONFIG_TARGET_PREINIT_IP="192.168.1.1" CONFIG_TARGET_PREINIT_NETMASK="255.255.255.0" CONFIG_TARGET_PREINIT_BROADCAST="192.168.1.255" CONFIG_TARGET_INIT_PATH="/usr/sbin:/usr/bin:/sbin:/bin" CONFIG_TARGET_INIT_ENV="" CONFIG_TARGET_INIT_CMD="/sbin/init" CONFIG_TARGET_INIT_SUPPRESS_STDERR=y 还有这些要吗?

KFERMercer commented 4 years ago

CONFIG_TARGET_PREINIT_IFNAME="" CONFIG_TARGET_PREINIT_IP="192.168.1.1" CONFIG_TARGET_PREINIT_NETMASK="255.255.255.0" CONFIG_TARGET_PREINIT_BROADCAST="192.168.1.255" CONFIG_TARGET_INIT_PATH="/usr/sbin:/usr/bin:/sbin:/bin" CONFIG_TARGET_INIT_ENV="" CONFIG_TARGET_INIT_CMD="/sbin/init" CONFIG_TARGET_INIT_SUPPRESS_STDERR=y 还有这些要吗?

不需要.

image 只需要这三项对吗?其他的像这样的要吗? CONFIG_TARGET_BOARD="sunxi" CONFIG_TARGET_SUBTARGET="cortexa53" CONFIG_TARGET_PROFILE="DEVICE_sun50i-h5-nanopi-neo2" CONFIG_TARGET_ARCH_PACKAGES="aarch64_cortex-a53"

对. 通常来说你在menuconfig下需要做出多少次选泽就需要多少行, 所以nanopi 2只需要这三行就够了:

CONFIG_TARGET_sunxi_cortexa53_DEVICE_sun50i-h5-nanopi-neo2=y
CONFIG_TARGET_sunxi_cortexa53=y
CONFIG_TARGET_sunxi=y

比如要编译ACRH 17的固件, 只需要这两行:

CONFIG_TARGET_ipq40xx=y
CONFIG_TARGET_ipq40xx_DEVICE_asus_rt-acrh17=y
ghost commented 4 years ago

CONFIG_TARGET_PREINIT_IFNAME="" CONFIG_TARGET_PREINIT_IP="192.168.1.1" CONFIG_TARGET_PREINIT_NETMASK="255.255.255.0" CONFIG_TARGET_PREINIT_BROADCAST="192.168.1.255" CONFIG_TARGET_INIT_PATH="/usr/sbin:/usr/bin:/sbin:/bin" CONFIG_TARGET_INIT_ENV="" CONFIG_TARGET_INIT_CMD="/sbin/init" CONFIG_TARGET_INIT_SUPPRESS_STDERR=y 还有这些要吗?

不需要.

image 只需要这三项对吗?其他的像这样的要吗? CONFIG_TARGET_BOARD="sunxi" CONFIG_TARGET_SUBTARGET="cortexa53" CONFIG_TARGET_PROFILE="DEVICE_sun50i-h5-nanopi-neo2" CONFIG_TARGET_ARCH_PACKAGES="aarch64_cortex-a53"

对. 通常来说你在menuconfig下需要做出多少次选泽就需要多少行, 所以nanopi 2只需要这三行就够了:

CONFIG_TARGET_sunxi_cortexa53_DEVICE_sun50i-h5-nanopi-neo2=y
CONFIG_TARGET_sunxi_cortexa53=y
CONFIG_TARGET_sunxi=y

比如要编译ACRH 17的固件, 只需要这两行:

CONFIG_TARGET_ipq40xx=y
CONFIG_TARGET_ipq40xx_DEVICE_asus_rt-acrh17=y

我觉得这些都背不下来,所有设备的。。。您看看再写个这块的所有设备参数文档?嘻嘻嘻嘻

KFERMercer commented 4 years ago

我觉得这些都背不下来,所有设备的。。。您看看再写个这块的所有设备参数文档?嘻嘻嘻嘻

我也没背, 需要什么设备只需要去make一个配置文件看一下就好了啊, 反正这种事是一劳永逸的. 话说回来, 配置选项的命名仔细看一下你就会发现规律.

ghost commented 4 years ago

我觉得这些都背不下来,所有设备的。。。您看看再写个这块的所有设备参数文档?嘻嘻嘻嘻

我也没背, 需要什么设备只需要去make一个配置文件看一下就好了啊, 反正这种事是一劳永逸的. 话说回来, 配置选项的命名仔细看一下你就会发现规律.

嗯嗯。 那我再问下几个问题: 1.我配置的自定义的Neo2固件编译,那么可以同时再添加一个编译其他的设备固件的workflow脚本吗?(可以的话,是怎么添加呢?在workflow目录下新建一个其他的比如op-acrh17.yml就可以了?) 2.FORK一次代码后,任意一个workflow脚本都可以自动同步大雕的commit并且开始按照脚本编译吗?不需要重新FORK吧?.....我不太会用git,不知道怎么同步大雕的源码且不覆盖我的自定义的workflow的yml。

pingod commented 4 years ago

现在可以了,是GitHub官方的锅 https://www.githubstatus.com/incidents/39ynqr1xb3s0

KFERMercer commented 4 years ago

我觉得这些都背不下来,所有设备的。。。您看看再写个这块的所有设备参数文档?嘻嘻嘻嘻

我也没背, 需要什么设备只需要去make一个配置文件看一下就好了啊, 反正这种事是一劳永逸的. 话说回来, 配置选项的命名仔细看一下你就会发现规律.

嗯嗯。 那我再问下几个问题: 1.我配置的自定义的Neo2固件编译,那么可以同时再添加一个编译其他的设备固件的workflow脚本吗?(可以的话,是怎么添加呢?在workflow目录下新建一个其他的比如op-acrh17.yml就可以了?) 2.FORK一次代码后,任意一个workflow脚本都可以自动同步大雕的commit并且开始按照脚本编译吗?不需要重新FORK吧?.....我不太会用git,不知道怎么同步大雕的源码且不覆盖我的自定义的workflow的yml。

① 对 ② 不能, 需要手动合并. 这个脚本专注当前库, 如果想要代码, 可以再脚本中添加一个拉取代码的命令, 但是我不建议你这么做. 同步上游不会覆盖下游更改.

如果你只是想编译最新固件, 可以用P3TERX/Actions-OpenWrt

现在可以了,是GitHub官方的锅 https://www.githubstatus.com/incidents/39ynqr1xb3s0

github的bug都让你找着了😂

z826540272 commented 4 years ago

我觉得这些都背不下来,所有设备的。。。您看看再写个这块的所有设备参数文档?嘻嘻嘻嘻

我也没背, 需要什么设备只需要去make一个配置文件看一下就好了啊, 反正这种事是一劳永逸的. 话说回来, 配置选项的命名仔细看一下你就会发现规律.

嗯嗯。 那我再问下几个问题: 1.我配置的自定义的Neo2固件编译,那么可以同时再添加一个编译其他的设备固件的workflow脚本吗?(可以的话,是怎么添加呢?在workflow目录下新建一个其他的比如op-acrh17.yml就可以了?) 2.FORK一次代码后,任意一个workflow脚本都可以自动同步大雕的commit并且开始按照脚本编译吗?不需要重新FORK吧?.....我不太会用git,不知道怎么同步大雕的源码且不覆盖我的自定义的workflow的yml。

① 对 ② 不能, 需要手动合并. 这个脚本专注当前库, 如果想要代码, 可以再脚本中添加一个拉取代码的命令, 但是我不建议你这么做. 同步上游不会覆盖下游更改.

如果你只是想编译最新固件, 可以用P3TERX/Actions-OpenWrt

现在可以了,是GitHub官方的锅 https://www.githubstatus.com/incidents/39ynqr1xb3s0

github的bug都让你找着了😂

4点同时编译,GitHub算力被撸完

d975xbx commented 4 years ago

如果大雕源码更新,要怎么自动编译?

BROBIRD commented 4 years ago

每个项目每个月只有2000分钟的免费时间,如果每天都运行一次的话,是不够用的。

抱歉看错了,上述限制是针对私有仓库的

KFERMercer commented 4 years ago

如果大雕源码更新,要怎么自动编译?

你可以在CI脚本中添加pull上游代码的动作.

每个项目每个月只有2000分钟的免费时间,如果每天都运行一次的话,是不够用的。

我在 GitHub 论坛上看到这样一条帖子:

image

似乎2000分钟的限制只在私有库中存在.

BROBIRD commented 4 years ago

@KFERMercer 抱歉看错了,上述限制是针对私有仓库的

d975xbx commented 4 years ago

大神,怎么在CI脚本中添加pull上游代码的动作?

z826540272 commented 4 years ago

大神,怎么在CI脚本中添加pull上游代码的动作?

你用另一个脚本就是最新版编译

d975xbx commented 4 years ago

这个吗?https://github.com/P3TERX/Actions-OpenWrt

xunqiuhuiyi commented 4 years ago

谢谢UP主的分享 想请教下 如果我拥有多台路由 是否可以同时自动化编译多个固件呢?还是说需要建立多个自动编译化脚本?如果我修改了openwrt-ci.yml 在Action建立多个脚本 更新以后 他是按照我最近修改还是?主要是我不太会使用git 如果我workflow目录下创建多个.yml脚本,是不是workflow脚本都可以自动同步大雕的commit并且开始按照脚本编译呢?

KFERMercer commented 4 years ago

谢谢UP主的分享 想请教下 如果我拥有多台路由 是否可以同时自动化编译多个固件呢?还是说需要建立多个自动编译化脚本?如果我修改了openwrt-ci.yml 在Action建立多个脚本 更新以后 他是按照我最近修改还是?主要是我不太会使用git 如果我workflow目录下创建多个.yml脚本,是不是workflow脚本都可以自动同步大雕的commit并且开始按照脚本编译呢?

同时建立多个flow, 每个flow都会执行. 不过既然你不太会用git, 那这种需求建议使用P3TERX/Actions-OpenWrt.

adaaaaaa commented 4 years ago

老哥,不行啊。。。你最近一次改代码之后,GG了。。。

Uploading artifact 'OpenWrt firmware' from '/home/runner/work/lede/lede/artifact/' for run #21 Uploading 0 files File upload complete. Uploaded '0' bytes from '/home/runner/work/lede/lede/artifact/' to server

固件大小直接为0了。。。

KFERMercer commented 4 years ago

老哥,不行啊。。。你最近一次改代码之后,GG了。。。

Uploading artifact 'OpenWrt firmware' from '/home/runner/work/lede/lede/artifact/' for run #21 Uploading 0 files File upload complete. Uploaded '0' bytes from '/home/runner/work/lede/lede/artifact/' to server

固件大小直接为0了。。。

刚才又更新了,, 之前一条命令写错了

adaaaaaa commented 4 years ago

不行啊,你是说前6,7小时那个改动吗?。。。还是这样啊。。。😂😂😂 你那边可以了??

KFERMercer commented 4 years ago

不行啊,你是说前6,7小时那个改动吗?。。。还是这样啊。。。😂😂😂 你那边可以了??

刚刚更新

adaaaaaa commented 4 years ago

好的,我又去抄作业了。。。😂😂😂

adaaaaaa commented 4 years ago

你确定这次没问题了吧??😂😂😂

KFERMercer commented 4 years ago

你确定这次没问题了吧??😂😂😂

刚看了下你的CI, 写的非常山炮. 建议去看小白教程: https://github.com/coolsnowwolf/lede/issues/2225

adaaaaaa commented 4 years ago

结合你们两家所长啊。。。怎么就山炮了呢??😂😂😂

KFERMercer commented 4 years ago

结合你们两家所长啊。。。怎么就山炮了呢??😂😂😂

基本语法都错了

adaaaaaa commented 4 years ago

最初的模板就是你的呢。。。整个编译过程也没有报错啊??🙃

adaaaaaa commented 4 years ago

给个栗子我看看哪里不对了??

adaaaaaa commented 4 years ago

除了中间加一点插件,软件,驱动。。。其他基本完全照抄啊。。。😂😂😂

KFERMercer commented 4 years ago

最初的模板就是你的呢。。。整个编译过程也没有报错啊??🙃

给个栗子我看看哪里不对了??

除了中间加一点插件,软件,驱动。。。其他基本完全照抄啊。。。😂😂😂

我怀疑你这个编出来的配置根本就不会生效, 而且有多个包之间互相冲突. 如果你不需要某项配置, 除了你想强制关闭应该在后面添加is not set外, 其余的应该就直接删掉对应行而不是注释.

adaaaaaa commented 4 years ago

收到,谢谢,我马上去改。。。至少也是简洁好看一点。。。😂😂😂

adaaaaaa commented 4 years ago

对了,我设置是计划9点UTC,每星期五执行的,为什么没有生效,而是立刻就开始编译了呢??

adaaaaaa commented 4 years ago

老哥,好像还是不太行哦。。。编译出的固件大小有问题。。。之前都是190多M的,现在只剩90多了。。。无论是按照你后来让我改的,还是之前照你修改的配置文件改的。。。都是一样大小。。。 然后,压缩包解压出错。。。

KFERMercer commented 4 years ago

老哥,好像还是不太行哦。。。编译出的固件大小有问题。。。之前都是190多M的,现在只剩90多了。。。无论是按照你后来让我改的,还是之前照你修改的配置文件改的。。。都是一样大小。。。 然后,压缩包解压出错。。。

image

adaaaaaa commented 4 years ago
      cat >> .config <<EOF
      CONFIG_TARGET_IMAGES_PAD=y
      CONFIG_VDI_IMAGES=y
      EOF

这里有什么问题不?为什么不能编译出VDI镜像?

powskey commented 4 years ago

编译ipq40XX固件:

      # cat >> .config <<EOF

      # CONFIG_TARGET_ipq40xx=y

      # CONFIG_TARGET_ipq40xx_DEVICE_p2w_r619ac-128m=y

      # EOF

我这样写的,为什么编译出来的不是竞斗云的固件?是不是哪里错了?

redchenjs commented 4 years ago

就因为这个CI好多萌新乱开PR都开到官方OpenWrt上去了

z826540272 commented 4 years ago

就因为这个CI好多萌新乱开PR都开到官方OpenWrt上去了

说实话这ci难用多此一举,不如原来的那个

KFERMercer commented 4 years ago

就因为这个CI好多萌新乱开PR都开到官方OpenWrt上去了

今天新加了自动更新CI, 不再需要手动pr了.

adaaaaaa commented 4 years ago

能不能把编译时候实际用到的完整版的config文件也导出来,一起打包下载了?? 这次看到又添加了一些新的驱动,这些是我不需要的。。。 我想要下次编译的时候,禁止这些新的驱动添加到固件里面。。。 但是,我又不想在本地启动虚拟机来git pull。。。我都打算删掉虚拟机了。。。