这是 Jerry 2021 年的第 61 篇文章,也是汪子熙公众号总共第 338 篇原创文章。
短歌行
曹操
对酒当歌,人生几何!
譬如朝露,去日苦多。
慨当以慷,忧思难忘。
何以解忧?唯有杜康。
青青子衿,悠悠我心。
但为君故,沉吟至今。
呦呦鹿鸣,食野之苹。
我有嘉宾,鼓瑟吹笙。
明明如月,何时可掇?
忧从中来,不可断绝。
越陌度阡,枉用相存。
契阔谈讌,心念旧恩。
月明星稀,乌鹊南飞。
绕树三匝,何枝可依?
山不厌高,海不厌深。
周公吐哺,天下归心。
Jerry 之前写过一篇文章,应用 abapGit 在 ABAP On-Premises 零碎和 SAP 云平台 ABAP 环境之间进行代码传输,介绍了 abapGit 这个开源工具的根本用法。
本文 Jerry 介绍基于 abapGit 和另一个开源工具,abaplint,实现 ABAP 继续集成的一个具体场景:当有新的代码提交到 ABAP 代码仓库时,主动触发 ABAP 代码检测。
当然,继续集成指的是,只有有新的代码提交,就主动运行构建和测试,反馈运行后果。仅当能确保新提交的代码合乎预期,再将新代码集成到骨干。因而本文介绍的例子,只是 ABAP 继续集成中的一个小步骤而已。
咱们首先来简略理解一下 abaplint. 应用 SAP UI5 开发的敌人们,想必都接触过 ESLint,一款 JavaScript 代码检测工具。
Jerry 每天用 Angular 开发 SAP Commerce Cloud UI,也借助了 Visual Studio Code 名为 TSLint 的扩大,来对 TypeScript 代码进行检测。
同样,abaplint 也是一款对 ABAP 代码依据指定的规定进行检测的开源工具,基于 TypeScript 编写。
上面是它的一个 demo 网站:
https://playground.abaplint.org/
其中 abaplint.json 是配置文件,定义了检测规定。违反规定的代码,会通过红色波浪线高亮进去:
我依照 abaplint 检测进去的提醒对代码进行了调整,之后正告信息都隐没了。
留神,abaplint 对代码的检测和 ABAP 服务器上的代码语法查看 (Syntax Check) 齐全是两回事。后者由位于 ABAP 内核的 Compiler 实现,而前者只是 TypeScript 实现的基于源代码文本级别的检测,abaplint 自身并不能从语法层面辨认 ABAP 语言,只是机械地基于文本动态剖析,实现 abaplint.json 里定义的检测工作而已。
上面介绍如何配置 abapGit 和 abaplint 实现最简略的 ABAP 继续集成。这个例子不须要任何开发,仅仅蕴含一些配置工作,不超过半小时即可实现。
(1) 创立一个 Github 仓库寄存 ABAP 代码。我抉择把所有的 ABAP 代码搁置在 src 文件夹内。
留神:abaplint 只能扫描非凡格局的 ABAP 代码文件,即通过 abapGit 提交的 ABAP 代码。
新建一个 .github 文件夹,外面放一个子文件夹 workflows, 蕴含一个 abaplint.yml 文件。
这个 abaplint.yml 文件,负责指定当该代码仓库有新的代码提交时,通过 Github Workflow 执行的操作内容。其中第 2 行开始的 on 指令,通知 Github,当 main 分支有 push 或者 pull request 到来时,执行名为 abaplint 的 job. 而后者的工作内容,其具体步骤从第 14 行的 steps 指令开始定义。
第 15 行的 uses 指令,意思是重用 Github 自带的名为 setup-node action,实现 Node.js 运行环境的筹备。
setup-node 这个 action 实现于如下的 Github 仓库:
https://github.com/actions/se…
而 run 命令里保护的如下命令行,意思是 Node.js 运行环境筹备好之后,装置 abaplint 命令行工具并执行。
npm -g install @abaplint/cli
abaplint
(2) 根目录下新建 abaplint.json, 定义 ABAP 代码检测规定。为了演示起见,我只启用了如下图所示的几条简略规定。对于 abaplint.json 反对的所有检测规定,请查阅这个链接:
https://github.com/abapGit/ab…
实现 abaplint.yml 和 abaplint.json 两个文件的创立之后,提交任意代码到 main 分支,即可在代码仓库的 Actions 标签页里,看到针对这些代码提交,主动执行的 abaplint 检测记录:
单击一条进去,能查看到引起当前工作流执行失败的起因——代码违反了我自定义的 abaplint 检测规定:定义的关键字须要小写,应用了被标注为 obsolete 的关键字 ADD 等等。
目前开源社区里用于继续集成的构建和测试的自动化工具层出不穷,Jerry 工作的 SAP Commerce Cloud Spartacus UI 开发团队应用的是 Travis.
Travis 反对绑定 Github 的代码仓库,只有有新的代码提交,就会主动抓取。而后提供一个运行环境,执行测试,实现构建。
为了让我的 ABAP 代码仓库提交的代码可能被 Travis 抓取,我在我的项目根目录下创立了 .travis.yml 文件,内容如下图所示,其 script 区域的命令行和前文介绍的 abaplint.yml 内蕴含的内容完全一致,这里不再赘述。
实现 .travis.yml 文件的编辑之后,从新提交,登录 Travis 控制台,发现这次提交触发了一次新的 Travis 构建:
https://app.travis-ci.com/git…
构建失败,起因还是因为违反了 abaplint.json 定义的那几条规定:
老老实实依照 abaplint 输入的后果把 ABAP 代码里所有违反规定之处修复,从新提交,这次 Github 工作流和 Travis 里的构建日志终于都显示绿灯了。
本文演示用的 ABAP 代码仓库地址如下:
https://github.com/wangzixi-d…
总结
本文通过一个具体的例子,介绍了如何利用 abapGit 和 abaplint,以及 Travis,实现 ABAP 继续集成场景里基于新的代码提交,主动进行代码检测的步骤。
在理论的 SAP 产品开发我的项目中,继续集成的场景复杂度远远大于本例,因而通常都由专人甚至专门的团队来实现。
感激浏览。
更多 Jerry 的原创文章,尽在:” 汪子熙 ”:
Jerry 的 ABAP 专题
- Jerry 的 ABAP, Java 和 JavaScript 乱炖
- ABAP 开发人员将来应该学些什么
- Jerry 2017 年的五一小长假:8 种经典排序算法的 ABAP 实现
- Jerry 的 ABAP 原创技术文章合集
- 300 行 ABAP 代码实现一个最简略的区块链原型
- 应用 Java+SAP 云平台 +SAP Cloud Connector 调用 ABAP On-Premise 零碎里的函数
- 在 SAP 云平台的 CloudFoundry 环境下生产 ABAP On-Premise OData 服务
- ABAP vs Java,蛙泳 vs 自由泳
- 聊聊 C 语言和 ABAP
- 入手应用 ABAP Channel 开发一些小工具,晋升日常工作效率
- 我用 ABAP 做过的那些无聊的事件
- 不喜爱 SAP GUI?那试试用 Eclipse 进行 ABAP 开发吧
- 应用 Visual Studio Code 编写和激活 ABAP 代码
- 你的 ABAP 程序给佛祖开过光么?来试试 Jerry 这个小技巧
- 在 SAP 云平台 ABAP 编程环境上编写第一段 ABAP 程序
- SAP 官网公布的 ABAP 编程标准
- ABAP Code Inspector 那些暗藏的性能,您都晓得吗?
- 还在用 ABAP 进行 SAP 产品的二次开发?来理解下这种全新的二次开发理念吧
- ABAP Netweaver 体内的那些寄生式编程语言
- 从 SAP 社区上的一篇博客开始,聊聊 SAP 产品命名背地的那份情怀
- 云端的 ABAP Restful 服务开发
- 如何在 SAP 云平台 ABAP 编程环境里把 CDS view 裸露成 OData 服务
- 应用 abapGit 在 ABAP On-Premises 零碎和 SAP 云平台 ABAP 环境之间进行代码传输
- 30 分钟用 Restful ABAP Programming 模型开发一个反对增删改查的 Fiori 利用
- Jerry 带您理解 Restful ABAP Programming 模型系列之二:Action 和 Validation 的实现
- Jerry 带您理解 Restful ABAP Programming 模型系列之三:云端 ABAP 利用调试
- SAP 云平台上的 ABAP 编程环境里如何生产第三方服务
- ABAP 开发者上云的时候到了 – 当初大家能够收费应用 SAP 云平台 ABAP 环境的试用版了
- 学而不思则罔 – SAP 云平台 ABAP 编程环境的由来和实用场景
- SAP 云平台里的三叉戟利用
- 如何基于 Restful ABAP Programming 模型开发并部署一个反对增删改查的 Fiori 利用
- SAP 2019 TechEd Key Note 解读:云时代下 SAP 从业人员如何做二次开发?
- 有哪些 ABAP 关键字和语法,到了 ABAP 云环境上就没方法用了?
- ABAP 开发环境终于反对以驼峰命名法主动格式化 ABAP 变量名了
- 利用 ABAP 740 的新关键字 REDUCE 实现一个理论工作工作
- 一段让人瑟瑟发抖的 ABAP 代码
- 昨日万圣节 ABAP 怪兽级代码谜团,颁布答案啦
- 介绍一种在 ABAP 内核态进行内表高效拷贝的办法
- 应用 SAP Cloud Application Programming 模型开发 OData 的一个理论例子
- 当 ABAP 遇见普罗米修斯
- 应用 ABAP 绘制可伸缩矢量图
- ABAP 开发环境语法高亮的那些事儿
- SAP 谬误音讯调试之七种武器:让所有的谬误音讯都能被定位
- 应用 ABAP 操作 Excel 的几种办法
- SAP GUI 里的收藏夹事务码管理工具
- SAP GUI 和 Windows 注册表
- 有了 Debug 权限就能干坏事?小心了,你的一举一动尽在系统监控中
- ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX 这些东东是什么鬼
- 实现 ABAP 条件断点的三种形式
- 应用 SAT 跟踪监控从浏览器关上的 SAP 利用的性能和调用栈
- 一个 13 年 ABAP 老兵的倡议:理解这些基础知识,对 ABAP 开发有百利而无一害
- SAP ABAP Netweaver 容器化, 不可能实现的工作吗?
- SAP 产品加强技术回顾
- SAP API 开发方法大全
- 浅谈 Java 和 SAP ABAP 的动态代理和动静代理,以及 ABAP 面向切面编程的尝试
- SAP ABAP 应用服务器的 HTTP 响应状态码(Status Code)
- SAP ABAP 里存在 Java List 这种汇合工具类么?CL_OBJECT_COLLECTION 理解一下
- ABAP 面试题系列:写一组会呈现死锁 (Deadlock) 的 ABAP 程序
- SAP ABAP Netweaver 服务器的规范登录形式解说
- SAP ABAP 关键字语法图和 ABAP 代码主动生成工具 Code Composer
- SAP ABAP SM50 的另类用处 – ABAP 工作过程对数据库表读取操作的检测
- 对于 SAP ABAP 字符变量和字符串变量字符个数的一个知识点,和一个血案
- SAP ABAP 一组关键字 IS BOUND, IS NOT INITIAL 和 IS ASSIGNED 的用法辨析
- SAP ABAP 和 Java 里的弱援用 (WeakReference) 和软援用(SoftReference)
- SAP AMDP 介绍 – ABAP 托管的 HANA 数据库过程
- 给你的 ABAP 对象打上标签(Tag)
- 历史上的明天:编程语言中 null 援用的十亿美元谬误
- ABAP Development Tool 代码模板和其余一些实用技巧汇总
- SAP ABAP Development Tool 进步开发效率的十个小技巧
- 如何在 SAP BTP 平台 ABAP 编程环境里生产基于 SOAP 的 Web Service
- ABAP 真的会过期吗?聊聊 ABAP 的过来,当初和将来