kubernetes-operator/docs/docs/developer-guide/index.html

1411 lines
69 KiB
HTML

<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="generator" content="Hugo 0.62.2" />
<META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
<link rel="alternate" type="application/rss&#43;xml" href="https://jenkinsci.github.io/kubernetes-operator/docs/developer-guide/index.xml">
<link rel="shortcut icon" href="/favicons/favicon.ico" >
<link rel="apple-touch-icon" href="/kubernetes-operator/favicons/apple-touch-icon-180x180.png" sizes="180x180">
<link rel="icon" type="image/png" href="/kubernetes-operator/favicons/favicon-16x16.png" sizes="16x16">
<link rel="icon" type="image/png" href="/kubernetes-operator/favicons/favicon-32x32.png" sizes="32x32">
<link rel="icon" type="image/png" href="/kubernetes-operator/favicons/android-36x36.png" sizes="36x36">
<link rel="icon" type="image/png" href="/kubernetes-operator/favicons/android-48x48.png" sizes="48x48">
<link rel="icon" type="image/png" href="/kubernetes-operator/favicons/android-72x72.png" sizes="72x72">
<link rel="icon" type="image/png" href="/kubernetes-operator/favicons/android-96x196.png" sizes="96x196">
<link rel="icon" type="image/png" href="/kubernetes-operator/favicons/android-144x144.png" sizes="144x144">
<link rel="icon" type="image/png" href="/kubernetes-operator/favicons/android-192x192.png"sizes="192x192">
<title>Developer Guide | Jenkins Operator</title><meta property="og:title" content="Developer Guide" />
<meta property="og:description" content="Jenkins Operator for developers
" />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://jenkinsci.github.io/kubernetes-operator/docs/developer-guide/" />
<meta property="og:updated_time" content="2023-01-12T00:00:00+00:00" /><meta property="og:site_name" content="Jenkins Operator" />
<meta itemprop="name" content="Developer Guide">
<meta itemprop="description" content="Jenkins Operator for developers
"><meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content="Developer Guide"/>
<meta name="twitter:description" content="Jenkins Operator for developers
"/>
<link rel="preload" href="/kubernetes-operator/scss/main.min.6c58fba96b88d035ce071c346f084a9dc4dedee4e80eb3724fe530520541a4ec.css" as="style">
<link href="/kubernetes-operator/scss/main.min.6c58fba96b88d035ce071c346f084a9dc4dedee4e80eb3724fe530520541a4ec.css" rel="stylesheet" integrity="">
<script
src="https://code.jquery.com/jquery-3.3.1.min.js"
integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="
crossorigin="anonymous"></script>
<title>Developer Guide | Jenkins Operator</title>
</head>
<body class="td-section">
<header>
<nav class="js-navbar-scroll navbar navbar-expand navbar-dark flex-column flex-md-row td-navbar">
<a class="navbar-brand" href="/kubernetes-operator/">
<img style="width: 32px; height: 32px; margin-right: 7.5px;" src="/kubernetes-operator/img/logo.svg"></img><span class="text-uppercase font-weight-bold">Jenkins Operator</span>
</a>
<div class="td-navbar-nav-scroll ml-md-auto" id="main_navbar">
<ul class="navbar-nav mt-2 mt-lg-0">
<li class="nav-item mr-4 mb-2 mb-lg-0">
<a class="nav-link" href="/kubernetes-operator/about"><span>What's the Jenkins Operator?</span></a>
</li>
<li class="nav-item mr-4 mb-2 mb-lg-0">
<a class="nav-link" href="/kubernetes-operator/docs"><span>Documentation</span></a>
</li>
</ul>
</div>
<div class="navbar-nav d-none d-lg-block">
<input type="search" class="form-control td-search-input" placeholder="&#xf002 Search this site…" aria-label="Search this site…" autocomplete="off">
</div>
</nav>
</header>
<div class="container-fluid td-outer">
<div class="td-main">
<div class="row flex-xl-nowrap">
<div class="col-12 col-md-3 col-xl-2 td-sidebar d-print-none">
<div id="td-sidebar-menu" class="td-sidebar__inner">
<form class="td-sidebar__search d-flex align-items-center">
<input type="search" class="form-control td-search-input" placeholder="&#xf002 Search this site…" aria-label="Search this site…" autocomplete="off">
<button class="btn btn-link td-sidebar__toggle d-md-none p-0 ml-3 fas fa-bars" type="button" data-toggle="collapse" data-target="#td-section-nav" aria-controls="td-docs-nav" aria-expanded="false" aria-label="Toggle section navigation">
</button>
</form>
<nav class="collapse td-sidebar-nav pt-2 pl-4" id="td-section-nav">
<ul class="td-sidebar-nav__section pr-md-3">
<li class="td-sidebar-nav__section-title">
<a href="/kubernetes-operator/docs/" class="align-left pl-0 pr-2 td-sidebar-link td-sidebar-link__section">Documentation</a>
</li>
<ul>
<li class="collapse show" id="kubernetes-operator-docs">
<ul class="td-sidebar-nav__section pr-md-3">
<li class="td-sidebar-nav__section-title">
<a href="/kubernetes-operator/docs/how-it-works/" class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">How it works</a>
</li>
<ul>
<li class="collapse " id="kubernetes-operator-docs-how-it-works">
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-how-it-works-architecture-and-design" href="/kubernetes-operator/docs/how-it-works/architecture-and-design/">Architecture and design</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-how-it-works-jenkins-docker-images" href="/kubernetes-operator/docs/how-it-works/jenkins-docker-images/">Jenkins Docker Images</a>
</li>
</ul>
</ul>
<ul class="td-sidebar-nav__section pr-md-3">
<li class="td-sidebar-nav__section-title">
<a href="/kubernetes-operator/docs/getting-started/" class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">Getting Started</a>
</li>
<ul>
<li class="collapse " id="kubernetes-operator-docs-getting-started">
<ul class="td-sidebar-nav__section pr-md-3">
<li class="td-sidebar-nav__section-title">
<a href="/kubernetes-operator/docs/getting-started/latest/" class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">Latest (v0.7.x)</a>
</li>
<ul>
<li class="collapse " id="kubernetes-operator-docs-getting-started-latest">
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-latest-installing-the-operator" href="/kubernetes-operator/docs/getting-started/latest/installing-the-operator/">Installing the Operator</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-latest-deploying-jenkins" href="/kubernetes-operator/docs/getting-started/latest/deploying-jenkins/">Deploying Jenkins</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-latest-customizing-jenkins" href="/kubernetes-operator/docs/getting-started/latest/customizing-jenkins/">Customizing Jenkins</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-latest-configuring-seed-jobs-and-pipelines" href="/kubernetes-operator/docs/getting-started/latest/configuring-seed-jobs-and-pipelines/">Configuring Seed Jobs and Pipelines</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-latest-configuring-backup-and-restore" href="/kubernetes-operator/docs/getting-started/latest/configuring-backup-and-restore/">Configuring backup and restore</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-latest-separate-namespaces" href="/kubernetes-operator/docs/getting-started/latest/separate-namespaces/">Separate namespaces for Jenkins and Operator</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-latest-custom-backup-and-restore" href="/kubernetes-operator/docs/getting-started/latest/custom-backup-and-restore/">Custom backup and restore providers</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-latest-aks" href="/kubernetes-operator/docs/getting-started/latest/aks/">AKS</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-latest-ldap" href="/kubernetes-operator/docs/getting-started/latest/ldap/">LDAP</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-latest-openshift" href="/kubernetes-operator/docs/getting-started/latest/openshift/">OpenShift</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-latest-schema" href="/kubernetes-operator/docs/getting-started/latest/schema/">Schema</a>
</li>
</ul>
</ul>
<ul class="td-sidebar-nav__section pr-md-3">
<li class="td-sidebar-nav__section-title">
<a href="/kubernetes-operator/docs/getting-started/v0.6.x/" class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">v0.6.x</a>
</li>
<ul>
<li class="collapse " id="kubernetes-operator-docs-getting-started-v0-6-x">
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-6-x-installing-the-operator" href="/kubernetes-operator/docs/getting-started/v0.6.x/installing-the-operator/">Installing the Operator</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-6-x-deploying-jenkins" href="/kubernetes-operator/docs/getting-started/v0.6.x/deploying-jenkins/">Deploying Jenkins</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-6-x-customizing-jenkins" href="/kubernetes-operator/docs/getting-started/v0.6.x/customizing-jenkins/">Customizing Jenkins</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-6-x-configuring-seed-jobs-and-pipelines" href="/kubernetes-operator/docs/getting-started/v0.6.x/configuring-seed-jobs-and-pipelines/">Configuring Seed Jobs and Pipelines</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-6-x-configuring-backup-and-restore" href="/kubernetes-operator/docs/getting-started/v0.6.x/configuring-backup-and-restore/">Configuring backup and restore</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-6-x-separate-namespaces" href="/kubernetes-operator/docs/getting-started/v0.6.x/separate-namespaces/">Separate namespaces for Jenkins and Operator</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-6-x-custom-backup-and-restore" href="/kubernetes-operator/docs/getting-started/v0.6.x/custom-backup-and-restore/">Custom backup and restore providers</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-6-x-aks" href="/kubernetes-operator/docs/getting-started/v0.6.x/aks/">AKS</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-6-x-ldap" href="/kubernetes-operator/docs/getting-started/v0.6.x/ldap/">LDAP</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-6-x-openshift" href="/kubernetes-operator/docs/getting-started/v0.6.x/openshift/">OpenShift</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-6-x-schema" href="/kubernetes-operator/docs/getting-started/v0.6.x/schema/">Schema</a>
</li>
</ul>
</ul>
<ul class="td-sidebar-nav__section pr-md-3">
<li class="td-sidebar-nav__section-title">
<a href="/kubernetes-operator/docs/getting-started/v0.5.x/" class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">v0.5.x</a>
</li>
<ul>
<li class="collapse " id="kubernetes-operator-docs-getting-started-v0-5-x">
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-5-x-deploy-jenkins" href="/kubernetes-operator/docs/getting-started/v0.5.x/deploy-jenkins/">Deploy Jenkins</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-5-x-configuration" href="/kubernetes-operator/docs/getting-started/v0.5.x/configuration/">Configuration</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-5-x-customization" href="/kubernetes-operator/docs/getting-started/v0.5.x/customization/">Customization</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-5-x-configure-backup-and-restore" href="/kubernetes-operator/docs/getting-started/v0.5.x/configure-backup-and-restore/">Configure backup and restore</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-5-x-aks" href="/kubernetes-operator/docs/getting-started/v0.5.x/aks/">AKS</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-5-x-custom-backup-and-restore" href="/kubernetes-operator/docs/getting-started/v0.5.x/custom-backup-and-restore/">Custom Backup and Restore Providers</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-5-x-notifications" href="/kubernetes-operator/docs/getting-started/v0.5.x/notifications/">Notifications</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-5-x-openshift" href="/kubernetes-operator/docs/getting-started/v0.5.x/openshift/">OpenShift</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-5-x-diagnostics" href="/kubernetes-operator/docs/getting-started/v0.5.x/diagnostics/">Diagnostics</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-5-x-schema" href="/kubernetes-operator/docs/getting-started/v0.5.x/schema/">Schema</a>
</li>
</ul>
</ul>
<ul class="td-sidebar-nav__section pr-md-3">
<li class="td-sidebar-nav__section-title">
<a href="/kubernetes-operator/docs/getting-started/v0.4.x/" class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">v0.4.x</a>
</li>
<ul>
<li class="collapse " id="kubernetes-operator-docs-getting-started-v0-4-x">
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-4-x-deploy-jenkins" href="/kubernetes-operator/docs/getting-started/v0.4.x/deploy-jenkins/">Deploy Jenkins</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-4-x-configuration" href="/kubernetes-operator/docs/getting-started/v0.4.x/configuration/">Configuration</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-4-x-customization" href="/kubernetes-operator/docs/getting-started/v0.4.x/customization/">Customization</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-4-x-aks" href="/kubernetes-operator/docs/getting-started/v0.4.x/aks/">AKS</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-4-x-configure-backup-and-restore" href="/kubernetes-operator/docs/getting-started/v0.4.x/configure-backup-and-restore/">Configure backup and restore</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-4-x-custom-backup-and-restore" href="/kubernetes-operator/docs/getting-started/v0.4.x/custom-backup-and-restore/">Custom Backup and Restore Providers</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-4-x-notifications" href="/kubernetes-operator/docs/getting-started/v0.4.x/notifications/">Notifications</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-4-x-openshift" href="/kubernetes-operator/docs/getting-started/v0.4.x/openshift/">OpenShift</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-4-x-diagnostics" href="/kubernetes-operator/docs/getting-started/v0.4.x/diagnostics/">Diagnostics</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-4-x-schema" href="/kubernetes-operator/docs/getting-started/v0.4.x/schema/">Schema</a>
</li>
</ul>
</ul>
<ul class="td-sidebar-nav__section pr-md-3">
<li class="td-sidebar-nav__section-title">
<a href="/kubernetes-operator/docs/getting-started/v0.3.x/" class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">v0.3.x</a>
</li>
<ul>
<li class="collapse " id="kubernetes-operator-docs-getting-started-v0-3-x">
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-3-x-deploy-jenkins" href="/kubernetes-operator/docs/getting-started/v0.3.x/deploy-jenkins/">Deploy Jenkins</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-3-x-configuration" href="/kubernetes-operator/docs/getting-started/v0.3.x/configuration/">Configuration</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-3-x-customization" href="/kubernetes-operator/docs/getting-started/v0.3.x/customization/">Customization</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-3-x-migration" href="/kubernetes-operator/docs/getting-started/v0.3.x/migration/">Migration from v0.2.x</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-3-x-aks" href="/kubernetes-operator/docs/getting-started/v0.3.x/aks/">AKS</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-3-x-configure-backup-and-restore" href="/kubernetes-operator/docs/getting-started/v0.3.x/configure-backup-and-restore/">Configure backup and restore</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-3-x-custom-backup-and-restore" href="/kubernetes-operator/docs/getting-started/v0.3.x/custom-backup-and-restore/">Custom Backup and Restore Providers</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-3-x-notifications" href="/kubernetes-operator/docs/getting-started/v0.3.x/notifications/">Notifications</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-3-x-diagnostics" href="/kubernetes-operator/docs/getting-started/v0.3.x/diagnostics/">Diagnostics</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-3-x-schema" href="/kubernetes-operator/docs/getting-started/v0.3.x/schema/">Schema</a>
</li>
</ul>
</ul>
<ul class="td-sidebar-nav__section pr-md-3">
<li class="td-sidebar-nav__section-title">
<a href="/kubernetes-operator/docs/getting-started/v0.2.x/" class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">v0.2.x</a>
</li>
<ul>
<li class="collapse " id="kubernetes-operator-docs-getting-started-v0-2-x">
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-2-x-deploy-jenkins" href="/kubernetes-operator/docs/getting-started/v0.2.x/deploy-jenkins/">Deploy Jenkins</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-2-x-configuration" href="/kubernetes-operator/docs/getting-started/v0.2.x/configuration/">Configuration</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-2-x-customization" href="/kubernetes-operator/docs/getting-started/v0.2.x/customization/">Customization</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-2-x-aks" href="/kubernetes-operator/docs/getting-started/v0.2.x/aks/">AKS</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-2-x-configure-backup-and-restore" href="/kubernetes-operator/docs/getting-started/v0.2.x/configure-backup-and-restore/">Configure backup and restore</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-2-x-custom-backup-and-restore" href="/kubernetes-operator/docs/getting-started/v0.2.x/custom-backup-and-restore/">Custom Backup and Restore Providers</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-2-x-migration" href="/kubernetes-operator/docs/getting-started/v0.2.x/migration/">Migration from v0.1.x</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-2-x-diagnostics" href="/kubernetes-operator/docs/getting-started/v0.2.x/diagnostics/">Diagnostics</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-2-x-schema" href="/kubernetes-operator/docs/getting-started/v0.2.x/schema/">Schema</a>
</li>
</ul>
</ul>
<ul class="td-sidebar-nav__section pr-md-3">
<li class="td-sidebar-nav__section-title">
<a href="/kubernetes-operator/docs/getting-started/v0.1.x/" class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">v0.1.x</a>
</li>
<ul>
<li class="collapse " id="kubernetes-operator-docs-getting-started-v0-1-x">
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-1-x-deploy-jenkins" href="/kubernetes-operator/docs/getting-started/v0.1.x/deploy-jenkins/">Deploy Jenkins</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-1-x-configuration" href="/kubernetes-operator/docs/getting-started/v0.1.x/configuration/">Configuration</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-1-x-customization" href="/kubernetes-operator/docs/getting-started/v0.1.x/customization/">Customization</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-1-x-aks" href="/kubernetes-operator/docs/getting-started/v0.1.x/aks/">AKS</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-1-x-configure-backup-and-restore" href="/kubernetes-operator/docs/getting-started/v0.1.x/configure-backup-and-restore/">Configure backup and restore</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-1-x-diagnostics" href="/kubernetes-operator/docs/getting-started/v0.1.x/diagnostics/">Diagnostics</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-1-x-scheme" href="/kubernetes-operator/docs/getting-started/v0.1.x/scheme/">Scheme</a>
<a class="td-sidebar-link td-sidebar-link__page " id="m-kubernetes-operator-docs-getting-started-v0-1-x-migration-guide-v1alpha1-to-v1alpha2" href="/kubernetes-operator/docs/getting-started/v0.1.x/migration-guide-v1alpha1-to-v1alpha2/">Migration guide from v1alpha1 to v1alpha2</a>
</li>
</ul>
</ul>
</li>
</ul>
</ul>
<ul class="td-sidebar-nav__section pr-md-3">
<li class="td-sidebar-nav__section-title">
<a href="/kubernetes-operator/docs/security/" class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">Security</a>
</li>
<ul>
<li class="collapse " id="kubernetes-operator-docs-security">
</li>
</ul>
</ul>
<ul class="td-sidebar-nav__section pr-md-3">
<li class="td-sidebar-nav__section-title">
<a href="/kubernetes-operator/docs/troubleshooting/" class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">Troubleshooting</a>
</li>
<ul>
<li class="collapse " id="kubernetes-operator-docs-troubleshooting">
</li>
</ul>
</ul>
<ul class="td-sidebar-nav__section pr-md-3">
<li class="td-sidebar-nav__section-title">
<a href="/kubernetes-operator/docs/developer-guide/" class="align-left pl-0 pr-2 active td-sidebar-link td-sidebar-link__section">Developer Guide</a>
</li>
<ul>
<li class="collapse show" id="kubernetes-operator-docs-developer-guide">
</li>
</ul>
</ul>
<ul class="td-sidebar-nav__section pr-md-3">
<li class="td-sidebar-nav__section-title">
<a href="/kubernetes-operator/docs/faq/" class="align-left pl-0 pr-2 collapsed td-sidebar-link td-sidebar-link__section">FAQ</a>
</li>
<ul>
<li class="collapse " id="kubernetes-operator-docs-faq">
</li>
</ul>
</ul>
</li>
</ul>
</ul>
</nav>
</div>
</div>
<div class="d-none d-xl-block col-xl-2 td-toc d-print-none">
<div class="td-page-meta ml-2 pb-1 pt-2 mb-0">
<a href="https://github.com/jenkinsci/kubernetes-operator/edit/master/website/content/en/docs/Developer%20Guide/_index.md" target="_blank"><i class="fa fa-edit fa-fw"></i> Edit this page</a>
<a href="https://github.com/jenkinsci/kubernetes-operator/issues/new?labels=documentation&amp;template=documentation.md&amp;title=Developer%20Guide" target="_blank"><i class="fab fa-github fa-fw"></i> Create documentation issue</a>
<a href="https://github.com/jenkinsci/kubernetes-operator/issues/new/choose" target="_blank"><i class="fas fa-tasks fa-fw"></i> Create project issue</a>
</div>
<nav id="TableOfContents">
<ul>
<li>
<ul>
<li><a href="#prerequisites">Prerequisites</a></li>
<li><a href="#clone-repository-and-download-dependencies">Clone repository and download dependencies</a></li>
<li><a href="#build-and-run-with-a-minikube">Build and run with a minikube</a></li>
<li><a href="#build-and-run-with-docker-desktop">Build and run with Docker Desktop</a>
<ul>
<li><a href="#debug-jenkins-operator">Debug Jenkins Operator</a></li>
<li><a href="#stop-or-delete-minikube-cluster">Stop or delete minikube cluster</a></li>
</ul></li>
<li><a href="#build-and-run-with-a-remote-kubernetes-cluster">Build and run with a remote Kubernetes cluster</a></li>
<li><a href="#testing">Testing</a>
<ul>
<li><a href="#running-e2e-tests">Running E2E tests</a></li>
<li><a href="#building-docker-image-on-minikube">Building docker image on minikube</a></li>
<li><a href="#when-api-v1alpha2-jenkins-types-go-has-changed">When <code>api/v1alpha2/jenkins_types.go</code> has changed</a></li>
<li><a href="#getting-the-jenkins-url-and-basic-credentials">Getting the Jenkins URL and basic credentials</a></li>
<li><a href="#webhook">Webhook</a></li>
</ul></li>
<li><a href="#self-learning">Self-learning</a></li>
</ul></li>
</ul>
</nav>
</div>
<main class="col-12 col-md-9 col-xl-8 pl-md-5" role="main">
<nav aria-label="breadcrumb" class="d-none d-md-block d-print-none">
<ol class="breadcrumb spb-1">
<li class="breadcrumb-item" >
<a href="https://jenkinsci.github.io/kubernetes-operator/docs/">Documentation</a>
</li>
<li class="breadcrumb-item active" aria-current="page">
<a href="https://jenkinsci.github.io/kubernetes-operator/docs/developer-guide/">Developer Guide</a>
</li>
</ol>
</nav >
<div class="td-content">
<h1>Developer Guide</h1>
<div class="lead">Jenkins Operator for developers</div>
<div class="pageinfo pageinfo-primary">
<p>This document explains how to setup your development environment.</p>
</div>
<h2 id="prerequisites">Prerequisites</h2>
<ul>
<li><a href="https://github.com/operator-framework/operator-sdk">operator_sdk</a> version 1.3.0</li>
<li><a href="https://git-scm.com/downloads">git</a></li>
<li><a href="https://golang.org/dl/">go</a> version 1.15.6</li>
<li>goimports, golint, checkmake and staticcheck</li>
<li><a href="https://kubernetes.io/docs/tasks/tools/install-minikube/">minikube</a> version 1.21.0 (preferred Hypervisor - <a href="https://www.virtualbox.org/wiki/Downloads">virtualbox</a>) (automatically downloaded)</li>
<li><a href="https://docs.docker.com/install/">docker</a> version 17.03+</li>
</ul>
<h2 id="clone-repository-and-download-dependencies">Clone repository and download dependencies</h2>
<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">git clone git@github.com:jenkinsci/kubernetes-operator.git
<span style="color:#204a87">cd</span> kubernetes-operator
make go-dependencies</code></pre></div>
<h2 id="build-and-run-with-a-minikube">Build and run with a minikube</h2>
<p>Start minikube instance configured for <strong>Jenkins Operator</strong>. Appropriate minikube version will be downloaded to bin folder.</p>
<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">make minikube-start</code></pre></div>
<p>Next run <strong>Jenkins Operator</strong> locally.</p>
<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">make run</code></pre></div>
<p>Console output indicating readiness of this phase:</p>
<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">+ build
+ run
kubectl config use-context minikube
Switched to context <span style="color:#4e9a06">&#34;minikube&#34;</span>.
Watching <span style="color:#4e9a06">&#39;default&#39;</span> namespace
bin/manager --jenkins-api-hostname<span style="color:#ce5c00;font-weight:bold">=</span>192.168.99.252 --jenkins-api-port<span style="color:#ce5c00;font-weight:bold">=</span><span style="color:#0000cf;font-weight:bold">0</span> --jenkins-api-use-nodeport<span style="color:#ce5c00;font-weight:bold">=</span><span style="color:#204a87">true</span> --cluster-domain<span style="color:#ce5c00;font-weight:bold">=</span>cluster.local
2021-02-08T14:14:45.263+0100 INFO cmd Version: v0.5.0
2021-02-08T14:14:45.263+0100 INFO cmd Git commit: 305dbeda-dirty-dirty
2021-02-08T14:14:45.264+0100 INFO cmd Go Version: go1.15.6
2021-02-08T14:14:45.264+0100 INFO cmd Go OS/Arch: darwin/amd64
2021-02-08T14:14:45.264+0100 INFO cmd Watch namespace: default
2021-02-08T14:14:45.592+0100 INFO controller-runtime.metrics metrics server is starting to listen <span style="color:#ce5c00;font-weight:bold">{</span><span style="color:#4e9a06">&#34;addr&#34;</span>: <span style="color:#4e9a06">&#34;0.0.0.0:8383&#34;</span><span style="color:#ce5c00;font-weight:bold">}</span>
2021-02-08T14:14:45.599+0100 INFO cmd starting manager
2021-02-08T14:14:45.599+0100 INFO controller-runtime.manager starting metrics server <span style="color:#ce5c00;font-weight:bold">{</span><span style="color:#4e9a06">&#34;path&#34;</span>: <span style="color:#4e9a06">&#34;/metrics&#34;</span><span style="color:#ce5c00;font-weight:bold">}</span>
2021-02-08T14:14:45.599+0100 INFO controller-runtime.manager.controller.jenkins Starting EventSource <span style="color:#ce5c00;font-weight:bold">{</span><span style="color:#4e9a06">&#34;reconciler group&#34;</span>: <span style="color:#4e9a06">&#34;jenkins.io&#34;</span>, <span style="color:#4e9a06">&#34;reconciler kind&#34;</span>: <span style="color:#4e9a06">&#34;Jenkins&#34;</span>, <span style="color:#4e9a06">&#34;source&#34;</span>: <span style="color:#4e9a06">&#34;kind source: jenkins.io/v1alpha2, Kind=Jenkins&#34;</span><span style="color:#ce5c00;font-weight:bold">}</span>
2021-02-08T14:14:45.700+0100 INFO controller-runtime.manager.controller.jenkins Starting EventSource <span style="color:#ce5c00;font-weight:bold">{</span><span style="color:#4e9a06">&#34;reconciler group&#34;</span>: <span style="color:#4e9a06">&#34;jenkins.io&#34;</span>, <span style="color:#4e9a06">&#34;reconciler kind&#34;</span>: <span style="color:#4e9a06">&#34;Jenkins&#34;</span>, <span style="color:#4e9a06">&#34;source&#34;</span>: <span style="color:#4e9a06">&#34;kind source: /, Kind=&#34;</span><span style="color:#ce5c00;font-weight:bold">}</span>
2021-02-08T14:14:45.800+0100 INFO controller-runtime.manager.controller.jenkins Starting EventSource <span style="color:#ce5c00;font-weight:bold">{</span><span style="color:#4e9a06">&#34;reconciler group&#34;</span>: <span style="color:#4e9a06">&#34;jenkins.io&#34;</span>, <span style="color:#4e9a06">&#34;reconciler kind&#34;</span>: <span style="color:#4e9a06">&#34;Jenkins&#34;</span>, <span style="color:#4e9a06">&#34;source&#34;</span>: <span style="color:#4e9a06">&#34;kind source: /, Kind=&#34;</span><span style="color:#ce5c00;font-weight:bold">}</span>
2021-02-08T14:14:45.901+0100 INFO controller-runtime.manager.controller.jenkins Starting EventSource <span style="color:#ce5c00;font-weight:bold">{</span><span style="color:#4e9a06">&#34;reconciler group&#34;</span>: <span style="color:#4e9a06">&#34;jenkins.io&#34;</span>, <span style="color:#4e9a06">&#34;reconciler kind&#34;</span>: <span style="color:#4e9a06">&#34;Jenkins&#34;</span>, <span style="color:#4e9a06">&#34;source&#34;</span>: <span style="color:#4e9a06">&#34;kind source: /, Kind=&#34;</span><span style="color:#ce5c00;font-weight:bold">}</span>
2021-02-08T14:14:46.003+0100 INFO controller-runtime.manager.controller.jenkins Starting EventSource <span style="color:#ce5c00;font-weight:bold">{</span><span style="color:#4e9a06">&#34;reconciler group&#34;</span>: <span style="color:#4e9a06">&#34;jenkins.io&#34;</span>, <span style="color:#4e9a06">&#34;reconciler kind&#34;</span>: <span style="color:#4e9a06">&#34;Jenkins&#34;</span>, <span style="color:#4e9a06">&#34;source&#34;</span>: <span style="color:#4e9a06">&#34;kind source: core/v1, Kind=Secret&#34;</span><span style="color:#ce5c00;font-weight:bold">}</span>
2021-02-08T14:14:46.004+0100 INFO controller-runtime.manager.controller.jenkins Starting EventSource <span style="color:#ce5c00;font-weight:bold">{</span><span style="color:#4e9a06">&#34;reconciler group&#34;</span>: <span style="color:#4e9a06">&#34;jenkins.io&#34;</span>, <span style="color:#4e9a06">&#34;reconciler kind&#34;</span>: <span style="color:#4e9a06">&#34;Jenkins&#34;</span>, <span style="color:#4e9a06">&#34;source&#34;</span>: <span style="color:#4e9a06">&#34;kind source: core/v1, Kind=ConfigMap&#34;</span><span style="color:#ce5c00;font-weight:bold">}</span>
2021-02-08T14:14:46.004+0100 INFO controller-runtime.manager.controller.jenkins Starting EventSource <span style="color:#ce5c00;font-weight:bold">{</span><span style="color:#4e9a06">&#34;reconciler group&#34;</span>: <span style="color:#4e9a06">&#34;jenkins.io&#34;</span>, <span style="color:#4e9a06">&#34;reconciler kind&#34;</span>: <span style="color:#4e9a06">&#34;Jenkins&#34;</span>, <span style="color:#4e9a06">&#34;source&#34;</span>: <span style="color:#4e9a06">&#34;kind source: jenkins.io/v1alpha2, Kind=Jenkins&#34;</span><span style="color:#ce5c00;font-weight:bold">}</span>
2021-02-08T14:14:46.004+0100 INFO controller-runtime.manager.controller.jenkins Starting Controller <span style="color:#ce5c00;font-weight:bold">{</span><span style="color:#4e9a06">&#34;reconciler group&#34;</span>: <span style="color:#4e9a06">&#34;jenkins.io&#34;</span>, <span style="color:#4e9a06">&#34;reconciler kind&#34;</span>: <span style="color:#4e9a06">&#34;Jenkins&#34;</span><span style="color:#ce5c00;font-weight:bold">}</span>
2021-02-08T14:14:46.004+0100 INFO controller-runtime.manager.controller.jenkins Starting workers <span style="color:#ce5c00;font-weight:bold">{</span><span style="color:#4e9a06">&#34;reconciler group&#34;</span>: <span style="color:#4e9a06">&#34;jenkins.io&#34;</span>, <span style="color:#4e9a06">&#34;reconciler kind&#34;</span>: <span style="color:#4e9a06">&#34;Jenkins&#34;</span>, <span style="color:#4e9a06">&#34;worker count&#34;</span>: 1<span style="color:#ce5c00;font-weight:bold">}</span></code></pre></div>
<p>Lastly apply Jenkins Custom Resource to minikube cluster:</p>
<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">kubectl apply -f config/samples/jenkins.io_v1alpha2_jenkins.yaml
<span style="color:#ce5c00;font-weight:bold">{</span><span style="color:#4e9a06">&#34;level&#34;</span>:<span style="color:#4e9a06">&#34;info&#34;</span>,<span style="color:#4e9a06">&#34;ts&#34;</span>:1612790690.875426,<span style="color:#4e9a06">&#34;logger&#34;</span>:<span style="color:#4e9a06">&#34;controller-jenkins&#34;</span>,<span style="color:#4e9a06">&#34;msg&#34;</span>:<span style="color:#4e9a06">&#34;Setting default Jenkins container command&#34;</span>,<span style="color:#4e9a06">&#34;cr&#34;</span>:<span style="color:#4e9a06">&#34;jenkins-example&#34;</span><span style="color:#ce5c00;font-weight:bold">}</span>
<span style="color:#ce5c00;font-weight:bold">{</span><span style="color:#4e9a06">&#34;level&#34;</span>:<span style="color:#4e9a06">&#34;info&#34;</span>,<span style="color:#4e9a06">&#34;ts&#34;</span>:1612790690.8754492,<span style="color:#4e9a06">&#34;logger&#34;</span>:<span style="color:#4e9a06">&#34;controller-jenkins&#34;</span>,<span style="color:#4e9a06">&#34;msg&#34;</span>:<span style="color:#4e9a06">&#34;Setting default Jenkins container JAVA_OPTS environment variable&#34;</span>,<span style="color:#4e9a06">&#34;cr&#34;</span>:<span style="color:#4e9a06">&#34;jenkins-example&#34;</span><span style="color:#ce5c00;font-weight:bold">}</span>
<span style="color:#ce5c00;font-weight:bold">{</span><span style="color:#4e9a06">&#34;level&#34;</span>:<span style="color:#4e9a06">&#34;info&#34;</span>,<span style="color:#4e9a06">&#34;ts&#34;</span>:1612790690.875456,<span style="color:#4e9a06">&#34;logger&#34;</span>:<span style="color:#4e9a06">&#34;controller-jenkins&#34;</span>,<span style="color:#4e9a06">&#34;msg&#34;</span>:<span style="color:#4e9a06">&#34;Setting default operator plugins&#34;</span>,<span style="color:#4e9a06">&#34;cr&#34;</span>:<span style="color:#4e9a06">&#34;jenkins-example&#34;</span><span style="color:#ce5c00;font-weight:bold">}</span>
<span style="color:#ce5c00;font-weight:bold">{</span><span style="color:#4e9a06">&#34;level&#34;</span>:<span style="color:#4e9a06">&#34;info&#34;</span>,<span style="color:#4e9a06">&#34;ts&#34;</span>:1612790690.875463,<span style="color:#4e9a06">&#34;logger&#34;</span>:<span style="color:#4e9a06">&#34;controller-jenkins&#34;</span>,<span style="color:#4e9a06">&#34;msg&#34;</span>:<span style="color:#4e9a06">&#34;Setting default Jenkins master service&#34;</span>,<span style="color:#4e9a06">&#34;cr&#34;</span>:<span style="color:#4e9a06">&#34;jenkins-example&#34;</span><span style="color:#ce5c00;font-weight:bold">}</span>
<span style="color:#ce5c00;font-weight:bold">{</span><span style="color:#4e9a06">&#34;level&#34;</span>:<span style="color:#4e9a06">&#34;info&#34;</span>,<span style="color:#4e9a06">&#34;ts&#34;</span>:1612790690.875467,<span style="color:#4e9a06">&#34;logger&#34;</span>:<span style="color:#4e9a06">&#34;controller-jenkins&#34;</span>,<span style="color:#4e9a06">&#34;msg&#34;</span>:<span style="color:#4e9a06">&#34;Setting default Jenkins slave service&#34;</span>,<span style="color:#4e9a06">&#34;cr&#34;</span>:<span style="color:#4e9a06">&#34;jenkins-example&#34;</span><span style="color:#ce5c00;font-weight:bold">}</span>
<span style="color:#ce5c00;font-weight:bold">{</span><span style="color:#4e9a06">&#34;level&#34;</span>:<span style="color:#4e9a06">&#34;info&#34;</span>,<span style="color:#4e9a06">&#34;ts&#34;</span>:1612790690.881811,<span style="color:#4e9a06">&#34;logger&#34;</span>:<span style="color:#4e9a06">&#34;controller-jenkins&#34;</span>,<span style="color:#4e9a06">&#34;msg&#34;</span>:<span style="color:#4e9a06">&#34;*v1alpha2.Jenkins/jenkins-example has been updated&#34;</span>,<span style="color:#4e9a06">&#34;cr&#34;</span>:<span style="color:#4e9a06">&#34;jenkins-example&#34;</span><span style="color:#ce5c00;font-weight:bold">}</span>
<span style="color:#ce5c00;font-weight:bold">{</span><span style="color:#4e9a06">&#34;level&#34;</span>:<span style="color:#4e9a06">&#34;info&#34;</span>,<span style="color:#4e9a06">&#34;ts&#34;</span>:1612790691.252834,<span style="color:#4e9a06">&#34;logger&#34;</span>:<span style="color:#4e9a06">&#34;controller-jenkins&#34;</span>,<span style="color:#4e9a06">&#34;msg&#34;</span>:<span style="color:#4e9a06">&#34;Creating a new Jenkins Master Pod default/jenkins-jenkins-example&#34;</span>,<span style="color:#4e9a06">&#34;cr&#34;</span>:<span style="color:#4e9a06">&#34;jenkins-example&#34;</span><span style="color:#ce5c00;font-weight:bold">}</span>
<span style="color:#ce5c00;font-weight:bold">{</span><span style="color:#4e9a06">&#34;level&#34;</span>:<span style="color:#4e9a06">&#34;info&#34;</span>,<span style="color:#4e9a06">&#34;ts&#34;</span>:1612790691.322793,<span style="color:#4e9a06">&#34;logger&#34;</span>:<span style="color:#4e9a06">&#34;controller-jenkins&#34;</span>,<span style="color:#4e9a06">&#34;msg&#34;</span>:<span style="color:#4e9a06">&#34;Jenkins master pod restarted by operator:&#34;</span>,<span style="color:#4e9a06">&#34;cr&#34;</span>:<span style="color:#4e9a06">&#34;jenkins-example&#34;</span><span style="color:#ce5c00;font-weight:bold">}</span>
<span style="color:#ce5c00;font-weight:bold">{</span><span style="color:#4e9a06">&#34;level&#34;</span>:<span style="color:#4e9a06">&#34;info&#34;</span>,<span style="color:#4e9a06">&#34;ts&#34;</span>:1612790691.322817,<span style="color:#4e9a06">&#34;logger&#34;</span>:<span style="color:#4e9a06">&#34;controller-jenkins&#34;</span>,<span style="color:#4e9a06">&#34;msg&#34;</span>:<span style="color:#4e9a06">&#34;Jenkins Operator version has changed, actual &#39;&#39; new &#39;v0.5.0&#39;&#34;</span>,<span style="color:#4e9a06">&#34;cr&#34;</span>:<span style="color:#4e9a06">&#34;jenkins-example&#34;</span><span style="color:#ce5c00;font-weight:bold">}</span>
<span style="color:#ce5c00;font-weight:bold">{</span><span style="color:#4e9a06">&#34;level&#34;</span>:<span style="color:#4e9a06">&#34;info&#34;</span>,<span style="color:#4e9a06">&#34;ts&#34;</span>:1612790691.3228202,<span style="color:#4e9a06">&#34;logger&#34;</span>:<span style="color:#4e9a06">&#34;controller-jenkins&#34;</span>,<span style="color:#4e9a06">&#34;msg&#34;</span>:<span style="color:#4e9a06">&#34;Jenkins CR has been replaced&#34;</span>,<span style="color:#4e9a06">&#34;cr&#34;</span>:<span style="color:#4e9a06">&#34;jenkins-example&#34;</span><span style="color:#ce5c00;font-weight:bold">}</span>
<span style="color:#ce5c00;font-weight:bold">{</span><span style="color:#4e9a06">&#34;level&#34;</span>:<span style="color:#4e9a06">&#34;info&#34;</span>,<span style="color:#4e9a06">&#34;ts&#34;</span>:1612790695.8789551,<span style="color:#4e9a06">&#34;logger&#34;</span>:<span style="color:#4e9a06">&#34;controller-jenkins&#34;</span>,<span style="color:#4e9a06">&#34;msg&#34;</span>:<span style="color:#4e9a06">&#34;Creating a new Jenkins Master Pod default/jenkins-jenkins-example&#34;</span>,<span style="color:#4e9a06">&#34;cr&#34;</span>:<span style="color:#4e9a06">&#34;jenkins-example&#34;</span><span style="color:#ce5c00;font-weight:bold">}</span>
<span style="color:#ce5c00;font-weight:bold">{</span><span style="color:#4e9a06">&#34;level&#34;</span>:<span style="color:#4e9a06">&#34;warn&#34;</span>,<span style="color:#4e9a06">&#34;ts&#34;</span>:1612790817.9423082,<span style="color:#4e9a06">&#34;logger&#34;</span>:<span style="color:#4e9a06">&#34;controller-jenkins&#34;</span>,<span style="color:#4e9a06">&#34;msg&#34;</span>:<span style="color:#4e9a06">&#34;Reconcile loop failed: couldn&#39;t init Jenkins API client: Get \&#34;http://192.168.99.254:31998/api/json\&#34;: dial tcp 192.168.99.254:31998: connect: connection refused&#34;</span>,<span style="color:#4e9a06">&#34;cr&#34;</span>:<span style="color:#4e9a06">&#34;jenkins-example&#34;</span><span style="color:#ce5c00;font-weight:bold">}</span>
<span style="color:#ce5c00;font-weight:bold">{</span><span style="color:#4e9a06">&#34;level&#34;</span>:<span style="color:#4e9a06">&#34;warn&#34;</span>,<span style="color:#4e9a06">&#34;ts&#34;</span>:1612790817.9998221,<span style="color:#4e9a06">&#34;logger&#34;</span>:<span style="color:#4e9a06">&#34;controller-jenkins&#34;</span>,<span style="color:#4e9a06">&#34;msg&#34;</span>:<span style="color:#4e9a06">&#34;Reconcile loop failed: couldn&#39;t init Jenkins API client: Get \&#34;http://192.168.99.254:31998/api/json\&#34;: dial tcp 192.168.99.254:31998: connect: connection refused&#34;</span>,<span style="color:#4e9a06">&#34;cr&#34;</span>:<span style="color:#4e9a06">&#34;jenkins-example&#34;</span><span style="color:#ce5c00;font-weight:bold">}</span>
<span style="color:#ce5c00;font-weight:bold">{</span><span style="color:#4e9a06">&#34;level&#34;</span>:<span style="color:#4e9a06">&#34;info&#34;</span>,<span style="color:#4e9a06">&#34;ts&#34;</span>:1612790818.581316,<span style="color:#4e9a06">&#34;logger&#34;</span>:<span style="color:#4e9a06">&#34;controller-jenkins&#34;</span>,<span style="color:#4e9a06">&#34;msg&#34;</span>:<span style="color:#4e9a06">&#34;base-groovy ConfigMap &#39;jenkins-operator-base-configuration-jenkins-example&#39; name &#39;1-basic-settings.groovy&#39; running groovy script&#34;</span>,<span style="color:#4e9a06">&#34;cr&#34;</span>:<span style="color:#4e9a06">&#34;jenkins-example&#34;</span><span style="color:#ce5c00;font-weight:bold">}</span>
...
<span style="color:#ce5c00;font-weight:bold">{</span><span style="color:#4e9a06">&#34;level&#34;</span>:<span style="color:#4e9a06">&#34;info&#34;</span>,<span style="color:#4e9a06">&#34;ts&#34;</span>:1612790820.9473379,<span style="color:#4e9a06">&#34;logger&#34;</span>:<span style="color:#4e9a06">&#34;controller-jenkins&#34;</span>,<span style="color:#4e9a06">&#34;msg&#34;</span>:<span style="color:#4e9a06">&#34;base-groovy ConfigMap &#39;jenkins-operator-base-configuration-jenkins-example&#39; name &#39;8-disable-job-dsl-script-approval.groovy&#39; running groovy script&#34;</span>,<span style="color:#4e9a06">&#34;cr&#34;</span>:<span style="color:#4e9a06">&#34;jenkins-example&#34;</span><span style="color:#ce5c00;font-weight:bold">}</span>
<span style="color:#ce5c00;font-weight:bold">{</span><span style="color:#4e9a06">&#34;level&#34;</span>:<span style="color:#4e9a06">&#34;info&#34;</span>,<span style="color:#4e9a06">&#34;ts&#34;</span>:1612790821.244055,<span style="color:#4e9a06">&#34;logger&#34;</span>:<span style="color:#4e9a06">&#34;controller-jenkins&#34;</span>,<span style="color:#4e9a06">&#34;msg&#34;</span>:<span style="color:#4e9a06">&#34;Base configuration phase is complete, took 2m6s&#34;</span>,<span style="color:#4e9a06">&#34;cr&#34;</span>:<span style="color:#4e9a06">&#34;jenkins-example&#34;</span><span style="color:#ce5c00;font-weight:bold">}</span>
<span style="color:#ce5c00;font-weight:bold">{</span><span style="color:#4e9a06">&#34;level&#34;</span>:<span style="color:#4e9a06">&#34;info&#34;</span>,<span style="color:#4e9a06">&#34;ts&#34;</span>:1612790821.7953842,<span style="color:#4e9a06">&#34;logger&#34;</span>:<span style="color:#4e9a06">&#34;controller-jenkins&#34;</span>,<span style="color:#4e9a06">&#34;msg&#34;</span>:<span style="color:#4e9a06">&#34;Waiting for Seed Job Agent `seed-job-agent`...&#34;</span>,<span style="color:#4e9a06">&#34;cr&#34;</span>:<span style="color:#4e9a06">&#34;jenkins-example&#34;</span><span style="color:#ce5c00;font-weight:bold">}</span>
...
<span style="color:#ce5c00;font-weight:bold">{</span><span style="color:#4e9a06">&#34;level&#34;</span>:<span style="color:#4e9a06">&#34;info&#34;</span>,<span style="color:#4e9a06">&#34;ts&#34;</span>:1612790851.843638,<span style="color:#4e9a06">&#34;logger&#34;</span>:<span style="color:#4e9a06">&#34;controller-jenkins&#34;</span>,<span style="color:#4e9a06">&#34;msg&#34;</span>:<span style="color:#4e9a06">&#34;Waiting for Seed Job Agent `seed-job-agent`...&#34;</span>,<span style="color:#4e9a06">&#34;cr&#34;</span>:<span style="color:#4e9a06">&#34;jenkins-example&#34;</span><span style="color:#ce5c00;font-weight:bold">}</span>
<span style="color:#ce5c00;font-weight:bold">{</span><span style="color:#4e9a06">&#34;level&#34;</span>:<span style="color:#4e9a06">&#34;info&#34;</span>,<span style="color:#4e9a06">&#34;ts&#34;</span>:1612790853.489524,<span style="color:#4e9a06">&#34;logger&#34;</span>:<span style="color:#4e9a06">&#34;controller-jenkins&#34;</span>,<span style="color:#4e9a06">&#34;msg&#34;</span>:<span style="color:#4e9a06">&#34;User configuration phase is complete, took 2m38s&#34;</span>,<span style="color:#4e9a06">&#34;cr&#34;</span>:<span style="color:#4e9a06">&#34;jenkins-example&#34;</span><span style="color:#ce5c00;font-weight:bold">}</span>
Two log lines says that Jenkins Operator works correctly:
* <span style="color:#4e9a06">`</span>Base configuration phase is <span style="color:#204a87">complete</span><span style="color:#4e9a06">`</span> - ensures manifests, Jenkins pod, Jenkins configuration and Jenkins API token
* <span style="color:#4e9a06">`</span>User configuration phase is <span style="color:#204a87">complete</span><span style="color:#4e9a06">`</span> - ensures Jenkins restore, backup and seed <span style="color:#204a87">jobs</span> along with user configuration
&gt; Details about base and user phase can be found <span style="color:#ce5c00;font-weight:bold">[</span>here<span style="color:#ce5c00;font-weight:bold">]</span><span style="color:#ce5c00;font-weight:bold">(</span>https://jenkinsci.github.io/kubernetes-operator/docs/how-it-works/architecture-and-design/<span style="color:#ce5c00;font-weight:bold">)</span>.</code></pre></div><div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">kubectl get jenkins -o yaml
apiVersion: v1
items:
- apiVersion: jenkins.io/v1alpha2
kind: Jenkins
metadata:
...
spec:
backup:
action: <span style="color:#ce5c00;font-weight:bold">{</span><span style="color:#ce5c00;font-weight:bold">}</span>
containerName: <span style="color:#4e9a06">&#34;&#34;</span>
interval: <span style="color:#0000cf;font-weight:bold">0</span>
makeBackupBeforePodDeletion: <span style="color:#204a87">false</span>
configurationAsCode:
configurations: <span style="color:#ce5c00;font-weight:bold">[</span><span style="color:#ce5c00;font-weight:bold">]</span>
secret:
name: <span style="color:#4e9a06">&#34;&#34;</span>
groovyScripts:
configurations: <span style="color:#ce5c00;font-weight:bold">[</span><span style="color:#ce5c00;font-weight:bold">]</span>
secret:
name: <span style="color:#4e9a06">&#34;&#34;</span>
jenkinsAPISettings:
authorizationStrategy: createUser
master:
basePlugins:
...
containers:
- command:
- bash
- -c
- /var/jenkins/scripts/init.sh <span style="color:#ce5c00;font-weight:bold">&amp;&amp;</span> <span style="color:#204a87">exec</span> /usr/bin/tini -s -- /usr/local/bin/jenkins.sh
env:
- name: JAVA_OPTS
value: -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap
-XX:MaxRAMFraction<span style="color:#ce5c00;font-weight:bold">=</span><span style="color:#0000cf;font-weight:bold">1</span> -Djenkins.install.runSetupWizard<span style="color:#ce5c00;font-weight:bold">=</span><span style="color:#204a87">false</span> -Djava.awt.headless<span style="color:#ce5c00;font-weight:bold">=</span><span style="color:#204a87">true</span>
image: jenkins/jenkins:2.263.3-lts-alpine
imagePullPolicy: Always
livenessProbe:
...
readinessProbe:
...
resources:
limits:
cpu: 1500m
memory: 3Gi
requests:
cpu: <span style="color:#4e9a06">&#34;1&#34;</span>
memory: 500Mi
disableCSRFProtection: <span style="color:#204a87">false</span>
restore:
action: <span style="color:#ce5c00;font-weight:bold">{</span><span style="color:#ce5c00;font-weight:bold">}</span>
containerName: <span style="color:#4e9a06">&#34;&#34;</span>
getLatestAction: <span style="color:#ce5c00;font-weight:bold">{</span><span style="color:#ce5c00;font-weight:bold">}</span>
seedJobs:
- additionalClasspath: <span style="color:#4e9a06">&#34;&#34;</span>
bitbucketPushTrigger: <span style="color:#204a87">false</span>
buildPeriodically: <span style="color:#4e9a06">&#34;&#34;</span>
description: Jenkins Operator repository
failOnMissingPlugin: <span style="color:#204a87">false</span>
githubPushTrigger: <span style="color:#204a87">false</span>
id: jenkins-operator
ignoreMissingFiles: <span style="color:#204a87">false</span>
pollSCM: <span style="color:#4e9a06">&#34;&#34;</span>
repositoryBranch: master
repositoryUrl: https://github.com/jenkinsci/kubernetes-operator.git
targets: cicd/jobs/*.jenkins
unstableOnDeprecation: <span style="color:#204a87">false</span>
service:
port: <span style="color:#0000cf;font-weight:bold">8080</span>
type: NodePort
serviceAccount: <span style="color:#ce5c00;font-weight:bold">{</span><span style="color:#ce5c00;font-weight:bold">}</span>
slaveService:
port: <span style="color:#0000cf;font-weight:bold">50000</span>
type: ClusterIP
status:
appliedGroovyScripts:
- configurationType: base-groovy
hash: <span style="color:#000">2ownqpRyBjQYmzTRttUx7axok3CKe2E45frI5iRwH0w</span><span style="color:#ce5c00;font-weight:bold">=</span>
name: 1-basic-settings.groovy
source: jenkins-operator-base-configuration-jenkins-example
...
baseConfigurationCompletedTime: <span style="color:#4e9a06">&#34;2021-02-08T13:27:01Z&#34;</span>
createdSeedJobs:
- jenkins-operator
operatorVersion: v0.5.0
provisionStartTime: <span style="color:#4e9a06">&#34;2021-02-08T13:24:55Z&#34;</span>
userAndPasswordHash: <span style="color:#000">nnfZsWmFfAYlYyVYeKhWW2KB4L8mE61JUfetAsr9IMM</span><span style="color:#ce5c00;font-weight:bold">=</span>
userConfigurationCompletedTime: <span style="color:#4e9a06">&#34;2021-02-08T13:27:33Z&#34;</span>
kind: List
metadata:
resourceVersion: <span style="color:#4e9a06">&#34;&#34;</span>
selfLink: <span style="color:#4e9a06">&#34;&#34;</span></code></pre></div><div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">kubectl get po
NAME READY STATUS RESTARTS AGE
jenkins-jenkins-example 1/1 Running <span style="color:#0000cf;font-weight:bold">0</span> 23m
seed-job-agent-jenkins-example-758cc7cc5c-82hbl 1/1 Running <span style="color:#0000cf;font-weight:bold">0</span> 21m</code></pre></div>
<h2 id="build-and-run-with-docker-desktop">Build and run with Docker Desktop</h2>
<p>Install Docker Desktop. If you are using Docker Desktop for Windows, you will also need to install WSL or WSL2. Ensure that Docker Desktop is currently running, and that you have enabled Kubernetes in it.</p>
<p>Run <strong>Jenkins Operator</strong> locally.</p>
<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">make <span style="color:#000">config</span><span style="color:#ce5c00;font-weight:bold">=</span><span style="color:#4e9a06">&#34;config.docker-desktop.env&#34;</span> run</code></pre></div>
<p>From this point on, Docker Desktop usage is identical to minikube usage.</p>
<h3 id="debug-jenkins-operator">Debug Jenkins Operator</h3>
<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">make run <span style="color:#000">OPERATOR_EXTRA_ARGS</span><span style="color:#ce5c00;font-weight:bold">=</span><span style="color:#4e9a06">&#34;--debug&#34;</span></code></pre></div>
<h3 id="stop-or-delete-minikube-cluster">Stop or delete minikube cluster</h3>
<p>To stop Kubernetes cluster running locally on minikube:</p>
<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">minikube stop</code></pre></div>
<p>To delete the cluster altogether:</p>
<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">minikube delete</code></pre></div>
<h2 id="build-and-run-with-a-remote-kubernetes-cluster">Build and run with a remote Kubernetes cluster</h2>
<p>You can also run the controller locally and make it listen to a remote Kubernetes server.</p>
<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">make run <span style="color:#000">NAMESPACE</span><span style="color:#ce5c00;font-weight:bold">=</span>default <span style="color:#000">KUBECTL_CONTEXT</span><span style="color:#ce5c00;font-weight:bold">=</span>remote-k8s <span style="color:#000">EXTRA_ARGS</span><span style="color:#ce5c00;font-weight:bold">=</span><span style="color:#4e9a06">&#39;--kubeconfig ~/.kube/config&#39;</span></code></pre></div>
<p>Once <strong>Jenkins Operator</strong> are up and running, apply Jenkins custom resource:</p>
<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">kubectl --context remote-k8s --namespace default apply -f deploy/crds/jenkins_v1alpha2_jenkins_cr.yaml
kubectl --context remote-k8s --namespace default get jenkins -o yaml
kubectl --context remote-k8s --namespace default get po</code></pre></div>
<h2 id="testing">Testing</h2>
<p>Tests are written using <a href="https://onsi.github.io/ginkgo/">Ginkgo</a> with <a href="https://onsi.github.io/gomega/">Gomega</a>.</p>
<p>Run unit tests with go fmt, lint, staticcheck, vet:</p>
<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">make verify</code></pre></div>
<p>Run unit tests only:</p>
<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">make test</code></pre></div>
<h3 id="running-e2e-tests">Running E2E tests</h3>
<p>Run e2e tests with minikube:</p>
<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">make minikube-start
make e2e</code></pre></div>
<p>Run Helm e2e tests:</p>
<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash"><span style="color:#204a87">eval</span> <span style="color:#204a87;font-weight:bold">$(</span>bin/minikube docker-env<span style="color:#204a87;font-weight:bold">)</span>
make helm-e2e</code></pre></div>
<p>Run the specific e2e test:</p>
<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">make e2e <span style="color:#000">E2E_TEST_SELECTOR</span><span style="color:#ce5c00;font-weight:bold">=</span><span style="color:#4e9a06">&#39;^TestConfiguration$&#39;</span></code></pre></div>
<h3 id="building-docker-image-on-minikube">Building docker image on minikube</h3>
<p>To be able to work with the docker daemon on <code>minikube</code> machine run the following command before building an image:</p>
<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash"><span style="color:#204a87">eval</span> <span style="color:#204a87;font-weight:bold">$(</span>bin/minikube docker-env<span style="color:#204a87;font-weight:bold">)</span></code></pre></div>
<h3 id="when-api-v1alpha2-jenkins-types-go-has-changed">When <code>api/v1alpha2/jenkins_types.go</code> has changed</h3>
<p>Run:</p>
<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">make manifests</code></pre></div>
<h3 id="getting-the-jenkins-url-and-basic-credentials">Getting the Jenkins URL and basic credentials</h3>
<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">minikube service jenkins-operator-http-&lt;cr_name&gt; --url
kubectl get secret jenkins-operator-credentials-&lt;cr_name&gt; -o <span style="color:#4e9a06">&#39;jsonpath={.data.user}&#39;</span> <span style="color:#000;font-weight:bold">|</span> base64 -d
kubectl get secret jenkins-operator-credentials-&lt;cr_name&gt; -o <span style="color:#4e9a06">&#39;jsonpath={.data.password}&#39;</span> <span style="color:#000;font-weight:bold">|</span> base64 -d</code></pre></div>
<h3 id="webhook">Webhook</h3>
<p>To deploy the operator along with webhook, run :</p>
<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash"><span style="color:#204a87">eval</span> <span style="color:#204a87;font-weight:bold">$(</span>minikube docker-env<span style="color:#204a87;font-weight:bold">)</span>
make deploy-webhook</code></pre></div>
<p>It uses <a href="https://cert-manager.io/">cert-manager</a> as an external dependency.</p>
<h2 id="self-learning">Self-learning</h2>
<ul>
<li><p><a href="https://www.youtube.com/watch?v=8_DaCcRMp5I">Tutorial: Deep Dive into the Operator Framework for&hellip; Melvin Hillsman, Michael Hrivnak, &amp; Matt Dorn
</a></p></li>
<li><p><a href="https://www.katacoda.com/openshift/courses/operatorframework">Operator Framework Training By OpenShift</a></p></li>
<li><p><a href="https://sdk.operatorframework.io/docs/building-operators/golang/tutorial/">Operator SDK Tutorial for Go</a></p></li>
<li><p><a href="https://book.kubebuilder.io/cronjob-tutorial/webhook-implementation.html">Kubebuilder Validating Webhook Implementation</a></p></li>
</ul>
<div class="section-index">
<hr class="panel-line">
</div>
<div class="text-muted mt-5 pt-3 border-top">Last modified January 12, 2023
</div>
</div>
</main>
</div>
</div>
<footer class="bg-dark py-5 row d-print-none">
<div class="bg-dark container-fluid trademark-bigger">
<div class="row">
<div class="col-6 col-sm-4 text-xs-center order-sm-2">
</div>
<div class="col-6 col-sm-4 text-right text-xs-center order-sm-3">
</div>
<div class="col-12 col-sm-12 text-center py-4 order-sm-2">
<small class="text-white">&copy; 2023 Jenkins Operator is created by VirtusLab. Source is available under Apache License Version 2 and website content under Creative Commons Attribution-ShareAlike 4.0.</small><br>
<small class="text-white">Jenkins® is a registered trademark of Software in the Public Interest, Inc.</small>
<p class="mt-2"><a href="/kubernetes-operator/about/">What&#39;s the Jenkins Operator?</a></p>
</div>
</div>
</div>
</footer>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
<script src="/kubernetes-operator/js/main.min.b0e99aac17991fa76812dd47914049168ac469a1faa0939560f0b370565becab.js" integrity="sha256-sOmarBeZH6doEt1HkUBJForEaaH6oJOVYPCzcFZb7Ks="></script>
</body>
</html>