Build Jenkins using Jenkins as code configuration and configure jobs in the code instead of the UI

626 Views Asked by At

I am using Jcasc (Jenkins as a code) and when I build Jenkins from scratch, the Jenkins is up without any jobs/folders exist. I want to have jobs predefined or organization folders (From github) predefined when I build the code.

I have tried adding this under Jcasc: key this code but nothing happened -

jobs: |
          jobs:
            - script: >
                organizationFolder('Xobabia Organisation') {
                  buildStrategies {
                      skipInitialBuildOnFirstBranchIndexing()
                  }
......

My jenkins as a code configuration -

Jenkins:cluster: non-prod
  Jenkins:secrets:
    create: true
    secretsList:
      - name: jenkins-github-token-non-prod
        value: /us-west-2-non-prod/jenkins/secrets/github-token
      - name: jenkins-slack-token-non-prod
        value: /us-west-2-non-prod/jenkins/secrets/slack-token
  Jenkins:config:
    chart: jenkins
    namespace: default
    repo: https://charts.jenkins.io
    values:
      agent:
        enabled: true
        podTemplates:
          jenkins-slave-pod: |
            - name: jenkins-slave-pod
              label: jenkins-slave-pod
              containers:
                - name: main
                  image: '805787217936.dkr.ecr.us-west-2.amazonaws.com/aba-jenkins-slave:ecs-global-node_master_57'
                  command: "sleep"
                  args: "30d"
                  privileged: true
        master.JCasC.enabled: true
        master.JCasC.defaultConfig: true
        kubernetesConnectTimeout: 5
        kubernetesReadTimeout: 15
        maxRequestsPerHostStr: "32"
        namespace: default
        image: "805787217936.dkr.ecr.us-west-2.amazonaws.com/aba-jenkins-slave"
        tag: "ecs-global-node_master_57"
        workingDir: "/home/jenkins/agent"
        nodeUsageMode: "NORMAL"
        # name of the secret to be used for image pulling
        imagePullSecretName:
        componentName: "eks-global-slave"
        websocket: false
        privileged: false
        runAsUser:
        runAsGroup:
        resources:
          requests:
            cpu: "512m"
            memory: "512Mi"
          limits:
            cpu: "512m"
            memory: "512Mi"
        podRetention: "Never"
        volumes: [ ]
        workspaceVolume: { }
        envVars: [ ]
        # - name: PATH
        #   value: /usr/local/bin
        command:
        args: "${computer.jnlpmac} ${computer.name}"
        # Side container name
        sideContainerName: "jnlp"
        # Doesn't allocate pseudo TTY by default
        TTYEnabled: true
        # Max number of spawned agent
        containerCap: 10
        # Pod name
        podName: "jnlp"
        # Allows the Pod to remain active for reuse until the configured number of
        # minutes has passed since the last step was executed on it.
        idleMinutes: 0
        # Timeout in seconds for an agent to be online
        connectTimeout: 100
      serviceAccount:
        annotations: {}
      controller:
        numExecutors: 1
        additionalExistingSecrets: []
        JCasC:
          securityRealm: |
            local:
                  allowsSignup: false
                  users:
                    - id: "aba"
                      password: "aba"
#          securityRealm: |
#            saml:
#              binding: "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"
#              displayNameAttributeName: "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name"
#              groupsAttributeName: "http://schemas.xmlsoap.org/claims/Group"
#              idpMetadataConfiguration:
#                period: 0
#                url: "https://aba.onelogin.com/saml/metadata/34349e62-799f-4378-9d2a-03b870cbd965"
#              maximumAuthenticationLifetime: 86400
#              usernameCaseConversion: "none"
#          authorizationStrategy: |-
#            roleBased:
#              forceExistingJobs: true
          configScripts:
            credentials: |
              credentials:
                system:
                  domainCredentials:
                    - credentials:
                        - string:
                            scope: GLOBAL
                            id: slack-token
                            description: "Slack access token"
                            secret: "${jenkins-slack-token-non-prod-value}"
                        - usernamePassword:
                            id: "github-credentials"
                            password: "aba"
                            scope: GLOBAL
                            username: "aba"
            plugin-config: |
              jenkins:
                disabledAdministrativeMonitors:
                  - "hudson.model.UpdateCenter$CoreUpdateMonitor"
                  - "jenkins.diagnostics.ControllerExecutorsNoAgents"
              security:
                updateSiteWarningsConfiguration:
                  ignoredWarnings:
                    - "core-2_263"
                    - "SECURITY-2617-extended-choice-parameter"
                    - "SECURITY-2170"
                    - "SECURITY-2796"
                    - "SECURITY-2169"
                    - "SECURITY-2332"
                    - "SECURITY-2232"
                    - "SECURITY-1351"
                    - "SECURITY-1350"
                    - "SECURITY-2888"
              unclassified:
                slackNotifier:
                  teamDomain: "superops"
                  baseUrl: "https://superops.slack.com/services/hooks/jenkins-ci/"
                  tokenCredentialId: "slack-token"
                globalLibraries:
                  libraries:
                    - defaultVersion: "master"
                      allowVersionOverride: true
                      name: "aba-jenkins-library"
                      implicit: true
                      retriever:
                        modernSCM:
                          scm:
                            git:
                              credentialsId: "github-credentials"
                              id: "shared-library-creds"
                              remote: "https://github.com/aba-aba/aba-jenkins-library.git"
                              traits:
                                - "gitBranchDiscovery"
                                - "cleanBeforeCheckoutTrait"
                                - "ignoreOnPushNotificationTrait"
        additionalPlugins:
        - junit:1119.1121.vc43d0fc45561
        - prometheus:2.0.11
        - saml:4.352.vb_722786ea_79d
        - role-strategy:546.ve16648865996
        - blueocean-web:1.25.5
        - github-branch-source:1677.v731f745ea_0cf
        - git-changelog:3.23
        - scriptler:3.5
        - sshd:3.249.v2dc2ea_416e33
        - rich-text-publisher-plugin:1.4
        - matrix-project:785.v06b_7f47b_c631
        - build-failure-analyzer:2.3.0
        - testng-plugin:555.va0d5f66521e3
        - allure-jenkins-plugin:2.30.2
        - timestamper:1.18
        - ws-cleanup:0.42
        - build-timeout:1.21
        - slack:616.v03b_1e98d13dd
        - email-ext:2.91
        - docker-commons:1.19
        - docker-workflow:521.v1a_a_dd2073b_2e
        - rundeck:3.6.11
        - parameter-separator:1.3
        - extended-choice-parameter:346.vd87693c5a_86c
        - uno-choice:2.6.3
        adminPassword: ""
        ingress:
          enabled: true
          hostName: jenkins.non-prod.us-west-2.int.isappcloud.com
          ingressClassName: nginx-int
        installPlugins:
        - kubernetes:3883.v4d70a_a_a_df034
        - workflow-aggregator:590.v6a_d052e5a_a_b_5
        - git:5.0.0
        - configuration-as-code:1569.vb_72405b_80249
        jenkinsUrlProtocol: https
        prometheus:
          enabled: true
        resources:
          limits:
            cpu: "4"
            memory: 8Gi
          requests:
            cpu: "2"
            memory: 4Gi
        sidecars:
          configAutoReload:
            resources:
              requests:
                cpu: 128m
                memory: 256Mi
        statefulSetAnnotations:
          pulumi.com/patchForce: "true"
          Name: eks-non-prod-us-west-2-jenkins
          department: aba
          division: enterprise
          environment: non-prod
          owner: devops
          project: eks-non-prod-us-west-2-jenkins
          team: infra
        tag: 2.362-jdk11
    version: 4.1.13
  Jenkins:stackTags:
    Name: eks-non-prod-us-west-2-jenkins
    department: aba
    division: enterprise
    environment: non-prod
    owner: devops
    project: eks-non-prod-us-west-2-jenkins
    team: infra
  aws:region: us-west-2
1

There are 1 best solutions below

0
Michał Lewndowski On

My approach to that is adding following script in CaaC:

jobs:
- script: >
    freeStyleJob('job-dsl-plugin') {
      description('Initial job to setup all pipelines with DSL')
      displayName('Seed job')
      label('seed-job-agent')
      scm {
        git {
          extensions {
            cloneOptions {
              depth(1)
              shallow(true)
              noTags(true)
              timeout(10)
            }
            gitLFSPull()
          }
          remote {
            credentials('XXX')
            url('https://github.XXX.com/XXXX/XXX-ci.git')
          }
          branch('*/main')
        }
      }
      steps {
        jobDsl {
          removedJobAction('DELETE')
          removedViewAction('DELETE')
          targets('jobs/*.groovy')
        }
      }
      triggers {
        hudsonStartupTrigger {
          label('')
          quietPeriod('0')
          nodeParameterName('')
          runOnChoice('') 
        }
      }
    }

This code will check mentioned repo and looks for folder jobs with *.groovy extensions file where I store whole configuration of jobs.

It is also using this plugin which is triggering this seed job on every Jenkins restart.

This is also sample job definition

#!/usr/bin/env groovy

pipelineJob('name') {
  displayName('Job name')
  description('Job description')
  parameters {
    stringParam {
      name('USERNAME')
      defaultValue('dummy')
      description('Username for login')
    }
  }

  logRotator {
    numToKeep(300)
  }

  configure { project ->
    project / 'properties' / 'org.jenkinsci.plugins.workflow.job.properties.DurabilityHintJobProperty' {
      hint('PERFORMANCE_OPTIMIZED')
    }
  }

  definition {
    cpsScm {
      scm {
        git {
          remote {
            url("https://github.xxx.com/xxx/xxx.git")
            credentials("github-token")
          }
          branches('*/main')
        }
      }
      scriptPath('Jenkinsfile')
    }
  }
}