前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >ABAP 中的 CI/CD 实战

ABAP 中的 CI/CD 实战

原创
作者头像
编程扫地僧
发布2025-02-07 17:25:43
发布2025-02-07 17:25:43
960
举报
文章被收录于专栏:后端开发后端开发

看到社区里关于 ABAP CI/CD 的文章比较少,我就来贡献一篇。

关于 ABAP CI/CD 的概述,推荐大家学习 SAP 社区这篇文章:

CI/CD in ABAP - An Outside-In View

本文介绍具体的实战,以一个简单的示例项目为例,该项目包含一个 ABAP 报表和相应的单元测试,通过 abapGit 进行版本管理,利用 Jenkins 实现流水线控制,并结合 ABAP Unit 以及静态代码检查工具(如 abaplint)来保证代码质量。

随着企业数字化转型的不断深入,SAP 系统中开发的 ABAP 程序也需要采用现代化软件工程实践来提升质量和效率。CI/CD(持续集成/持续交付)正是其中的关键环节,能够帮助开发团队实现自动化构建、测试、质量检查及自动部署,降低手工操作错误,提高交付速度和代码质量。

本案例中,我们使用以下组件构建 CI/CD 流程:

  • abapGit:将 ABAP 源码同步到 Git 仓库,实现版本控制与协同开发。
  • Jenkins:作为 CI/CD 工具,定义流水线流程,自动触发构建、测试和部署步骤。
  • Shell 脚本:调用 ABAP 系统相关工具或 RFC 接口,实现编译、单元测试运行及代码传输。
  • ABAP 单元测试(ABAP Unit):在 ABAP 层面编写测试类,保证业务逻辑正确性。
  • 静态代码检查工具(如 abaplint):用于在流水线中对代码规范和质量进行自动化检测。

整个流程主要分为以下几个阶段:

  1. 源码管理

开发人员通过 abapGit 将 ABAP 对象提交到 Git 仓库(例如 GitHub 或内部 Git 服务器),仓库中同时包含一个配置文件(.abapgit.xml),记录了需要同步的对象。

  1. 自动构建

Jenkins 通过触发器(如代码提交或定时任务)拉取最新代码,并利用预先编写的 Shell 脚本调用 ABAP 系统中的编译功能,对代码进行激活和编译。

  1. 自动测试

编译后,流水线调用测试脚本执行 ABAP Unit 测试(以及其他自动化检测,如 abaplint 代码检查),确保代码没有语法错误、单元测试全部通过,并符合代码风格规范。

  1. 自动部署

当所有测试通过后,流水线自动调用部署脚本,将新代码以传输请求或其他方式部署到目标 ABAP 系统中(如开发、质量或生产环境)。

本示例项目包含两个主要部分:

  1. ABAP 报表(ZDEMO_REPORT)

一个简单的 ABAP 程序,用于展示基本业务逻辑或数据处理。此对象存放在 ABAP 开发系统中的 DEV 目录中。

  1. 单元测试类(LCL_SAMPLE_TEST)

使用 ABAP Unit 编写的测试类,验证核心逻辑(例如 1+1=2 的简单测试),保证程序正确性。

同时,项目根目录中还包含用于 CI/CD 流水线的配置文件,如 Jenkinsfile 和 Shell 脚本。

关键配置与源代码示例

abapGit 配置文件

在 ABAP 开发系统中,利用 abapGit 将对象同步到 Git 仓库,需要在对象的目录中放置配置文件 .abapgit.xml。

代码语言:xml
复制
<abapGit version="1.0">
  <asObjects>
    <!-- 将 ABAP 类对象同步至 Git -->
    <object type="CLAS" name="LCL_SAMPLE_TEST" />
    <!-- 将开发报表同步至 Git -->
    <object type="DEVC" name="ZDEMO_REPORT" />
  </asObjects>
  <abap>
    <!-- 仓库地址和分支信息 -->
    <repo>https://github.com/youruser/abap-ci-demo</repo>
    <branch>master</branch>
  </abap>
</abapGit>

该文件告知 abapGit 同步哪些 ABAP 对象,以及代码仓库的地址、分支等信息,方便后续自动更新。

ABAP 单元测试代码

在 ABAP 中,通过 ABAP Unit 框架编写测试类。下面是一段示例代码,用于测试简单的加法逻辑:

代码语言:sql
复制
CLASS lcl_sample_test DEFINITION FOR TESTING
  DURATION SHORT
  RISK LEVEL HARMLESS.
  PRIVATE SECTION.
    METHODS: test_simple_addition FOR TESTING.
ENDCLASS.

CLASS lcl_sample_test IMPLEMENTATION.
  METHOD test_simple_addition.
    cl_abap_unit_assert=>assert_equals(
      act = 1 + 1,
      exp = 2,
      msg = '1+1 应等于 2').
  ENDMETHOD.
ENDCLASS.

此测试类在运行时将由流水线自动调用,若测试失败,流水线将中断后续部署操作。

Jenkinsfile 流水线配置

Jenkinsfile 定义了整个 CI/CD 流程,下面是一份典型的 Declarative Pipeline 示例:

代码语言:groovy
复制
pipeline {
    agent any
    environment {
        // 配置连接 ABAP 系统的环境变量
        ABAP_SYSTEM = "sap.example.com"
        ABAP_USER   = "CI_USER"
        ABAP_PASS   = "password"
    }
    stages {
        stage('Checkout') {
            steps {
                // 从 Git 仓库检出最新代码(包含 .abapgit.xml、ABAP 源码及脚本)
                checkout scm
            }
        }
        stage('Build') {
            steps {
                // 调用脚本进行 ABAP 代码编译与激活
                sh './scripts/abap_build.sh'
            }
        }
        stage('Test') {
            steps {
                // 执行 ABAP 单元测试及静态代码检查(如 abaplint 检查)
                sh './scripts/abap_run_tests.sh'
            }
        }
        stage('Deploy') {
            steps {
                // 测试通过后调用部署脚本,将代码传输到目标 ABAP 系统
                sh './scripts/abap_deploy.sh'
            }
        }
    }
    post {
        always {
            // 清理工作区,确保下一次构建环境干净
            cleanWs()
        }
    }
}

该 Jenkinsfile 分为四个阶段:检出代码、编译构建、自动测试以及自动部署。各阶段均调用预先编写好的 Shell 脚本。

Shell 脚本示例

下面提供三个示例脚本,分别对应编译、测试和部署阶段。

编译脚本 – abap_build.sh
代码语言:bash
复制
#!/bin/bash
echo "连接 ABAP 系统 ${ABAP_SYSTEM} 开始编译..."
# 假设系统提供了命令行接口或 RFC 工具进行激活编译,此处调用相应工具
# 例如:调用 SAP 的 RFC 接口或使用 SAP Cloud SDK 工具
# 此处仅做示例,实际环境中需替换为真实的调用命令
sapcli compile --server ${ABAP_SYSTEM} --user ${ABAP_USER} --password ${ABAP_PASS} --package ZDEMO_PACKAGE
if [ $? -ne 0 ]; then
  echo "ABAP 编译失败!"
  exit 1
fi
echo "ABAP 编译成功!"
测试脚本 – abap_run_tests.sh
代码语言:bash
复制
#!/bin/bash
echo "运行 ABAP 单元测试及代码检查..."
# 运行 ABAP 单元测试(假设通过 RFC 或 API 调用系统内置测试框架)
sapcli run_tests --server ${ABAP_SYSTEM} --user ${ABAP_USER} --password ${ABAP_PASS} --package ZDEMO_PACKAGE
if [ $? -ne 0 ]; then
  echo "单元测试失败!"
  exit 1
fi
# 运行静态代码检查工具 abaplint(本地安装或容器中执行)
abaplint -p .
if [ $? -ne 0 ]; then
  echo "代码质量检查未通过!"
  exit 1
fi
echo "测试全部通过!"
部署脚本 – abap_deploy.sh
代码语言:bash
复制
#!/bin/bash
echo "开始将代码部署至 ABAP 系统..."
# 假设使用 SAP 传输请求或其他自动化部署方式,此处调用相应工具
sapcli deploy --server ${ABAP_SYSTEM} --user ${ABAP_USER} --password ${ABAP_PASS} --transport ZTR_DEMO
if [ $? -ne 0 ]; then
  echo "部署失败!"
  exit 1
fi
echo "代码已成功部署到 ABAP 系统!"

在实际环境中,以上命令(如 sapcli compile、run_tests、deploy)需要替换为适合您 ABAP 系统的工具或 API 调用命令。也可以利用 SAP 提供的 ABAP Development Tools(ADT)自动化功能实现类似效果。


部署与验证

整个流水线配置好后,开发人员只需将 ABAP 对象和 Jenkinsfile、Shell 脚本等推送到 Git 仓库中。Jenkins 自动检测到新提交后,会依次执行以下流程:

  1. 检出代码:将最新的 ABAP 代码、测试类和配置文件同步到构建环境。
  2. 编译构建:调用 abap_build.sh 脚本,对 ABAP 对象进行激活编译,确保代码在系统中能正确激活。
  3. 自动测试:执行 abap_run_tests.sh,运行单元测试和代码规范检查,若发现错误则中断流水线。
  4. 自动部署:当测试全部通过后,调用 abap_deploy.sh 将新版本代码以传输请求方式部署至目标 ABAP 系统。

构建成功后,可在 SAP 系统中验证报表 ZDEMO_REPORT 是否已正确激活,同时在测试系统中查看测试日志,确认单元测试全部通过。若流水线中任一步骤出错,Jenkins 会发送通知,开发人员可以据此迅速排查和解决问题。

这种方法不仅能够大大降低人为错误,还能使开发、测试与运维之间协同更加紧密。后续扩展中,可以考虑增加更复杂的测试场景(例如集成测试、性能测试)以及自动化回滚机制,以适应更大规模的 ABAP 应用系统。与此同时,还可结合 SAP 的云平台 CI/CD 服务,实现跨系统自动化发布,进一步提升业务敏捷性和响应速度。

该案例为 ABAP 系统引入现代 DevOps 流程提供了一种切实可行的解决方案,适用于企业内部 ABAP 项目自动化管理和持续交付场景。希望本文的详细说明和示例配置对大家的实际项目有所启发与帮助。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 关键配置与源代码示例
    • abapGit 配置文件
    • ABAP 单元测试代码
    • Jenkinsfile 流水线配置
    • Shell 脚本示例
      • 编译脚本 – abap_build.sh
      • 测试脚本 – abap_run_tests.sh
      • 部署脚本 – abap_deploy.sh
  • 部署与验证
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档