谁说大象不能跳舞?ABAP 开发也能实现持续集成

简介: 谁说大象不能跳舞?ABAP 开发也能实现持续集成

本世纪过去的十年里,计算机软件敏捷开发领域中的持续集成(Continuous Integration,简称 CI)理念,几乎已经渗透到了各个领域的软件开发中。

诞生于上世纪 80 年代的 ABAP 编程语言,论辈分,算是现在很多主流编程语言爷爷级的存在了。因为 ABAP 独特的技术栈,以及用来开发的都是复杂度极其高的企业管理软件,其软件实施周期动辄就是数年甚至十数年,使得不少人都觉得 ABAP 开发肯定与敏捷开发中的持续集成不然。

其实不然,笔者近年来工作的团队,就成功地使用了 ABAP 完成了持续集成的工作。

本文将笔者团队进行 ABAP 持续集成的实践分享给大家。

我们首先来简单了解一下 abaplint.

使用 SAP UI5 开发的朋友们,想必都接触过 ESLint,一款 JavaScript 代码检测工具。

笔者每天用 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 文件。

name: abaplint
categories:
  - linter
tags:
  - abap
license: MIT License
types:
  - cli
  - service
  - ide-plugin  
source: 'https://github.com/abaplint/abaplint'
homepage: 'https://abaplint.org'
description: 'Linter for ABAP, written in TypeScript.'

这个 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

name: 'Setup Node.js environment'
description: 'Setup a Node.js environment by adding problem matchers and optionally downloading and adding it to the PATH.'
author: 'GitHub'
inputs:
  always-auth:
    description: 'Set always-auth in npmrc.'
    default: 'false'
  node-version:
    description: 'Version Spec of the version to use. Examples: 12.x, 10.15.1, >=10.15.0.'
  node-version-file:
    description: 'File containing the version Spec of the version to use.  Examples: package.json, .nvmrc, .node-version, .tool-versions.'
  architecture:
    description: 'Target architecture for Node to use. Examples: x86, x64. Will use system architecture by default.'
  check-latest:
    description: 'Set this option if you want the action to check for the latest available version that satisfies the version spec.'
    default: false
  registry-url:
    description: 'Optional registry to set up for auth. Will set the registry in a project level .npmrc and .yarnrc file, and set up auth to read in from env.NODE_AUTH_TOKEN.'
  scope:
    description: 'Optional scope for authenticating against scoped registries. Will fall back to the repository owner when using the GitHub Packages registry (https://npm.pkg.github.com/).'
  token:
    description: Used to pull node distributions from node-versions. Since there's a default, this is typically not supplied by the user. When running this action on github.com, the default value is sufficient. When running on GHES, you can pass a personal access token for github.com if you are experiencing rate limiting.
    default: ${{ github.server_url == 'https://github.com' && github.token || '' }}
  cache:
    description: 'Used to specify a package manager for caching in the default directory. Supported values: npm, yarn, pnpm.'
  cache-dependency-path:
    description: 'Used to specify the path to a dependency file: package-lock.json, yarn.lock, etc. Supports wildcards or a list of file names for caching multiple dependencies.'
# TODO: add input to control forcing to pull from cloud or dist.
#       escape valve for someone having issues or needing the absolute latest which isn't cached yet
outputs:
  cache-hit: 
    description: 'A boolean value to indicate if a cache was hit.'
  node-version:
    description: 'The installed node version.'
runs:
  using: 'node20'
  main: 'dist/setup/index.js'
  post: 'dist/cache-save/index.js'
  post-if: success()

而 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 等等。

目前开源社区里用于持续集成的构建和测试的自动化工具层出不穷,笔者工作的 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 持续集成场景里基于新的代码提交,自动进行代码检测的步骤。

相关文章
|
1月前
|
图形学 iOS开发 Android开发
从Unity开发到移动平台制胜攻略:全面解析iOS与Android应用发布流程,助你轻松掌握跨平台发布技巧,打造爆款手游不是梦——性能优化、广告集成与内购设置全包含
【8月更文挑战第31天】本书详细介绍了如何在Unity中设置项目以适应移动设备,涵盖性能优化、集成广告及内购功能等关键步骤。通过具体示例和代码片段,指导读者完成iOS和Android应用的打包与发布,确保应用顺利上线并获得成功。无论是性能调整还是平台特定的操作,本书均提供了全面的解决方案。
108 0
|
2月前
|
开发者 存储 API
Xamarin 云服务集成竟然如此强大,简化后端开发不再是梦,数据存储、用户认证、推送通知全搞定!
【8月更文挑战第31天】Xamarin 是一款强大的跨平台移动应用开发工具,通过与云服务集成,显著简化了后端开发。开发者无需自行搭建服务器,即可利用云服务提供的数据存储、用户认证、推送通知等功能,大幅减少数据库设计、服务器配置及 API 开发的时间成本。借助 Azure Mobile Apps 等云服务,Xamarin 可轻松实现数据存取操作,同时增强应用安全性与用户参与度,使开发者更专注于业务逻辑和用户体验,提升开发效率并降低成本。这种方式在快速发展的移动应用领域极具价值。
45 0
|
2月前
|
数据库 开发者 Java
颠覆传统开发:Hibernate与Spring Boot的集成,让你的开发效率飞跃式提升!
【8月更文挑战第31天】在 Java 开发中,Spring Boot 和 Hibernate 已成为许多开发者的首选技术栈。Spring Boot 简化了配置和部署过程,而 Hibernate 则是一个强大的 ORM 框架,用于管理数据库交互。将两者结合使用,可以极大提升开发效率并构建高性能的现代 Java 应用。本文将通过代码示例展示如何在 Spring Boot 项目中集成 Hibernate,并实现基本的数据库操作,包括添加依赖、配置数据源、创建实体类和仓库接口,以及在服务层和控制器中处理 HTTP 请求。这种组合不仅简化了配置,还提供了一套强大的工具来快速开发现代 Java 应用程序。
59 0
|
2月前
|
前端开发 Java UED
JSF遇上Material Design:一场视觉革命,如何让传统Java Web应用焕发新生?
【8月更文挑战第31天】在当前的Web开发领域,用户体验和界面美观性至关重要。Google推出的Material Design凭借其独特的动画、鲜艳的颜色和简洁的布局广受好评。将其应用于JavaServer Faces(JSF)项目,能显著提升应用的现代感和用户交互体验。本文介绍如何通过PrimeFaces等组件库在JSF应用中实现Material Design风格,包括添加依赖、使用组件及响应式布局等步骤,为用户提供美观且功能丰富的界面。
33 0
|
2月前
|
持续交付 测试技术 jenkins
JSF 邂逅持续集成,紧跟技术热点潮流,开启高效开发之旅,引发开发者强烈情感共鸣
【8月更文挑战第31天】在快速发展的软件开发领域,JavaServer Faces(JSF)这一强大的Java Web应用框架与持续集成(CI)结合,可显著提升开发效率及软件质量。持续集成通过频繁的代码集成及自动化构建测试,实现快速反馈、高质量代码、加强团队协作及简化部署流程。以Jenkins为例,配合Maven或Gradle,可轻松搭建JSF项目的CI环境,通过JUnit和Selenium编写自动化测试,确保每次构建的稳定性和正确性。
44 0
|
2月前
|
前端开发 Devops 持续交付
【前端自动化新高度】Angular与Azure DevOps完美结合:从零构建持续集成与持续部署的全自动流水线,提升开发效率与软件交付质量!
【8月更文挑战第31天】Angular作为领先的前端框架,以强大功能和灵活性深受开发者喜爱。Azure DevOps提供一站式DevOps服务,涵盖源码管理、持续集成(CI)及持续部署(CD)。本文将指导你如何在Azure DevOps中搭建Angular项目的CI/CD流程,并通过具体示例代码展示整个过程。首先,我们将创建一个Angular项目并初始化Git仓库;然后,在Azure DevOps中设置CI流水线,定义YAML文件以自动化构建和部署流程。最终实现每次提交代码后自动构建并部署至Azure Web App,极大提升了开发效率和软件交付速度,使团队更专注于创新。
19 0
|
2月前
|
消息中间件 NoSQL 调度
Django后端架构开发:Django 与 Celery 的深度集成
Django后端架构开发:Django 与 Celery 的深度集成
86 0
|
3月前
|
Linux Apache C++
FFmpeg开发笔记(三十五)Windows环境给FFmpeg集成libsrt
该文介绍了如何在Windows环境下为FFmpeg集成SRT协议支持库libsrt。首先,需要安装Perl和Nasm,然后编译OpenSSL。接着,下载libsrt源码并使用CMake配置,生成VS工程并编译生成srt.dll和srt.lib。最后,将编译出的库文件和头文件按照特定目录结构放置,并更新环境变量,重新配置启用libsrt的FFmpeg并进行编译安装。该过程有助于优化直播推流的性能,减少卡顿问题。
87 2
FFmpeg开发笔记(三十五)Windows环境给FFmpeg集成libsrt
|
3月前
|
Linux
FFmpeg开发笔记(三十四)Linux环境给FFmpeg集成libsrt和librist
《FFmpeg开发实战》书中介绍了直播的RTSP和RTMP协议,以及新协议SRT和RIST。SRT是安全可靠传输协议,RIST是可靠的互联网流传输协议,两者于2017年发布。腾讯视频云采用SRT改善推流卡顿。以下是Linux环境下为FFmpeg集成libsrt和librist的步骤:下载安装源码,配置、编译和安装。要启用这些库,需重新配置FFmpeg,添加相关选项,然后编译和安装。成功后,通过`ffmpeg -version`检查版本信息以确认启用SRT和RIST支持。详细过程可参考书中相应章节。
62 1
FFmpeg开发笔记(三十四)Linux环境给FFmpeg集成libsrt和librist
|
3月前
|
应用服务中间件 Linux nginx
FFmpeg开发笔记(四十)Nginx集成rtmp模块实现RTMP推拉流
《FFmpeg开发实战》书中介绍了如何使用FFmpeg向网络推流,简单流媒体服务器MediaMTX不适用于复杂业务。nginx-rtmp是Nginx的RTMP模块,提供基本流媒体服务。要在Linux上集成rtmp,需从官方下载nginx和nginx-rtmp-module源码,解压后在nginx目录配置并添加rtmp模块,编译安装。配置nginx.conf启用RTMP服务,监听1935端口。使用ffmpeg推流测试,如能通过VLC播放,表明nginx-rtmp运行正常。更多详情见书本。
88 0
FFmpeg开发笔记(四十)Nginx集成rtmp模块实现RTMP推拉流

相关实验场景

更多
下一篇
无影云桌面