gCTS : Git-enabled Change and Transport System

Catégorie
DevOps
Publié
Auteur
Johannes

gCTS (Git-enabled Change and Transport System) revolutionne la gestion des transports dans SAP ABAP en utilisant Git comme systeme de controle de version central. Ainsi, les pratiques DevOps modernes comme le branching, les pull requests et le CI/CD deviennent possibles pour le developpement ABAP.

Qu’est-ce que gCTS ?

gCTS connecte le systeme de transport SAP classique avec les repositories Git. Au lieu de deplacer des ordres de transport entre les systemes, les objets ABAP sont stockes sous forme de fichiers dans Git et synchronises via des operations Git.

AspectCTS classiquegCTS
VersionnementOrdres de transportCommits Git
BranchingImpossibleBranching complet
ComparaisonLimiteeDiff entre commits/branches
CollaborationLimiteePull Requests, Code Review
HistoriqueLogs de transportHistorique Git complet
RollbackManuelGit Revert/Reset
CI/CDDifficileIntegration native
OutillageSpecifique SAPOutils Git standard

Vue d’ensemble de l’architecture

+-----------------------------------------------------------------------+
| Paysage de developpement |
| |
| +-------------+ +-------------+ +-------------+ |
| | DEV | | QAS | | PRD | |
| | Systeme | | Systeme | | Systeme | |
| | | | | | | |
| | +-------+ | | +-------+ | | +-------+ | |
| | | gCTS | | | | gCTS | | | | gCTS | | |
| | |Client | | | |Client | | | |Client | | |
| | +---+---+ | | +---+---+ | | +---+---+ | |
| +------+------+ +------+------+ +------+------+ |
| | | | |
| +--------+---------+--------+---------+ |
| | | |
| Push | | Pull |
| v v |
| +-------------------------------+ |
| | Repository Git | |
| | (GitHub / GitLab / etc.) | |
| | | |
| | main ------+--------------- | |
| | | | |
| | feature/* -+-- branch -- | |
| | | |
| +-------------------------------+ |
+-----------------------------------------------------------------------+

Avantages de gCTS

Perspective developpeur

  • Feature Branches : Developpement isole de nouvelles fonctionnalites
  • Pull Requests : Code review avant l’integration
  • Historique Git : Tracabilite complete de tous les changements
  • Comparaisons : Diffs faciles entre versions
  • Outils locaux : Utilisation de VS Code, clients Git, etc.

Perspective operations

  • Automatisation : Pipelines CI/CD pour tests et deploiements
  • Rollback : Retour simple aux versions anterieures
  • Strategies de branching : GitFlow, Trunk-based Development
  • Conformite : Piste d’audit via l’historique Git
  • Multi-systeme : Deploiements coherents sur les paysages systemes

Setup et configuration

Prerequis

  • SAP S/4HANA ou SAP BTP ABAP Environment
  • Repository Git (GitHub, GitLab, Azure DevOps, Bitbucket)
  • Certificats SSL pour le serveur Git
  • Autorisations : S_CTS_ADMI, S_CTS_SADM

1. Importer les certificats SSL

Les certificats SSL du serveur Git doivent d’abord etre importes :

Transaction: STRUST
1. Ouvrir SSL Client (Standard)
2. Importer le certificat:
- GitHub: github.com
- GitLab: gitlab.com (ou votre propre domaine)
3. Actualiser la liste des certificats
4. Sauvegarder

2. Creer un repository gCTS

Dans la transaction SE80 ou GCTS_MAINT (App Fiori) :

+--------------------------------------------------------------+
| Configuration du Repository |
+--------------------------------------------------------------+
| |
| Nom du Repository: Z_MY_PROJECT |
| URL Distante: https://github.com/company/my-project.git|
| Branche: main |
| |
| Authentification: |
| o Authentification basique |
| * Base sur token (recommande) |
| |
| Nom d'utilisateur: github-service-user |
| Token: ghp_xxxxxxxxxxxx |
| |
| vSID (Virtual System ID): DEV |
| |
+--------------------------------------------------------------+

3. Appel API du repository

gCTS peut aussi etre configure via l’API REST :

CLASS zcl_gcts_setup DEFINITION
PUBLIC FINAL
CREATE PUBLIC.
PUBLIC SECTION.
METHODS create_repository
IMPORTING
iv_repository_name TYPE string
iv_remote_url TYPE string
iv_branch TYPE string DEFAULT 'main"
RAISING
cx_web_http_client_error.
ENDCLASS.
CLASS zcl_gcts_setup IMPLEMENTATION.
METHOD create_repository.
DATA(lo_destination) = cl_http_destination_provider=>create_by_url(
i_url = |http://localhost:50000/sap/bc/cts_abapvcs/repository| ).
DATA(lo_client) = cl_web_http_client_manager=>create_by_http_destination(
i_destination = lo_destination ).
" Creer le corps de la requete
DATA: BEGIN OF ls_request,
repository TYPE string,
url TYPE string,
branch TYPE string,
role TYPE string VALUE 'SOURCE',
END OF ls_request.
ls_request-repository = iv_repository_name.
ls_request-url = iv_remote_url.
ls_request-branch = iv_branch.
DATA(lv_json) = /ui2/cl_json=>serialize(
data = ls_request
compress = abap_true
pretty_name = /ui2/cl_json=>pretty_mode-camel_case ).
DATA(lo_request) = lo_client->get_http_request( ).
lo_request->set_header_field( i_name = 'Content-Type' i_value = 'application/json' ).
lo_request->set_text( lv_json ).
DATA(lo_response) = lo_client->execute( if_web_http_client=>post ).
IF lo_response->get_status( )-code <> 201.
" Gestion des erreurs
DATA(lv_error) = lo_response->get_text( ).
RAISE EXCEPTION TYPE cx_web_http_client_error.
ENDIF.
lo_client->close( ).
ENDMETHOD.
ENDCLASS.

4. Lier le package ABAP au repository

" Connecter le package Z_MY_PACKAGE au repository gCTS
" Cela se fait dans SE80 ou via l'API
DATA: BEGIN OF ls_link,
package TYPE devclass VALUE 'Z_MY_PACKAGE',
repository TYPE string VALUE 'Z_MY_PROJECT',
END OF ls_link.

Workflow Git avec gCTS

Creer un commit

Apres des modifications sur des objets ABAP, celles-ci peuvent etre committees :

+--------------------------------------------------------------+
| Dialogue Commit |
+--------------------------------------------------------------+
| |
| Objets modifies: |
| [x] ZCL_CUSTOMER_SERVICE (Classe) |
| [x] ZI_CUSTOMER (CDS View) |
| [x] ZC_CUSTOMER (CDS Projection) |
| [ ] ZCL_TEST_HELPER (Classe) |
| |
| Message de commit: |
| +----------------------------------------------------+ |
| | feat: API Client etendue | |
| | | |
| | - Nouvelle methode get_customer_orders ajoutee | |
| | - CDS View etendue avec association Orderhistory | |
| | - Tests unitaires ajoutes | |
| +----------------------------------------------------+ |
| |
| [ Commit ] [ Commit & Push ] [ Annuler ] |
| |
+--------------------------------------------------------------+

Push, Pull et Checkout

Push - Transferer les commits locaux vers le repository distant :

METHOD push_changes.
" Appeler l'API REST gCTS
DATA(lo_client) = create_gcts_client( ).
DATA(lo_request) = lo_client->get_http_request( ).
lo_request->set_uri_path(
|/sap/bc/cts_abapvcs/repository/{ mv_repository }/push| ).
DATA(lo_response) = lo_client->execute( if_web_http_client=>post ).
IF lo_response->get_status( )-code = 200.
" Push reussi
DATA(lv_result) = lo_response->get_text( ).
ENDIF.
lo_client->close( ).
ENDMETHOD.

Pull - Recuperer les modifications du repository distant :

METHOD pull_changes.
DATA(lo_client) = create_gcts_client( ).
DATA(lo_request) = lo_client->get_http_request( ).
lo_request->set_uri_path(
|/sap/bc/cts_abapvcs/repository/{ mv_repository }/pull| ).
DATA(lo_response) = lo_client->execute( if_web_http_client=>post ).
IF lo_response->get_status( )-code = 200.
" Pull reussi - Les objets ABAP sont mis a jour
ENDIF.
lo_client->close( ).
ENDMETHOD.

Changer de branche (Checkout) :

METHOD checkout_branch.
DATA(lo_client) = create_gcts_client( ).
DATA: BEGIN OF ls_request,
branch TYPE string,
END OF ls_request.
ls_request-branch = iv_branch_name.
DATA(lv_json) = /ui2/cl_json=>serialize( data = ls_request compress = abap_true ).
DATA(lo_request) = lo_client->get_http_request( ).
lo_request->set_uri_path(
|/sap/bc/cts_abapvcs/repository/{ mv_repository }/checkout| ).
lo_request->set_header_field( i_name = 'Content-Type' i_value = 'application/json' ).
lo_request->set_text( lv_json ).
DATA(lo_response) = lo_client->execute( if_web_http_client=>post ).
lo_client->close( ).
ENDMETHOD.

Strategies de branching

GitFlow pour ABAP

main (Production)
|
+-- release/1.0 ------------------------------> PRD
| |
+-- develop -----------------------------------> QAS
| |
| +-- feature/customer-api -----------------> DEV
| | |
| | +-- Merge via Pull Request
| |
| +-- feature/order-workflow ---------------> DEV
|
+-- hotfix/fix-calculation -------------------> Merge vers main & develop

Trunk-based Development

main
|
+-- commit A ----> Auto-Deploy DEV
+-- commit B ----> Auto-Deploy DEV
+-- commit C ----> Auto-Deploy DEV
|
+-- Release Tag v1.0 ----> Deploy QAS ----> Deploy PRD

Workflow Feature-Branch

Workflow typique pour une fonctionnalite :

Terminal window
# 1. Creer une feature-branch (dans l'UI gCTS ou l'API)
Branch: feature/new-customer-api
# 2. Developpement dans le systeme DEV
# - Modifier le code
# - Ecrire les tests
# - Creer les commits
# 3. Push vers le distant
git push origin feature/new-customer-api
# 4. Creer une Pull Request (GitHub/GitLab)
# - Code Review
# - Tests CI/CD
# - Approbation
# 5. Merge dans develop/main
# - Automatiquement ou manuellement
# 6. Pull dans le systeme QAS/PRD
# - Operation Pull gCTS
# - Les objets sont mis a jour

Integration avec GitHub/GitLab

GitHub Actions pour ABAP

Creer un pipeline pour des tests automatises :

.github/workflows/abap-ci.yml
name: ABAP CI/CD
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main, develop ]
jobs:
abap-unit-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run ABAP Unit Tests
uses: sap/abap-ci-action@v1
with:
abap-endpoint: ${{ secrets.ABAP_ENDPOINT }}
username: ${{ secrets.ABAP_USER }}
password: ${{ secrets.ABAP_PASSWORD }}
packages: 'Z_MY_PACKAGE"
- name: Run ATC Checks
uses: sap/abap-atc-action@v1
with:
abap-endpoint: ${{ secrets.ABAP_ENDPOINT }}
username: ${{ secrets.ABAP_USER }}
password: ${{ secrets.ABAP_PASSWORD }}
packages: 'Z_MY_PACKAGE"
variant: 'Z_CI_CHECKS"
- name: Deploy to QAS
if: github.ref == 'refs/heads/main"
run: |
curl -X POST \
"${{ secrets.QAS_ENDPOINT }}/sap/bc/cts_abapvcs/repository/Z_MY_PROJECT/pull" \
-u "${{ secrets.ABAP_USER }}:${{ secrets.ABAP_PASSWORD }}"

Comparaison : gCTS vs. abapGit

FonctionnalitegCTSabapGit
Support SAPOfficiellement par SAPProjet communautaire
IntegrationNative dans le CTSOutil autonome
Objets de transportCompletement supporteQuelques limitations
Paysage systemeIntegreGestion separee
Open SourceNonOui
FlexibiliteWorkflows standardHautement personnalisable
SetupComplexePlus simple
Courbe d’apprentissagePlus raidePlus plate

Recommandation :

  • gCTS : Pour les paysages systemes productifs avec exigences de support Enterprise
  • abapGit : Pour les projets open-source, prototypes ou quand une flexibilite maximale est necessaire

Depannage

Problemes frequents

Erreur de certificat SSL :

Erreur: SSL certificate verification failed
Solution: Importer le certificat dans STRUST (voir Setup)

Erreur d’authentification :

Erreur: 401 Unauthorized
Solution:
- Verifier les autorisations du token (repo, write:packages)
- Mettre a jour le nom d'utilisateur/token dans la configuration gCTS

Conflits de merge :

Erreur: Cannot pull - conflicts detected
Solution:
1. Resoudre les conflits dans le repository Git
2. Executer Pull a nouveau
3. Eventuellement rejeter les modifications locales et pull a nouveau

Verrous d’objets :

Erreur: Object is locked by another user
Solution:
1. Verifier/liberer le verrou dans SM12
2. Executer Pull a nouveau

Logs et diagnostic

" Recuperer les logs gCTS
METHOD get_repository_logs.
DATA(lo_client) = create_gcts_client( ).
DATA(lo_request) = lo_client->get_http_request( ).
lo_request->set_uri_path(
|/sap/bc/cts_abapvcs/repository/{ iv_repository }/log| ).
DATA(lo_response) = lo_client->execute( if_web_http_client=>get ).
IF lo_response->get_status( )-code = 200.
rv_logs = lo_response->get_text( ).
ENDIF.
lo_client->close( ).
ENDMETHOD.

Bonnes pratiques

ThemeRecommandation
Messages de commitUtiliser les commits conventionnels (feat:, fix:, docs:, etc.)
BranchingFeature-branches pour le developpement isole
Code ReviewPull Requests avec au moins un reviewer
CI/CDTests automatises avant chaque merge
TaggingTaguer les releases avec versionnement semantique
DocumentationMaintenir README.md et CHANGELOG.md
SecretsGerer les tokens et mots de passe dans Secrets
BackupLe repository Git est la sauvegarde - pull regulierement
FormationFormer l’equipe aux bases de Git
MigrationMigrer progressivement de CTS vers gCTS

Sujets complementaires