ChaRM tickets, manual transports, and midnight cut-overs make ABAP feel 1999. This guide shows how our Micro-GCC squad replaced the ticket parade with a Git-driven CI/CD pipeline:
Result: commit → Prod in 38 minutes, rollback in < 2 minutes, zero manual steps. Copy-paste pipelines, YAML, and ATC variant included.
Traditional flow – SE38 → SE80 → Transport → ChaRM → Basis release night.
Pain points:
Goal: bring ABAP onto the same rails as Java/Node—branch → PR → pipeline → Prod with shift-left quality gates.
java
CopyEdit
GitHub (origin)
▲ |
push / PR | | gCTS webhook
| ▼
gCTS Repo (DEV) ──► ABAP Dev System
(Unit + ATC)
│
Jenkins Pipeline (#123)
│
Transport Factory API (CTS+) —─► QAS —─► PROD
│ ▲
Blue/Green Switch (F5 / SAP APIM)│
▼ │
Grafana & Slack Alerts ──┘
Blue/Green – F5 or APIM toggles traffic; rollback flips alias.
bash
CopyEdit
# First-time clone
abapgit clone https://github.com/acme/sd_pricing.git ZSD_PRICING
# Work, test …
abapUnit run ZSD_PRICING
# Commit & push
git add . && git commit -m “feat: dynamic tax rules”
git push origin feature/tax-rules
Developers use VS Code + ABAP Remote. Commit hooks run abaplint.
/sap/bc/cts_abapvcs/repositories/<repo>/pullByRequest
Triggered by GitHub “push” hook. Imports commit into DEV without transport—the repo is transport layer.
groovy
CopyEdit
pipeline {
agent any
stages {
stage(‘ATC & Unit’) {
steps {
sh ‘abap-ci run –atc-variant S4H_READINESS_EXT –unit –piper’
}
}
stage(‘Build Transport’) {
steps {
sh ‘abap-ci transport assemble –target QAS’
}
}
stage(‘Deploy QAS’) {
steps {
sh ‘abap-ci transport deploy –system QAS’
}
}
stage(‘Blue/Green Prod’) {
when { branch ‘main’ }
steps {
sh ‘abap-ci transport deploy –system PROD –blue-green’
}
}
}
post {
failure { slackSend channel:’#abap-ci’, message:”❌ Pipeline ${env.BUILD_NUMBER} failed” }
success { slackSend channel:’#abap-ci’, message:”✅ Pipeline ${env.BUILD_NUMBER} green” }
}
}
Average runtime 38 min: ATC 22 m, Unit 8 m, build+deploy 8 m.
Transport deploys to PROD-GREEN client (100).
F5 pool weights: GREEN 10 % / BLUE 90 % for 30 min.
Grafana alert if:
If clear, script flips weights to 100 % GREEN. Rollback = one API call.
| Gate | Threshold | Tool |
| ATC Critical | 0 | S4H_READINESS_EXT |
| ABAP Unit | ≥ 90 % pass | abapUnit |
| Code Coverage | ≥ 70 % | Coverage plugin |
| Extended Check (Sci-T) | No open tasks | abap test cockpit |
| Deployment SLR | α Error < 0.5 % | Grafana / Prometheus |
Slack bot posts green/red dashboard at each stage.
| KPI | Pre-CI/CD (ChaRM) | Git-Driven CI/CD |
| Commit → Prod lead time | 7–14 days | 38 min |
| Hot-fix rollback | 2–4 h | < 2 min |
| Defects escaped / 100 changes | 1.2 | 0.2 |
| ATC compliance | 68 % | 100 % |
| Developer NPS | +4 | +33 |
Team delivered three releases per week vs. one per month—without night shifts.
| Pitfall | Fix |
| gCTS repo chaos – multiple transport layers | Create one repo per package group; enforce naming via LDEVPACKAGE security. |
| ATC runtime too long | Split variant by package → parallel Jenkins stages; use –packages arg. |
| abapGit can’t push new DDIC objects | Enable “Serialize DDLS, CDS View” flag; add to abapGit.xml. |
| Object locks during gCTS pull | Schedule hourly pulls or use webhook; developers re-base before push. |
| Basis team uneasy | Run pilot in sandbox; show rollback in 2 min to earn trust. |
| Sprint | Milestone |
| 1 | Install abapGit 1.122; export one pilot package. |
| 2 | Spin gCTS repo; hook Jenkins ATC pipeline. |
| 3 | Auto-build transport → QAS; manual Prod deploy. |
| 4 | Implement blue/green & Slack alerts; enable Prod auto-deploy for low-risk. |
| 5 | Expand to all Z-packages; retire ChaRM for custom code. |