【CODING x 物联网】使用 CODING CI 快速编译 NodeMCU 固件
NodeMCU 是一个开源的物联网平台。它使用 Lua 脚本语言编程。该平台基于 eLua 开源项目,底层使用 ESP8266 sdk 0.9.5 版本。该平台使用了很多开源项目,例如 lua-cjson,spiffs. NodeMCU 包含了可以运行在 esp8266 Wi-Fi SoC 芯片之上的固件,以及基于 ESP-12 模组的硬件。
[图片: 一种 NodeMCU 开发板]
https://static.txisfine.cn/upload/Snipaste2020-05-3118-51-27.png/pkwatermark
几种编译方法的利弊
根据 NodeMCU 官方文档,目前提供了三种方法供开发者进行固件编译。
[图片: 来源 NodeMCU 文档:三种推荐的固件编译方法]
https://static.txisfine.cn/upload/20200531185936.png/pkwatermark
| | 云编译 | Docker 编译 | 本地 Linux 编译 | | -------------------- | ------ | ---------------------- | ---------------------- | | 固件灵活度 | 不灵活 | 灵活 | 灵活 | | 是否需要本地搭建环境 | 否 | 是 | 是 | | 环境搭建复杂程度 | - | 较复杂 | 复杂 | | 固件编译速度 | 快 | 由计算机性能决定 | 由计算机性能决定 | | 是否受到本地网络限制 | 否 | 是(需要拉取外网资源) | 是(需要拉取外网资源) |
由表已知,云编译是使用最方便的编译方式,但因为云编辑只能对模块和一些简单的配置项进行定义,使得生成的固件整体灵活性很低。如果需要开启 SmartConfig 智能配网等功能,云编译将不能满足我们的需求,使用 Docker 和 Linux 进行编译,需要我们下载配置 Docker 或 Linux 虚拟机环境,也比较复杂。在编译固件的过程中需要拉取外网资源,往往因为网络问题导致编译时间长甚至编译失败。那么有没有一种不需要本地搭建环境还可以灵活而快速的编译 NodeMCU 固件呢?
今天我就来介绍一下,如何通过 CODING CI(CODING 持续集成)功能快速编译 NodeMCU 固件,并将固件保存在制品库中,供开发者使用。
在 CODING 中创建 DevOps 项目
首先我们需要在 CODING 中创建一个 DevOps 项目。如果你还没有 CODING 账号,请戳这里免费注册。
[图片: 20200531214523]
https://static.txisfine.cn/upload/20200531214523.png/pkwatermark
[图片: 20200531215040]
https://static.txisfine.cn/upload/20200531215040.png/pkwatermark
自定义 NodeMCU Firmware
在本地使用 Git 工具 clone 一个 nodemcu-firmware 项目,作为本地工程。
{% note info %} 注意 一定要使用 Git 工具 clone 项目,而不是下载项目的 zip 包。 {% endnote %}
对固件进行配置,即编辑 nodemcu-firmware/app/include 目录下的 usermodel.h 和 userconfig.h。这个就是根据项目需求可以自己定义了。
下面我列举一些比较常用的配置项。
- 选择要编译的模块:在 usermodel.h 中解除对应模块的注释。
[图片: 20200531215527]
https://static.txisfine.cn/upload/20200531215527.png/pkwatermark
- 调整串口波特率:定义在 userconfig.h 中的 BITRATEDEFAULT,因为启动时的波特率是 74880,这里将波特率配置成 74880 可以在 NodeMCU 启动时不跳乱码。
[图片: 20200531215752]
https://static.txisfine.cn/upload/20200531215752.png/pkwatermark
- 只使用 Int 型(节省内存):定义在 userconfig.h 中的 LUANUMBERINTEGRAL。
- Smart 智能配网(SmartConfig 或 AirKiss)配置项定义在 userconfig.h 中的 WIFISMARTENABLE。
- 打包 Lua 文件,我们可以将项目的 lua 文件直接打包进固件,在烧录过程中直接写入闪存。将 lua 文件放在 /local/fs 目录中并删除工程根目录中 .gitignore 的 local/ 即可。
[图片: 20200531220804]
https://static.txisfine.cn/upload/20200531220804.png/pkwatermark
[图片: 20200531222532]
https://static.txisfine.cn/upload/20200531222532.png/pkwatermark
配置远端库
默认 clone 下来的 nodemcu-firmware 项目是带有远端库的,我们还需要配置一个 CODING 的远端库,方便我们将配置好的工程推送到 CODING,并开始编译固件。
在工程文件夹中右击,选择 Git Gui Here,选择 Remote->Add...。
[图片: 20200531222745]
https://static.txisfine.cn/upload/20200531222745.png/pkwatermark
[图片: 20200531222922]
https://static.txisfine.cn/upload/20200531222922.png/pkwatermark
[图片: 20200531223320]
https://static.txisfine.cn/upload/20200531223320.png/pkwatermark
创建制品库
我们编译好的固件将存放在制品库中,这里创建一个 Generic 型的制品库,叫 releases。
在 CODING 项目页面,选择制品库,创建仓库。
[图片: 20200531224214]
https://static.txisfine.cn/upload/20200531224214.png/pkwatermark
创建持续集成任务
这也是比较关键的一步,还是在 CODING 项目页面,选择持续集成->构建计划,新建一个构建计划。
他会让你选择构建计划模板,为了方便配置,我们直接选择 CODING Generic 制品上传。
[图片: 20200531224602]
https://static.txisfine.cn/upload/20200531224602.png/pkwatermark
[图片: 20200531224815]
https://static.txisfine.cn/upload/20200531224815.png/pkwatermark
pipeline {
agent {
docker {
registryUrl 'https://coding-public-docker.pkg.coding.net'
image 'public/docker/ubuntu:16.04'
reuseNode true
}
}
stages {
stage('检出') {
steps {
checkout([$class: 'GitSCM',
branches: [[name: env.GIT_BUILD_REF]],
userRemoteConfigs: [[
url: env.GIT_REPO_URL,
credentialsId: env.CREDENTIALS_ID
]]])
}
}
stage('构建') {
steps {
sh '''apt-get update && apt-get install -y --no-install-recommends wget unzip git make python-serial srecord bc xz-utils gcc ccache tzdata vim-tiny
apt-get install -y --no-install-recommends gperf python-pip python-dev flex bison build-essential libssl-dev libffi-dev libncurses5-dev libncursesw5-dev libreadline-dev
pip install --upgrade pip'''
sh 'V=1 make'
dir('bin') {
sh 'srec_cat -output "esp8266.bin" -binary 0x00000.bin -binary -fill 0xff 0x00000 0x10000 0x10000.bin -binary -offset 0x10000'
}
sh 'tar zcvf bin.tar.gz bin'
}
}
stage('推送制品') {
steps {
codingArtifactsGeneric(files: 'bin.tar.gz', repoName: "${env.GENERIC_REPO_NAME}", credentialsId: '${env.CODING_ARTIFACTS_CREDENTIALS_ID}', withBuildProps: true)
}
}
}
}
```
点击右侧,保存。
CODING DevOps 极速构建计划
编译流程构建好了,我们就可以愉快的开始编译固件了吗?NO,我们还要选择一下构建计划所使用的节点池,在默认情况下会使用上海的构建节点池,但是我们在编译固件时需要拉取外网资源,这时候 CODING DevOps 极速构建计划就要登场了。
{% note info%} 什么是 CODING DevOps 极速构建计划 CODING DevOps 推出全新“极速构建”方案,通过海外镜像资源加速提升拉取速度,支持海外节点构建以便有需求的用户使用全球服务,用户独占构建资源无需排队等待,以及通过内网将制品推送至 CODING 制品库以缩短推送时间。了解更多 {% endnote %}
在持续集成构建计划列表,点击“...”->设置,进入构建计划设置,选择基础信息选项卡,在节点池配置中选择海外节点。
[图片: 20200602231604]
https://static.txisfine.cn/upload/20200602231604.png/pkwatermark
选择保存修改,完成对构建节点池的配置。
开始编译!
发起一次构建。如果手动发起触发信息是手动触发,同时也支持通过代码更新自动触发构建。
[图片: 20200531225412]
https://static.txisfine.cn/upload/20200531225412.png/pkwatermark
[图片: 20200531225430]
https://static.txisfine.cn/upload/20200531225430.png/pkwatermark
获取编译好的固件
目前 CODING 使用了腾讯云云主机为用户提供持续集成服务,构建速度非常快,大概 2 分钟后,我们发现状态变为构建成功,我们就可以去制品库下载编译好的固件包了。
[图片: 20200531225804]
https://static.txisfine.cn/upload/20200531225804.png/pkwatermark
在 CODING 项目页面,点击制品库,我们可以看到生成好的 bin 包。
[图片: 20200531225944]
https://static.txisfine.cn/upload/20200531225944.png/pkwatermark
[图片: 20200531230143]
https://static.txisfine.cn/upload/20200531230143.png/pkwatermark