ESP-C3入门20. CentOS开发环境及Jenkins流水线
一、准备环境
- CentOS8
- 已经正常安装Jenkins
二、升级 cmake
cmake 升到 3.16以上。
cmake --version
# 安装 g++
sudo yum install gcc-c++
export CXX=g++# 安装 CMake 的依赖项
sudo yum install -y openssl-devel# 下载 CMake 源码并进行编译安装
wget https://github.com/Kitware/CMake/releases/download/v3.21.1/cmake-3.21.1.tar.gz
tar -zxvf cmake-3.21.1.tar.gz
cd cmake-3.21.1
./bootstrap
make
sudo make install
三、升级 bash
bash要升到 4 以上。
cd /opt
wget -v http://ftp.gnu.org/gnu/bash/bash-5.1.16.tar.gz
tar zxvf bash-5.1.16.tar.gz
cd bash-5.1.16/
./configuremake install
mv /bin/bash /bin/bash.bak && ln -s /usr/local/bin/bash /bin/bash
四、安装IDF编译工具链
1. 替换源
git clone https://gitee.com/EspressifSystems/esp-gitee-tools.git
cd esp-gitee-tools/
./jihu-mirror.sh set
# 依赖准备
sudo yum -y update && sudo yum install git wget flex bison gperf cmake ninja-build ccache dfu-util libusbx
在这里遇到个问题,提示:
Public key for jenkins-2.401.2-1.1.noarch.rpm is not installed,
意思是系统中缺少 Jenkins 软件包的公钥,因此无法验证软件包的真实性。
执行下面操作:
cd /opt
wget -O jenkins.rpm https://pkg.jenkins.io/redhat-stable/jenkins-2.401.2-1.1.noarch.rpm --no-check-certificate
sudo yum localinstall jenkins.rpm
2. 安装python3.8
ESP-IDF 需要python3.7以上版本,如果yum仓库版本比较低,则需要手动下载安装。
cd /opt
wget https://www.python.org/ftp/python/3.8.16/Python-3.8.16.tgz
tar -zxvf Python-3.8.16.tgz
ls
cd Python-3.8.16./configure --prefix=/opt/Python-3.8.16 --with-openssl=/usr/local/openssl
make
make install
rm -rf /usr/bin/pip3 /usr/bin/python3
ln -s /usr/local/bin/pip3.8 /usr/bin/pip3
ln -s /usr/local/bin/python3.8 /usr/bin/python3
2. 获取 ESP-IDF
mkdir -p /opt/esp
cd /opt/esp
git clone -b v5.1 --recursive https://github.com/espressif/esp-idf.git
3. 安装 ESP-IDF
cd /opt/esp/esp-idf
# 提高下载速度
export IDF_GITHUB_ASSETS="dl.espressif.com/github_assets"
./install.sh esp32,esp32s2,esp32c2,esp32c3
. ./export.sh
五、流水线设置
Jenkinsfile脚本 :
pipeline{agent anyenvironment {IDF_PATH = "/opt/esp/esp-idf" // 替换为您的 ESP-IDF 安装路径IDF_PYTHON_ENV = "/usr/bin/python3" // 替换为您的 Python 虚拟环境路径(可选)}parameters{choice(name: 'ENV', choices: 'intranet\ntest\n', description: '部署环境')choice(name: 'CHIPSET', choices: 'esp32c3\nesp32c2\n', description: '芯片')choice(name: 'VERSION_TYPE', choices: '最新版本\n指定版本\n', description: '版本指定方式')string(name: 'VERSION', description: '版本', defaultValue: '1')choice(name: 'LOG', choices: '打印\n屏蔽\n', description: '是否打印日志')}stages{stage('Build') {steps {echo 'Building'script {echo "start"sh "/usr/local/bin/python3 /opt/esp/esp-idf/tools/idf_tools.py install"sh "cd $IDF_PATH && . /opt/esp/esp-idf/export.sh" // 激活 ESP-IDF 环境和 Python 虚拟环境if (params.VERSION_TYPE == '最新版本') {// 从 constants.h 文件中获取 MODULE_SOFT_VERSION 的值def versionHex = sh(returnStdout: true,script: "cat main/config/include/constants.h | grep 'MODULE_SOFT_VERSION' | awk '{print \$3}'").trim()// 将十六进制转换为十进制def versionDecimal = versionHex.toLong(16)// 赋值给 VERSIONparams.VERSION = versionDecimal.toString()}sh "idf.py set-target ${params.CHIPSET}"sh "idf.py build" // 在工作目录下运行 idf.py build 命令进行编译String calcPath = '/www/server/tomcat/webapps/upload';// 上传到指定路径sh "scp ${env.WORKSPACE}/build/whr_wifi_esp32.bin root@${host['test']}:${calcPath}/${params.VERSION}"sh "scp ${env.WORKSPACE}/build/partition_table/partition-table.bin root@${host['test']}:${calcPath}/${params.VERSION}"// 这里可以根据需要打印下载地址echo "烧写命令"echo "/opt/esp/esp-idf/components/esptool_py/esptool/esptool.py -p (PORT) -b 460800 --before default_reset --after hard_reset --chip ${params.CHIPSET} write_flash --flash_mode dio --flash_size 4MB --flash_freq 60m 0x0 build/bootloader/bootloader.bin 0x8000 build/partition_table/partition-table.bin 0x10000 build/project.bin"echo "或运行 'idf.py -p (PORT) flash'"}}}}
}
六、问题处理
1. 找不到 GLIBCXX_3.4.20
Run Build Command(s):/usr/bin/ninja-build cmTC_a92c3 && [1/2] Building CXX object CMakeFiles/cmTC_a92c3.dir/testCXXCompiler.cxx.objFAILED: CMakeFiles/cmTC_a92c3.dir/testCXXCompiler.cxx.obj /root/.espressif/tools/riscv32-esp-elf/esp-12.2.0_20230208/riscv32-esp-elf/bin/riscv32-esp-elf-g++ -march=rv32imc_zicsr_zifencei -o CMakeFiles/cmTC_a92c3.dir/testCXXCompiler.cxx.obj -c /var/lib/jenkins/workspace/whr-wifi-esp32/build/CMakeFiles/CMakeTmp/testCXXCompiler.cxx/root/.espressif/tools/riscv32-esp-elf/esp-12.2.0_20230208/riscv32-esp-elf/bin/../libexec/gcc/riscv32-esp-elf/12.2.0/cc1plus: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by /root/.espressif/tools/riscv32-esp-elf/esp-12.2.0_20230208/riscv32-esp-elf/bin/../libexec/gcc/riscv32-esp-elf/12.2.0/cc1plus)
执行:
strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX

拷一个 libstdc++.so.6.0.25到 /usr/lib64,执行:
ln -s libstdc++.so.6.0.25 libstdc++.so.6
ls -l libstdc++.so.6
strings libstdc++.so.6 | grep GLIBC
2. 提示"/lib64/libc.so.6: version GLIBC_2.18' not found (required by /lib64/libstdc++.so.6)"
curl -O http://ftp.gnu.org/gnu/glibc/glibc-2.18.tar.gz
tar zxf glibc-2.18.tar.gz
cd glibc-2.18/
mkdir build
cd build/
../configure --prefix=/usr
make -j2
make install
相关文章:
ESP-C3入门20. CentOS开发环境及Jenkins流水线
一、准备环境 CentOS8已经正常安装Jenkins 二、升级 cmake cmake 升到 3.16以上。 cmake --version # 安装 g sudo yum install gcc-c export CXXg# 安装 CMake 的依赖项 sudo yum install -y openssl-devel# 下载 CMake 源码并进行编译安装 wget https://github.com/Kitwa…...
服务器被爬虫恶意攻击怎么办?
在有预算的情况可以采购第三方服务防火墙,没钱就使用开源的WAF进行防护。 # WAF防火墙的基本防护原理 WAF(Web 应用防火墙)可以使用多种技术来防止恶意爬虫攻击,例如: 1. 黑名单:WAF 可以使用黑名单技术来…...
JavaScript正则表达式之座机号/手机号验证校验规则
引用:https://www.bilibili.com/read/cv18300539/ 本文对利用正则表达式对手机号码进行了验证 支持格式: 座机 :xxx-xxxxxxxx、xxxxxxxxxxxx …座机区号的横杠可有可无 手机:xxxxxxxxxxx JavaScript: var: checkPhone (rule,…...
黑客学习手册(自学网络安全)
一、首先,什么是黑客? 黑客泛指IT技术主攻渗透窃取攻击技术的电脑高手,现阶段黑客所需要掌握的远远不止这些。 二、为什么要学习黑客技术? 其实,网络信息空间安全已经成为海陆空之外的第四大战场,除了国…...
获取非叶子节点的grad(retain_grad()、hook)【为了解决grad值是None的问题】
在调试过程中, 有时候我们需要对中间变量梯度进行监控, 以确保网络的有效性, 这个时候我们需要打印出非叶节点的梯度, 为了实现这个目的, 我们可以通过两种手段进行, 分别是: retain_grad()hook 不过我感觉“hook”比“retain_grad()”要麻烦.....,所以我感觉还是…...
JMeter(八):响应断言详解
响应断言 :对服务器的响应进行断言校验 (1)应用范围: main sample and sub sample, main sample only , sub-sample only , jmeter variable 关于应用范围,我们大多数勾选“main sample only” 就足够了,因为我们一个请求,实质上只有一个请求。但是当我们发一个请求时,…...
【网络编程】IO复用的应用一:非阻塞connect
在connect连接中,若socket以非阻塞的方式进行连接,则系统内设置的TCP三次握手超时时间为0,所以它不会等待TCP三次握手完成,直接返回,错误为EINPROGRESS。 所以,我们可以通过判断connect时返回的错误码是…...
Spring注解开发,bean的作用范围及生命周期、Spring注解开发依赖注入
🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaweb 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 Spring注解开发 一、注解开发定义Bean二、纯注解开发Bean三…...
C#设计模式之---原型模式
原型模式(Prototype Pattern) 原型模式(Prototype Pattern) 是用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式是一种创建型设计模式。也就是用一个已经创建的实例作为原型,通过…...
STM32入门学习之外部中断
1.STM32的IO口可以作为外部中断输入口。本文通过按键按下作为外部中断的输入,点亮LED灯。在STM32的19个外部中断中,0-15为外部IO口的中断输入口。STM32的引脚分别对应着0-15的外部中断线。比如,外部中断线0对应着GPIOA.0-GPIOG.0,…...
Jenkins 配置maven和jdk
前提:服务器已经安装maven和jdk 一、在Jenkins中添加全局变量 系统管理–>系统配置–>全局属性–>环境变量 添加三个全局变量 JAVA_HOME、MAVEN_HOME、PATH 二、配置maven 系统管理–>全局工具配置–>maven–>新增 新增配置 三、配置JDK 在系统管…...
Leetcode | Binary search | 22. 74. 162. 33. 34. 153.
22. Generate Parentheses 要意识到只要还有左括号,就可以放到path里。只要右括号数量小于左括号,也可以放进去。就是valid的组合。recurse两次 74. Search a 2D Matrix 看成sorted list就好。直接用m*n表示最后一位的index,并且每次只需要 …...
生命在于折腾——面试问题汇总
这里面的问题都是我参加面试时候遇到的问题,大家就这样看吧。 一、个人情况 1、自我介绍 2、为什么离开上一家公司 3、有没有参加过HVV 4、介绍一下上家公司的项目 5、小程序和公众号渗透测试做过么 6、实习工资多少 7、有挖过漏洞么 二、基础知识 1、信息收集的…...
<Java>Map<String,Object>中解析Object类型数据为数组格式
背景: 前端:入参为字符串和数组类型;通过json字符串传给后台, 后台:后台通过工具解析为Map<String,Object>,然后需要解析出Map里面的数组值做操作; 需求: 入参&…...
别再分库分表了,试试TiDB!
什么是NewSQL 传统SQL的问题 升级服务器硬件 数据分片 NoSQL 的问题 优点 缺点 NewSQL 特性 NewSQL 的主要特性 三种SQL的对比 TiDB怎么来的 TiDB社区版和企业版 TIDB核心特性 水平弹性扩展 分布式事务支持 金融级高可用 实时 HTAP 云原生的分布式数据库 高度兼…...
Java进阶之Dump文件初体验
视频地址:https://www.bilibili.com/video/BV1Ak4y137oh 学习文章:https://d9bp4nr5ye.feishu.cn/wiki/VQoAwlzrXiLFZekuLIyc1uK5nqc 最近线上频繁的内存告警,同事A通过分析dump文件解决了这个问题,我当然是不会放过这种学习的机…...
基于扩展(EKF)和无迹卡尔曼滤波(UKF)的电力系统动态状态估计(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
曲线拟合(MATLAB拟合工具箱)位置前馈量计算(压力闭环控制应用)
利用PLC进行压力闭环控制的项目背景介绍请查看下面文章链接,这里不再赘述。 信捷PLC压力闭环控制应用(C语言完整PD、PID源代码)_RXXW_Dor的博客-CSDN博客闭环控制的系列文章,可以查看PID专栏的的系列文章,链接如下:张力控制之速度闭环(速度前馈量计算)_RXXW_Dor的博客-CSD…...
小程序使用echarts
参考文档:echarts官网、echarts-for-weixin 第一步引入组件库,可直接从echarts-for-weixin下载,也可以从echarts官网自定义生成,这里我们就不贴了组件库引入好后,就是页面引用啦,废话不多说,直…...
面向对象——封装
C面向对象的三大特性为:封装、继承、多态 C认为万事万物都皆为对象,对象上有其属性和行为 例如: 人可以作为对象,属性有姓名、年龄、身高、体重…,行为有走、跑、跳、吃饭、唱歌… 车也可以作为对象…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
【Linux】自动化构建-Make/Makefile
前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...
在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例
目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码:冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...
java高级——高阶函数、如何定义一个函数式接口类似stream流的filter
java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用(Math::max) 2 函数接口…...
数据库——redis
一、Redis 介绍 1. 概述 Redis(Remote Dictionary Server)是一个开源的、高性能的内存键值数据库系统,具有以下核心特点: 内存存储架构:数据主要存储在内存中,提供微秒级的读写响应 多数据结构支持&…...
PH热榜 | 2025-06-08
1. Thiings 标语:一套超过1900个免费AI生成的3D图标集合 介绍:Thiings是一个不断扩展的免费AI生成3D图标库,目前已有超过1900个图标。你可以按照主题浏览,生成自己的图标,或者下载整个图标集。所有图标都可以在个人或…...
如何把工业通信协议转换成http websocket
1.现状 工业通信协议多数工作在边缘设备上,比如:PLC、IOT盒子等。上层业务系统需要根据不同的工业协议做对应开发,当设备上用的是modbus从站时,采集设备数据需要开发modbus主站;当设备上用的是西门子PN协议时…...
