DevSecOps · Jenkins · Argo CD · GKE
Security gates inside every pipeline, not after them
A DevSecOps delivery platform with GitLab, Jenkins and Argo CD on GKE, where every quality and security check is a pipeline gate owned by a named team.
Client context
Who this was for
This practice has been delivered across engagements in banking, financial services, manufacturing and retail. Each engagement started from the same request: release more often without letting security and quality review fall behind, and give teams one automated path for provisioning infrastructure and deploying applications, rather than a path that differs from team to team.
The work runs in three parts: an assessment of the current delivery process, the design of a DevSecOps process that places each control deliberately, and the implementation of that process as working pipelines. SonarQube for code quality, Katalon for automated testing, Terraform for infrastructure as code, and Kubernetes manifests with Helm for complex deployments are common to the engagements.
Engagement scope
What the engagement covered
- An assessment of the existing delivery process and the security and quality controls around it
- The design of a DevSecOps process for automated infrastructure provisioning and application deployment
- The implementation of that process, with Terraform for infrastructure as code and Kubernetes manifests and Helm charts for complex deployments
Challenge
The decision they faced
Pipelines were shipping faster than security review could keep up with. Scanning that happens after a build is a report; scanning that happens during one is a gate, and only the second changes what reaches production. Findings delivered at the end of a release also arrive at the point where they are most expensive to fix and easiest to waive.
The decision was where each control should live and who should own its result. A failed dependency scan, a failed quality gate and an image vulnerability each need a different team's judgement. A pipeline that reports every failure to everyone ends up owned by no one, so routing mattered as much as scanning. The branching model also had to give vendor teams their own development line without splitting the release history on main.
Solution architecture
How the platform fits together
A developer lead initialises each project in GitLab and approves every merge request. Changes on the develop, release and hotfix branches trigger the SIT and UAT pipelines. Continuous integration runs in a fixed order: unit tests, software composition analysis (SCA), static application security testing (SAST), a SonarQube quality scan, the image build, a push to the container registry and an image scan. Cheaper checks run first, so an expensive build is never spent on code that fails a unit test.
Every gate that fails raises a Jira ticket and sends email and Microsoft Teams notifications to the team that owns the check, whether that is development, QA or security. In the quality and security check lane, the QA team reviews the quality gates alongside manual and automation testing, and the security team reviews the SCA, SAST, DAST and image-scan results.
Continuous deployment follows GitOps. For SIT, Jenkins triggers Argo CD, which releases the new image to Google Kubernetes Engine (GKE). UAT adds a QA approval before the Argo CD release, followed by automation testing with Katalon, performance testing with JMeter and dynamic application security testing (DAST) against the running application. Secrets are issued from HashiCorp Vault rather than stored in the repository or the pipeline definition.
Production is deliberately slower. The developer lead triggers the pipeline, and the release needs approval from the developer lead, the QA lead and the security team, whose sign-off follows a penetration test. The image already tested in UAT is retagged rather than rebuilt, approved for release and deployed by Argo CD to GKE, so what reaches production is the same artefact that passed every earlier gate.

Figure 1 — End-to-end pipeline: every stage is a gate, and a failed check becomes a ticket for the owning team rather than a report at the end.
Open full-size image: Figure 1 — End-to-end pipeline: every stage is a gate, and a failed check becomes a ticket for the owning team rather than a report at the end.Approach
What we did
01
Assessment and process design
We began with an assessment of how code moved from a developer's machine to production, then designed the DevSecOps process around it: which checks run on every merge request, which run before UAT, and which gate production. Each control was given an owner, whether development, QA or security, before any tooling was chosen, so the pipeline encodes decisions the teams had already agreed.
02
Branching and version control
We standardised on GitLab with git flow: main and develop, feature, release, bugfix and hotfix branches, and a separate develop-vendor line so vendor teams can work in parallel. Pull requests are peer-reviewed before merging, releases are tagged on main, and every hotfix is merged back into both development lines, so a fix cannot be lost in the next release.
03
Continuous integration gates
We built the continuous integration pipeline in Jenkins with the gates in order of cost: unit tests, SCA, SAST, the SonarQube quality scan, the image build and an image scan before anything is promoted from the container registry. Each failed gate opens a Jira ticket and notifies the owning team in Microsoft Teams and by email, so findings enter the normal work queue.
04
GitOps deployment to GKE
We moved deployment to Argo CD, with Jenkins handing over at the end of integration. Argo CD reconciles the desired state for SIT, UAT and production on Google Kubernetes Engine, which makes the configuration of every environment reviewable in Git. Terraform provisions the underlying infrastructure, and Kubernetes manifests with Helm charts describe the more complex deployments.
05
Testing, approvals and secrets
We placed the slower checks where they add most. Automation testing with Katalon, performance testing with JMeter and DAST run in UAT against a deployed application, after a QA approval. Production requires sign-off from the developer lead, the QA lead and security following a penetration test, and the tested image is retagged, not rebuilt. HashiCorp Vault supplies secrets to every stage.
Outcome
What changed
The platform is designed to let teams release more often without letting security and quality review fall behind. Because checks run inside the pipeline and every failure reaches its owner as a ticket, it aims to improve development velocity and code quality while strengthening security, and to give teams faster and more reliable releases than a review held at the end.
The intent is a fully automated delivery path, from merge request to a GitOps-managed production cluster, that supports rapid iteration and continuous improvement. It is designed to let development teams concentrate on delivering value, with the security and quality evidence for each release produced by the pipeline itself rather than assembled afterwards.
Technology stack
What it was built with
- Source control
- GitLab
- CI/CD
- JenkinsArgo CD
- Platform and infrastructure
- Google Kubernetes EngineDockerHelmTerraform
- Secrets
- HashiCorp Vault
- Quality and testing
- SonarQubeKatalonJMeter
- Collaboration
- JiraMicrosoft Teams
Architecture gallery
Supporting diagrams

Figure 2 — The toolchain by stage, from a developer’s machine to a GitOps-managed production cluster.
Open full-size image: Figure 2 — The toolchain by stage, from a developer’s machine to a GitOps-managed production cluster.
Figure 3 — Branching strategy shared by internal and vendor teams, so every release on main is tagged and every hotfix flows back into both development lines.
Open full-size image: Figure 3 — Branching strategy shared by internal and vendor teams, so every release on main is tagged and every hotfix flows back into both development lines.Lessons learned
What we would carry forward
- Routing each failed gate to its owning team through Jira matters as much as the scanner itself. A SAST finding that arrives as a ticket in the security queue gets triaged; the same finding as a line in a shared report tends to be skimmed past, and the pipeline becomes something developers learn to ignore.
- Retagging the UAT image for production, rather than rebuilding it, is what makes the earlier gates meaningful. A rebuild can pull a different base layer or dependency, and then the image that passed DAST, Katalon and JMeter is not the one that ships.
- A separate develop-vendor line in GitLab gives vendor teams their own integration point, but it only stays safe if every hotfix is merged back into both development lines. Skipping that merge once is enough for a fixed defect to return in the next vendor delivery.
- Keeping secrets in HashiCorp Vault, rather than in pipeline credentials or the repository, means Argo CD can reconcile every environment from Git without Git ever holding anything sensitive.
More case studies
Other programmes
A governed Azure foundation a bank could build on
We designed and built an Azure landing zone for a bank: governance, hub-and-spoke networking, security policy and Terraform-delivered infrastructure.
We delivered a scalable, secure and efficient Azure landing zone that accelerated the bank's cloud adoption. Application teams deploy into subscriptions that already carry networking, policy, monitoring and backup, which…
- Azure
- Terraform
- Azure DevOps
Omnichannel banking on Microsoft Azure, private by default
An omnichannel banking platform on Azure: one controlled edge for every channel, workloads on AKS, and data services reached only through private endpoints.
We delivered a scalable, secure and efficient application architecture on Microsoft Azure. Every channel enters through one controlled edge and every data service is reachable only through a private endpoint,…
- Azure
- AKS
- Front Door
- Keycloak
Next step
Start from the platform you have today
Tell us what you run, what is holding back the next release or workload, and who owns it. An engineer replies with questions and a proposed first step.
