kubesphere版本:v3.1.0
参考文档:KubeSphere (v3.1.0)
之前是通过kubesphere devops模块ui运行的,不太方便,创建流水线时,虽然有触发远程构建的选项,但需要知道Jenkins地址,需要配负载均衡挺麻烦的。
后来,通过查看kubesphere api文档,发现有实现方式的。以下是容器中进行的,所以访问svc,具体如下:
第一步:获取access_token

curl -X POST -H 'Content-Type: application/x-www-form-urlencoded' \
'http://ks-apiserver.kubesphere-system.svc/oauth/token' \
--data-urlencode 'grant_type=password' \
--data-urlencode 'username=[你的kubesphere用户名]' \
--data-urlencode 'password=[用户密码]'

第二步:获取Jenkins-Crumb,这一步很重要,不然后面调用接口触发构建时,Jenkins会报错,网上有解决方案是对Jenkins进行配置,但感觉不太安全。

curl -X GET -H "Authorization: Bearer [第一步获取到的access_token]" \
'http://ks-apiserver.kubesphere-system.svc/kapis/devops.kubesphere.io/v1alpha2/crumbissuer'

第三步:通过api远程触发构建,运行流水线

curl -X POST -H "Authorization: Bearer [第一步获取到的access_token]" \
-H 'Content-Type: application/json' \
-H 'Jenkins-Crumb: [第二步获取到的crumb字段值]' \
'http://ks-apiserver.kubesphere-system.svc/kapis/devops.kubesphere.io/v1alpha2/devops/{devops项目的namespace名称}/pipelines/{具体的pipeline名称}/runs'

至此,成功!也算是一次探索了!

    2 年 后
    2 年 后

    hilbp 按照您的操作token与Jenkins-Crumb都成功获取了,但是第三步请求还是报错了:

    <!DOCTYPE html>

    <html class="">

    <head resURL=“/static/35f0fb8a” data-rooturl="“ data-resurl=”/static/35f0fb8a" data-extensions-available=“true” data-unit-test=“false” data-imagesurl=“/static/35f0fb8a/images” data-crumb-header=“Jenkins-Crumb” data-crumb-value=“625dd4d4180c14a582976b1b536516e81563a894dee07b231ee35ecad9e1c749”>

    <title>Jenkins [Jenkins]</title> <link rel=“stylesheet” href=“/static/35f0fb8a/jsbundles/base-styles-v2.css” type=“text/css”> <link rel=“stylesheet” href=“/static/35f0fb8a/css/color.css” type=“text/css”> <link rel=“stylesheet” href=“/static/35f0fb8a/css/responsive-grid.css” type=“text/css”> <link rel=“shortcut icon” href=“/static/35f0fb8a/favicon.ico” type=“image/vnd.microsoft.icon”> <link color=“black” rel=“mask-icon” href=“/images/mask-icon.svg”> <script src=“/static/35f0fb8a/scripts/prototype.js” type=“text/javascript”></script> <script src=“/static/35f0fb8a/scripts/behavior.js” type=“text/javascript”></script> <script src=‘/adjuncts/35f0fb8a/org/kohsuke/stapler/bind.js’ type=‘text/javascript’></script> <script src=“/static/35f0fb8a/scripts/yui/yahoo/yahoo-min.js”></script> <script src=“/static/35f0fb8a/scripts/yui/dom/dom-min.js”></script> <script src=“/static/35f0fb8a/scripts/yui/event/event-min.js”></script> <script src=“/static/35f0fb8a/scripts/yui/animation/animation-min.js”></script> <script src=“/static/35f0fb8a/scripts/yui/dragdrop/dragdrop-min.js”></script> <script src=“/static/35f0fb8a/scripts/yui/container/container-min.js”></script> <script src=“/static/35f0fb8a/scripts/yui/connection/connection-min.js”></script> <script src=“/static/35f0fb8a/scripts/yui/datasource/datasource-min.js”></script> <script src=“/static/35f0fb8a/scripts/yui/autocomplete/autocomplete-min.js”></script> <script src=“/static/35f0fb8a/scripts/yui/menu/menu-min.js”></script> <script src=“/static/35f0fb8a/scripts/yui/element/element-min.js”></script> <script src=“/static/35f0fb8a/scripts/yui/button/button-min.js”></script> <script src=“/static/35f0fb8a/scripts/yui/storage/storage-min.js”></script> <script src=“/static/35f0fb8a/scripts/polyfills.js” type=“text/javascript”></script> <script src=“/static/35f0fb8a/scripts/hudson-behavior.js” type=“text/javascript”></script> <script src=“/static/35f0fb8a/scripts/sortable.js” type=“text/javascript”></script> <link rel=“stylesheet” href=“/static/35f0fb8a/scripts/yui/container/assets/container.css” type=“text/css”> <link rel=“stylesheet” href=“/static/35f0fb8a/scripts/yui/container/assets/skins/sam/container.css” type=“text/css”> <link rel=“stylesheet” href=“/static/35f0fb8a/scripts/yui/menu/assets/skins/sam/menu.css” type=“text/css”> <link rel=“stylesheet” href=“/static/35f0fb8a/jsbundles/ui-refresh-overrides.css” type=“text/css”> <link rel=“search” href=“/opensearch.xml” type=“application/opensearchdescription+xml” title=“Jenkins”> <meta name=“ROBOTS” content=“INDEX,NOFOLLOW”> <meta name=“viewport” content=“width=device-width, initial-scale=1”> <script src=“/adjuncts/35f0fb8a/org/kohsuke/stapler/jquery/jquery.full.js” type=“text/javascript”></script> <script> var Q=jQuery.noConflict() </script> <script src=“/static/35f0fb8a/jsbundles/vendors.js” type=“text/javascript”></script> <script src=“/static/35f0fb8a/jsbundles/page-init.js” type=“text/javascript”></script> <script src=“/static/35f0fb8a/jsbundles/sortable-drag-drop.js” type=“text/javascript”></script></head>
    <body data-model-type=“hudson.model.Hudson” id=“jenkins” class=“yui-skin-sam one-column jenkins-2.319.3” data-version=“2.319.3”><a href=“#skip2content” class=“skiplink”>Skip to content</a> <div id=“page-head”> <header id=“header” class=“page-header”> <div class=“page-headerbrand”> <div class=“logo”><a id=“jenkins-home-link” href=“/”><img src=“/static/35f0fb8a/images/jenkins-header-logo-v2.svg” alt=“[Jenkins]” id=“jenkins-head-icon”><img src=“/static/35f0fb8a/images/title.svg” alt=“Jenkins” width=“139” id=“jenkins-name-icon” height=“34”></a> </div><a href=“/” class=“page-headerbrand-link”><img src=“/static/35f0fb8a/images/jenkins-header-logo-v2.svg” alt=“[Jenkins]” class=“page-headerbrand-image”><span class=“page-headerbrand-name”>Jenkins</span></a> </div> <div class=“searchbox hidden-xs”> <form role=“search” method=“get” name=“search” action=“/search/” style=“position:relative;” class=“no-json”> <div id=“search-box-sizer”></div> <div id=“searchform”> <input role=“searchbox” name=“q” placeholder=“Search” id=“search-box” class=“main-searchinput”><span class=“main-searchicon-leading”><svg viewBox=“0 0 24 24” focusable=“false” class=“svg-icon ”><use href=“/static/35f0fb8a/images/material-icons/svg-sprite-action-symbol.svg#ic_search_24px”></use></svg></span><a href=“https://www.jenkins.io/redirect/search-box” class=“main-searchicon-trailing”><svg viewBox=“0 0 24 24” focusable=“false” class=“svg-icon ”> <use href=“/static/35f0fb8a/images/material-icons/svg-sprite-action-symbol.svg#ic_help_outline_24px”> </use> </svg></a> <div id=“search-box-completion”></div> <script> createSearchBox(“/search/”); </script> </div> </form> </div> <div class=“login page-headerhyperlinks”> <div id=“visible-am-insertion” class=“page-headeram-wrapper”></div> <div id=“visible-sec-am-insertion” class=“page-headeram-wrapper”></div><a href=“/login?from=%2Fblue%2Frest%2Forganizations%2Fjenkins%2Fpipelines%2Fzhengzhou-testc9ghp%2Fpipelines%2Fscps-sys-server%2Fbranches%2Fmaster%2Fruns%2F”><b>log in</b></a> </div> </header> <div id=“breadcrumbBar”> <tr id=“top-nav”> <td id=“left-top-nav” colspan=“2”> <link rel=‘stylesheet’ href=‘/adjuncts/35f0fb8a/lib/layout/breadcrumbs.css’ type=‘text/css’ /> <script src=‘/adjuncts/35f0fb8a/lib/layout/breadcrumbs.js’ type=‘text/javascript’></script> <div class=“top-sticker noedge”> <div class=“top-sticker-inner”> <div class=“breadcrumbswrapper”> <ul id=“breadcrumbs”> <li class=“item”><a href=“/” class=“model-link inside”>Dashboard</a></li> <li href=“/” class=“children”></li> </ul> <div id=“breadcrumb-menu-target”></div> </div> </div> </div> </td> </tr> </div> </div> <div id=“page-body” class=“clear”> <div id=“main-panel”><a name=“skip2content”></a> <h1 style=“text-align: center”> <img src=“/static/35f0fb8a/images/rage.png” width=“154” height=“179”><span style=“font-size:50px”> Oops!</span> </h1> <div id=“error-description”> <h2 style=“text-align: center”>A problem occurred while processing the request.</h2> <p style=“text-align: center”>Logging ID=0a268ce4-e4e0-4641-bd8f-855290a8d408 </div> </div> </div> <footer class=“page-footer”> <div class=“container-fluid”> <div class=“page-footerflex-row”> <div class=“page-footerfooter-id-placeholder” id=“footer”></div> <div class=“page-footerlinks rest_api hidden-xs”><a href=“api/”>REST API</a></div> <div class=“page-footerlinks page-footerlinks–white jenkins_ver”><a rel=“noopener noreferrer” href=“https://www.jenkins.io/” target=“_blank”>Jenkins 2.319.3</a></div> </div> </div> </footer> <script async=“true” src=“/static/35f0fb8a/scripts/svgxuse.min.js” type=“text/javascript”></script></body>
    </html>