這是 Jerry 2021 年的第 61 篇文章,也是汪子熙公眾號總共第 338 篇原創(chuàng)文章。
短歌行
曹操
對酒當(dāng)歌,人生幾何!
譬如朝露,去日苦多。
慨當(dāng)以慷,憂思難忘。
何以解憂?唯有杜康。
青青子衿,悠悠我心。
但為君故,沉吟至今。
呦呦鹿鳴,食野之蘋。
我有嘉賓,鼓瑟吹笙。
明明如月,何時可掇?
憂從中來,不可斷絕。
越陌度阡,枉用相存。
契闊談讌,心念舊恩。
月明星稀,烏鵲南飛。
繞樹三匝,何枝可依?
山不厭高,海不厭深。
周公吐哺,天下歸心。
Jerry 之前寫過一篇文章,使用 abapGit 在 ABAP On-Premises 系統(tǒng)和 SAP 云平臺 ABAP 環(huán)境之間進(jìn)行代碼傳輸,介紹了 abapGit 這個開源工具的基本用法。
本文 Jerry 介紹基于 abapGit 和另一個開源工具,abaplint,實現(xiàn) ABAP 持續(xù)集成的一個具體場景:當(dāng)有新的代碼提交到 ABAP 代碼倉庫時,自動觸發(fā) ABAP 代碼檢測。
當(dāng)然,持續(xù)集成指的是,只要有新的代碼提交,就自動運行構(gòu)建和測試,反饋運行結(jié)果。僅當(dāng)能確保新提交的代碼符合預(yù)期,再將新代碼集成到主干。因此本文介紹的例子,只是 ABAP 持續(xù)集成中的一個小步驟而已。
我們首先來簡單了解一下 abaplint.使用 SAP UI5 開發(fā)的朋友們,想必都接觸過 ESLint,一款 JavaScript 代碼檢測工具。
Jerry 每天用 Angular 開發(fā) SAP Commerce Cloud UI,也借助了 Visual Studio Code 名為 TSLint 的擴展,來對 TypeScript 代碼進(jìn)行檢測。
同樣,abaplint 也是一款對 ABAP 代碼根據(jù)指定的規(guī)則進(jìn)行檢測的開源工具,基于 TypeScript 編寫。
下面是它的一個 demo 網(wǎng)站:
https://playground.abaplint.org/
其中 abaplint.json 是配置文件,定義了檢測規(guī)則。違反規(guī)則的代碼,會通過紅色波浪線高亮出來:
我按照 abaplint 檢測出來的提示對代碼進(jìn)行了調(diào)整,之后警告信息都消失了。
注意,abaplint 對代碼的檢測和 ABAP 服務(wù)器上的代碼語法檢查(Syntax Check)完全是兩回事。后者由位于 ABAP 內(nèi)核的 Compiler 完成,而前者只是 TypeScript 實現(xiàn)的基于源代碼文本級別的檢測,abaplint 本身并不能從語法層面識別 ABAP 語言,只是機械地基于文本靜態(tài)分析,完成 abaplint.json 里定義的檢測任務(wù)而已。
下面介紹如何配置 abapGit 和 abaplint 實現(xiàn)最簡單的 ABAP 持續(xù)集成。這個例子不需要任何開發(fā),僅僅包含一些配置工作,不超過半小時即可完成。
(1) 創(chuàng)建一個 Github 倉庫存放 ABAP 代碼。我選擇把所有的 ABAP 代碼放置在 src 文件夾內(nèi)。
注意:abaplint 只能掃描特殊格式的 ABAP 代碼文件,即經(jīng)過 abapGit 提交的 ABAP 代碼。
新建一個 .github 文件夾,里面放一個子文件夾 workflows, 包含一個 abaplint.yml 文件。
這個 abaplint.yml 文件,負(fù)責(zé)指定當(dāng)該代碼倉庫有新的代碼提交時,通過 Github Workflow 執(zhí)行的操作內(nèi)容。其中第2行開始的 on 指令,告訴 Github,當(dāng) main 分支有 push 或者 pull request 到來時,執(zhí)行名為 abaplint 的 job. 而后者的工作內(nèi)容,其具體步驟從第14行的 steps 指令開始定義。
第15行的 uses 指令,意思是重用 Github 自帶的名為 setup-node action,完成 Node.js 運行環(huán)境的準(zhǔn)備。
setup-node 這個 action 實現(xiàn)于如下的 Github 倉庫:
https://github.com/actions/setup-node
而 run 命令里維護的如下命令行,意思是 Node.js 運行環(huán)境準(zhǔn)備好之后,安裝 abaplint 命令行工具并執(zhí)行。
npm -g install @abaplint/cli
abaplint
(2) 根目錄下新建 abaplint.json,定義 ABAP 代碼檢測規(guī)則。為了演示起見,我只啟用了如下圖所示的幾條簡單規(guī)則。關(guān)于 abaplint.json 支持的所有檢測規(guī)則,請查閱這個鏈接:
https://github.com/abapGit/abapGit/blob/main/abaplint.json
完成 abaplint.yml 和 abaplint.json 兩個文件的創(chuàng)建之后,提交任意代碼到 main 分支,即可在代碼倉庫的 Actions 標(biāo)簽頁里,看到針對這些代碼提交,自動執(zhí)行的 abaplint 檢測記錄:
單擊一條進(jìn)去,能查看到引起當(dāng)前工作流執(zhí)行失敗的原因——代碼違反了我自定義的 abaplint 檢測規(guī)則:定義的關(guān)鍵字需要小寫,使用了被標(biāo)注為 obsolete 的關(guān)鍵字 ADD 等等。
目前開源社區(qū)里用于持續(xù)集成的構(gòu)建和測試的自動化工具層出不窮,Jerry 工作的 SAP Commerce Cloud Spartacus UI 開發(fā)團隊使用的是 Travis.
Travis 支持綁定 Github 的代碼倉庫,只要有新的代碼提交,就會自動抓取。然后提供一個運行環(huán)境,執(zhí)行測試,完成構(gòu)建。
為了讓我的 ABAP 代碼倉庫提交的代碼能夠被 Travis 抓取,我在項目根目錄下創(chuàng)建了 .travis.yml 文件,內(nèi)容如下圖所示,其 script 區(qū)域的命令行和前文介紹的 abaplint.yml 內(nèi)包含的內(nèi)容完全一致,這里不再贅述。
完成 .travis.yml 文件的編輯之后,重新提交,登錄 Travis 控制臺,發(fā)現(xiàn)這次提交觸發(fā)了一次新的 Travis 構(gòu)建:
https://app.travis-ci.com/github/wangzixi-diablo/abap-ci-test
構(gòu)建失敗,原因還是因為違反了 abaplint.json 定義的那幾條規(guī)則:
老老實實按照 abaplint 輸出的結(jié)果把 ABAP 代碼里所有違反規(guī)則之處修復(fù),重新提交,這次 Github 工作流和 Travis 里的構(gòu)建日志終于都顯示綠燈了。
本文演示用的 ABAP 代碼倉庫地址如下:
https://github.com/wangzixi-diablo/abap-ci-test
總結(jié)
本文通過一個具體的例子,介紹了如何利用 abapGit 和 abaplint,以及 Travis,實現(xiàn) ABAP 持續(xù)集成場景里基于新的代碼提交,自動進(jìn)行代碼檢測的步驟。
在實際的 SAP 產(chǎn)品開發(fā)項目中,持續(xù)集成的場景復(fù)雜度遠(yuǎn)遠(yuǎn)大于本例,因此通常都由專人甚至專門的團隊來完成。
感謝閱讀。
Jerry 的 ABAP 專題
使用Java+SAP云平臺+SAP Cloud Connector調(diào)用ABAP On-Premise系統(tǒng)里的函數(shù)
使用abapGit在ABAP On-Premises系統(tǒng)和SAP云平臺ABAP環(huán)境之間進(jìn)行代碼傳輸
Jerry帶您了解Restful ABAP Programming模型系列之二:Action和Validation的實現(xiàn)
Jerry帶您了解Restful ABAP Programming模型系列之三:云端ABAP應(yīng)用調(diào)試
ABAP開發(fā)者上云的時候到了 - 現(xiàn)在大家可以免費使用SAP云平臺ABAP環(huán)境的試用版了
如何基于Restful ABAP Programming模型開發(fā)并部署一個支持增刪改查的Fiori應(yīng)用
SAP ABAP一組關(guān)鍵字 IS BOUND, IS NOT INITIAL和IS ASSIGNED的用法辨析
聯(lián)系客服