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érialisation | Convertit les objets ABAP en fichiers XML/JSON |
| Intégration Git | Push, Pull, Branch, Merge directement depuis SAP |
| Support Offline | Export/Import en fichiers ZIP |
| Open Source | Piloté 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)
- Téléchargez la version actuelle depuis abapGit Releases
- Créez un nouveau report
ZABAPGIT_STANDALONEdans SE38/ADT - Copiez le code source complet dans le report
- 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.gitabapGit dans ADT (Eclipse)
Pour ADT, il existe le plugin abapGit Eclipse :
- Help → Install New Software
- URL :
https://eclipse.abapgit.org/updatesite/ - Sélectionnez abapGit for ABAP Development Tools
- 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 :
- Lancer abapGit : Transaction
ZABAPGITou exécuter le report - Ajouter un dépôt : Cliquez sur ”+ Online”
- Entrer l’URL : ex.
https://github.com/username/my-abap-project.git - Sélectionner le package : Package existant comme
ZRAP_DEMO - Authentification : Token GitHub pour les dépôts privés
Cloner un dépôt
Pour cloner un dépôt existant :
1. Ouvrir abapGit2. Cliquer sur "+ Online"3. URL du dépôt : https://github.com/SAP-samples/abap-platform-rap-opensap.git4. Créer un nouveau package : ZRAP_OPENSAP5. Branche : main6. 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 :
- Ouvrez le dépôt dans abapGit
- Cliquez sur “Stage”
- 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és3. Sélectionner les objets pour le commit (Stage)4. Entrer le message de commit5. Cliquer sur "Commit"Push vers le dépôt distant
Après le commit :
1. Bouton "Push" dans la vue du dépôt2. Pour GitHub : Entrer le Personal Access Token3. Le push est exécuté4. Les modifications sont visibles dans le dépôt distantExemple 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 :
- Modifier et activer la classe dans ADT
- Ouvrir abapGit → Sélectionner le dépôt
- “Stage” → Sélectionner
ZCL_ABAPGIT_WORKFLOW.clas.abap - Message de commit :
feat: Add order processing method - Commit → Push
Branches et Merging
Créer une branche
Dans abapGit :
1. Ouvrir le dépôt2. Dropdown "Branch" → "Create Branch"3. Entrer le nom de la branche : feature/new-validation4. Branche de base : main5. Créer la branche
La nouvelle branche est maintenant active.Changer de branche
1. Ouvrir le dépôt dans abapGit2. Cliquer sur le dropdown "Branch"3. Sélectionner la branche souhaitée4. 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 abapGitGérer les conflits de merge
En cas de conflits entre branches :
1. Le Pull échoue avec un message de conflit2. 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 Push3. Dans abapGit : Exécuter à nouveau le PullConfiguration .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ètre | Description | Valeurs |
|---|---|---|
MASTER_LANGUAGE | Langue originale | D (Allemand), E (Anglais), F (Français) |
STARTING_FOLDER | Répertoire racine | /src/, / |
FOLDER_LOGIC | Structure des dossiers | PREFIX, FULL, MIXED |
IGNORE | Fichiers ignorés | Liste 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.abapExemple : 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 :
| Aspect | abapGit | gCTS |
|---|---|---|
| Licence | Open Source | Licence SAP requise |
| Installation | Simple (Report) | Configuration système |
| Flexibilité | Élevée | Définie par SAP |
| Support Cloud | Oui (BTP) | Oui (S/4HANA) |
| Intégration Transport | Optionnelle | Complète |
| CI/CD | Externe (GitHub Actions) | SAP CI/CD Service |
| Courbe d’apprentissage | Faible | Moyenne |
| Support Enterprise | Communauté | 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.xmlExemple 2 : CI/CD avec GitHub Actions
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: abaplintConfiguration 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 commitBonnes pratiques
1. Messages de commit
Utilisez des messages de commit conventionnels :
feat: Add customer validation endpointfix: Correct date calculation in reportdocs: Update README with setup instructionsrefactor: Extract common validation logictest: Add unit tests for order processing2. Nommage des branches
feature/customer-validation # Nouvelles fonctionnalitésbugfix/date-calculation # Corrections de bugshotfix/critical-security # Corrections urgentesrefactor/extract-utils # Améliorations du code3. 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.abap4. 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*.tmplocal_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.comErreur d’authentification sur GitHub :
Solution : Utiliser un Personal Access Token1. GitHub → Settings → Developer Settings → Personal Access Tokens2. Créer un token avec le scope 'repo"3. Entrer le token comme mot de passe dans abapGitErreur 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.