ABAP Code Reviews A practical guide ABAP WRITE 'code'. WRITE 'review'. Change-based code reviews increase code quality by finding defects earlier and preventing them from polluting the main code line. They also enable continuous integration by registering automated checks as reviewers. These modern capabilities have been on the wish list of ABAP developers for some time. We survey current possibilities of applying git-based review platforms to ABAP code and give recommendations for authors and reviewers. Table of Contents . . .Introduction 1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1. . . .Related 2. . . . . . . . . .Work . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2. . . .Best 3. . . . . . .Practices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3. . . . . .Why 3.1. . . . . . .perform . . . . . . . . Code . . . . . . .Reviews? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3. . . . . .Size 3.2. . . . . . and . . . . .Speed . . . . . . . .of. .Reviews . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3. . . . . .How 3.3. . . . . . .to. .Select . . . . . . . Reviewers? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3. . . . . .Required 3.4. . . . . . . . . . . Code . . . . . . .Reviews . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4. . . . . .Code 3.5. . . . . . . Formatting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4. . . .Tools 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5. . . . . .Git 4.1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5. . . . . .Code 4.2. . . . . . . Review . . . . . . . . .Platforms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5. . . . . .CTS 4.3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5. . . . . .ABAP 4.4. . . . . . . .and . . . . .Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5. . . . . . . .abapGit 4.4.1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .6. . . . . . . .gCTS 4.4.2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .6. . . . . .Static 4.5. . . . . . . .Analysis . . . . . . . . . and . . . . .Tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .6. . . . . . . .Code 4.5.1. . . . . . . Inspector . . . . . . . . . . .(ATC) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .6. . . . . . . .abaplint 4.5.2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .7. . . . . . . .Third 4.5.3. . . . . . .party . . . . . .checks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .7. . . . . .abap-openapi-client 4.6. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .7. . . .Scenarios 5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8. . . . . .One 5.1. . . . . . Way . . . . . .Synchronization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8. . . . . .Two 5.2. . . . . .Way . . . . . Synchronization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8. . . .abapGit 6. . . . . . . . . .Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 ... . . . . .One 6.1. . . . . . Way . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10 .. . . . . . . .Setup 6.1.1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10 .. . . . . . . .Workflow 6.1.2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10 .. . . . . .Two 6.2. . . . . .Way . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11 .. . . .gCTS 7. . . . . . . .Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 ... Home https://github.com/SAP/styleguides License Creative Commons Build 2022-12-09 11:08:36 UTC 1. Introduction Code review is a measure for assuring software quality by letting developers read the code of others. While the primary goal is to increase quality by finding defects, it also fosters learning and shared code ownership. Continuous integration / continuous delivery (CI/CD) is commonly seen as a prerequisite to faster delivery of cloud-based products. This comprises the ability to review, test, and, if required, veto changes before they affect every other developer working on the same repository. This capability to validate a change in isolation before integrating it is also known as proposed commits or pending head. For instance, most git platforms have implemented this concept as depicted below. Request Automated Checks Rework Peer Review OK? No Ye s Submit(merge) Once your version control system supports such a validation, manual change-based code reviews usually come for free because it does not matter technically whether a change is vetoed by a human vote or an automated test verdict. While Git-based collaboration platforms offer features like Gerrit Changes and GitHub Pull Requests, which already support the concept of proposed commits out of the box, ABAP Change and Transport System (CTS) only offers extension points, where a comparable flow can be implemented besides or on top to veto the release of transport requests. This document provides an overview of possible scenarios which can be implemented in various development landscapes. Page 1 2. Related Work Some work has already been done to apply git-based code reviews for ABAP: ABAP code reviews with abapGit by Eduardo Copat, describes the general idea of exporting code to GitHub using abapGit to review it via Pull Requests. How we do ABAP code review using abapGit by Michael Pang, explains how to use the abapGit feature transport to branch to review a CTS transport before it is released. Create a commit in Git when an ABAP task is released by Karin Spiegel, elaborates on code reviews per transport by using existing BAdI interfaces to commit changes per task release to a feature branch using gCTS. Static ABAP Pull Request Code Review with abapLint on Jenkins using piper-lib by Jaqueline Bonoto, gives a practical example setup using various tooling Page 2 3. Best Practices This section contains suggestions on how to conduct code reviews effectively. Other code review guides have already dealt with this topic generically, for instance, Google’s Engineering Practices documentation. We will focus on ABAP specific considerations. 3.1. Why perform Code Reviews? Code reviews can detect issues in the software that are harder to find via other methods: Foster Clean code to improve maintainability and readability of code, including comments, and to avoid unnecessary complexity. Ensure the code is well designed. Consider behavioral aspects like performance and security. Improve testability of code, including test design and adequateness of tests. Code reviews are one possibility to share experience and knowledge between developers. It works a bit like "asynchronous pair programming", so that colleagues can learn from each other, see different perspectives, and share know-how about all parts of the code. Code reviews help to prevent that code health deteriorates over time. 3.2. Size and Speed of Reviews Change-based code reviews are these days considered more effective than formal Fagan-style code inspections as they were practiced some years ago. Conducted continuously, they require less effort while still finding a considerable number of defects at an earlier time. The main reason is the smaller size of code deltas to digest. This ensures that reviews can be performed both, more quickly and thoroughly, while keeping the process lean, i.e., less waste if changes are rejected and lower probability to block other development. Changes should be self-contained to help reviewers focus on the task at hand. An ABAP Transport Request typically fulfills these criteria. Code reviews need to be done fast. Hence, you need to balance between the interruption of your own work against the probability of blocking the release of other developers' transport. Rule of thumb for the maximum delay should be one day. Usually, the speed of code reviews will improve over time. 3.3. How to Select Reviewers? In general, reviewers can be selected manually or automatically. Manual selection happens either by the author explicitly requesting reviews from colleagues with matching expertise, or by interested reviewers actively picking open changes for review. The latter requires a certain "meritocracy" culture in an organization, where novice developers may gain reputation by reviewing open changes. Some organisations may even chose to let team leads assign reviewers to changes. Automated selection of code reviewers is also possible, for instance, via round robin routing or advanced concepts like Code Owners. The latter enables you to define (groups of) default reviewers for certain files and folders on git level. This can be useful for critical coding parts or known hot spots. Page 3 Attributes qualifying colleagues as reviewers include: team assignment experience and seniority (also outside of the team) consumer role (to check if something was implemented as required) 3.4. Required Code Reviews An important decision is how many code reviews are required to release a change. Most projects require at least the so-called 4-eyes-principle for every change. It is important to note the culture aspect of this configuration: This is not meant as an additional hurdle to harass developers that should be generally mistrusted. It is rather an opportunity and safety net that prevents slip errors from spreading unnoticed, because they can happen anytime to anyone. If reviews from Code Owners are required, individual approvals will not suffice. In case of pair-programming, code reviews can of course be conducted much faster. Usually, a remark documenting the pair-programming should suffice. Moreover, one could imagine also dynamic conditions that make code reviews mandatory, for instance, a significant drop in test coverage, a high number of low priority ATC messages, or changes of critical objects like DDIC or CDS, security checks, APIs and package interfaces, just to name a few. The practicability of such requirements of course depends on the capabilities of the chosen code review platform. 3.5. Code Formatting The code reviewer will look through the textual changes in the source code, and even if the actual change is small, there might be a lot of changes due to reformatting of the code. Having a consistently formatted codebase will help keeping the size of textual changes small, and make reviewing easier. The SAP ABAP style guide provides multiple recommendations which can be used in the development team, Use your pretty printer team settings Stick to a reasonable line length Indent and snap to tab Align type clauses Close brackets at line end Align parameters Objects can be mass pretty printed via abappretty, and developers reminded to follow the team conventions via static analysis tooling. Page 4 4. Tools Various tools can be used to orchestrate the code review process, this section introduces the tooling required for conducting code reviews in the context of ABAP development. 4.1. Git Git is a popular distributed version control system, which helps developers work on the same codebase. Unlike ABAP, Git works with files instead of objects in a database, which allows editing any file with any editor, and keeping multiple copies (branches) of files. At a technical level Git is a protocol, and is typically used in connection with cloud-based hosting platforms like: GitHub GitLab Bitbucket Azure Repos For an introduction to Git see: Git Documentation Git Handbook 4.2. Code Review Platforms Git helps keeping track of changes to files, and the Git hosting platforms add extra functionality on top of that. As explained in the Introduction, the most important feature is proposed commits, which is the basis for code reviews. The general idea is to keep all commits of a feature in a separate branch, propose to merge this branch to a parent or main branch, and to conduct a review conversation over this proposal. For instance, GitHub provides Code Reviews via Pull Requests. Other git platforms offer similar features. 4.3. CTS The Change and Transport System (CTS) helps organizing development projects in transports, both for objects in the ABAP Workbench and in Customizing. After the development is completed the change is transported between the SAP systems in the system landscape. The complete documentation on how to configure CTS and how to set up transport landscapes is available on SAP Help Portal. CTS also offers the possibility to integrate custom logic in the flow of transport requests via the BAdI CTS_REQUEST_CHECK . In particular, the method CHECK_BEFORE_RELEASE is useful for vetoing the release of transports based on external conditions, like code reviews. 4.4. ABAP and Git ABAP objects are stored in the underlying database, and git works on files, to enable git in ABAP, the objects must be serialized to files and moved to the git server via the git protocol. Currently two different tools exists that Page 5 brings git and ABAP together. 4.4.1. abapGit abapGit is a git client written in ABAP for use with ABAP, it serializes the ABAP objects to files, and provides access to the most common git operations. It can be installed on any SAP system version 702 and up, requiring only a ABAP developer key for installation. abapGit was initially released in 2014 and is continuously being enhanced, users can update to the latest version at any time. Multiple open source projects use abapGit for development and installation into systems. 4.4.2. gCTS A first set of features of git-enabled CTS (gCTS) is available with SAP S/4HANA 1909. You can find the documentation on how to configure and use gCTS on the SAP Help Portal: Git-enabled Change and Transport System. A good starting point is Karin Spiegel’s blog post gCTS is here. To get the idea of gCTS and what is planned for future releases, please refer to its statement of direction. 4.5. Static Analysis and Tests To make code reviews effective, it is useful to conduct automated checks upfront. For instance, machines are much cheaper and more effective at finding typical slip errors by static code analysis than human reviewers. Hence it is desirable to perform such checks upfront before peer code reviewers are bothered with a change. Git platforms usually allow developers to connect continuous integration pipelines to their repositories so that arbitrary automated checks can be configured. In the following, we will look into tools running ABAP-specific checks in such pipelines. 4.5.1. Code Inspector (ATC) The developer can use ATC to check the working copy in an ABAP system. If the state of the ABAP system matches the git state, ATC can be executed locally for the scope given in the transport or pull request to help the code reviewer. In addition to the standard checks provided by SAP, there are open source projects that provide additional checks: code pal for ABAP abapOpenChecks It is however not so trivial (yet) to execute ATC as part of a continuous integration pipeline. One possibility is to use BAdI CTS_REQUEST_CHECK to execute ATC programmatically during the release of a transport. In case the SAP ABAP Development Tools for Eclipse are already configured for your system, you could use its REST APIs to trigger ATC and ABAP Unit externally. This is what, for instance, the pipeline step gctsExecuteABAPUnitTests of project Piper does. With SAP BTP ABAP Environment (a.k.a. Steampunk) and newer SAP S/4 HANA releases, there is also the possibility to use dedicated REST end-points for such continuous integration scenarios. There is even a Page 6 dedicated ABAP Environment Pipeline for that. These newer features are of course not available to customers working on older releases. To call the REST endpoints on the ABAP system, the pipelines must have network access to the ABAP system. 4: pull abap1 1: push git 2: trigger pipeline 3: REST abap2 5: ATC 4.5.2. abaplint abaplint is a open source static analysis tool for ABAP, it works on files serialized by abapGit. abaplint is "cloud native" and built to run on CI pipelines, and only requires that the pipeline can access the files in git. There are no specific system requirements, as abaplint can run on the lowest/free pipeline tiers. Multiple rules can be configured and the corresponding configuration file abaplint.json is stored in the repository along with the code, following the same change process as the code. The abaplint.app can be installed via one-click from Github Marketplace, and provides extra features like automatic suggestions and code insights. The developers can check their working copy using abaplint-sci-client which integrates the rules into Code Inspector/ATC. And the linter also works in vscode or running standalone in a browser window. abap 1: push git 2: trigger 3: pull pipeline 4: abaplint 4.5.3. Third party checks There are other tools from third party vendors that can be also used for ABAP code analysis. For instance, SonarSource ABAP can be used to check ABAP source serialized by abapGit. 4.6. abap-openapi-client External check services often have an OpenAPI definition. Unfortunately, there is no standard way of consuming such OpenAPI services in ABAP yet. An emerging open source OpenAPI client for ABAP can be found at https://github.com/abap-openapi/abap-openapi-client Page 7 5. Scenarios In this section we look at typical scenarios how git-based code reviews and classical ABAP CTS transports can be combined. We assume the SAP ABAP development application servers have network access to the code review platform, e.g., GitHub. 5.1. One Way Synchronization By one-way we mean that CTS is the primary source of truth of your component. It is in full control of your software lifecycle. Git is only used for code review purposes as a secondary persistence or USB-stick-like export channel. Developers work normally, releasing transports via CTS as configured per transport layer. This setup is recommended for scnearios where multiple developers work on the same repostiory in the same system, pulling code into the system might overwrite ongoing changes by other developers, allowing only pushes will avoid this problem. developer1 developer2 abap developer3 push git The only difference are the new review steps, which are conducted via an ABAP git client (either abapGit or gCTS) on a code review platform like GitHub. Even though code reviews could also be conducted independently from transport releases, it is more efficient to synchronize both tightly because their granularity typically captures a logical unit of work. This scenario requires minimal git knowledge, as developers will continue working with normal CTS requests/tasks. 5.2. Two Way Synchronization In contrast, open source projects or reusable assets developed by partners for multiple clients usually have a lifecycle of their own, independent of the target systems they are deployed to. Git becomes the primary persistence. Classical CTS is only used optionally for software logistics of the consuming target project (or you rely completely on gCTS). All git operations are manually performed by the developer using the ABAP git client (either abapGit or gCTS), including the pull of changes back from git into AS ABAP. One developer would typically work on one repository in a system at a time, utilizing both the push and pull features in the git client. abap push & pull git one developer Page 8 Conflicts resulting from concurrent modification of the same objects on different systems need to be resolved on git level. Page 9 6. abapGit Examples 6.1. One Way There are lots of ways to setup code reviews, this section introduces a simple implementation of the One Way Synchronization, with commits for each task release, the example can be extended according to the needs of each organization. A sample abapGit setup is provided at https://github.com/abapGit/abapgit-review-example, it can be installed via abapGit, and works together with GitHub. 6.1.1. Setup GitHub setup required, 1. Create repositories 2. If needed, setup branch protection 3. Enable automatic branch deletion Multiple setup steps are required in the development system, 1. abapGit development edition installed 2. Connectivity from the ABAP system to Github, SSL setup 3. Background user authentication 4. Online repositories are created and linked to the development packages 5. Enable abapGit write protection for the repos 6.1.2. Workflow For the release of each task, the following steps are performed: Page 10 Determine repository Does branch exist? yes no Create branch Push changes to branch Does PR exist? yes no Create PR For release of request, 1. Check PR is released, if not the request cannot be released abapGit works on object level( R3TR ), while the transport system works on subobject level( LIMU ), if mirroring transports to git and subobjects exists in multiple transports, the abapGit based example will give an error. Transports must consistently match the git repositories, an error will be issued if a transport contains objects from multiple git repositories. The example is provided as a starting point, different organizations have different requirements and work processes, the example can be adjusted to fit any requirements. 6.2. Two Way The developer uses the normal UI of abapGit, pushing and pulling all changes. If git is the only destination for the code, suggest disabling CTS transports to make it faster to do changes, eg. by developing in local packages. Page 11 Page 12 7. gCTS Examples In principle, gCTS can also be used like a Git client for implementing a similar code review flow as in the previous example. A combination with classical CTS steps like task and transport releases, which extends it towards "decentralized development", is described in Create a commit in Git when an ABAP task is released. Page 13