An enterprise-grade, multi-cluster continuous integration and progressive delivery platform purpose-built for TIBCO BusinessWorksβ’ Container Edition (BWCE 2.9.2 / 2.10.0) microservices on Red Hat OpenShift 4.20+. It integrates Jenkins Configuration as Code (JCasC), Dynamic Git Parameter Plugin Dropdowns, Multi-Remote SCM, ArgoCD 3.5 Multi-Cluster GitOps, and Datadog Full-Stack Observability (APM, DogStatsD, CI Visibility, Logs, and Argo Rollouts Metric Analysis).
Important
- Non-Production Testing Status: This repository serves as an architectural reference blueprint, educational design pattern, and foundational boilerplate. It has not been tested or executed in a live production environment.
- Sovereign & Air-Gapped Boilerplate: This project is engineered as a deterministic, version-controlled Infrastructure-as-Code (IaC) template that can be safely used as a standardized boilerplate in enterprise environments where Agentic AI / LLMs are prohibited due to data sovereignty, compliance regulations, intellectual property protection, or air-gapped security policies.
- Enterprise Hardening: Platform engineers must review, adapt, and validate all cluster endpoints, TLS certificates, HashiCorp Vault configurations, Datadog API keys, and RBAC quotas prior to production adoption.
- AI Generation Attribution: This architecture, Infrastructure-as-Code implementation, and documentation were generated using Gemini 3.7 Flash with Antigravity.
- Origin & Real-World Heritage: This blueprint is based on nubenetes/jenkins-git-parameter and nubenetes/jenkins-git-parameter-global-vars, drawing directly from the author's personal hands-on experience designing and operating enterprise integration platforms with these exact requirements (engineered just before agentic AI became widespread).
Tip
This orchestration platform works in tandem with its centralized configuration repository:
π nubenetes/jenkins-git-parameter-bwce-global-vars
(Houses multi-cluster environment topologies, externalized .substvar BWCE profiles, Helm values, and Vault secret references)
- Executive Summary & Architecture Overview
- TIBCO BWCE Cloud-Native Best Practices
- Datadog Full-Stack Observability Architecture
- Multi-Repository Git Parameter CI/CD Patterns
- Enterprise Security & Supply Chain Integrity
- Repository Structure
- Quick Start & Deployment
- Decommissioning & Reinstallation
- References & Standards
This platform delivers an automated, governed, multi-cluster CI/CD and GitOps delivery pipeline for enterprise TIBCO BWCE workloads across three OpenShift clusters (DEV, STAGING, PROD).
πΊοΈ Click to expand: End-to-End Multi-Cluster Platform Topology Diagram
flowchart TB
subgraph DevSystems ["1. Developer & Portals"]
Dev["Developer / Ops"]
Backstage["Backstage IDP<br/>Service Catalog"]
ITSM["Jira Service Mgmt<br/>ServiceNow CMDB"]
end
subgraph OCP_DEV ["Cluster 1: OCP DEV"]
direction TB
subgraph JenkinsPlatform ["Jenkins Control Plane"]
Master["Jenkins Master<br/>2.492.2 LTS"]
Seed["00-Seed-Job<br/>Orchestrator"]
CIJob["01-CI-Build<br/>BWCE App Git"]
CDJob["02-CD-Release<br/>Global Vars Git"]
end
subgraph Agents ["Agent Pods"]
BwceAgent["bwce-builder<br/>EAR & Tests"]
GitOpsAgent["argocd-gitops<br/>Skopeo & Cosign"]
end
subgraph OCPDevRegistry ["DEV Registry"]
DevReg["Internal Registry<br/>dev-bwce"]
end
subgraph ArgoCDMaster ["ArgoCD 3.5"]
ArgoServer["ArgoCD Server<br/>ApplicationSets"]
end
subgraph DatadogAgentStack ["Datadog Stack"]
DDAgent["Datadog Agent<br/>APM:8126 | DSD:8125"]
DDCluster["Cluster Agent<br/>Metrics Provider"]
end
DevApps["BWCE DEV Apps<br/>dev-bwce"]
end
subgraph OCP_STG ["Cluster 2: OCP STAGING"]
StgReg["STG Registry"]
StgApps["BWCE STAGING Apps<br/>staging-bwce"]
end
subgraph OCP_PRD ["Cluster 3: OCP PROD"]
PrdReg["PROD Registry"]
PrdApps["BWCE PROD Apps<br/>prod-bwce"]
RolloutCtrl["Argo Rollouts<br/>Canary Controller"]
end
subgraph DatadogCloud ["Datadog Cloud"]
DDCIVis["CI Visibility<br/>Pipeline Spans"]
DDAPM["APM Tracing<br/>Live Profiling"]
DDDash["Dashboards<br/>& Monitors"]
end
Dev -->|"Selects Branch"| CIJob
Dev -->|"Selects Config"| CDJob
Backstage -->|"REST API"| CDJob
ITSM -->|"Webhook"| CDJob
CIJob -->|"Launches"| BwceAgent
BwceAgent -->|"Pushes Image"| DevReg
CIJob -->|"Triggers CD"| CDJob
CDJob -->|"Launches"| GitOpsAgent
GitOpsAgent -->|"Skopeo Copy"| StgReg
GitOpsAgent -->|"Skopeo Copy"| PrdReg
GitOpsAgent -->|"Sync & Health"| ArgoServer
ArgoServer -->|"GitOps"| DevApps
ArgoServer -->|"GitOps"| StgApps
ArgoServer -->|"Sync Waves"| PrdApps
Master -.->|"CI Spans"| DDAgent
DevApps -.->|"APM & Metrics"| DDAgent
StgApps -.->|"APM & Metrics"| DDAgent
PrdApps -.->|"APM & Metrics"| DDAgent
DDAgent -->|"HTTPS"| DatadogCloud
RolloutCtrl -.->|"Query Metrics"| DatadogCloud
In enterprise TIBCO BWCE implementations, building environment-specific EAR files violates 12-Factor principles. Instead:
- Build Once: A single immutable
.earartifact (tibco-bwce-order-service_2.1.0.ear) is compiled during CI and packaged into the container image (FROM tibco/bwce:2.9.2). - Externalize Profiles: Configuration tokens (
DEV.substvar,STAGING.substvar,PROD.substvar) reside in the Single Source of Truth configuration repository:jenkins-git-parameter-bwce-global-vars. - Runtime Injection: The runtime profile is selected via
BW_PROFILEenvironment variable or ConfigMap volume mount at container startup.
βοΈ Click to expand: TIBCO BWCE Profile Externalization Flow Diagram
flowchart LR
subgraph BuildTime ["1. CI Packaging"]
Source[".bwp Sources"] --> Maven["Maven Plugin"]
Maven --> EAR["Single EAR"]
EAR --> BaseImage["tibco/bwce:2.9.2"]
BaseImage --> Image["Container Image<br/>(Immutable)"]
end
subgraph GitOpsSSOT ["2. Global Vars SSOT"]
DevVars["DEV.substvar<br/>(dev.yaml)"]
StgVars["STAGING.substvar<br/>(staging.yaml)"]
PrdVars["PROD.substvar<br/>(prod.yaml)"]
end
subgraph RuntimeDeploy ["3. OpenShift Runtime"]
Image --> OCPDev["DEV Pod<br/>Profile: DEV"]
Image --> OCPStg["STG Pod<br/>Profile: STG"]
Image --> OCPPrd["PROD Pod<br/>Profile: PROD"]
DevVars -.->|"ConfigMap"| OCPDev
StgVars -.->|"ConfigMap"| OCPStg
PrdVars -.->|"ConfigMap"| OCPPrd
end
The BusinessWorks Container Edition runtime engine requires deliberate sizing parameters adapted to container cgroups:
| Environment | Replicas | CPU Request (Burstable) | Memory Req / Limit | BW_ENGINE_THREADCOUNT |
BW_STEP_FLOWLIMIT |
BW_LOGLEVEL |
|---|---|---|---|---|---|---|
| DEV | 2 | 250m (No CPU Limit) |
512Mi / 1024Mi | 16 |
50 |
DEBUG |
| STAGING | 3 | 500m (No CPU Limit) |
768Mi / 1536Mi | 32 |
100 |
INFO |
| PROD | 6 | 1000m (No CPU Limit) |
1024Mi / 2048Mi | 64 |
250 |
WARN |
Tip
- The CFS Quota Problem in Multi-Threaded Runtimes: Setting
resources.limits.cpuinstructs the Linux kernel Completely Fair Scheduler (CFS) to enforce hard bandwidth quotas (cfs_quota_usover 100ms periods). Because TIBCO BWCE and JVM garbage collection are highly concurrent (e.g. 16β64 engine threads), parallel thread execution can consume the quota in milliseconds, causing the container to be hard-throttled for the remainder of the period. This induces artificial p99 latency spikes and timeouts even when the OpenShift worker node has surplus CPU capacity. - Namespace-Level ResourceQuota Governance: Instead of per-pod CPU limits, capacity governance and noisy-neighbor protection are enforced at the OpenShift Project/Namespace boundary using
security/openshift-namespace-resource-quota.yaml(ResourceQuotafor aggregaterequests.cpu,requests.memory, andlimits.memory). - Deterministic Memory Limits: Unlike CPU (which is compressible), Memory is strictly capped with
limits.memoryto prevent out-of-memory cascading to neighbor pods.
BW_ENGINE_THREADCOUNT: Specifies the number of engine worker threads executing process instances concurrently.BW_STEP_FLOWLIMIT: Prevents unbounded memory growth during traffic bursts by capping active in-memory process transitions.BW_CONTAINER_SHUTDOWN_TIMEOUT_SECONDS: Set to30s(DEV/STAGING) and45s(PROD) for clean process draining uponSIGTERM.- JVM Options:
-XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0 -XX:+UseG1GC -XX:+ExplicitGCInvokesConcurrentensuring GC predictability inside Linux container cgroups.
- Security Context Constraints: Complies with OpenShift
restricted-v2SCC (non-rootuid: 1001, dropped capabilitiesALL, read-only root filesystems). - Probes:
- Liveness Probe:
HTTP GET http://:8090/health(Initial delay:45s, Period:15s, Timeout:5s). - Readiness Probe:
HTTP GET http://:8090/health(Initial delay:20s, Period:10s, Timeout:3s).
- Liveness Probe:
Replaces OpenTelemetry and Grafana with an enterprise Datadog observability stack.
π Click to expand: Datadog Full-Stack Observability Architecture Diagram
flowchart TB
subgraph Sources ["1. OpenShift Workloads"]
direction TB
Jenkins["Jenkins Master<br/>(Datadog Plugin)"]
BWCEApp["TIBCO BWCE App<br/>(dd-java-agent)"]
RolloutCtrl["Argo Rollouts<br/>(Canary Engine)"]
end
subgraph DaemonSetLayer ["2. Node Agent Layer"]
direction TB
DDAgent["Datadog Agent<br/>(DaemonSet)<br/>ββββββββββββββ<br/>APM Port: 8126<br/>StatsD Port: 8125<br/>Metrics: 8090<br/>Logs: JSON"]
end
subgraph CloudPlatform ["3. Datadog Cloud Platform"]
direction TB
CIVisibility["CI Visibility<br/>Pipeline Spans<br/>Queue Metrics"]
APMTrace["APM Tracing<br/>HTTP & JMS<br/>Distributed Spans"]
OpenMetrics["Engine Metrics<br/>Thread Pools<br/>JVM GC Pauses"]
Dashboards["Dashboards<br/>β’ Jenkins CI<br/>β’ BWCE Engine<br/>β’ ArgoCD Sync"]
Monitors["Alert Monitors<br/>β’ 5xx > 1.0%<br/>β’ p99 > 500ms<br/>β’ Queue Spikes"]
end
Jenkins -->|"CI Spans"| DDAgent
BWCEApp -->|"APM: 8126"| DDAgent
BWCEApp -->|"Metrics: 8090"| DDAgent
BWCEApp -->|"Logs"| DDAgent
DDAgent -->|"HTTPS"| CIVisibility
DDAgent -->|"HTTPS"| APMTrace
DDAgent -->|"HTTPS"| OpenMetrics
CIVisibility --> Dashboards
APMTrace --> Dashboards
OpenMetrics --> Dashboards
CIVisibility --> Monitors
APMTrace --> Monitors
OpenMetrics --> Monitors
RolloutCtrl -.->|"Query SLA"| APMTrace
The official Datadog Jenkins Plugin (datadog:5.9.0) is configured via JCasC (jcasc/jenkins-jcasc.yaml):
- Automatically correlates pipeline builds, stage execution times, agent queue wait times, and test results.
- Injects Datadog Trace IDs (
x-datadog-trace-id) across pipeline steps. - Global tags:
env:dev,team:integration-platform,tech:tibco-bwce,cluster:ocp-dev.
- Java Tracer: The Datadog Java APM agent (
dd-java-agent.jar) is injected into the container image and attached to the BWCE engine via:BW_JAVA_OPTS="-XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0 -XX:+UseG1GC -javaagent:/opt/datadog/dd-java-agent.jar -Ddd.service=tibco-bwce-order-service -Ddd.logs.injection=true -Ddd.profiling.enabled=true" - OpenMetrics Autodiscovery: Pod annotations configure the Datadog Agent to scrape BWCE management metrics from port
8090:annotations: ad.datadoghq.com/tibco-bwce-order-service.logs: '[{"source": "tibco-bwce", "service": "tibco-bwce-order-service"}]' ad.datadoghq.com/tibco-bwce-order-service.check_names: '["openmetrics"]' ad.datadoghq.com/tibco-bwce-order-service.init_configs: '[{}]' ad.datadoghq.com/tibco-bwce-order-service.instances: | [{"openmetrics_endpoint": "http://%%host%%:8090/metrics", "namespace": "tibco_bwce", "metrics": [".*"]}]
Preconfigured Datadog JSON dashboards and alert monitors located in observability/:
- Jenkins CI Visibility:
observability/dashboards/datadog-jenkins-ci-visibility.json - BWCE Engine Performance:
observability/dashboards/datadog-bwce-runtime-performance.json - ArgoCD GitOps Sync:
observability/dashboards/datadog-argocd-gitops-sync.json - Automated Monitors:
observability/monitors/datadog-monitors-bwce.yaml(Monitors HTTP 5xx error rate > 1%, p99 latency > 500ms, and build agent queue bottlenecks).
During canary deployments, Argo Rollouts queries Datadog metrics directly using sample-apps/tibco-bwce-order-service/rollout/analysis-template-datadog.yaml:
-
Error Rate SLA: Evaluates that 5xx errors
$\le 0.1%$ viasum:trace.tibco_bwce_order_service.request.errors{env:prod}.as_count() / sum:trace.tibco_bwce_order_service.request.hits{env:prod}.as_count(). -
Latency SLA: Evaluates that p99 latency
$\le 250 ext{ms}$ viap99:trace.tibco_bwce_order_service.request.duration{env:prod}before traffic step promotion.
π£ Click to expand: Argo Rollouts Canary Traffic Splitting & Datadog Metric Analysis Diagram
flowchart LR
Ingress["OpenShift Route<br/>Ingress Traffic"]
Canary["Canary Pods<br/>10% -> 25% -> 50%<br/>v2.1.0 (New EAR)"]
Stable["Stable Pods<br/>90% -> 75% -> 50%<br/>v2.0.8 (Stable EAR)"]
DatadogMetrics["Datadog APM API<br/>5xx <= 0.1%<br/>p99 <= 250ms"]
RolloutCtrl["Argo Rollouts<br/>Controller"]
Ingress -->|"Traffic Split"| Canary
Ingress -->|"Traffic Split"| Stable
Canary -.->|"APM Metrics"| DatadogMetrics
DatadogMetrics -.->|"SLA Evaluation"| RolloutCtrl
RolloutCtrl -->|"Pass: Promote<br/>Fail: Rollback"| Ingress
In cloud-native architectures, applications separate source code (tibco-bwce-order-service) from centralized configuration and Helm values (jenkins-git-parameter-bwce-global-vars).
When engineering teams attempt to introduce multiple gitParameter dropdowns into a single Jenkins Pipeline, they encounter a hard blocker where GitSCM appears to only support one repository, or secondary dropdowns fail.
β οΈ Click to expand: Jenkins SCM Lifecycle & Pre-Execution Blindspot Diagram
flowchart TB
subgraph UI_Phase ["1. Pre-Execution (Master)"]
direction TB
User["User opens<br/>Build UI Form"]
Master["Master reads<br/>Job XML SCM"]
GitParam["git-parameter<br/>queries remote refs"]
Dropdown["Renders Dropdown<br/>for Primary Repo"]
User --> Master --> GitParam --> Dropdown
end
subgraph Runtime_Phase ["2. Runtime Phase (Agent)"]
direction TB
AllocAgent["Ephemeral Agent<br/>Pod Allocated"]
RunStage["Pipeline Stage:<br/>checkout(repo-2)"]
AllocAgent --> RunStage
end
Gap["SCM Blindspot:<br/>Dynamic checkouts<br/>run during build and are<br/>invisible at UI render"]
Dropdown -.-> Gap
Gap -.-> RunStage
The entire CI/CD platform is self-bootstrapping and self-healing using Jenkins Configuration as Code (JCasC) combined with the Job DSL Plugin.
βοΈ Click to expand: Seed Job & Job DSL Pipeline Provisioning Flow Diagram
flowchart TB
subgraph JCasC_Phase ["1. Controller Bootstrap (JCasC)"]
direction TB
JCasC["jenkins-jcasc.yaml<br/>(Master Config)"] -->|"Registers"| SeedJob["00-Seed-Job<br/>(Platform Seed)"]
end
subgraph SCM_Phase ["2. SCM Synchronization"]
direction TB
GitRepo["Git Repository<br/>(Platform Code)"]
SeedJob -->|"Polls H/15 * * * *"| GitRepo
SeedJob -->|"Evaluates"| JobDSLFiles["Target Scripts<br/>(jobdsl/*.groovy)"]
end
subgraph Materialization ["3. Pipeline Materialization"]
direction TB
JobDSLFiles -->|"seed-job.groovy"| Folders["Creates Folders:<br/>β’ CI Pipelines<br/>β’ CD Orchestrators"]
JobDSLFiles -->|"pipelines-ci.groovy"| CIPipelines["Generates CI:<br/>β’ order-service-ci<br/>β’ customer-api-ci"]
JobDSLFiles -->|"pipelines-cd.groovy"| CDPipelines["Generates CD:<br/>β’ release-orchestrator<br/>β’ hotfix-deploy"]
end
Folders -.->|"Parent"| CIPipelines
Folders -.->|"Parent"| CDPipelines
In enterprise Jenkins-as-Code implementations, we deliberately apply the Separation of Concerns (SoC) principle:
- Taxonomy & Hierarchy Initialization:
jobdsl/seed-job.groovyacts as the root taxonomy initializer. It creates and configures the top-level folder containers (01-CI-Build-Pipelinesand02-CD-Release-Orchestrators) along with their descriptions and metadata. - Decoupled Pipeline Generation Logic: The application CI pipelines (
jobdsl/pipelines-ci.groovy) and CD release orchestrators (jobdsl/pipelines-cd.groovy) contain iterative business logic (looping over theappsinventory, configuring multi-remote refspecs, Git Parameter dropdowns, log rotation, and Datadog CI visibility). Keeping folder declarations separate prevents monolithic scripts and enables modular additions of new business domains.
While folders can technically be defined directly in jenkins-jcasc.yaml, managing them through Job DSL is the recommended SRE practice for multi-tenant platforms:
| Architectural Metric | Static JCasC Management (jenkins-jcasc.yaml) |
Dynamic Job DSL Management (jobdsl/seed-job.groovy) |
|---|---|---|
| Creation Lifecycle | Executed strictly upon Jenkins Controller startup or manual JCasC reload. | Evaluated continuously on every Seed Job execution (automated SCM polling or manual trigger). |
| Orphaned Item Pruning | Does not automatically purge folders or child jobs if deleted from configuration. | Automated Pruning: removedJobAction('DELETE') and removedViewAction('DELETE') cleanly destroy removed jobs/folders. |
| Configuration Ownership | Belongs to Controller System Configuration (Platform Admin scope). | Belongs to Version-Controlled GitOps Code (Developer / Application Domain scope). |
| Zero-Downtime Evolution | Renaming or restructuring folders requires reloading master JCasC. | Restructuring folders is applied dynamically via Git commit without touching master configuration. |
- JCasC Master Bootstrap:
When the Jenkins container starts,jcasc/jenkins-jcasc.yamlconfigures the master Seed Job:jobs: - script: | job('00-Seed-Job-BWCE-Platform-Orchestrator') { description('Master Seed Job provisioning TIBCO BWCE Pipelines as Code.') scm { git { remote { url('https://github.com/nubenetes/jenkins-git-parameter-bwce.git') } branch('*/main') } } steps { jobDsl { targets('jobdsl/seed-job.groovy\njobdsl/pipelines-ci.groovy\njobdsl/pipelines-cd.groovy') removedJobAction('DELETE') removedViewAction('DELETE') lookupStrategy('JENKINS_ROOT') } } triggers { scm('H/15 * * * *') } }
lookupStrategy('JENKINS_ROOT')Context Resolution:
By settinglookupStrategy('JENKINS_ROOT'), Job DSL resolves all relative job paths from the root of Jenkins. This allowspipelines-ci.groovyto target"01-CI-Build-Pipelines/${app.name}-ci-build"and nest jobs into the folders previously created byseed-job.groovy.- Automated Drift Correction via SCM Polling:
The triggerscm('H/15 * * * *')polls this repository every 15 minutes. When an engineer adds a new microservice to thedef apps = [...]inventory inpipelines-ci.groovyand pushes tomain, the Seed Job automatically generates the new CI/CD pipelines in Jenkins with zero manual UI configuration.
Target: Developer Sandboxes & Feature Preview Environments
- Dropdown 1: Queries application repository (
APP_GIT_REVISION). - Dropdown 2: Queries global configuration repository (
GLOBAL_VARS_REVISION). - Multi-remote refspecs configured via Job DSL in
jobdsl/pipelines-ci.groovy.
Target: Enterprise Production Release Pipeline (Recommended)
π§ͺ Click to expand: Inner-Loop (Pattern 1) vs Outer-Loop (Pattern 2) Coexistence Diagram
flowchart TD
subgraph InnerLoop ["Pattern 1: Dual-Dropdown"]
Dev1["Feature Dev"]
DualJob["Dual-Dropdown Job<br/>App & Config Refs"]
DevSandbox["Dev Sandbox<br/>dev-bwce"]
Dev1 -->|"Trigger"| DualJob
DualJob -->|"Deploy"| DevSandbox
end
subgraph OuterLoop ["Pattern 2: Decoupled CI/CD"]
Dev2["Release Lead"]
CIJob["01-CI-Build<br/>App Repo"]
Registry["DEV Registry"]
CDOrchestrator["02-CD-Orchestrator<br/>Global Vars SSOT"]
ArgoEngine["ArgoCD Engine"]
Clusters["Promotion Chain<br/>DEV->STG->PROD"]
Dev2 -->|"Trigger CI"| CIJob
CIJob -->|"Push Image"| Registry
CIJob -->|"Dispatch"| CDOrchestrator
CDOrchestrator -->|"Sync"| ArgoEngine
ArgoEngine -->|"Promote"| Clusters
end
π Click to expand: End-to-End Hand-off Sequence Diagram
sequenceDiagram
autonumber
actor Dev as Developer / Operator
participant CI as 01-CI-Build-Pipeline
participant DevReg as OCP DEV Registry
participant CD as 02-CD-Release-Orchestrator
participant StgReg as OCP Staging Registry
participant PrdReg as OCP Prod Registry
participant Argo as ArgoCD 3.5 Control Plane
participant DDog as Datadog Cloud APM
Dev->>CI: Trigger Build (Select App Branch)
activate CI
CI->>CI: Execute BWUnit Mock Tests
CI->>CI: Package EAR and Build Container
CI->>CI: Scan with Trivy and Sign with Cosign
CI->>DevReg: Push image (e.g. 2.1.0-42)
CI->>DDog: Emit CI Span (ci.bwce.pipeline_completed)
CI->>CD: Dispatch downstream CD Orchestrator
deactivate CI
activate CD
CD->>Argo: Sync DEV Application (Wave 0 -> Wave 1)
Argo-->>CD: DEV Health Check Passed (HTTP 200)
CD->>StgReg: Skopeo copy (DEV -> STAGING)
CD->>Argo: Sync STAGING Application
Argo-->>CD: STAGING Integration Suite Passed (100%)
CD->>Dev: Production Approval Gate (Interactive Input)
Dev-->>CD: Approved by Release Engineer
CD->>PrdReg: Skopeo copy (STAGING -> PROD)
CD->>Argo: Sync PROD Application (Argo Rollouts Canary)
Argo->>DDog: Query Datadog Metric Analysis (p99 < 250ms, 5xx < 0.1%)
DDog-->>Argo: Metrics Passed (100% Promoted)
CD->>DDog: Emit Release Metric (cd.bwce.release_completed)
deactivate CD
All container images layered on the BWCE base runtime are cryptographically signed using Sigstore Cosign during CI execution, guaranteeing supply chain integrity before promotion into production.
π Click to expand: Cosign Image Signing & SLSA Level 3 Attestation Flow Diagram
flowchart LR
CI["CI Build<br/>(Maven BWCE)"]
Trivy["Trivy Scan<br/>& Syft SBOM"]
Cosign["Cosign Sign<br/>& Attestation"]
Registry["OCP DEV<br/>Registry"]
Policy["OpenShift Policy<br/>Block Unsigned"]
CI --> Trivy
Trivy --> Cosign
Cosign --> Registry
Registry -.->|"Enforced"| Policy
Plaintext credentials (database passwords, JMS connection tokens, Datadog API keys) are never stored in Git. Instead, the External Secrets Operator (ESO) synchronizes encrypted secrets from HashiCorp Vault directly into OpenShift namespaces.
π Click to expand: External Secrets Operator & Vault Synchronization Flow Diagram
flowchart LR
Vault["HashiCorp Vault<br/>Secrets & Keys"]
GlobalVars["Global Vars Repo<br/>ExternalSecret CRD"]
ESO["External Secrets<br/>Operator (ESO)"]
K8sSecret["Kubernetes Secret<br/>(In-Memory)"]
BWCEPod["TIBCO BWCE Pod<br/>(Workload)"]
Vault -->|"Token Fetch"| ESO
GlobalVars -->|"Ref Spec"| ESO
ESO -->|"Sync/Rotate"| K8sSecret
K8sSecret -->|"Env Mount"| BWCEPod
Pull Requests targeting application repositories automatically trigger the ArgoCD PR Generator ApplicationSet, creating ephemeral preview namespaces for end-to-end integration testing before merging.
β‘ Click to expand: Ephemeral PR Preview Provisioning Flow Diagram
flowchart LR
Dev["Developer"]
PR["GitHub PR #42"]
AppSet["ArgoCD AppSet<br/>(PR Generator)"]
PreviewNS["Preview Env<br/>pr-42-preview"]
Datadog["Datadog<br/>PR Dashboard"]
Dev -->|"Opens"| PR
PR -->|"Discovers"| AppSet
AppSet -->|"Deploys"| PreviewNS
PreviewNS -->|"DD_ENV"| Datadog
.
βββ config/
β βββ environments.env # Pinned versions, domain names, Datadog credentials
β βββ clusters.yaml # ConfigMap defining OCP DEV, STAGING, PROD topologies
βββ helm/
β βββ jenkins/ # Official Jenkins chart values with Datadog plugin
β βββ observability/ # Datadog Agent Helm values (OpenShift hardened)
β βββ argocd/ # ArgoCD 3.5 Helm values
βββ jcasc/
β βββ jenkins-jcasc.yaml # JCasC security matrix, Datadog CI visibility, seed job
β βββ pod-templates.yaml # Ephemeral Kubernetes agent pod templates (bwce-builder)
β βββ github-app-credentials.yaml # GitHub App credential rotation
βββ jobdsl/
β βββ seed-job.groovy # Master Seed Job definition
β βββ pipelines-ci.groovy # Pattern 1 and Pattern 2 CI pipelines
β βββ pipelines-cd.groovy # CD Release Orchestrator & Hotfix pipelines
βββ jenkinsfiles/
β βββ ci/
β β βββ Jenkinsfile.app-bwce
β β βββ Jenkinsfile.app-bwce-dual-dropdown
β βββ cd/
β βββ Jenkinsfile.release-orchestrator
β βββ Jenkinsfile.hotfix-deploy
βββ shared-library/
β βββ vars/
β β βββ datadogLogEvent.groovy # Emits Datadog CI spans & DogStatsD metrics
β β βββ bwceEarBuild.groovy # Compiles and packages BWCE EAR
β β βββ bwceProfileOverride.groovy# Injects .substvar profile tokens
β β βββ argoAppSync.groovy # ArgoCD 3.5 synchronization
β β βββ skopeoPromote.groovy # Cross-cluster image promotion
β β βββ cosignSign.groovy # Cryptographic image signing (SLSA Level 3)
β β βββ sbomGenerate.groovy # CycloneDX SBOM generation
β β βββ gitopsCommit.groovy # Updates Global Vars SSOT repository
β βββ src/com/nubenetes/gitops/
βββ sample-apps/
β βββ tibco-bwce-order-service/ # Complete TIBCO BWCE project + Dockerfile + K8s + Rollout
β βββ tibco-bwce-customer-api/
βββ observability/
β βββ dashboards/ # Datadog dashboards (Jenkins, BWCE Engine, ArgoCD)
β βββ monitors/ # Datadog automated alert monitors
βββ argocd-apps/ # ArgoCD Root App-of-Apps & ApplicationSets
βββ security/ # Image signature policy & External Secrets Operator
βββ scripts/ # Automation & setup scripts
βββ deploy.sh # 1-Click Platform Deployment Script
βββ destroy.sh # Clean Decommission Script
βββ reinstall.sh # Full Wipe & Reinstall Script
βββ Makefile
- Red Hat OpenShift 4.20+ cluster (or Kubernetes 1.31+)
kubectl,oc, andhelmv3 CLI tools installed- Datadog Account & API/App Keys
Set your Datadog credentials in config/environments.env or export environment variables:
export DATADOG_API_KEY="your-datadog-api-key"
export DATADOG_APP_KEY="your-datadog-app-key"./deploy.sh
# or
make deploy- Jenkins Controller:
https://jenkins-jenkins.apps.ocp-dev.nubenetes.internal(Default login:admin/admin123!) - ArgoCD UI:
https://argocd-server.apps.ocp-dev.nubenetes.internal - Datadog Dashboard:
https://app.datadoghq.eu
./destroy.sh
# or
make destroy./reinstall.sh
# or
make reinstall- TIBCO BWCE Documentation: TIBCO BusinessWorksβ’ Container Edition Official Docs
- Datadog Jenkins Integration: Datadog CI Visibility & Jenkins Plugin
- Datadog Java Tracer APM: Datadog Java Agent Documentation
- ArgoCD 3.5 & ApplicationSets: ArgoCD Documentation
- Sigstore Cosign: Cosign Container Signing Documentation
- External Secrets Operator: External Secrets Operator Docs
- Jenkins Job DSL & Git Parameter: Jenkins Job DSL API
- Global Variables SSOT: jenkins-git-parameter-bwce-global-vars
- Base Generic CI/CD Blueprint: nubenetes/jenkins-git-parameter
- Base Generic Global Variables SSOT: nubenetes/jenkins-git-parameter-global-vars