abapGit : Versioning Git pour le code ABAP

Catégorie
DevOps
Publié
Auteur
Johannes

abapGit est l’outil open source de la communauté ABAP qui permet le versioning Git pour les objets de développement ABAP. Il sérialise les objets ABAP en fichiers textuels qui peuvent être stockés dans des dépôts Git. Vous apportez ainsi le contrôle de version moderne, les revues de code et les pipelines CI/CD dans le monde ABAP.

Qu’est-ce qu’abapGit ?

abapGit est un outil client Git écrit en ABAP qui :

FonctionnalitéDescription
SérialisationConvertit les objets ABAP en fichiers XML/JSON
Intégration GitPush, Pull, Branch, Merge directement depuis SAP
Support OfflineExport/Import en fichiers ZIP
Open SourcePiloté par la communauté sur GitHub

Avantages d’abapGit

  • Contrôle de version : Historique Git complet pour le code ABAP
  • Revues de code : Pull Requests et revues sur GitHub/GitLab
  • Sauvegarde : Sauvegarde externe de tout le code ABAP
  • Partage : Partager des projets ABAP open source
  • CI/CD : Intégration dans les pipelines DevOps modernes

Installation d’abapGit

abapGit peut être installé de différentes manières :

Version Standalone (recommandée pour débuter)

  1. Téléchargez la version actuelle depuis abapGit Releases
  2. Créez un nouveau report ZABAPGIT_STANDALONE dans SE38/ADT
  3. Copiez le code source complet dans le report
  4. Activez et exécutez le report

Version Developer (pour les mises à jour régulières)

" 1. Créez un package pour abapGit
" 2. Clonez le dépôt abapGit lui-même avec la version Standalone
" 3. URL du dépôt : https://github.com/abapGit/abapGit.git

abapGit dans ADT (Eclipse)

Pour ADT, il existe le plugin abapGit Eclipse :

  1. Help → Install New Software
  2. URL : https://eclipse.abapgit.org/updatesite/
  3. Sélectionnez abapGit for ABAP Development Tools
  4. Terminez l’installation et redémarrez Eclipse

Créer et connecter un dépôt

Créer un nouveau dépôt

CLASS zcl_abapgit_example DEFINITION
PUBLIC FINAL
CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES if_oo_adt_classrun.
ENDCLASS.
CLASS zcl_abapgit_example IMPLEMENTATION.
METHOD if_oo_adt_classrun~main.
" Cet exemple montre les étapes de manière conceptuelle
" Le travail réel se fait via l'interface abapGit
out->write( '=== Configuration du dépôt abapGit ===' ).
out->write( '1. Lancer la transaction ZABAPGIT ou le report' ).
out->write( '2. "+ Online" pour un nouveau dépôt Git' ).
out->write( '3. Entrer l''URL du dépôt' ).
out->write( '4. Sélectionner ou créer un package' ).
out->write( '5. Sélectionner la branche (généralement "main")' ).
ENDMETHOD.
ENDCLASS.

Connecter un package local avec Git

Voici comment connecter un package existant avec un dépôt Git :

  1. Lancer abapGit : Transaction ZABAPGIT ou exécuter le report
  2. Ajouter un dépôt : Cliquez sur ”+ Online”
  3. Entrer l’URL : ex. https://github.com/username/my-abap-project.git
  4. Sélectionner le package : Package existant comme ZRAP_DEMO
  5. Authentification : Token GitHub pour les dépôts privés

Cloner un dépôt

Pour cloner un dépôt existant :

1. Ouvrir abapGit
2. Cliquer sur "+ Online"
3. URL du dépôt : https://github.com/SAP-samples/abap-platform-rap-opensap.git
4. Créer un nouveau package : ZRAP_OPENSAP
5. Branche : main
6. Exécuter "Clone"

Workflow Stage, Commit, Push

Le workflow Git typique dans abapGit :

Afficher les modifications (Status)

Après des modifications de votre code ABAP :

  1. Ouvrez le dépôt dans abapGit
  2. Cliquez sur “Stage”
  3. Vous voyez tous les objets modifiés

Staging et Commit

Workflow dans l'interface abapGit :
1. Ouvrir le dépôt → Cliquer sur "Stage"
2. Revoir les modifications :
- Vert (+) : Nouveaux objets
- Jaune (~) : Objets modifiés
- Rouge (-) : Objets supprimés
3. Sélectionner les objets pour le commit (Stage)
4. Entrer le message de commit
5. Cliquer sur "Commit"

Push vers le dépôt distant

Après le commit :
1. Bouton "Push" dans la vue du dépôt
2. Pour GitHub : Entrer le Personal Access Token
3. Le push est exécuté
4. Les modifications sont visibles dans le dépôt distant

Exemple pratique : Workflow complet

CLASS zcl_abapgit_workflow DEFINITION
PUBLIC FINAL
CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES if_oo_adt_classrun.
METHODS process_order
IMPORTING
iv_order_id TYPE i
RETURNING
VALUE(rv_success) TYPE abap_bool.
ENDCLASS.
CLASS zcl_abapgit_workflow IMPLEMENTATION.
METHOD if_oo_adt_classrun~main.
" Exemple : Cette classe est versionnée avec abapGit
DATA(lv_result) = process_order( 12345 ).
IF lv_result = abap_true.
out->write( 'Commande traitée avec succès.' ).
ELSE.
out->write( 'Échec du traitement de la commande.' ).
ENDIF.
ENDMETHOD.
METHOD process_order.
" Logique métier ici
" Après modifications : Stage → Commit → Push
rv_success = abap_true.
ENDMETHOD.
ENDCLASS.

Workflow Git pour cette modification :

  1. Modifier et activer la classe dans ADT
  2. Ouvrir abapGit → Sélectionner le dépôt
  3. “Stage” → Sélectionner ZCL_ABAPGIT_WORKFLOW.clas.abap
  4. Message de commit : feat: Add order processing method
  5. Commit → Push

Branches et Merging

Créer une branche

Dans abapGit :
1. Ouvrir le dépôt
2. Dropdown "Branch" → "Create Branch"
3. Entrer le nom de la branche : feature/new-validation
4. Branche de base : main
5. Créer la branche
La nouvelle branche est maintenant active.

Changer de branche

1. Ouvrir le dépôt dans abapGit
2. Cliquer sur le dropdown "Branch"
3. Sélectionner la branche souhaitée
4. Confirmer "Switch"
IMPORTANT : Les modifications non sauvegardées seront écrasées !

Workflow Pull Request

Le workflow recommandé pour le développement en équipe :

1. Créer une nouvelle feature branch
→ feature/customer-validation
2. Développer et tester les modifications
→ Implémenter la nouvelle logique de validation
3. Stage, Commit, Push
→ Commit : "feat: Add customer credit validation"
4. Créer une Pull Request sur GitHub/GitLab
→ feature/customer-validation → main
5. Revue de code par les collègues
→ Les reviewers vérifient les modifications
6. Merge après approbation
→ La PR est mergée dans main
7. Pull de la branche main dans SAP
→ Exécuter Pull dans abapGit

Gérer les conflits de merge

En cas de conflits entre branches :

1. Le Pull échoue avec un message de conflit
2. Résoudre le conflit en externe :
- Cloner le dépôt localement (git clone)
- Effectuer le merge (git merge)
- Résoudre les conflits dans l'éditeur
- Commit et Push
3. Dans abapGit : Exécuter à nouveau le Pull

Configuration .abapgit.xml

Le fichier .abapgit.xml à la racine du dépôt contrôle le comportement d’abapGit.

Structure de base

<?xml version="1.0" encoding="utf-8"?>
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<DATA>
<MASTER_LANGUAGE>D</MASTER_LANGUAGE>
<STARTING_FOLDER>/src/</STARTING_FOLDER>
<FOLDER_LOGIC>FULL</FOLDER_LOGIC>
<IGNORE>
<item>/.gitignore</item>
<item>/LICENSE</item>
<item>/README.md</item>
<item>/.github/</item>
</IGNORE>
<REQUIREMENTS>
<item>
<component>SAP_BASIS</component>
<min_release>756</min_release>
</item>
</REQUIREMENTS>
</DATA>
</asx:values>
</asx:abap>

Paramètres importants

ParamètreDescriptionValeurs
MASTER_LANGUAGELangue originaleD (Allemand), E (Anglais), F (Français)
STARTING_FOLDERRépertoire racine/src/, /
FOLDER_LOGICStructure des dossiersPREFIX, FULL, MIXED
IGNOREFichiers ignorésListe de chemins

Folder Logic expliquée

PREFIX (Standard pour les structures plates) :
/src/zcl_myclass.clas.abap
/src/zif_myinterface.intf.abap
FULL (Recommandé pour les grands projets) :
/src/zpackage/
/src/zpackage/zcl_myclass.clas.abap
/src/zpackage/subpackage/
/src/zpackage/subpackage/zcl_helper.clas.abap
MIXED (Combinaison) :
/src/zpackage/
zcl_myclass.clas.abap
subpackage/
zcl_helper.clas.abap

Exemple : Configuration de projet

<?xml version="1.0" encoding="utf-8"?>
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<DATA>
<MASTER_LANGUAGE>D</MASTER_LANGUAGE>
<STARTING_FOLDER>/src/</STARTING_FOLDER>
<FOLDER_LOGIC>FULL</FOLDER_LOGIC>
<IGNORE>
<item>/.gitignore</item>
<item>/LICENSE</item>
<item>/README.md</item>
<item>/.github/</item>
<item>/docs/</item>
</IGNORE>
<REQUIREMENTS>
<item>
<component>SAP_BASIS</component>
<min_release>756</min_release>
</item>
</REQUIREMENTS>
<ORIGINAL_SYSTEM>NPL</ORIGINAL_SYSTEM>
</DATA>
</asx:values>
</asx:abap>

abapGit vs. gCTS : Comparaison

SAP propose avec gCTS (Git-enabled Change and Transport System) sa propre intégration Git. Voici la comparaison :

AspectabapGitgCTS
LicenceOpen SourceLicence SAP requise
InstallationSimple (Report)Configuration système
FlexibilitéÉlevéeDéfinie par SAP
Support CloudOui (BTP)Oui (S/4HANA)
Intégration TransportOptionnelleComplète
CI/CDExterne (GitHub Actions)SAP CI/CD Service
Courbe d’apprentissageFaibleMoyenne
Support EnterpriseCommunautéSupport SAP

Quand utiliser abapGit ?

  • Partager des projets open source
  • Intégrer des équipes de développement externes
  • Pipelines CI/CD flexibles (GitHub Actions, GitLab CI)
  • Sauvegarde et documentation
  • Systèmes legacy sans gCTS

Quand utiliser gCTS ?

  • Intégration étroite avec le système de transport SAP
  • Support Enterprise requis
  • Utilisation du SAP CI/CD Service prévue
  • Paysage SAP standardisé

Exemples pratiques

Exemple 1 : Préparer un projet ABAP pour l’open source

CLASS zcl_string_utils DEFINITION
PUBLIC FINAL
CREATE PUBLIC.
PUBLIC SECTION.
"! Supprime tous les espaces d'une chaîne
METHODS remove_spaces
IMPORTING
iv_input TYPE string
RETURNING
VALUE(rv_output) TYPE string.
"! Inverse une chaîne
METHODS reverse_string
IMPORTING
iv_input TYPE string
RETURNING
VALUE(rv_output) TYPE string.
"! Vérifie si une chaîne est un palindrome
METHODS is_palindrome
IMPORTING
iv_input TYPE string
RETURNING
VALUE(rv_result) TYPE abap_bool.
ENDCLASS.
CLASS zcl_string_utils IMPLEMENTATION.
METHOD remove_spaces.
rv_output = iv_input.
REPLACE ALL OCCURRENCES OF ` ` IN rv_output WITH ``.
ENDMETHOD.
METHOD reverse_string.
rv_output = reverse( iv_input ).
ENDMETHOD.
METHOD is_palindrome.
DATA(lv_cleaned) = to_lower( remove_spaces( iv_input ) ).
DATA(lv_reversed) = reverse_string( lv_cleaned ).
rv_result = xsdbool( lv_cleaned = lv_reversed ).
ENDMETHOD.
ENDCLASS.

Structure du dépôt sur GitHub :

my-abap-utils/
├── .abapgit.xml
├── README.md
├── LICENSE
└── src/
└── zcl_string_utils.clas.abap
└── zcl_string_utils.clas.xml

Exemple 2 : CI/CD avec GitHub Actions

.github/workflows/abap-lint.yml
name: ABAP Lint
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20"
- name: Install abaplint
run: npm install -g @abaplint/cli
- name: Run abaplint
run: abaplint

Configuration abaplint.json :

{
"global": {
"files": "/src/**/*.*"
},
"syntax": {
"version": "v756",
"errorNamespace": "^(Z|Y)"
},
"rules": {
"avoid_use": {
"statics": true,
"default": true
},
"line_length": {
"length": 120
},
"method_length": {
"statements": 50
}
}
}

Exemple 3 : Développement en équipe avec Feature Branches

CLASS zcl_customer_validator DEFINITION
PUBLIC FINAL
CREATE PUBLIC.
PUBLIC SECTION.
TYPES:
BEGIN OF ty_validation_result,
valid TYPE abap_bool,
message TYPE string,
END OF ty_validation_result.
METHODS validate_customer
IMPORTING
iv_customer_id TYPE i
RETURNING
VALUE(rs_result) TYPE ty_validation_result.
METHODS validate_credit_limit
IMPORTING
iv_customer_id TYPE i
iv_order_value TYPE p
RETURNING
VALUE(rs_result) TYPE ty_validation_result.
ENDCLASS.
CLASS zcl_customer_validator IMPLEMENTATION.
METHOD validate_customer.
" Fonctionnalité développée sur la branche : feature/customer-validation
" Commit : "feat: Add basic customer validation"
IF iv_customer_id <= 0.
rs_result = VALUE #(
valid = abap_false
message = 'ID client invalide"
).
RETURN.
ENDIF.
" Vérifier le client en base de données
SELECT SINGLE @abap_true
FROM scustom
WHERE id = @iv_customer_id
INTO @DATA(lv_exists).
IF lv_exists = abap_true.
rs_result = VALUE #(
valid = abap_true
message = 'Client valide"
).
ELSE.
rs_result = VALUE #(
valid = abap_false
message = 'Client non trouvé"
).
ENDIF.
ENDMETHOD.
METHOD validate_credit_limit.
" Fonctionnalité développée sur la branche : feature/credit-validation
" Commit : "feat: Add credit limit validation"
" D'abord valider le client
DATA(ls_customer_valid) = validate_customer( iv_customer_id ).
IF ls_customer_valid-valid = abap_false.
rs_result = ls_customer_valid.
RETURN.
ENDIF.
" Vérifier la limite de crédit
SELECT SINGLE discount
FROM scustom
WHERE id = @iv_customer_id
INTO @DATA(lv_limit).
DATA(lv_credit_limit) = CONV p( lv_limit * 10000 ).
IF iv_order_value <= lv_credit_limit.
rs_result = VALUE #(
valid = abap_true
message = |Commande dans la limite de crédit ({ lv_credit_limit })|
).
ELSE.
rs_result = VALUE #(
valid = abap_false
message = |Commande dépasse la limite de crédit ({ lv_credit_limit })|
).
ENDIF.
ENDMETHOD.
ENDCLASS.

Historique Git pour cette fonctionnalité :

* 7a3f2b1 (HEAD -> main) Merge pull request #42: Credit validation
|\
| * 5c2d1e3 (feature/credit-validation) feat: Add credit limit validation
| * 2b1a0c4 feat: Add customer validation helper
|/
* 9f8e7d6 Initial commit

Bonnes pratiques

1. Messages de commit

Utilisez des messages de commit conventionnels :

feat: Add customer validation endpoint
fix: Correct date calculation in report
docs: Update README with setup instructions
refactor: Extract common validation logic
test: Add unit tests for order processing

2. Nommage des branches

feature/customer-validation # Nouvelles fonctionnalités
bugfix/date-calculation # Corrections de bugs
hotfix/critical-security # Corrections urgentes
refactor/extract-utils # Améliorations du code

3. Structure du dépôt

my-abap-project/
├── .abapgit.xml # Configuration abapGit
├── .gitignore # Fichiers ignorés
├── README.md # Documentation du projet
├── LICENSE # Licence
├── abaplint.json # Configuration du linter
├── .github/
│ └── workflows/
│ └── ci.yml # Pipeline CI/CD
└── src/
└── zpackage/ # Objets ABAP
├── zcl_class.clas.abap
└── zif_interface.intf.abap

4. Sécurité

Ne JAMAIS commiter dans Git :
- Mots de passe ou clés API
- Paramètres spécifiques au système
- Données de production
- Code personnalisé (User codé en dur)
À inclure dans .gitignore :
*.log
*.tmp
local_config.*

Dépannage

Problèmes fréquents

Erreur de certificat SSL :

Solution : Importer les certificats SSL dans le système SAP
→ Transaction STRUST
→ Ouvrir SSL Client (Standard)
→ Importer le certificat de github.com

Erreur d’authentification sur GitHub :

Solution : Utiliser un Personal Access Token
1. GitHub → Settings → Developer Settings → Personal Access Tokens
2. Créer un token avec le scope 'repo"
3. Entrer le token comme mot de passe dans abapGit

Erreur de désérialisation :

Solution : Vérifier les dépendances
- Tous les objets référencés sont-ils clonés ?
- La version SAP Basis est-elle correcte ?
- Les packages requis sont-ils présents ?

Conclusion

abapGit apporte les pratiques de développement modernes dans le monde ABAP :

  • Contrôle de version : Historique complet de toutes les modifications
  • Collaboration : Revues de code et travail d’équipe
  • Open Source : Partager et utiliser des projets
  • CI/CD : Contrôles qualité automatisés

Pour les projets open source et les workflows de développement flexibles, abapGit est le premier choix. Pour les environnements Enterprise strictement réglementés avec un support SAP complet, gCTS offre une alternative.

Ressources complémentaires

Articles connexes