Jenkins and GitOps
Learn how to bridge continuous integration with declarative infrastructure management, shifting your deployment pipelines away from manual commands to version-controlled repository updates.
What is the Jenkins and GitOps Pattern?
In traditional application delivery workflows, a Jenkins pipeline uses direct shell tools (like kubectl or SSH commands) to push code updates straight into server environments. While this works well for basic systems, it can create operational visibility problems if external configurations change behind the scenes.
GitOps solves this problem by turning your Git repository into the single source of truth for your environment setups. In a GitOps architecture, instead of Jenkins deploying your application directly to a live server, Jenkins handles the verification steps (linting, compiling, testing, and packaging images). Once the build passes, Jenkins automatically writes the new version tags down into a dedicated Git configuration repository. From there, automated sync tools pull the new state down to match your target environment.
Key Concepts (Explained Simply)
Separation of Concerns
In Simple Terms: Jenkins focuses purely on building and testing your app code, while a separate Git repository manages the deployment files. This separation protects your production access keys from app code bugs.
Declarative Target Environments
In Simple Terms: Storing infrastructure layouts as text blueprints (like Kubernetes YAML templates) instead of running manual server upgrade steps, making server environments easy to recreate from scratch.
Automated Pull Sync Hooks
In Simple Terms: Using background controller utilities (like ArgoCD or Flux) that watch your Git files and automatically pull modifications down to the server, fixing any unexpected manual changes instantly.
Immutable Audit Trails
In Simple Terms: Because every deployment step requires a standard Git commit, your version control tracking tools naturally build a permanent history of exactly who deployed what version, and when.
Practical Jenkins Example
This production blueprint validates application source tests, packages an asset image, pulls down an isolated environment configuration file, and safely pushes updated tag properties back to Git to complete a GitOps delivery:
pipeline {
agent any
environment {
// App coordinates and configuration repo links
APP_NAME = 'payment-api'
NEW_TAG = "v${BUILD_NUMBER}"
CONFIG_REPO = '://github.com'
}
stages {
stage('Validate & Package Application') {
steps {
echo 'Executing application tests and compiling runtime binaries...'
sh 'echo "Simulating application unit testing phases..."'
sh "echo 'Building image container tagged as: ${NEW_TAG}'"
}
}
stage('Update GitOps Manifest Blueprint') {
steps {
echo 'Checking out the central configuration repository...'
// Pulls down the environment tracking infrastructure maps safely
dir('env-manifests-workspace') {
checkout scmGit(
branches: [[name: '*/main']],
userRemoteConfigs: [[
credentialsId: 'github-gitops-token-id',
url: "https://${CONFIG_REPO}"
]]
)
echo 'Updating production parameters with new application tracking tag...'
// Updates the manifest description file to target the newly validated version tag
sh "sed -i 's|image: .*|image: ${APP_NAME}:${NEW_TAG}|g' deployments/${APP_NAME}.yaml"
echo 'Committing structural changes back to Git repo source of truth...'
// Signs the update path safely right inside the version timeline records
sh '''
git config user.email "jenkins-ci@company.com"
git config user.name "Jenkins Automation Bot"
git add deployments/
git commit -m "Automated environment deployment upgrade: ${APP_NAME} to version ${NEW_TAG}"
git push origin main
'''
}
}
}
}
}
Practice Exercise
- Create two separate target repositories on your GitHub account: one for application source files and one for cluster deployment manifests.
- Verify your Jenkins controller holds active push permissions for the manifest repository under a saved credential token labeled
github-gitops-token-id. - Set up a new **Pipeline** project automation slot in your catalog labeled
gitops-delivery-pipeline. - Paste the declarative script shared in the practical view example container above into the pipeline block workspace.
- Execute a manual execution run. Open your configuration repository on GitHub to confirm that the automated bot successfully committed the updated image tracking tags.
Summary
You have completed the Jenkins and GitOps lesson. Shifting delivery workflows into version-controlled layout paths allows you to easily connect your build runs with secondary enterprise tracking mechanisms, such as **External Integrations**.