背景
20.03-LTS-SP1目前golang的版本过低(1.13.3),上游社区已经不再维护
老版本的CVE没有补丁,需要从高版本回合,但是在改动较大,或者涉及runtime等底层修改的情况下,回合与验证比较困难。我们希望升级到golang-1.15.7。
版本变化
Go1范围内升级:1.13.3 --> 1.15.7
差异分析
golang-1.14和1.15都确保Go1兼容性:the release maintains the Go 1 promise of compatibility。
Go1.14
golang-1.14关键特性包括:goroutine支持异步抢占,defer性能优化,定时器性能优化等。
删除接口
变更接口
-
go get 命令行不再支持-mod选项。根据go.mod文件和vendor目录是否存在自动推断。
-
go test -v采用流式输出,以前是在所有测试都结束后才会打印输出。
-
go list -m不再忽略vendor中没有提供包的依赖,发现会报错。该命令很少使用。
-
标准库encoding/json: Compact()不再转义U+2028 and U+2029字符,如果希望转义,可以调用HTMLEscape()、Number()不再支持无效数字
新增接口
无
Go1.15
golang-1.15关键特性包括链接器改进,新增标准库time/tzdata。
删除接口
语言层面无变更:There are no changes to the language.
变更接口
-
标准库io/ioutil:Tempdir参数模式不支持含有路径分隔符(安全增强)
-
标准库:弃用将X.509CommonName作为主机名,可以通过设置x509ignoreCN=0临时开启
新增接口
- tzdata:增加tzdata包(将时区数据嵌入到Go应用二进制文件中)
影响分析
经分析,本次golang升级涉及剔除不安全协议、CVE修复,客户感知小,版本提升大,申请在openEuler 20.03-LTS-SP1中进行升级。
遗留问题
- 软件包涉及梳理(编译)
- 软件包显示调用接口梳理
遗留问题分析
涉及组件
openEuler-20.03-LTS-SP1中,使用golang作为编译依赖的包一共28款,其中EPOL类软件6款。
类型 | 软件包 |
---|---|
常规软件 | A-Tune、audit、authz、containerd、containernetworking-plugins、docker、go-compilers、golang、golang-github-cpuguy83-go-md2man、golang-github-russross-blackfriday、isula-build、iSulad-img、isula-transform、kata-containers、libnetwork、lxcfs-tools、podman、runc、skopeo、syscontainer-tools、thrift、umoci |
EPOL | startdde、deepin-dbus-generator、dde-daemon、dde-api、deepin-desktop-schemas、kubernetes |
编译问题
在升级golang至1.15.7之后,有10款软件无法正常编译,其中8款在解决go-compilers编译问题之后可以顺利编译
-
常规软件:
软件包 备注 A-Tune 自身编译问题 go-compilers 自身编译问题 golang-github-cpuguy83-go-md2man 依赖go-compilers golang-github-russross-blackfriday 依赖go-compilers containernetworking-plugins 依赖go-compilers podman 依赖go-compilers skopeo 依赖go-compilers -
EPOL:
软件包 备注 deepin-dbus-generator 依赖go-compilers dde-daemon 依赖go-compilers dde-api 依赖go-compilers
修复建议
需要 A-Tune(@hanxinke)、go-compilers(@ultra_planet)软件包owner进行修复
A-Tune
报错:go: inconsistent vendoring in /home/abuild/rpmbuild/BUILD/A-Tune
go mod vendor
go-compilers
报错:unexpected directory layout
尝试处理golist问题。