Multi-platform CI/CD orchestration library for Jenkins, GitHub Actions, GitLab CI, and Bitbucket Pipelines.
Build any language stack. Deploy to any CMS or framework.
ci-orchestrator is a Jenkins shared library (with GitHub Actions, GitLab CI, and Bitbucket Pipelines support planned) that turns a single ciorch.yml config file into a complete CI/CD pipeline — regardless of language, framework, or branching strategy.
Instead of writing a Jenkinsfile from scratch for every project, you declare what to build and where to deploy, and the orchestrator figures out which steps to run based on the Git event (push, PR, tag, release).
- Data-driven pipelines — branching rules are YAML, not code. Swap strategies (
gitflow,github-flow,trunk-based) without touching yourJenkinsfile. - Adapter pattern — plug in any build toolchain (Node, PHP, Go, Java, Python, Rust, Docker…) or deploy target (WordPress, Drupal, Symfony, Django, FastAPI…) via a single interface.
- Shell-injection safe — all external values are passed through
withEnv+ single-quoted shell variables, never interpolated into Groovy strings. - Jenkins CPS compliant — all classes implement
Serializable; regex and split operations are annotated@NonCPS. - Testable — 81 unit tests (Spock + JenkinsPipelineUnit) run without a live Jenkins instance.
- Single config file —
ciorch.ymlat repo root is read by every supported platform.
| Platform | Status | Docs |
|---|---|---|
| Jenkins Shared Library | ✅ Phase 1 — core complete | Getting Started |
| GitHub Actions | 🔜 Phase 4 | — |
| GitLab CI | 🔜 Phase 5 | Preview |
| Bitbucket Pipelines | 🔜 Phase 6 | Preview |
1. Register the library in Manage Jenkins → Global Pipeline Libraries:
| Field | Value |
|---|---|
| Name | ci-orchestrator |
| Default version | main |
| Repository URL | https://github.com/nikolareljin/ci-orchestrator.git |
2. Add ciorch.yml to your repo root:
ciorch:
version: "1"
build:
adapter: node
node_version: "20"
test_command: "npm test"
build_command: "npm run build"
deploy:
adapter: wordpress
environments:
staging:
host: staging.example.com
user: deploy
path: /var/www/staging
production:
host: prod.example.com
user: deploy
path: /var/www/html
branching:
strategy: gitflow
notify:
slack:
channel: "#deployments"3. Create a Jenkinsfile:
@Library('ci-orchestrator@main') _
ciorch(
payload: env.GITHUB_WEBHOOK_PAYLOAD ?: '',
apiToken: env.GITHUB_TOKEN ?: '',
apiUser: env.GITHUB_USER ?: ''
)That's it. When a webhook fires, ci-orchestrator parses the event, matches it against the GitFlow branching rules, and runs lint → test → build → deploy → tag as appropriate.
GitHub Webhook
│
▼
WebhookParser ← parses JSON into a GitEvent
│
▼
MatrixEvaluator ← matches event against YAML rules → task list
│
▼
PipelineOrchestrator ← dispatches tasks sequentially
├── BuildAdapter ← lint / test / build
├── DeployAdapter ← pre-deploy / deploy / post-deploy
├── GitOperations ← tag / commit / push
└── Notifier ← Slack / webhook
The branching strategy YAML (resources/matrix/default-gitflow.yml) controls which tasks run for each combination of source branch, destination branch, and event type. Rules are priority-ordered; the highest-priority match wins.
| Adapter | Language | Phase |
|---|---|---|
docker |
Generic Docker build | ✅ 1 |
node |
Node.js / npm / yarn | 🔜 2 |
php |
PHP / Composer | 🔜 2 |
python |
Python / pip | 🔜 2 |
go |
Go modules | 🔜 2 |
java-maven |
Java + Maven | 🔜 2 |
java-gradle |
Java + Gradle | 🔜 2 |
dotnet |
.NET / C# | 🔜 2 |
rust |
Rust / Cargo | 🔜 2 |
cpp |
C/C++ / CMake | 🔜 2 |
| Adapter | Target | Phase |
|---|---|---|
wordpress |
WordPress + WP-CLI | 🔜 3 |
drupal |
Drupal + Drush | 🔜 3 |
symfony |
Symfony + Deployer.php | 🔜 3 |
django |
Django + manage.py | 🔜 3 |
fastapi |
FastAPI + uvicorn | 🔜 3 |
sugarcrmm |
SugarCRM / SuiteCRM | 🔜 3 |
dotnetnuke |
DNN / DotNetNuke | 🔜 3 |
./gradlew :tests:unit:testTests use JenkinsPipelineUnit + Spock and run without a live Jenkins instance. 81 tests covering Version, MatrixEvaluator, WebhookParser, and Config.
| Topic | Link |
|---|---|
ciorch.yml full reference |
docs/ciorch-yml-reference.md |
| Jenkins — Getting Started | docs/jenkins/getting-started.md |
| Jenkins — Configuration | docs/jenkins/configuration.md |
| Git Action Matrix (rule engine) | docs/jenkins/git-action-matrix.md |
| Build Adapters | docs/jenkins/build-adapters.md |
| Deploy Adapters | docs/jenkins/deploy-adapters.md |
| GitLab CI (planned) | docs/gitlab/getting-started.md |
| Bitbucket Pipelines (planned) | docs/bitbucket/getting-started.md |
ci-orchestrator/
├── src/io/ciorch/
│ ├── core/ # PipelineOrchestrator, Config, SystemCall, Version, Notifier
│ ├── git/ # WebhookParser, GitEvent, MatrixLoader, MatrixEvaluator, GitOperations
│ ├── build/ # BuildAdapter interface + DockerAdapter
│ └── deploy/ # DeployAdapter interface
├── vars/ # ciorch.groovy — Jenkins global variable entry point
├── resources/matrix/ # default-gitflow.yml, github-flow.yml, trunk-based.yml
├── gitlab/ # GitLab CI templates (Phase 5)
├── bitbucket/ # Bitbucket Pipes (Phase 6)
├── tests/unit/ # Spock tests
├── assets/ # Logo and visual assets
└── docs/ # Per-platform documentation
- Fork and clone this repository.
- Create a feature branch:
git checkout -b feature/my-change. - Add or update tests (
./gradlew :tests:unit:test). - Open a pull request against
main.
Please open an issue before starting work on large features so we can discuss the approach.