基于 abapGit 和 abaplint 的 ABAP 持续集成的一个例子
這是 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/setup-node
而 run 命令里維護的如下命令行,意思是 Node.js 運行環境準備好之后,安裝 abaplint 命令行工具并執行。
npm -g install @abaplint/cli
abaplint
(2) 根目錄下新建 abaplint.json,定義 ABAP 代碼檢測規則。為了演示起見,我只啟用了如下圖所示的幾條簡單規則。關于 abaplint.json 支持的所有檢測規則,請查閱這個鏈接:
https://github.com/abapGit/abapGit/blob/main/abaplint.json
完成 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/github/wangzixi-diablo/abap-ci-test
構建失敗,原因還是因為違反了 abaplint.json 定義的那幾條規則:
老老實實按照 abaplint 輸出的結果把 ABAP 代碼里所有違反規則之處修復,重新提交,這次 Github 工作流和 Travis 里的構建日志終于都顯示綠燈了。
本文演示用的 ABAP 代碼倉庫地址如下:
https://github.com/wangzixi-diablo/abap-ci-test
總結
本文通過一個具體的例子,介紹了如何利用 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 的過去,現在和未來
總結
以上是生活随笔為你收集整理的基于 abapGit 和 abaplint 的 ABAP 持续集成的一个例子的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何在 SAP Cloud for Cu
- 下一篇: 什么是挖矿显卡(搞清楚什么是挖矿)