【CODING x 物联网】使用 CODING CI 快速编译 NodeMCU 固件

2020-06-03 15:37:24 浏览数 (1)

NodeMCU 是一个开源的物联网平台。 它使用 Lua 脚本语言编程。该平台基于 eLua 开源项目,底层使用 ESP8266 sdk 0.9.5 版本。该平台使用了很多开源项目, 例如 lua-cjson, spiffs. NodeMCU 包含了可以运行在 esp8266 Wi-Fi SoC 芯片之上的固件,以及基于 ESP-12 模组的硬件。

一种NodeMCU开发板一种NodeMCU开发板

使用 NodeMCU 可以使用 Lua 脚本语言快速构建一个基于 ESP8266 的物联网项目。NodeMCU 为我们提供了很多模块支持,但受限于物联网应用体积和一些其他的原因,我们一般按需构建固件,即只选择项目中所需的模块进行编译。

几种编译方法的利弊

根据 NodeMCU 官方文档,目前提供了三种方法供开发者进行固件编译。

来源NodeMCU文档:三种推荐的固件编译方法来源NodeMCU文档:三种推荐的固件编译方法

下面我通过一个表格来简单对比一下这三种编译方法。

云编译

Docker 编译

本地 Linux 编译

固件灵活度

不灵活

灵活

灵活

是否需要本地搭建环境

环境搭建复杂程度

较复杂

复杂

固件编译速度

由计算机性能决定

由计算机性能决定

是否受到本地网络限制

是(需要拉取外网资源)

是(需要拉取外网资源)

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

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

在 CODING 中创建 DevOps 项目

首先我们需要在 CODING 中创建一个 DevOps 项目。如果你还没有 CODING 账号,请戳这里免费注册。

2020053121452320200531214523

这个项目将存放我们的 NodeMCU 固件的代码,在创建完成后,进入项目,点击代码仓库->克隆,获取项目代码仓库的地址。

2020053121504020200531215040

自定义 NodeMCU Firmware

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

注意

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

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

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

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

配置远端库

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

在工程文件夹中右击,选择 Git Gui Here,选择 Remote->Add...。

2020053122274520200531222745

Name 填写 coding,Location 填写 CODING 远端代码仓库的地址,如图,最后点击 Add。

2020053122292220200531222922

然后就可以素质四连(Rescan、Stage Changed、SignOff、Commit)了,最后记得 Push 到 Coding。

这里需要选择好远端库,不要选 origin,选刚刚名称是 coding 的那个。(我这里远端库叫 git@e.coding)

2020053122332020200531223320

创建制品库

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

在 CODING 项目页面,选择制品库,创建仓库。

2020053122421420200531224214

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

创建持续集成任务

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

他会让你选择构建计划模板,为了方便配置,我们直接选择 CODING Generic 制品上传。

2020053122460220200531224602

给你的构建计划起一个名字,在构建过程的第二步,选择刚刚创建的 Generic 仓库名称,取消勾选“创建后触发构建”,点击确定。

2020053122481520200531224815

点击“...”->设置,进入构建计划设置,选择流程配置选项卡,直接使用文本编辑器,粘贴入一下内容。

代码语言: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 制品库以缩短推送时间。了解更多

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

2020060223160420200602231604

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

开始编译!

发起一次构建。如果手动发起触发信息是手动触发,同时也支持通过代码更新自动触发构建。

2020053122541220200531225412

我们可以通过流程图表和日志来获取构建的状态信息。

2020053122543020200531225430

获取编译好的固件

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

2020053122580420200531225804

在 CODING 项目页面,点击制品库,我们可以看到生成好的 bin 包。

2020053122594420200531225944

点击下载,即可下载我们自己编译好的固件包。

点击文件名,进入制品详情,通过版本列表,我们可以获取我们曾经编译过的固件包。

2020053123014320200531230143

参考文档

  • NodeMCU Documentation
  • marcelstoer/nodemcu-build dockerfile
  • CODING 持续集成文档

0 人点赞