CINXE.COM
Continuous integration/Jenkins job builder - MediaWiki
<!DOCTYPE html> <html class="client-nojs vector-feature-language-in-header-disabled vector-feature-language-in-main-page-header-disabled vector-feature-sticky-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-feature-night-mode-disabled skin-theme-clientpref-day vector-toc-available" lang="en" dir="ltr"> <head> <meta charset="UTF-8"> <title>Continuous integration/Jenkins job builder - MediaWiki</title> <script>(function(){var className="client-js vector-feature-language-in-header-disabled vector-feature-language-in-main-page-header-disabled vector-feature-sticky-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-feature-night-mode-disabled skin-theme-clientpref-day vector-toc-available";var cookie=document.cookie.match(/(?:^|; )mediawikiwikimwclientpreferences=([^;]+)/);if(cookie){cookie[1].split('%2C').forEach(function(pref){className=className.replace(new RegExp('(^| )'+pref.replace(/-clientpref-\w+$|[^\w-]+/g,'')+'-clientpref-\\w+( |$)'),'$1'+pref+'$2');});}document.documentElement.className=className;}());RLCONF={"wgBreakFrames":false,"wgSeparatorTransformTable":["",""],"wgDigitTransformTable":["",""], "wgDefaultDateFormat":"dmy","wgMonthNames":["","January","February","March","April","May","June","July","August","September","October","November","December"],"wgRequestId":"6ed5ea70-f812-4d1d-9c4c-fddd7034c876","wgCanonicalNamespace":"","wgCanonicalSpecialPageName":false,"wgNamespaceNumber":0,"wgPageName":"Continuous_integration/Jenkins_job_builder","wgTitle":"Continuous integration/Jenkins job builder","wgCurRevisionId":6789477,"wgRevisionId":6789477,"wgArticleId":104881,"wgIsArticle":true,"wgIsRedirect":false,"wgAction":"view","wgUserName":null,"wgUserGroups":["*"],"wgCategories":["Continuous integration"],"wgPageViewLanguage":"en","wgPageContentLanguage":"en","wgPageContentModel":"wikitext","wgRelevantPageName":"Continuous_integration/Jenkins_job_builder","wgRelevantArticleId":104881,"wgIsProbablyEditable":true,"wgRelevantPageIsProbablyEditable":true,"wgRestrictionEdit":[],"wgRestrictionMove":[],"wgNoticeProject":"mediawiki","wgCiteReferencePreviewsActive":true, "wgMediaViewerOnClick":true,"wgMediaViewerEnabledByDefault":true,"wgVisualEditor":{"pageLanguageCode":"en","pageLanguageDir":"ltr","pageVariantFallbacks":"en"},"wgMFDisplayWikibaseDescriptions":{"search":true,"watchlist":true,"tagline":false,"nearby":true},"wgWMESchemaEditAttemptStepOversample":false,"wgWMEPageLength":10000,"wgCentralAuthMobileDomain":false,"wgEditSubmitButtonLabelPublish":true,"wgDiscussionToolsFeaturesEnabled":{"replytool":true,"newtopictool":true,"sourcemodetoolbar":true,"topicsubscription":false,"autotopicsub":false,"visualenhancements":false,"visualenhancements_reply":false,"visualenhancements_pageframe":false},"wgDiscussionToolsFallbackEditMode":"visual","wgULSPosition":"personal","wgULSisCompactLinksEnabled":true,"wgVector2022LanguageInHeader":false,"wgULSisLanguageSelectorEmpty":false,"wgCheckUserClientHintsHeadersJsApi":["brands","architecture","bitness","fullVersionList","mobile","model","platform","platformVersion"]};RLSTATE={"ext.globalCssJs.user.styles": "ready","site.styles":"ready","user.styles":"ready","ext.globalCssJs.user":"ready","user":"ready","user.options":"loading","ext.pygments":"ready","ext.cite.styles":"ready","ext.discussionTools.init.styles":"ready","oojs-ui-core.styles":"ready","oojs-ui.styles.indicators":"ready","mediawiki.widgets.styles":"ready","oojs-ui-core.icons":"ready","skins.vector.search.codex.styles":"ready","skins.vector.styles":"ready","skins.vector.icons":"ready","ext.wikimediamessages.styles":"ready","ext.visualEditor.desktopArticleTarget.noscript":"ready","ext.uls.pt":"ready","wikibase.client.init":"ready","ext.wikimediaBadges":"ready"};RLPAGEMODULES=["ext.pygments.view","ext.cite.ux-enhancements","site","mediawiki.page.ready","mediawiki.toc","skins.vector.js","ext.centralNotice.geoIP","ext.centralNotice.startUp","ext.urlShortener.toolbar","ext.centralauth.centralautologin","ext.visualEditor.desktopArticleTarget.init","ext.visualEditor.targetLoader","ext.echo.centralauth","ext.discussionTools.init", "ext.eventLogging","ext.wikimediaEvents","ext.navigationTiming","ext.uls.compactlinks","ext.uls.interface","ext.checkUser.clientHints"];</script> <script>(RLQ=window.RLQ||[]).push(function(){mw.loader.impl(function(){return["user.options@12s5i",function($,jQuery,require,module){mw.user.tokens.set({"patrolToken":"+\\","watchToken":"+\\","csrfToken":"+\\"}); }];});});</script> <link rel="stylesheet" href="/w/load.php?lang=en&modules=ext.cite.styles%7Cext.discussionTools.init.styles%7Cext.pygments%2CwikimediaBadges%7Cext.uls.pt%7Cext.visualEditor.desktopArticleTarget.noscript%7Cext.wikimediamessages.styles%7Cmediawiki.widgets.styles%7Coojs-ui-core.icons%2Cstyles%7Coojs-ui.styles.indicators%7Cskins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles%7Cwikibase.client.init&only=styles&skin=vector-2022"> <script async="" src="/w/load.php?lang=en&modules=startup&only=scripts&raw=1&skin=vector-2022"></script> <meta name="ResourceLoaderDynamicStyles" content=""> <link rel="stylesheet" href="/w/load.php?lang=en&modules=site.styles&only=styles&skin=vector-2022"> <meta name="generator" content="MediaWiki 1.44.0-wmf.4"> <meta name="referrer" content="origin"> <meta name="referrer" content="origin-when-cross-origin"> <meta name="robots" content="max-image-preview:standard"> <meta name="format-detection" content="telephone=no"> <meta name="viewport" content="width=1120"> <meta property="og:site_name" content="MediaWiki"> <meta property="og:title" content="Continuous integration/Jenkins job builder - MediaWiki"> <meta property="og:type" content="website"> <link rel="alternate" media="only screen and (max-width: 640px)" href="//m.mediawiki.org/wiki/Continuous_integration/Jenkins_job_builder"> <link rel="alternate" type="application/x-wiki" title="Edit" href="/w/index.php?title=Continuous_integration/Jenkins_job_builder&action=edit"> <link rel="apple-touch-icon" href="/static/apple-touch/mediawiki.png"> <link rel="icon" href="/static/favicon/mediawiki.ico"> <link rel="search" type="application/opensearchdescription+xml" href="/w/rest.php/v1/search" title="MediaWiki (en)"> <link rel="EditURI" type="application/rsd+xml" href="//www.mediawiki.org/w/api.php?action=rsd"> <link rel="canonical" href="https://www.mediawiki.org/wiki/Continuous_integration/Jenkins_job_builder"> <link rel="license" href="https://creativecommons.org/licenses/by-sa/4.0/"> <link rel="alternate" type="application/atom+xml" title="MediaWiki Atom feed" href="/w/index.php?title=Special:RecentChanges&feed=atom"> <link rel="dns-prefetch" href="//meta.wikimedia.org" /> <link rel="dns-prefetch" href="//login.wikimedia.org"> </head> <body class="ext-discussiontools-replytool-enabled ext-discussiontools-newtopictool-enabled ext-discussiontools-sourcemodetoolbar-enabled skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject mw-editable page-Continuous_integration_Jenkins_job_builder rootpage-Continuous_integration skin-vector-2022 action-view"><a class="mw-jump-link" href="#bodyContent">Jump to content</a> <div class="vector-header-container"> <header class="vector-header mw-header"> <div class="vector-header-start"> <nav class="vector-main-menu-landmark" aria-label="Site"> <div id="vector-main-menu-dropdown" class="vector-dropdown vector-main-menu-dropdown vector-button-flush-left vector-button-flush-right" > <input type="checkbox" id="vector-main-menu-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-main-menu-dropdown" class="vector-dropdown-checkbox " aria-label="Main menu" > <label id="vector-main-menu-dropdown-label" for="vector-main-menu-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-menu mw-ui-icon-wikimedia-menu"></span> <span class="vector-dropdown-label-text">Main menu</span> </label> <div class="vector-dropdown-content"> <div id="vector-main-menu-unpinned-container" class="vector-unpinned-container"> <div id="vector-main-menu" class="vector-main-menu vector-pinnable-element"> <div class="vector-pinnable-header vector-main-menu-pinnable-header vector-pinnable-header-unpinned" data-feature-name="main-menu-pinned" data-pinnable-element-id="vector-main-menu" data-pinned-container-id="vector-main-menu-pinned-container" data-unpinned-container-id="vector-main-menu-unpinned-container" > <div class="vector-pinnable-header-label">Main menu</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-main-menu.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-main-menu.unpin">hide</button> </div> <div id="p-navigation" class="vector-menu mw-portlet mw-portlet-navigation" > <div class="vector-menu-heading"> Navigation </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-mainpage-description" class="mw-list-item"><a href="/wiki/MediaWiki" title="Visit the main page [z]" accesskey="z"><span>Main page</span></a></li><li id="n-mw-download" class="mw-list-item"><a href="/wiki/Download"><span>Get MediaWiki</span></a></li><li id="n-mw-extensions" class="mw-list-item"><a href="/wiki/Special:MyLanguage/Category:Extensions"><span>Get extensions</span></a></li><li id="n-blog-text" class="mw-list-item"><a href="https://techblog.wikimedia.org/"><span>Tech blog</span></a></li><li id="n-mw-contribute" class="mw-list-item"><a href="/wiki/Special:MyLanguage/How_to_contribute"><span>Contribute</span></a></li> </ul> </div> </div> <div id="p-support" class="vector-menu mw-portlet mw-portlet-support" > <div class="vector-menu-heading"> Support </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-help" class="mw-list-item"><a href="/wiki/Special:MyLanguage/Help:Contents" title="The place to find out"><span>User help</span></a></li><li id="n-mw-faq" class="mw-list-item"><a href="/wiki/Special:MyLanguage/Manual:FAQ"><span>FAQ</span></a></li><li id="n-mw-manual" class="mw-list-item"><a href="/wiki/Special:MyLanguage/Manual:Contents"><span>Technical manual</span></a></li><li id="n-mw-supportdesk" class="mw-list-item"><a href="/wiki/Project:Support_desk"><span>Support desk</span></a></li><li id="n-mw-communication" class="mw-list-item"><a href="/wiki/Special:MyLanguage/Communication"><span>Communication</span></a></li> </ul> </div> </div> <div id="p-development" class="vector-menu mw-portlet mw-portlet-development" > <div class="vector-menu-heading"> Development </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-mw-developerportal" class="mw-list-item"><a href="https://developer.wikimedia.org/"><span>Developer portal</span></a></li><li id="n-svn-statistics" class="mw-list-item"><a href="/wiki/Development_statistics"><span>Code statistics</span></a></li> </ul> </div> </div> <div id="p-mediawiki.org" class="vector-menu mw-portlet mw-portlet-mediawiki_org" > <div class="vector-menu-heading"> mediawiki.org </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-portal" class="mw-list-item"><a href="/wiki/Project:Help" title="About the project, what you can do, where to find things"><span>Community portal</span></a></li><li id="n-recentchanges" class="mw-list-item"><a href="/wiki/Special:RecentChanges" title="A list of recent changes in the wiki [r]" accesskey="r"><span>Recent changes</span></a></li><li id="n-mw-translate" class="mw-list-item"><a href="/wiki/Special:LanguageStats"><span>Translate content</span></a></li><li id="n-randompage" class="mw-list-item"><a href="/wiki/Special:Random" title="Load a random page [x]" accesskey="x"><span>Random page</span></a></li><li id="n-mw-discussion" class="mw-list-item"><a href="/wiki/Project:Village_Pump"><span>Village pump</span></a></li><li id="n-Sandboxlink-portlet-label" class="mw-list-item"><a href="/wiki/Project:Sandbox"><span>Sandbox</span></a></li> </ul> </div> </div> <div id="p-lang" class="vector-menu mw-portlet mw-portlet-lang" > <div class="vector-menu-heading"> In other languages </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> <div class="after-portlet after-portlet-lang"><span class="wb-langlinks-add wb-langlinks-link"><a href="https://www.wikidata.org/wiki/Special:NewItem?site=mediawikiwiki&page=Continuous+integration%2FJenkins+job+builder" title="Add interlanguage links" class="wbc-editpage">Add links</a></span></div> </div> </div> </div> </div> </div> </div> </nav> <a href="/wiki/MediaWiki" class="mw-logo"> <img class="mw-logo-icon" src="/static/images/icons/mediawikiwiki.svg" alt="" aria-hidden="true" height="50" width="50"> <span class="mw-logo-container skin-invert"> <img class="mw-logo-wordmark" alt="MediaWiki" src="/static/images/mobile/copyright/mediawikiwiki-wordmark.svg" style="width: 7.5em; height: 1.125em;"> </span> </a> </div> <div class="vector-header-end"> <div id="p-search" role="search" class="vector-search-box-vue vector-search-box-collapses vector-search-box-show-thumbnail vector-search-box-auto-expand-width vector-search-box"> <a href="/wiki/Special:Search" class="cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only search-toggle" title="Search MediaWiki [f]" accesskey="f"><span class="vector-icon mw-ui-icon-search mw-ui-icon-wikimedia-search"></span> <span>Search</span> </a> <div class="vector-typeahead-search-container"> <div class="cdx-typeahead-search cdx-typeahead-search--show-thumbnail cdx-typeahead-search--auto-expand-width"> <form action="/w/index.php" id="searchform" class="cdx-search-input cdx-search-input--has-end-button"> <div id="simpleSearch" class="cdx-search-input__input-wrapper" data-search-loc="header-moved"> <div class="cdx-text-input cdx-text-input--has-start-icon"> <input class="cdx-text-input__input" type="search" name="search" placeholder="Search MediaWiki" aria-label="Search MediaWiki" autocapitalize="sentences" title="Search MediaWiki [f]" accesskey="f" id="searchInput" > <span class="cdx-text-input__icon cdx-text-input__start-icon"></span> </div> <input type="hidden" name="title" value="Special:Search"> </div> <button class="cdx-button cdx-search-input__end-button">Search</button> </form> </div> </div> </div> <nav class="vector-user-links vector-user-links-wide" aria-label="Personal tools"> <div class="vector-user-links-main"> <div id="p-vector-user-menu-preferences" class="vector-menu mw-portlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-uls" class="mw-list-item active user-links-collapsible-item"><a data-mw="interface" href="#" class="uls-trigger cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet"><span class="vector-icon mw-ui-icon-wikimedia-language mw-ui-icon-wikimedia-wikimedia-language"></span> <span>English</span></a> </li> </ul> </div> </div> <div id="p-vector-user-menu-userpage" class="vector-menu mw-portlet emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> <nav class="vector-appearance-landmark" aria-label="Appearance"> <div id="vector-appearance-dropdown" class="vector-dropdown " title="Change the appearance of the page's font size, width, and color" > <input type="checkbox" id="vector-appearance-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-appearance-dropdown" class="vector-dropdown-checkbox " aria-label="Appearance" > <label id="vector-appearance-dropdown-label" for="vector-appearance-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-appearance mw-ui-icon-wikimedia-appearance"></span> <span class="vector-dropdown-label-text">Appearance</span> </label> <div class="vector-dropdown-content"> <div id="vector-appearance-unpinned-container" class="vector-unpinned-container"> </div> </div> </div> </nav> <div id="p-vector-user-menu-notifications" class="vector-menu mw-portlet emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> <div id="p-vector-user-menu-overflow" class="vector-menu mw-portlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-sitesupport-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="https://donate.wikimedia.org/?utm_source=donate&utm_medium=sidebar&utm_campaign=spontaneous&uselang=en" class=""><span>Donate</span></a> </li> <li id="pt-createaccount-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="/w/index.php?title=Special:CreateAccount&returnto=Continuous+integration%2FJenkins+job+builder" title="You are encouraged to create an account and log in; however, it is not mandatory" class=""><span>Create account</span></a> </li> <li id="pt-login-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="/w/index.php?title=Special:UserLogin&returnto=Continuous+integration%2FJenkins+job+builder" title="You are encouraged to log in; however, it is not mandatory [o]" accesskey="o" class=""><span>Log in</span></a> </li> </ul> </div> </div> </div> <div id="vector-user-links-dropdown" class="vector-dropdown vector-user-menu vector-button-flush-right vector-user-menu-logged-out" title="More options" > <input type="checkbox" id="vector-user-links-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-user-links-dropdown" class="vector-dropdown-checkbox " aria-label="Personal tools" > <label id="vector-user-links-dropdown-label" for="vector-user-links-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-ellipsis mw-ui-icon-wikimedia-ellipsis"></span> <span class="vector-dropdown-label-text">Personal tools</span> </label> <div class="vector-dropdown-content"> <div id="p-personal" class="vector-menu mw-portlet mw-portlet-personal user-links-collapsible-item" title="User menu" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-sitesupport" class="user-links-collapsible-item mw-list-item"><a href="https://donate.wikimedia.org/?utm_source=donate&utm_medium=sidebar&utm_campaign=spontaneous&uselang=en"><span>Donate</span></a></li><li id="pt-createaccount" class="user-links-collapsible-item mw-list-item"><a href="/w/index.php?title=Special:CreateAccount&returnto=Continuous+integration%2FJenkins+job+builder" title="You are encouraged to create an account and log in; however, it is not mandatory"><span class="vector-icon mw-ui-icon-userAdd mw-ui-icon-wikimedia-userAdd"></span> <span>Create account</span></a></li><li id="pt-login" class="user-links-collapsible-item mw-list-item"><a href="/w/index.php?title=Special:UserLogin&returnto=Continuous+integration%2FJenkins+job+builder" title="You are encouraged to log in; however, it is not mandatory [o]" accesskey="o"><span class="vector-icon mw-ui-icon-logIn mw-ui-icon-wikimedia-logIn"></span> <span>Log in</span></a></li> </ul> </div> </div> <div id="p-user-menu-anon-editor" class="vector-menu mw-portlet mw-portlet-user-menu-anon-editor" > <div class="vector-menu-heading"> Pages for logged out editors <a href="/wiki/Help:Introduction" aria-label="Learn more about editing"><span>learn more</span></a> </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-anoncontribs" class="mw-list-item"><a href="/wiki/Special:MyContributions" title="A list of edits made from this IP address [y]" accesskey="y"><span>Contributions</span></a></li><li id="pt-anontalk" class="mw-list-item"><a href="/wiki/Special:MyTalk" title="Discussion about edits from this IP address [n]" accesskey="n"><span>Talk</span></a></li> </ul> </div> </div> </div> </div> </nav> </div> </header> </div> <div class="mw-page-container"> <div class="mw-page-container-inner"> <div class="vector-sitenotice-container"> <div id="siteNotice"><!-- CentralNotice --></div> </div> <div class="vector-column-start"> <div class="vector-main-menu-container"> <div id="mw-navigation"> <nav id="mw-panel" class="vector-main-menu-landmark" aria-label="Site"> <div id="vector-main-menu-pinned-container" class="vector-pinned-container"> </div> </nav> </div> </div> <div class="vector-sticky-pinned-container"> <nav id="mw-panel-toc" aria-label="Contents" data-event-name="ui.sidebar-toc" class="mw-table-of-contents-container vector-toc-landmark"> <div id="vector-toc-pinned-container" class="vector-pinned-container"> <div id="vector-toc" class="vector-toc vector-pinnable-element"> <div class="vector-pinnable-header vector-toc-pinnable-header vector-pinnable-header-pinned" data-feature-name="toc-pinned" data-pinnable-element-id="vector-toc" > <h2 class="vector-pinnable-header-label">Contents</h2> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-toc.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-toc.unpin">hide</button> </div> <ul class="vector-toc-contents" id="mw-panel-toc-list"> <li id="toc-mw-content-text" class="vector-toc-list-item vector-toc-level-1"> <a href="#" class="vector-toc-link"> <div class="vector-toc-text">Beginning</div> </a> </li> <li id="toc-How_it_works" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#How_it_works"> <div class="vector-toc-text"> <span class="vector-toc-numb">1</span> <span>How it works</span> </div> </a> <ul id="toc-How_it_works-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Install_JJB" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Install_JJB"> <div class="vector-toc-text"> <span class="vector-toc-numb">2</span> <span>Install JJB</span> </div> </a> <button aria-controls="toc-Install_JJB-sublist" class="cdx-button cdx-button--weight-quiet cdx-button--icon-only vector-toc-toggle"> <span class="vector-icon mw-ui-icon-wikimedia-expand"></span> <span>Toggle Install JJB subsection</span> </button> <ul id="toc-Install_JJB-sublist" class="vector-toc-list"> <li id="toc-Configure_JJB" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Configure_JJB"> <div class="vector-toc-text"> <span class="vector-toc-numb">2.1</span> <span>Configure JJB</span> </div> </a> <ul id="toc-Configure_JJB-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Troubleshooting" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Troubleshooting"> <div class="vector-toc-text"> <span class="vector-toc-numb">2.2</span> <span>Troubleshooting</span> </div> </a> <ul id="toc-Troubleshooting-sublist" class="vector-toc-list"> <li id="toc-error:_externally-managed-environment" class="vector-toc-list-item vector-toc-level-3"> <a class="vector-toc-link" href="#error:_externally-managed-environment"> <div class="vector-toc-text"> <span class="vector-toc-numb">2.2.1</span> <span>error: externally-managed-environment</span> </div> </a> <ul id="toc-error:_externally-managed-environment-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-ERROR:stevedore.extension:_module_'pkgutil'_has_no_attribute_'ImpImporter'" class="vector-toc-list-item vector-toc-level-3"> <a class="vector-toc-link" href="#ERROR:stevedore.extension:_module_'pkgutil'_has_no_attribute_'ImpImporter'"> <div class="vector-toc-text"> <span class="vector-toc-numb">2.2.2</span> <span>ERROR:stevedore.extension: module 'pkgutil' has no attribute 'ImpImporter'</span> </div> </a> <ul id="toc-ERROR:stevedore.extension:_module_'pkgutil'_has_no_attribute_'ImpImporter'-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-pyconfig.h" class="vector-toc-list-item vector-toc-level-3"> <a class="vector-toc-link" href="#pyconfig.h"> <div class="vector-toc-text"> <span class="vector-toc-numb">2.2.3</span> <span>pyconfig.h</span> </div> </a> <ul id="toc-pyconfig.h-sublist" class="vector-toc-list"> </ul> </li> </ul> </li> </ul> </li> <li id="toc-Modifying_jobs" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Modifying_jobs"> <div class="vector-toc-text"> <span class="vector-toc-numb">3</span> <span>Modifying jobs</span> </div> </a> <ul id="toc-Modifying_jobs-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Deploy_changes" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Deploy_changes"> <div class="vector-toc-text"> <span class="vector-toc-numb">4</span> <span>Deploy changes</span> </div> </a> <button aria-controls="toc-Deploy_changes-sublist" class="cdx-button cdx-button--weight-quiet cdx-button--icon-only vector-toc-toggle"> <span class="vector-icon mw-ui-icon-wikimedia-expand"></span> <span>Toggle Deploy changes subsection</span> </button> <ul id="toc-Deploy_changes-sublist" class="vector-toc-list"> <li id="toc-Debugging_JJB" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Debugging_JJB"> <div class="vector-toc-text"> <span class="vector-toc-numb">4.1</span> <span>Debugging JJB</span> </div> </a> <ul id="toc-Debugging_JJB-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Deleting_a_job" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Deleting_a_job"> <div class="vector-toc-text"> <span class="vector-toc-numb">4.2</span> <span>Deleting a job</span> </div> </a> <ul id="toc-Deleting_a_job-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Synchronizing_all_jobs" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Synchronizing_all_jobs"> <div class="vector-toc-text"> <span class="vector-toc-numb">4.3</span> <span>Synchronizing all jobs</span> </div> </a> <ul id="toc-Synchronizing_all_jobs-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Deploying_changes_to_zuul_config" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Deploying_changes_to_zuul_config"> <div class="vector-toc-text"> <span class="vector-toc-numb">4.4</span> <span>Deploying changes to zuul config</span> </div> </a> <ul id="toc-Deploying_changes_to_zuul_config-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Deploying_changes_to_dockerfiles" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Deploying_changes_to_dockerfiles"> <div class="vector-toc-text"> <span class="vector-toc-numb">4.5</span> <span>Deploying changes to dockerfiles</span> </div> </a> <ul id="toc-Deploying_changes_to_dockerfiles-sublist" class="vector-toc-list"> </ul> </li> </ul> </li> <li id="toc-References" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#References"> <div class="vector-toc-text"> <span class="vector-toc-numb">5</span> <span>References</span> </div> </a> <ul id="toc-References-sublist" class="vector-toc-list"> </ul> </li> </ul> </div> </div> </nav> </div> </div> <div class="mw-content-container"> <main id="content" class="mw-body"> <header class="mw-body-header vector-page-titlebar"> <nav aria-label="Contents" class="vector-toc-landmark"> <div id="vector-page-titlebar-toc" class="vector-dropdown vector-page-titlebar-toc vector-button-flush-left" > <input type="checkbox" id="vector-page-titlebar-toc-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-page-titlebar-toc" class="vector-dropdown-checkbox " aria-label="Toggle the table of contents" > <label id="vector-page-titlebar-toc-label" for="vector-page-titlebar-toc-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-listBullet mw-ui-icon-wikimedia-listBullet"></span> <span class="vector-dropdown-label-text">Toggle the table of contents</span> </label> <div class="vector-dropdown-content"> <div id="vector-page-titlebar-toc-unpinned-container" class="vector-unpinned-container"> </div> </div> </div> </nav> <h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Continuous integration/Jenkins job builder</span></h1> <div class="mw-indicators"> <div id="mw-indicator-tpl-shortcut" class="mw-indicator"><div class="mw-parser-output"><div class="mw-parser-output"><style data-mw-deduplicate="TemplateStyles:r6605561">.mw-parser-output .tpl-badge{background-color:var(--background-color-progressive-subtle,#eaf3ff);color:var(--color-base,#202122);border-radius:10px;display:inline-block;font-size:90%;padding:5px 8px}</style><div class="tpl-badge">shortcut: <a href="/wiki/CI/JJB" class="mw-redirect" title="CI/JJB"><b>CI/JJB</b></a></div></div></div></div> </div> </header> <div class="vector-page-toolbar"> <div class="vector-page-toolbar-container"> <div id="left-navigation"> <nav aria-label="Namespaces"> <div id="p-associated-pages" class="vector-menu vector-menu-tabs mw-portlet mw-portlet-associated-pages" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-nstab-main" class="selected vector-tab-noicon mw-list-item"><a href="/wiki/Continuous_integration/Jenkins_job_builder" title="View the content page [c]" accesskey="c"><span>Page</span></a></li><li id="ca-talk" class="vector-tab-noicon mw-list-item"><a href="/wiki/Talk:Continuous_integration/Jenkins_job_builder" rel="discussion" title="Discussion about the content page [t]" accesskey="t"><span>Discussion</span></a></li> </ul> </div> </div> <div id="vector-variants-dropdown" class="vector-dropdown emptyPortlet" > <input type="checkbox" id="vector-variants-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-variants-dropdown" class="vector-dropdown-checkbox " aria-label="Change language variant" > <label id="vector-variants-dropdown-label" for="vector-variants-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet" aria-hidden="true" ><span class="vector-dropdown-label-text">English</span> </label> <div class="vector-dropdown-content"> <div id="p-variants" class="vector-menu mw-portlet mw-portlet-variants emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> </div> </div> </nav> </div> <div id="right-navigation" class="vector-collapsible"> <nav aria-label="Views"> <div id="p-views" class="vector-menu vector-menu-tabs mw-portlet mw-portlet-views" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-view" class="selected vector-tab-noicon mw-list-item"><a href="/wiki/Continuous_integration/Jenkins_job_builder"><span>Read</span></a></li><li id="ca-edit" class="vector-tab-noicon mw-list-item"><a href="/w/index.php?title=Continuous_integration/Jenkins_job_builder&action=edit" title="Edit the source code of this page [e]" accesskey="e"><span>Edit</span></a></li><li id="ca-history" class="vector-tab-noicon mw-list-item"><a href="/w/index.php?title=Continuous_integration/Jenkins_job_builder&action=history" title="Past revisions of this page [h]" accesskey="h"><span>View history</span></a></li> </ul> </div> </div> </nav> <nav class="vector-page-tools-landmark" aria-label="Page tools"> <div id="vector-page-tools-dropdown" class="vector-dropdown vector-page-tools-dropdown" > <input type="checkbox" id="vector-page-tools-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-page-tools-dropdown" class="vector-dropdown-checkbox " aria-label="Tools" > <label id="vector-page-tools-dropdown-label" for="vector-page-tools-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet" aria-hidden="true" ><span class="vector-dropdown-label-text">Tools</span> </label> <div class="vector-dropdown-content"> <div id="vector-page-tools-unpinned-container" class="vector-unpinned-container"> <div id="vector-page-tools" class="vector-page-tools vector-pinnable-element"> <div class="vector-pinnable-header vector-page-tools-pinnable-header vector-pinnable-header-unpinned" data-feature-name="page-tools-pinned" data-pinnable-element-id="vector-page-tools" data-pinned-container-id="vector-page-tools-pinned-container" data-unpinned-container-id="vector-page-tools-unpinned-container" > <div class="vector-pinnable-header-label">Tools</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-page-tools.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-page-tools.unpin">hide</button> </div> <div id="p-cactions" class="vector-menu mw-portlet mw-portlet-cactions emptyPortlet vector-has-collapsible-items" title="More options" > <div class="vector-menu-heading"> Actions </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-more-view" class="selected vector-more-collapsible-item mw-list-item"><a href="/wiki/Continuous_integration/Jenkins_job_builder"><span>Read</span></a></li><li id="ca-more-edit" class="vector-more-collapsible-item mw-list-item"><a href="/w/index.php?title=Continuous_integration/Jenkins_job_builder&action=edit" title="Edit the source code of this page [e]" accesskey="e"><span>Edit</span></a></li><li id="ca-more-history" class="vector-more-collapsible-item mw-list-item"><a href="/w/index.php?title=Continuous_integration/Jenkins_job_builder&action=history"><span>View history</span></a></li> </ul> </div> </div> <div id="p-tb" class="vector-menu mw-portlet mw-portlet-tb" > <div class="vector-menu-heading"> General </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="t-whatlinkshere" class="mw-list-item"><a href="/wiki/Special:WhatLinksHere/Continuous_integration/Jenkins_job_builder" title="A list of all wiki pages that link here [j]" accesskey="j"><span>What links here</span></a></li><li id="t-recentchangeslinked" class="mw-list-item"><a href="/wiki/Special:RecentChangesLinked/Continuous_integration/Jenkins_job_builder" rel="nofollow" title="Recent changes in pages linked from this page [k]" accesskey="k"><span>Related changes</span></a></li><li id="t-upload" class="mw-list-item"><a href="//commons.wikimedia.org/wiki/Special:UploadWizard" title="Upload files [u]" accesskey="u"><span>Upload file</span></a></li><li id="t-specialpages" class="mw-list-item"><a href="/wiki/Special:SpecialPages" title="A list of all special pages [q]" accesskey="q"><span>Special pages</span></a></li><li id="t-permalink" class="mw-list-item"><a href="/w/index.php?title=Continuous_integration/Jenkins_job_builder&oldid=6789477" title="Permanent link to this revision of this page"><span>Permanent link</span></a></li><li id="t-info" class="mw-list-item"><a href="/w/index.php?title=Continuous_integration/Jenkins_job_builder&action=info" title="More information about this page"><span>Page information</span></a></li><li id="t-cite" class="mw-list-item"><a href="/w/index.php?title=Special:CiteThisPage&page=Continuous_integration%2FJenkins_job_builder&id=6789477&wpFormIdentifier=titleform" title="Information on how to cite this page"><span>Cite this page</span></a></li><li id="t-urlshortener" class="mw-list-item"><a href="/w/index.php?title=Special:UrlShortener&url=https%3A%2F%2Fwww.mediawiki.org%2Fwiki%2FContinuous_integration%2FJenkins_job_builder"><span>Get shortened URL</span></a></li><li id="t-urlshortener-qrcode" class="mw-list-item"><a href="/w/index.php?title=Special:QrCode&url=https%3A%2F%2Fwww.mediawiki.org%2Fwiki%2FContinuous_integration%2FJenkins_job_builder"><span>Download QR code</span></a></li> </ul> </div> </div> <div id="p-coll-print_export" class="vector-menu mw-portlet mw-portlet-coll-print_export" > <div class="vector-menu-heading"> Print/export </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="coll-create_a_book" class="mw-list-item"><a href="/w/index.php?title=Special:Book&bookcmd=book_creator&referer=Continuous+integration%2FJenkins+job+builder"><span>Create a book</span></a></li><li id="coll-download-as-rl" class="mw-list-item"><a href="/w/index.php?title=Special:DownloadAsPdf&page=Continuous_integration%2FJenkins_job_builder&action=show-download-screen"><span>Download as PDF</span></a></li><li id="t-print" class="mw-list-item"><a href="/w/index.php?title=Continuous_integration/Jenkins_job_builder&printable=yes" title="Printable version of this page [p]" accesskey="p"><span>Printable version</span></a></li> </ul> </div> </div> <div id="p-wikibase-otherprojects" class="vector-menu mw-portlet mw-portlet-wikibase-otherprojects emptyPortlet" > <div class="vector-menu-heading"> In other projects </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> </div> </div> </div> </div> </nav> </div> </div> </div> <div class="vector-column-end"> <div class="vector-sticky-pinned-container"> <nav class="vector-page-tools-landmark" aria-label="Page tools"> <div id="vector-page-tools-pinned-container" class="vector-pinned-container"> </div> </nav> <nav class="vector-appearance-landmark" aria-label="Appearance"> <div id="vector-appearance-pinned-container" class="vector-pinned-container"> <div id="vector-appearance" class="vector-appearance vector-pinnable-element"> <div class="vector-pinnable-header vector-appearance-pinnable-header vector-pinnable-header-pinned" data-feature-name="appearance-pinned" data-pinnable-element-id="vector-appearance" data-pinned-container-id="vector-appearance-pinned-container" data-unpinned-container-id="vector-appearance-unpinned-container" > <div class="vector-pinnable-header-label">Appearance</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-appearance.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-appearance.unpin">hide</button> </div> </div> </div> </nav> </div> </div> <div id="bodyContent" class="vector-body" aria-labelledby="firstHeading" data-mw-ve-target-container> <div class="vector-body-before-content"> <div id="siteSub" class="noprint">From mediawiki.org</div> </div> <div id="contentSub"><div id="mw-content-subtitle"><div class="subpages">< <bdi dir="ltr"><a href="/wiki/Continuous_integration" title="Continuous integration">Continuous integration</a></bdi></div></div></div> <div id="mw-content-text" class="mw-body-content"><div class="mw-content-ltr mw-parser-output" lang="en" dir="ltr"><p><b><a href="/wiki/Continuous_integration/Jenkins" title="Continuous integration/Jenkins">Jenkins</a> Job builder</b> (abbreviated <b>JJB</b>) is a python script to maintain and simplify configuration of Jenkins jobs. Jenkins internally stores configuration of jobs in an XML format. JJB instead maintains jobs as simple descriptions in YAML format, which are then expanded to XML and uploaded to Jenkins through its HTTP API. </p><p>Upstream documentation is available at: <a rel="nofollow" class="external free" href="https://docs.openstack.org/infra/jenkins-job-builder/">https://docs.openstack.org/infra/jenkins-job-builder/</a>. </p><p>Note: which jobs are triggered for which events is handled by <a href="/wiki/Continuous_integration/Zuul" title="Continuous integration/Zuul">Zuul</a> via <code>zuul/layout.yaml</code>. </p> <meta property="mw:PageProp/toc"/> <div class="mw-heading mw-heading2 ext-discussiontools-init-section"><h2 id="How_it_works" data-mw-thread-id="h-How_it_works"><span data-mw-comment-start="" id="h-How_it_works"></span>How it works<span data-mw-comment-end="h-How_it_works"></span></h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Continuous_integration/Jenkins_job_builder&action=edit&section=1" title="Edit section: How it works"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span><!--__DTELLIPSISBUTTON__{"threadItem":{"headingLevel":2,"name":"h-","type":"heading","level":0,"id":"h-How_it_works","replies":[]}}--></div> <p>All jobs for Wikimedia Jenkins are managed by JJB. To create or change jobs, edit the YAML files in the <a class="external free" href="https://gerrit.wikimedia.org/g/integration/config">https://gerrit.wikimedia.org/g/integration/config</a> repository (submit a change, have it reviewed/merged by someone else). </p><p>Deployment must be done from the reviewer's local workstation. (Unlike mediawiki deployment, JJB does not run on the server.) </p> <div class="mw-heading mw-heading2 ext-discussiontools-init-section"><h2 id="Install_JJB" data-mw-thread-id="h-Install_JJB"><span data-mw-comment-start="" id="h-Install_JJB"></span>Install JJB<span data-mw-comment-end="h-Install_JJB"></span></h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Continuous_integration/Jenkins_job_builder&action=edit&section=2" title="Edit section: Install JJB"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span><!--__DTELLIPSISBUTTON__{"threadItem":{"headingLevel":2,"name":"h-","type":"heading","level":0,"id":"h-Install_JJB","replies":["h-Configure_JJB-Install_JJB","h-Troubleshooting-Install_JJB"]}}--></div> <p>The recommended way is to use JJB, is via a Python virtualenv managed by the <code>integration/config.git</code> repository itself. This way you will always use the correct JJB version. You will need to have Python 3 (e.g. from Apt or Homebrew) and <a rel="nofollow" class="external text" href="https://pypi.org/project/tox/">tox</a> installed (e.g. <code>pip3.11 install tox</code>, avoid Python 3.12+ until <a rel="nofollow" class="external text" href="https://bugs.launchpad.net/python-jenkins/+bug/2038855">upstream bug</a> is fixed). </p><p>The <code>./jjb-*</code> scripts in the repository will automatically use Tox and Python's virtualenv feature to install JJB on the first invocation. </p> <div class="mw-highlight mw-highlight-lang-shell-session mw-content-ltr" dir="ltr"><pre><span></span><span class="gp">$ </span>git<span class="w"> </span>clone<span class="w"> </span>https://gerrit.wikimedia.org/r/integration/config.git <span class="gp">$ </span><span class="nb">cd</span><span class="w"> </span>config <span class="gp">$ </span>./jenkins-jobs<span class="w"> </span>--version <span class="go">Jenkins Job Builder version: 4.3.0</span> </pre></div> <div class="mw-heading mw-heading3"><h3 id="Configure_JJB" data-mw-thread-id="h-Configure_JJB-Install_JJB"><span data-mw-comment-start="" id="h-Configure_JJB-Install_JJB"></span>Configure JJB<span data-mw-comment-end="h-Configure_JJB-Install_JJB"></span></h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Continuous_integration/Jenkins_job_builder&action=edit&section=3" title="Edit section: Configure JJB"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>JJB requires a basic authentication file with Jenkins credentials. Authentication is only needed if you intent to deploy changes to Jenkins. For local testing and validation, no authentication credentials are needed (just create a dummy file with empty <code>user</code> and <code>password</code> fields). </p><p>Our main installation at <a class="external free" href="https://integration.wikimedia.org/ci/">https://integration.wikimedia.org/ci/</a> only allows users in the <code>ciadmin</code> LDAP group to upload jobs. </p><p>To obtain an API token, log into Jenkins and open the "Configure" tab of your account (<code>JENKINS_URL/user/USERNAME/configure</code>; e.g. <a class="external free" href="https://integration.wikimedia.org/ci/user/Krinkle/configure">https://integration.wikimedia.org/ci/user/Krinkle/configure</a>). Click the "Add API Token", give it a name (eg. "jjb"), and then copy the your new API token. </p><p>Create a <code>jenkins_jobs.ini</code> file within your integration/config.git checkout and ensure to make it readable only by your user <code>chmod 0500 jenkins_jobs.ini</code>: </p> <div class="mw-highlight mw-highlight-lang-ini mw-content-ltr" dir="ltr"><pre><span></span><span class="k">[job_builder]</span> <span class="na">allow_duplicates</span><span class="o">=</span><span class="s">True</span> <span class="k">[jenkins]</span> <span class="na">user</span><span class="o">=</span><span class="s">USERNAME</span> <span class="na">password</span><span class="o">=</span><span class="s">API_TOKEN</span> <span class="na">url</span><span class="o">=</span><span class="s">https://integration.wikimedia.org/ci/</span> <span class="na">query_plugins_info</span><span class="o">=</span><span class="s">False</span> </pre></div> <div class="mw-heading mw-heading3"><h3 id="Troubleshooting" data-mw-thread-id="h-Troubleshooting-Install_JJB"><span data-mw-comment-start="" id="h-Troubleshooting-Install_JJB"></span>Troubleshooting<span data-mw-comment-end="h-Troubleshooting-Install_JJB"></span></h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Continuous_integration/Jenkins_job_builder&action=edit&section=4" title="Edit section: Troubleshooting"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>A few common problems that may occur when installing JJB. </p> <div class="mw-heading mw-heading4"><h4 id="error:_externally-managed-environment" data-mw-thread-id="h-error:_externally-managed-environment-Troubleshooting"><span data-mw-comment-start="" id="h-error:_externally-managed-environment-Troubleshooting"></span>error: externally-managed-environment<span data-mw-comment-end="h-error:_externally-managed-environment-Troubleshooting"></span></h4><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Continuous_integration/Jenkins_job_builder&action=edit&section=5" title="Edit section: error: externally-managed-environment"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <pre>$ pip install tox error: externally-managed-environment × This environment is externally managed ╰─> To install Python packages system-wide, try brew install xyz, where xyz is the package you are trying to install. </pre> <p>This can happen if you use Homebrew to install Python 3.12 or later. Use Python 3.11 instead, and then use that to install tox: </p> <pre>$ brew install python@3.11 … $ pip3.11 install tox </pre> <div class="mw-heading mw-heading4"><h4 id="ERROR:stevedore.extension:_module_'pkgutil'_has_no_attribute_'ImpImporter'" data-mw-thread-id="h-ERROR:stevedore.extension:_module_'pkgutil'_has_no_attribute_'ImpImporter'-Troubleshooting"><span id="ERROR:stevedore.extension:_module_.27pkgutil.27_has_no_attribute_.27ImpImporter.27"></span><span data-mw-comment-start="" id="h-ERROR:stevedore.extension:_module_'pkgutil'_has_no_attribute_'ImpImporter'-Troubleshooting"></span>ERROR:stevedore.extension: module 'pkgutil' has no attribute 'ImpImporter'<span data-mw-comment-end="h-ERROR:stevedore.extension:_module_'pkgutil'_has_no_attribute_'ImpImporter'-Troubleshooting"></span></h4><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Continuous_integration/Jenkins_job_builder&action=edit&section=6" title="Edit section: ERROR:stevedore.extension: module 'pkgutil' has no attribute 'ImpImporter'"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <pre>ERROR:stevedore.extension:Could not load 'delete': module 'pkgutil' has no attribute 'ImpImporter' ERROR:stevedore.extension:Could not load 'list': module 'pkgutil' has no attribute 'ImpImporter' ERROR:stevedore.extension:Could not load 'test': module 'pkgutil' has no attribute 'ImpImporter' ERROR:stevedore.extension:Could not load 'update': module 'pkgutil' has no attribute 'ImpImporter' </pre> <p>This is due to the popular "setuptools" Python package (which JJB depends on) not yet supporting Python 3.12 or later. Use Python 3.11 instead. </p><p>This bug is tracked upstream at <a rel="nofollow" class="external free" href="https://bugs.launchpad.net/python-jenkins/+bug/2038855">https://bugs.launchpad.net/python-jenkins/+bug/2038855</a> </p> <div class="mw-heading mw-heading4"><h4 id="pyconfig.h" data-mw-thread-id="h-pyconfig.h-Troubleshooting"><span data-mw-comment-start="" id="h-pyconfig.h-Troubleshooting"></span>pyconfig.h<span data-mw-comment-end="h-pyconfig.h-Troubleshooting"></span></h4><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Continuous_integration/Jenkins_job_builder&action=edit&section=7" title="Edit section: pyconfig.h"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <pre> ext/_yaml.c:8:22: fatal error: pyconfig.h: No such file or directory #include "pyconfig.h" ^ compilation terminated. </pre> <p>You may be missing Python's development dependencies. In Debian / Ubuntu that is: </p> <pre>sudo apt-get install python-dev </pre> <div class="mw-heading mw-heading2 ext-discussiontools-init-section"><h2 id="Modifying_jobs" data-mw-thread-id="h-Modifying_jobs"><span data-mw-comment-start="" id="h-Modifying_jobs"></span>Modifying jobs<span data-mw-comment-end="h-Modifying_jobs"></span></h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Continuous_integration/Jenkins_job_builder&action=edit&section=8" title="Edit section: Modifying jobs"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span><!--__DTELLIPSISBUTTON__{"threadItem":{"headingLevel":2,"name":"h-","type":"heading","level":0,"id":"h-Modifying_jobs","replies":[]}}--></div> <p><i>See also <a href="#Install_JJB">Install JJB</a> - You need to have it installed locally before you can test or validate config files.</i> </p> <ul><li>Modify jobs by editing the YAML files in the <code>integration/config.git</code> repository.</li> <li>Read the documentation<sup id="cite_ref-jjb-docs-config_1-0" class="reference"><a href="#cite_note-jjb-docs-config-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup> to learn what features are available (JJB internally maps the YAML format to the XML format for the Jenkins API, properties might have slightly different names, or might work differently, or might not be supported).</li> <li>Use an editor with YAML syntax highlighting and ideally YAML linting as well. The YAML format relies on indentation for its structure (similar to Python); it's easy to make mistakes.</li> <li>Once done editing, run the following in your <code>integration/config</code> directory:<div class="mw-highlight mw-highlight-lang-shell-session mw-content-ltr" dir="ltr"><pre><span></span><span class="gp">$ </span>./jjb-test<span class="w"> </span>-o<span class="w"> </span>output/ </pre></div>this internally translates to the following command:<div class="mw-highlight mw-highlight-lang-shell-session mw-content-ltr" dir="ltr"><pre><span></span><span class="gp">$ </span>tox<span class="w"> </span>-e<span class="w"> </span>jenkins-jobs<span class="w"> </span>--<span class="w"> </span>--conf<span class="w"> </span>jenkins_jobs.ini<span class="w"> </span><span class="nb">test</span><span class="w"> </span>jjb/<span class="w"> </span>-o<span class="w"> </span>output/ </pre></div>This verifies everything works as expected (aside from the YAML syntax, incorrect indentation can break things, or naming collisions with Python interfaces).</li> <li>Commit your modifications to a local topic branch (keep master clean), and send to Gerrit for review.</li></ul> <p>Output directory should now contains files like this: </p> <pre>$ ls -l output/ mediawiki-phpunit operations-puppet-validate ... </pre> <div class="mw-heading mw-heading2 ext-discussiontools-init-section"><h2 id="Deploy_changes" data-mw-thread-id="h-Deploy_changes"><span data-mw-comment-start="" id="h-Deploy_changes"></span>Deploy changes<span data-mw-comment-end="h-Deploy_changes"></span></h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Continuous_integration/Jenkins_job_builder&action=edit&section=9" title="Edit section: Deploy changes"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span><!--__DTELLIPSISBUTTON__{"threadItem":{"headingLevel":2,"name":"h-","type":"heading","level":0,"id":"h-Deploy_changes","replies":["h-Debugging_JJB-Deploy_changes","h-Deleting_a_job-Deploy_changes","h-Synchronizing_all_jobs-Deploy_changes","h-Deploying_changes_to_zuul_config-Deploy_changes","h-Deploying_changes_to_dockerfiles-Deploy_changes"]}}--></div> <dl><dd><i>See also <a href="#Install_JJB">Install JJB</a> - For deploying changes, JJB must be installed, configured, and authenticated</i></dd></dl> <p>Check out the relevant change for <code>integration/config</code> from Gerrit. Ensure the change is rebased onto latest master to avoid accidentally undoing other changes. </p> <div class="mw-highlight mw-highlight-lang-bash mw-content-ltr" dir="ltr"><pre><span></span>integration/config$<span class="w"> </span>git<span class="w"> </span>review<span class="w"> </span>-d<span class="w"> </span><span class="m">139035</span> </pre></div><p>Now use the JJB "test" command to validate the YAML files and generate the XML file that represent the Jenkins job.</p><div class="mw-highlight mw-highlight-lang-bash mw-content-ltr" dir="ltr"><pre><span></span>integration-config$<span class="w"> </span>./jjb-test<span class="w"> </span><span class="s1">'composer-package-php80-docker'</span> </pre></div><p> You can also generate multiple jobs (or all jobs) by passing no name or a wildcard name instead:</p><div class="mw-highlight mw-highlight-lang-bash mw-content-ltr" dir="ltr"><pre><span></span>integration-config$<span class="w"> </span>rm<span class="w"> </span>-rf<span class="w"> </span>output/<span class="w"> </span><span class="o">&&</span><span class="w"> </span>./jjb-test<span class="w"> </span><span class="s1">'composer-*'</span><span class="w"> </span>-o<span class="w"> </span>output/ integration-config$<span class="w"> </span>cat<span class="w"> </span>output/example-jenkins-job <?xml<span class="w"> </span>.. ... </pre></div><p>If the <code>jjb-test</code> command results in error, there is either a YAML syntax error or invalid an JJB structure inside the YAML file. The config patch will need amending in that case. Do not deploy! </p><p>If there are no errors, review the XML file for your job: </p> <style data-mw-deduplicate="TemplateStyles:r6651107">.mw-parser-output .note{background-position:left 7px top 50%;padding:0.5em 0.5em 0.5em 40px;margin:0.5em 0;overflow:hidden;background-color:#f8f9fa;color:#333;background-repeat:no-repeat;border:1px solid #ddd}.mw-parser-output .note-inline{display:inline-block;vertical-align:middle}.mw-parser-output .note-info{background-color:#eaf3ff;color:#333;background-image:url("https://upload.wikimedia.org/wikipedia/commons/e/ec/OOjs_UI_icon_information-progressive.svg");background-size:25px;border-color:#a3caff;padding-left:40px;min-height:25px}.mw-parser-output .note-reminder{background-color:#fff9ea;color:#333;background-image:url("https://upload.wikimedia.org/wikipedia/commons/a/a8/OOjs_UI_icon_lightbulb-yellow.svg");background-size:25px;border-color:#fc3;min-height:25px}.mw-parser-output .note-warn{background-color:#fff9ea;color:#333;background-image:url("https://upload.wikimedia.org/wikipedia/commons/3/3b/OOjs_UI_icon_alert-warning.svg");background-size:25px;border-color:#fc3;min-height:25px}.mw-parser-output .note-error{background-color:#fee7e6;color:#333;background-image:url("https://upload.wikimedia.org/wikipedia/commons/b/bf/OOjs_UI_icon_notice-destructive.svg");background-size:25px;border-color:#c33;min-height:25px}@media screen{html.skin-theme-clientpref-night .mw-parser-output .note{background-color:transparent;color:inherit}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .note{background-color:transparent;color:inherit}}</style><div role="note" class="note note-reminder">When you upload your Gerrit change for the integration/config repository, we automatically generate the above output for all jobs before and after, and show you a diff you can review. Browse for the output of the <b>integration-config-jjb-diff</b> Job for the full diff! </div> <p>If the job looks correct, upload the updated Jenkins job configurations to Jenkins. </p> <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r6651107"><div role="note" class="note note-info">Do not merge changes in integration/config until after you have locally generated the affected jobs and deployed ("jjb-update") them to the Jenkins. It is customary for the repository to reflect the deployed state. Given that deployment happens locally, it is customary to +2 afterwards, instead of the other way around. </div><p> The <code>./jjb-update</code> command accepts multiple (variadic) arguments, each of which may use the <a rel="nofollow" class="external text" href="https://docs.python.org/3/library/fnmatch.html">fnmatch patterns</a>.</p><div class="mw-highlight mw-highlight-lang-bash mw-content-ltr" dir="ltr"><pre><span></span><span class="c1"># Deploy one job</span> $<span class="w"> </span>./jjb-update<span class="w"> </span><span class="s1">'example-jenkins-job'</span> <span class="w"> </span>..<span class="w"> </span>INFO:root:Updating<span class="w"> </span><span class="nb">jobs</span><span class="w"> </span><span class="k">in</span><span class="w"> </span>jjb/<span class="w"> </span><span class="o">([</span><span class="s1">'example-jenkins-job'</span><span class="o">])</span> <span class="w"> </span>..<span class="w"> </span>INFO:jenkins_jobs.builder:Reconfiguring<span class="w"> </span>example-jenkins-job <span class="c1"># Deploy multiple jobs at once with a pattern</span> $<span class="w"> </span>./jjb-update<span class="w"> </span><span class="s1">'*-example'</span> <span class="w"> </span>.. <span class="c1"># Deploy multiple jobs at once with multiple patterns</span> $<span class="w"> </span>./jjb-update<span class="w"> </span><span class="s1">'*foo*'</span><span class="w"> </span><span class="s1">'*bar*'</span> <span class="w"> </span>.. <span class="c1"># The jjb-update script translates to the following command:</span> $<span class="w"> </span>tox<span class="w"> </span>-e<span class="w"> </span>jenkins-jobs<span class="w"> </span>--<span class="w"> </span>--conf<span class="w"> </span>jenkins_jobs.ini<span class="w"> </span>update<span class="w"> </span>jjb/<span class="w"> </span><span class="s1">'example-*'</span> </pre></div> <div class="mw-heading mw-heading3"><h3 id="Debugging_JJB" data-mw-thread-id="h-Debugging_JJB-Deploy_changes"><span data-mw-comment-start="" id="h-Debugging_JJB-Deploy_changes"></span>Debugging JJB<span data-mw-comment-end="h-Debugging_JJB-Deploy_changes"></span></h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Continuous_integration/Jenkins_job_builder&action=edit&section=10" title="Edit section: Debugging JJB"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <ul><li>You can enable debugging output by passing <code>-l debug</code></li> <li>Jenkins job builder maintains a cache of jobs and will not resubmit a job if it considers it already up to date. You will want to delete the file <code>~/.jenkins_jobs_cache.yml</code> to force the update.</li></ul> <div class="mw-heading mw-heading3"><h3 id="Deleting_a_job" data-mw-thread-id="h-Deleting_a_job-Deploy_changes"><span data-mw-comment-start="" id="h-Deleting_a_job-Deploy_changes"></span>Deleting a job<span data-mw-comment-end="h-Deleting_a_job-Deploy_changes"></span></h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Continuous_integration/Jenkins_job_builder&action=edit&section=11" title="Edit section: Deleting a job"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>If you are deleting a job, the regular jjb update command will not work (since it only updates jobs it's aware of). To delete jobs, you can use the <code>jjb-delete</code> script in the <code>integration/config</code> repository. </p> <div class="mw-heading mw-heading3"><h3 id="Synchronizing_all_jobs" data-mw-thread-id="h-Synchronizing_all_jobs-Deploy_changes"><span data-mw-comment-start="" id="h-Synchronizing_all_jobs-Deploy_changes"></span>Synchronizing all jobs<span data-mw-comment-end="h-Synchronizing_all_jobs-Deploy_changes"></span></h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Continuous_integration/Jenkins_job_builder&action=edit&section=12" title="Edit section: Synchronizing all jobs"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>This might overwrite things you don't intend to. <b>You usually do not want to do this</b>. </p><p>Known issues: </p> <ul><li>Updating all jobs does not allow one to control the order in which jobs are uploaded. Given our Jenkins instance is actively used, this will lead to problems where job A depends on job B, but job B is still absent or outdated.</li></ul> <div class="mw-heading mw-heading3"><h3 id="Deploying_changes_to_zuul_config" data-mw-thread-id="h-Deploying_changes_to_zuul_config-Deploy_changes"><span data-mw-comment-start="" id="h-Deploying_changes_to_zuul_config-Deploy_changes"></span>Deploying changes to zuul config<span data-mw-comment-end="h-Deploying_changes_to_zuul_config-Deploy_changes"></span></h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Continuous_integration/Jenkins_job_builder&action=edit&section=13" title="Edit section: Deploying changes to zuul config"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Changes to <code>zuul/layout.yaml</code> are deployed using fabric, by running the following command: </p><p>$ <code><b>./fab deploy_zuul</b></code> </p><p>See <a href="/wiki/Continuous_integration/Zuul#Update_configuration" title="Continuous integration/Zuul">Continuous integration/Zuul#Update configuration</a> for detailed instructions. </p> <div class="mw-heading mw-heading3"><h3 id="Deploying_changes_to_dockerfiles" data-mw-thread-id="h-Deploying_changes_to_dockerfiles-Deploy_changes"><span data-mw-comment-start="" id="h-Deploying_changes_to_dockerfiles-Deploy_changes"></span>Deploying changes to dockerfiles<span data-mw-comment-end="h-Deploying_changes_to_dockerfiles-Deploy_changes"></span></h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Continuous_integration/Jenkins_job_builder&action=edit&section=14" title="Edit section: Deploying changes to dockerfiles"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Changes to <code>dockerfiles/*</code> are deployed using fabric, by running the following command: </p><p>$ <code><b>./fab deploy_docker</b></code> </p> <div class="mw-heading mw-heading2 ext-discussiontools-init-section"><h2 id="References" data-mw-thread-id="h-References"><span data-mw-comment-start="" id="h-References"></span>References<span data-mw-comment-end="h-References"></span></h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Continuous_integration/Jenkins_job_builder&action=edit&section=15" title="Edit section: References"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span><!--__DTELLIPSISBUTTON__{"threadItem":{"headingLevel":2,"name":"h-","type":"heading","level":0,"id":"h-References","replies":[]}}--></div> <div class="mw-references-wrap"><ol class="references"> <li id="cite_note-jjb-docs-config-1"><span class="mw-cite-backlink"><a href="#cite_ref-jjb-docs-config_1-0">↑</a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://docs.openstack.org/infra/jenkins-job-builder/attic/">Configuration · jenkins-job-builder documentation</a></span> </li> </ol></div> <!-- NewPP limit report Parsed by mw‐web.eqiad.main‐68d6679558‐sjlrl Cached time: 20241107054808 Cache expiry: 2592000 Reduced expiry: false Complications: [show‐toc] DiscussionTools time usage: 0.012 seconds CPU time usage: 0.081 seconds Real time usage: 0.415 seconds Preprocessor visited node count: 247/1000000 Post‐expand include size: 1794/2097152 bytes Template argument size: 1251/2097152 bytes Highest expansion depth: 12/100 Expensive parser function count: 10/500 Unstrip recursion depth: 0/20 Unstrip post‐expand size: 9205/5000000 bytes Lua time usage: 0.016/10.000 seconds Lua memory usage: 637164/52428800 bytes Number of Wikibase entities loaded: 0/400 --> <!-- Transclusion expansion time report (%,ms,calls,template) 100.00% 327.481 1 -total 12.18% 39.898 1 Template:TNT 5.57% 18.233 2 Template:Note 2.71% 8.875 1 Template:Badge --> <!-- Saved in parser cache with key mediawikiwiki:pcache:idhash:104881-0!canonical and timestamp 20241107054808 and revision id 6789477. Rendering was triggered because: page-view --> </div><!--esi <esi:include src="/esitest-fa8a495983347898/content" /> --><noscript><img src="https://login.wikimedia.org/wiki/Special:CentralAutoLogin/start?type=1x1" alt="" width="1" height="1" style="border: none; position: absolute;"></noscript> <div class="printfooter" data-nosnippet="">Retrieved from "<a dir="ltr" href="https://www.mediawiki.org/w/index.php?title=Continuous_integration/Jenkins_job_builder&oldid=6789477">https://www.mediawiki.org/w/index.php?title=Continuous_integration/Jenkins_job_builder&oldid=6789477</a>"</div></div> <div id="catlinks" class="catlinks" data-mw="interface"><div id="mw-normal-catlinks" class="mw-normal-catlinks"><a href="/wiki/Special:Categories" title="Special:Categories">Category</a>: <ul><li><a href="/wiki/Category:Continuous_integration" title="Category:Continuous integration">Continuous integration</a></li></ul></div></div> </div> </main> </div> <div class="mw-footer-container"> <footer id="footer" class="mw-footer" > <ul id="footer-info"> <li id="footer-info-lastmod"> This page was last edited on 8 October 2024, at 05:44.</li> <li id="footer-info-copyright">Text is available under the <a rel="nofollow" class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">Creative Commons Attribution-ShareAlike License</a>; additional terms may apply. Text in <a class="external text" href="https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents">the Help: namespace</a> is available under the <a rel="nofollow" class="external text" href="https://creativecommons.org/publicdomain/zero/1.0/">Creative Commons CC0 License</a>. By using this site, you agree to the <a class="external text" href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Terms_of_Use">Terms of Use</a> and <a class="external text" href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Privacy_policy">Privacy Policy</a>.</li> </ul> <ul id="footer-places"> <li id="footer-places-privacy"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Privacy_policy">Privacy policy</a></li> <li id="footer-places-about"><a href="/wiki/Project:About">About mediawiki.org</a></li> <li id="footer-places-disclaimers"><a href="/wiki/Project:General_disclaimer">Disclaimers</a></li> <li id="footer-places-wm-codeofconduct"><a href="https://www.mediawiki.org/wiki/Special:MyLanguage/Code_of_Conduct">Code of Conduct</a></li> <li id="footer-places-developers"><a href="https://developer.wikimedia.org">Developers</a></li> <li id="footer-places-statslink"><a href="https://stats.wikimedia.org/#/www.mediawiki.org">Statistics</a></li> <li id="footer-places-cookiestatement"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Cookie_statement">Cookie statement</a></li> <li id="footer-places-mobileview"><a href="//m.mediawiki.org/w/index.php?title=Continuous_integration/Jenkins_job_builder&mobileaction=toggle_view_mobile" class="noprint stopMobileRedirectToggle">Mobile view</a></li> </ul> <ul id="footer-icons" class="noprint"> <li id="footer-copyrightico"><a href="https://wikimediafoundation.org/" class="cdx-button cdx-button--fake-button cdx-button--size-large cdx-button--fake-button--enabled"><img src="/static/images/footer/wikimedia-button.svg" width="84" height="29" alt="Wikimedia Foundation" loading="lazy"></a></li> <li id="footer-poweredbyico"><a href="https://www.mediawiki.org/" class="cdx-button cdx-button--fake-button cdx-button--size-large cdx-button--fake-button--enabled"><img src="/w/resources/assets/poweredby_mediawiki.svg" alt="Powered by MediaWiki" width="88" height="31" loading="lazy"></a></li> </ul> </footer> </div> </div> </div> <div class="vector-settings" id="p-dock-bottom"> <ul></ul> </div><script>(RLQ=window.RLQ||[]).push(function(){mw.config.set({"wgHostname":"mw-web.codfw.canary-84779d6bf6-lxzkk","wgBackendResponseTime":104,"wgDiscussionToolsPageThreads":[{"headingLevel":2,"name":"h-","type":"heading","level":0,"id":"h-How_it_works","replies":[]},{"headingLevel":2,"name":"h-","type":"heading","level":0,"id":"h-Install_JJB","replies":[{"headingLevel":3,"name":"h-","type":"heading","level":0,"id":"h-Configure_JJB-Install_JJB","replies":[]},{"headingLevel":3,"name":"h-","type":"heading","level":0,"id":"h-Troubleshooting-Install_JJB","replies":[{"headingLevel":4,"name":"h-","type":"heading","level":0,"id":"h-error:_externally-managed-environment-Troubleshooting","replies":[]},{"headingLevel":4,"name":"h-","type":"heading","level":0,"id":"h-ERROR:stevedore.extension:_module_'pkgutil'_has_no_attribute_'ImpImporter'-Troubleshooting","replies":[]},{"headingLevel":4,"name":"h-","type":"heading","level":0,"id":"h-pyconfig.h-Troubleshooting","replies":[]}]}]},{"headingLevel":2,"name":"h-","type":"heading","level":0,"id":"h-Modifying_jobs","replies":[]},{"headingLevel":2,"name":"h-","type":"heading","level":0,"id":"h-Deploy_changes","replies":[{"headingLevel":3,"name":"h-","type":"heading","level":0,"id":"h-Debugging_JJB-Deploy_changes","replies":[]},{"headingLevel":3,"name":"h-","type":"heading","level":0,"id":"h-Deleting_a_job-Deploy_changes","replies":[]},{"headingLevel":3,"name":"h-","type":"heading","level":0,"id":"h-Synchronizing_all_jobs-Deploy_changes","replies":[]},{"headingLevel":3,"name":"h-","type":"heading","level":0,"id":"h-Deploying_changes_to_zuul_config-Deploy_changes","replies":[]},{"headingLevel":3,"name":"h-","type":"heading","level":0,"id":"h-Deploying_changes_to_dockerfiles-Deploy_changes","replies":[]}]},{"headingLevel":2,"name":"h-","type":"heading","level":0,"id":"h-References","replies":[]}],"wgPageParseReport":{"discussiontools":{"limitreport-timeusage":"0.012"},"limitreport":{"cputime":"0.081","walltime":"0.415","ppvisitednodes":{"value":247,"limit":1000000},"postexpandincludesize":{"value":1794,"limit":2097152},"templateargumentsize":{"value":1251,"limit":2097152},"expansiondepth":{"value":12,"limit":100},"expensivefunctioncount":{"value":10,"limit":500},"unstrip-depth":{"value":0,"limit":20},"unstrip-size":{"value":9205,"limit":5000000},"entityaccesscount":{"value":0,"limit":400},"timingprofile":["100.00% 327.481 1 -total"," 12.18% 39.898 1 Template:TNT"," 5.57% 18.233 2 Template:Note"," 2.71% 8.875 1 Template:Badge"]},"scribunto":{"limitreport-timeusage":{"value":"0.016","limit":"10.000"},"limitreport-memusage":{"value":637164,"limit":52428800}},"cachereport":{"origin":"mw-web.eqiad.main-68d6679558-sjlrl","timestamp":"20241107054808","ttl":2592000,"transientcontent":false}}});});</script> </body> </html>