In the brave new world of Jenkins as Code, you can use CasC to specify an initial job (using the Job DSL):
jobs:
- script: >
pipelineJob('jenkins-job-dsl') {
definition {
cpsScm{
scm {
gitSCM {
userRemoteConfigs {
browser {
githubWeb {
repoUrl('https://github.com/foo/bar')
}
}
gitTool("github")
userRemoteConfig {
credentialsId("github-creds")
name("")
refspec("")
url("git@github.com:foo/bar.git")
}
}
branches {
branchSpec { name("main") }
}
}
}
scriptPath("Jenkinsfile.seed")
}
}
properties {
pipelineTriggers {
triggers {
cron { spec('@daily') }
githubPush()
}
}
}
}
using a Jenkinsfile to again call the Job DSL:
pipeline {
agent any
options {
timestamps ()
disableConcurrentBuilds()
}
stages {
stage('Clean') {
steps {
deleteDir()
}
}
stage('Checkout') {
steps {
checkout scm
}
}
stage('Job DSL') {
steps {
jobDsl(
targets: """
jobs/*.groovy
views/*.groovy
"""
)
}
}
}
}
and create all the jobs/views from that repo (each of which is another Jenkinsfile).
This should allow you to recreate your Jenkins instance, without any manual fiddling; and provide an audit trail of any changes.