NodeMCU 是一个开源的物联网平台。它使用 Lua 脚本语言编程。该平台基于 eLua 开源项目,底层使用 ESP8266 sdk 0.9.5 版本。该平台使用了很多开源项目,例如 lua-cjson,spiffs. NodeMCU 包含了可以运行在 esp8266 Wi-Fi SoC 芯片之上的固件,以及基于 ESP-12 模组的硬件。
一种 NodeMCU 开发板
使用 NodeMCU 可以使用 Lua 脚本语言快速构建一个基于 ESP8266 的物联网项目。NodeMCU 为我们提供了很多模块支持,但受限于物联网应用体积和一些其他的原因,我们一般按需构建固件,即只选择项目中所需的模块进行编译。

几种编译方法的利弊

根据 NodeMCU 官方文档,目前提供了三种方法供开发者进行固件编译。
来源 NodeMCU 文档:三种推荐的固件编译方法
下面我通过一个表格来简单对比一下这三种编译方法。

云编译 Docker 编译 本地 Linux 编译
固件灵活度 不灵活 灵活 灵活
是否需要本地搭建环境
环境搭建复杂程度 - 较复杂 复杂
固件编译速度 由计算机性能决定 由计算机性能决定
是否受到本地网络限制 是(需要拉取外网资源) 是(需要拉取外网资源)

由表已知,云编译是使用最方便的编译方式,但因为云编辑只能对模块和一些简单的配置项进行定义,使得生成的固件整体灵活性很低。如果需要开启 SmartConfig 智能配网等功能,云编译将不能满足我们的需求,使用 Docker 和 Linux 进行编译,需要我们下载配置 Docker 或 Linux 虚拟机环境,也比较复杂。在编译固件的过程中需要拉取外网资源,往往因为网络问题导致编译时间长甚至编译失败。那么有没有一种不需要本地搭建环境还可以灵活而快速的编译 NodeMCU 固件呢?

今天我就来介绍一下,如何通过 CODING CI(CODING 持续集成)功能快速编译 NodeMCU 固件,并将固件保存在制品库中,供开发者使用。

在 CODING 中创建 DevOps 项目

首先我们需要在 CODING 中创建一个 DevOps 项目。如果你还没有 CODING 账号,请戳这里免费注册
20200531214523
这个项目将存放我们的 NodeMCU 固件的代码,在创建完成后,进入项目,点击代码仓库->克隆,获取项目代码仓库的地址。
20200531215040

自定义 NodeMCU Firmware

在本地使用 Git 工具 clone 一个 nodemcu-firmware 项目,作为本地工程。

注意
一定要使用 Git 工具 clone 项目,而不是下载项目的 zip 包。

对固件进行配置,即编辑 nodemcu-firmware/app/include 目录下的 user_model.h 和 user_config.h。这个就是根据项目需求可以自己定义了。

下面我列举一些比较常用的配置项。

  • 选择要编译的模块:在 user_model.h 中解除对应模块的注释。
    20200531215527
  • 调整串口波特率:定义在 user_config.h 中的 BIT_RATE_DEFAULT,因为启动时的波特率是 74880,这里将波特率配置成 74880 可以在 NodeMCU 启动时不跳乱码。
    20200531215752
  • 只使用 Int 型(节省内存):定义在 user_config.h 中的 LUA_NUMBER_INTEGRAL。
  • Smart 智能配网(SmartConfig 或 AirKiss)配置项定义在 user_config.h 中的 WIFI_SMART_ENABLE。
  • 打包 Lua 文件,我们可以将项目的 lua 文件直接打包进固件,在烧录过程中直接写入闪存。将 lua 文件放在 /local/fs 目录中并删除工程根目录中 .gitignore 的 local/ 即可。
    20200531220804
    20200531222532

配置远端库

默认 clone 下来的 nodemcu-firmware 项目是带有远端库的,我们还需要配置一个 CODING 的远端库,方便我们将配置好的工程推送到 CODING,并开始编译固件。

在工程文件夹中右击,选择 Git Gui Here,选择 Remote->Add…。
20200531222745
Name 填写 coding,Location 填写 CODING 远端代码仓库的地址,如图,最后点击 Add。
20200531222922
然后就可以素质四连(Rescan、Stage Changed、SignOff、Commit)了,最后记得 Push 到 Coding。
这里需要选择好远端库,不要选 origin,选刚刚名称是 coding 的那个。(我这里远端库叫 git@e.coding
20200531223320

创建制品库

我们编译好的固件将存放在制品库中,这里创建一个 Generic 型的制品库,叫 releases。

在 CODING 项目页面,选择制品库,创建仓库。
20200531224214
这里需要注意的是,制品仓库一定要选择 Generic,仓库地址填写 releases,如果有特殊需求可以选择制品库的权限范围。

创建持续集成任务

这也是比较关键的一步,还是在 CODING 项目页面,选择持续集成->构建计划,新建一个构建计划。

他会让你选择构建计划模板,为了方便配置,我们直接选择 CODING Generic 制品上传。
20200531224602
给你的构建计划起一个名字,在构建过程的第二步,选择刚刚创建的 Generic 仓库名称,取消勾选“创建后触发构建”,点击确定。
20200531224815
点击“…”->设置,进入构建计划设置,选择流程配置选项卡,直接使用文本编辑器,粘贴入一下内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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 极速构建计划就要登场了。

什么是 CODING DevOps 极速构建计划
CODING DevOps 推出全新“极速构建”方案,通过海外镜像资源加速提升拉取速度,支持海外节点构建以便有需求的用户使用全球服务,用户独占构建资源无需排队等待,以及通过内网将制品推送至 CODING 制品库以缩短推送时间。了解更多

在持续集成构建计划列表,点击“…”->设置,进入构建计划设置,选择基础信息选项卡,在节点池配置中选择海外节点。

20200602231604

选择保存修改,完成对构建节点池的配置。

开始编译!

发起一次构建。如果手动发起触发信息是手动触发,同时也支持通过代码更新自动触发构建。
20200531225412
我们可以通过流程图表和日志来获取构建的状态信息。
20200531225430

获取编译好的固件

目前 CODING 使用了腾讯云云主机为用户提供持续集成服务,构建速度非常快,大概 2 分钟后,我们发现状态变为构建成功,我们就可以去制品库下载编译好的固件包了。

20200531225804

在 CODING 项目页面,点击制品库,我们可以看到生成好的 bin 包。
20200531225944
点击下载,即可下载我们自己编译好的固件包。
点击文件名,进入制品详情,通过版本列表,我们可以获取我们曾经编译过的固件包。
20200531230143

参考文档