Architecture Documentation - Jenkins as Code

Comprehensive architecture guide for Jenkins as Code automation framework

Updated Jan 15, 2024
10 min read
Advanced
tools

Architecture Documentation

Comprehensive architecture guide for Jenkins as Code automation framework

📋 Table of Contents

🎯 System Overview

High-Level Architecture

┌─────────────────────────────────────────────────────────────────┐
│                    Infrastructure Layer (Ansible)                 │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐          │
│  │   Packer     │  │  Monitoring  │  │   Jenkins     │          │
│  │   Playbook   │  │   Stack     │  │   Stack      │          │
│  └──────────────┘  └──────────────┘  └──────────────┘          │
└─────────────────────────────────────────────────────────────────┘
                            │
                            ▼
┌─────────────────────────────────────────────────────────────────┐
│              Configuration Layer (CaC)                            │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐          │
│  │ jenkins.yaml │  │  seed-jobs    │  │  init.groovy  │          │
│  │   (CaC)      │  │  (JobDSL)    │  │  (Plugins)    │          │
│  └──────────────┘  └──────────────┘  └──────────────┘          │
└─────────────────────────────────────────────────────────────────┘
                            │
                            ▼
┌─────────────────────────────────────────────────────────────────┐
│              Job Generation Layer (JobGenie)                      │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐          │
│  │  JobGenie    │  │  Shared      │  │   Pipeline   │          │
│  │  Scripts     │  │  Libraries   │  │   Templates  │          │
│  └──────────────┘  └──────────────┘  └──────────────┘          │
└─────────────────────────────────────────────────────────────────┘
                            │
                            ▼
┌─────────────────────────────────────────────────────────────────┐
│              Execution Layer (Jenkins Jobs)                       │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐          │
│  │   Build      │  │   Deploy     │  │   Manage     │          │
│  │   Jobs       │  │   Jobs       │  │   Jobs       │          │
│  └──────────────┘  └──────────────┘  └──────────────┘          │
└─────────────────────────────────────────────────────────────────┘

🏗️ Architecture Layers

Layer 1: Infrastructure Layer

Purpose: Provision and configure Jenkins infrastructure

Components:

  • Ansible Playbooks: Infrastructure automation
  • Packer Templates: AMI/image building
  • Monitoring Stack: Telegraf, Filebeat, ELK

Key Files:

mCloud-infra/ansible/
├── packer.yml                    # Main playbook
├── roles/
│   ├── monitoring/               # Monitoring stack
│   └── users/                    # User management
└── group_vars/
    └── packer_al2023_aarch64_devops_jenkins.yml

Responsibilities:

  • Server provisioning
  • Jenkins installation
  • Plugin management
  • System configuration
  • Monitoring setup

Layer 2: Configuration Layer

Purpose: Manage Jenkins configuration as code

Components:

  • Jenkins Configuration as Code (CaC): YAML-based config
  • JobDSL Seed Jobs: Initial job generation
  • Init Scripts: Plugin installation

Key Files:

mCloud-infra/ansible/roles/monitoring/templates/stacks/jenkins/
├── jenkins.yaml.j2               # Main CaC template
├── seed-jobs.groovy.j2           # Seed job DSL
└── init.groovy.j2                 # Plugin initialization

Configuration Sources:

  1. Ansible VariablesJinja2 TemplatesYAML FilesJenkins CaC

Responsibilities:

  • Jenkins system configuration
  • Security settings
  • Global libraries
  • Credential management
  • View configuration

Layer 3: Job Generation Layer

Purpose: Dynamically generate Jenkins jobs

Components:

  • JobGenie Scripts: Job definition files
  • Shared Libraries: Reusable pipeline utilities
  • Pipeline Templates: Standardized CI/CD patterns

Key Files:

mCloud-Jenkins/
├── amazon/
│   └── mcloud/
│       └── nonprod/
│           └── pipelines/
│               └── jobs/
│                   └── JobGenie.groovy
└── sharedlibs/
    ├── src/org/devops/
    │   └── CommonUtils.groovy
    └── vars/
        ├── pipelineUtils.groovy
        └── sendNotifications.groovy

Job Generation Flow:

JobGenie.groovy → Seed Job → JobDSL → Jenkins Jobs

Responsibilities:

  • Job definition parsing
  • Job generation logic
  • Folder structure creation
  • Parameter configuration
  • Pipeline linking

Layer 4: Execution Layer

Purpose: Execute CI/CD pipelines

Components:

  • Generated Jenkins Jobs: Build, deploy, manage jobs
  • Pipeline Templates: Reusable Jenkinsfiles
  • External Integrations: ArgoCD, ECR, Slack

Job Types:

  1. Build Jobs: Docker image building
  2. Deploy Jobs: Kubernetes deployments
  3. Manage Jobs: Infrastructure management

🔧 Component Details

1. Ansible Automation

Playbook Structure

# packer.yml
- hosts: packer_al2023_aarch64_devops_jenkins
  roles:
    - monitoring
  tasks:
    - name: Install Jenkins
    - name: Configure Jenkins
    - name: Install plugins

Role Organization

roles/
├── monitoring/
│   ├── tasks/
│   │   ├── install/
│   │   └── main.yml
│   ├── templates/
│   │   └── stacks/jenkins/
│   └── defaults/
│       └── main.yml

2. Jenkins Configuration as Code

Configuration Structure

jenkins:
  numExecutors: 2
  authorizationStrategy:
    roleBased:
      roles:
        global:
          - name: "admin"
            permissions: ["Overall/Administer"]
  views:
    - all:
        name: "all"

Template Generation

# jenkins.yaml.j2
jenkins:
  numExecutors: {{ jenkins_num_executors | default(2) }}
  authorizationStrategy:
    roleBased:
      roles:
        global:
          - name: "admin"
            entries: {{ overall_admin_users | to_json }}

3. JobGenie Engine

Job Definition Format

def jobGenie = [
    "mcloud": [
        [
            APP_REPO: 'my-app',
            APP_BRANCH: 'master',
            appNames: ['my-service'],
            DOCKER_BUILD_ARGS: 'ENV'
        ]
    ]
]

Generation Process

// CommonUtils.mCloudJobsGenerator()
jobGenie.each { techteam, values ->
    values.each { config ->
        // Merge configurations
        def pConfig = defaultConfigs + config
        
        // Create folders
        createFolders(dsl, ...)
        
        // Generate jobs
        pConfig.appNames.each { appName ->
            pipelineGenerator(dsl, deploy, buildVars, jobParams)
        }
    }
}

4. Shared Libraries

CommonUtils Class

class CommonUtils {
    static void createFolders(DslFactory dsl, List<Map> configs)
    static void pipelineGenerator(DslFactory dsl, Map deploy, ...)
    static void mCloudJobsGenerator(DslFactory dsl, Map jobGenie, ...)
}

Pipeline Utilities

// vars/pipelineUtils.groovy
def generateDockerArgs(Map opts = [:])
def updateCanarySteps(int steps, String file)
def sendJobNotification(String status, String message = '')

🔄 Data Flow

Configuration Flow

┌─────────────┐
│   Developer │
└──────┬──────┘
       │ 1. Edit JobGenie.groovy
       ▼
┌─────────────┐
│  Git Repo   │
└──────┬──────┘
       │ 2. Commit & Push
       ▼
┌─────────────┐
│  Seed Job   │
└──────┬──────┘
       │ 3. Read JobGenie
       ▼
┌─────────────┐
│  JobDSL     │
└──────┬──────┘
       │ 4. Generate Jobs
       ▼
┌─────────────┐
│  Jenkins    │
└─────────────┘

Deployment Flow

┌─────────────┐
│  Build Job  │
└──────┬──────┘
       │ 1. Build Docker Image
       ▼
┌─────────────┐
│     ECR     │
└──────┬──────┘
       │ 2. Push Image
       ▼
┌─────────────┐
│  Deploy Job │
└──────┬──────┘
       │ 3. Update Config
       ▼
┌─────────────┐
│   ArgoCD    │
└──────┬──────┘
       │ 4. Deploy to K8s
       ▼
┌─────────────┐
│   EKS       │
└─────────────┘

🔐 Security Architecture

Authentication & Authorization

Security Realm

jenkins:
  securityRealm:
    local:
      allowsSignup: false
      users:
        - id: "admin"
          password: "Admin@123"

Role-Based Access Control

authorizationStrategy:
  roleBased:
    roles:
      items:
        - name: "amazon-mcloud-dev"
          pattern: "amazon/mcloud/.*/nonprod/deploy/.*"
          templateName: "build"
          entries:
            - user: "dev"

Credential Management

Credential Storage

  • Jenkins Credentials Plugin
  • AWS Secrets Manager integration
  • Encrypted at rest

SSH Key Management

SSH_KEYS: 'default:/var/lib/jenkins/.ssh/id_rsa'

Network Security

  • HTTPS only
  • Firewall rules
  • Network policies
  • VPN access for sensitive operations

📈 Scalability & Performance

Horizontal Scaling

Jenkins Agents

jenkins_slave_nodes:
  linux-slave:
    host: "10.20.0.2"
    numExecutors: 4

Load Distribution

  • Multiple Jenkins agents
  • Job distribution
  • Resource optimization

Performance Optimization

Caching

  • Docker layer caching
  • Maven/Gradle caching
  • Git repository caching

Resource Management

  • Build timeouts
  • Concurrent build limits
  • Resource quotas

🛡️ Disaster Recovery

Backup Strategy

Configuration Backup

  • Git repository (source of truth)
  • Jenkins configuration export
  • Regular backups

Data Backup

jenkins_s3_backup_dir: "s3://mys3-bucket/amazon/mcloud/backup/jenkins"

Recovery Procedures

Full Recovery

  1. Provision new server
  2. Run Ansible playbook
  3. Restore from Git
  4. Verify configuration

Partial Recovery

  1. Restore specific jobs
  2. Re-run seed jobs
  3. Verify functionality

RTO/RPO Targets

  • RTO: < 30 minutes
  • RPO: < 1 hour

📊 Monitoring & Observability

Metrics Collection

System Metrics

  • CPU, Memory, Disk
  • Network I/O
  • Jenkins performance

Application Metrics

  • Build success rate
  • Deployment frequency
  • Mean time to recovery

Logging

Log Aggregation

  • Filebeat → ELK Stack
  • Centralized logging
  • Log retention policies

Audit Trail

audit-trail:
  logBuildCause: true
  logCredentialsUsage: true
  logFile: "/var/log/jenkins/audit-trail.log"

🔄 Continuous Improvement

Version Control

  • All configurations in Git
  • Semantic versioning
  • Change tracking

Testing

  • Ansible playbook testing
  • JobDSL validation
  • Integration testing

Documentation

  • Architecture documentation
  • Runbooks
  • Troubleshooting guides

📚 Additional Resources

🧭 Navigation

Related Topics:


Maintained by the DevOps Team


Last Updated: January 15, 2024
Version: 1.0.0

Found this helpful?

Help us improve this documentation by sharing your feedback or suggesting improvements.