NodeMCU 是一个开源的物联网平台。 它使用 Lua 脚本语言编程。该平台基于 eLua 开源项目,底层使用 ESP8266 sdk 0.9.5 版本。该平台使用了很多开源项目, 例如 lua-cjson, spiffs. NodeMCU 包含了可以运行在 esp8266 Wi-Fi SoC 芯片之上的固件,以及基于 ESP-12 模组的硬件。
使用 NodeMCU 可以使用 Lua 脚本语言快速构建一个基于 ESP8266 的物联网项目。NodeMCU 为我们提供了很多模块支持,但受限于物联网应用体积和一些其他的原因,我们一般按需构建固件,即只选择项目中所需的模块进行编译。
几种编译方法的利弊
根据 NodeMCU 官方文档,目前提供了三种方法供开发者进行固件编译。
下面我通过一个表格来简单对比一下这三种编译方法。
云编译 | Docker 编译 | 本地 Linux 编译 | |
---|---|---|---|
固件灵活度 | 不灵活 | 灵活 | 灵活 |
是否需要本地搭建环境 | 否 | 是 | 是 |
环境搭建复杂程度 | 较复杂 | 复杂 | |
固件编译速度 | 快 | 由计算机性能决定 | 由计算机性能决定 |
是否受到本地网络限制 | 否 | 是(需要拉取外网资源) | 是(需要拉取外网资源) |
由表已知,云编译是使用最方便的编译方式,但因为云编辑只能对模块和一些简单的配置项进行定义,使得生成的固件整体灵活性很低。如果需要开启 SmartConfig 智能配网等功能,云编译将不能满足我们的需求,使用 Docker 和 Linux 进行编译,需要我们下载配置 Docker 或 Linux 虚拟机环境,也比较复杂。在编译固件的过程中需要拉取外网资源,往往因为网络问题导致编译时间长甚至编译失败。那么有没有一种不需要本地搭建环境还可以灵活而快速的编译 NodeMCU 固件呢?
今天我就来介绍一下,如何通过 CODING CI(CODING 持续集成)功能快速编译 NodeMCU 固件,并将固件保存在制品库中,供开发者使用。
在 CODING 中创建 DevOps 项目
首先我们需要在 CODING 中创建一个 DevOps 项目。如果你还没有 CODING 账号,请戳这里免费注册。
这个项目将存放我们的 NodeMCU 固件的代码,在创建完成后,进入项目,点击代码仓库->克隆,获取项目代码仓库的地址。
自定义 NodeMCU Firmware
在本地使用 Git 工具 clone 一个 nodemcu-firmware 项目,作为本地工程。
注意
一定要使用 Git 工具 clone 项目,而不是下载项目的 zip 包。
对固件进行配置,即编辑 nodemcu-firmware/app/include 目录下的 user_model.h 和 user_config.h。这个就是根据项目需求可以自己定义了。
下面我列举一些比较常用的配置项。
- 选择要编译的模块:在 user_model.h 中解除对应模块的注释。
- 调整串口波特率: 定义在 user_config.h 中的 BIT_RATE_DEFAULT,因为启动时的波特率是 74880,这里将波特率配置成 74880 可以在 NodeMCU 启动时不跳乱码。
- 只使用 Int 型(节省内存):定义在 user_config.h 中的 LUA_NUMBER_INTEGRAL。
- Smart 智能配网(SmartConfig 或 AirKiss)配置项定义在 user_config.h 中的 WIFI_SMART_ENABLE。
- 打包 Lua 文件,我们可以将项目的 lua 文件直接打包进固件,在烧录过程中直接写入闪存。将 lua 文件放在 /local/fs 目录中并删除工程根目录中 .gitignore 的 local/ 即可。
配置远端库
默认 clone 下来的 nodemcu-firmware 项目是带有远端库的,我们还需要配置一个 CODING 的远端库,方便我们将配置好的工程推送到 CODING,并开始编译固件。
在工程文件夹中右击,选择 Git Gui Here,选择 Remote->Add...。
Name 填写 coding,Location 填写 CODING 远端代码仓库的地址,如图,最后点击 Add。
然后就可以素质四连(Rescan、Stage Changed、SignOff、Commit)了,最后记得 Push 到 Coding。
这里需要选择好远端库,不要选 origin,选刚刚名称是 coding 的那个。(我这里远端库叫 git@e.coding)
创建制品库
我们编译好的固件将存放在制品库中,这里创建一个 Generic 型的制品库,叫 releases。
在 CODING 项目页面,选择制品库,创建仓库。
这里需要注意的是,制品仓库一定要选择 Generic,仓库地址填写 releases,如果有特殊需求可以选择制品库的权限范围。
创建持续集成任务
这也是比较关键的一步,还是在 CODING 项目页面,选择持续集成->构建计划,新建一个构建计划。
他会让你选择构建计划模板,为了方便配置,我们直接选择 CODING Generic 制品上传。
给你的构建计划起一个名字,在构建过程的第二步,选择刚刚创建的 Generic 仓库名称,取消勾选“创建后触发构建”,点击确定。
点击“...”->设置,进入构建计划设置,选择流程配置选项卡,直接使用文本编辑器,粘贴入一下内容。
代码语言:txt复制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'
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 极速构建计划就要登场了。
什么是 CODING DevOps 极速构建计划
CODING DevOps 推出全新“极速构建”方案,通过海外镜像资源加速提升拉取速度,支持海外节点构建以便有需求的用户使用全球服务,用户独占构建资源无需排队等待,以及通过内网将制品推送至 CODING 制品库以缩短推送时间。了解更多
在持续集成构建计划列表,点击“...”->设置,进入构建计划设置,选择基础信息选项卡,在节点池配置中选择海外节点。
选择保存修改,完成对构建节点池的配置。
开始编译!
发起一次构建。如果手动发起触发信息是手动触发,同时也支持通过代码更新自动触发构建。
我们可以通过流程图表和日志来获取构建的状态信息。
获取编译好的固件
目前 CODING 使用了腾讯云云主机为用户提供持续集成服务,构建速度非常快,大概 2 分钟后,我们发现状态变为构建成功,我们就可以去制品库下载编译好的固件包了。
在 CODING 项目页面,点击制品库,我们可以看到生成好的 bin 包。
点击下载,即可下载我们自己编译好的固件包。
点击文件名,进入制品详情,通过版本列表,我们可以获取我们曾经编译过的固件包。
参考文档
- NodeMCU Documentation
- marcelstoer/nodemcu-build dockerfile
- CODING 持续集成文档