如何在`AsyncResourceDisposer.doStopTracking()`中使用`StaplerResponse rsp`

问题描述 投票:0回答:2

我正在尝试通过 groovy 脚本 (

${JENKINS_URL}/administrativeMonitor/AsyncResourceDisposer
) 从 Jenkins AsyncResourceDisposer (
${JENKINS_URL}/script
) 中删除(停止跟踪)trackig 项目。

根据Javadoc源代码

// Javadoc
@Restricted(value=org.kohsuke.accmod.restrictions.DoNotUse.class)
public org.kohsuke.stapler.HttpResponse doStopTracking(@QueryParameter
  int id,
  org.kohsuke.stapler.StaplerResponse rsp
)

// source code
@Restricted(DoNotUse.class)
@RequirePOST
public HttpResponse doStopTracking(@QueryParameter int id, StaplerResponse rsp) {
...
}

我想知道如何在

org.kohsuke.stapler.StaplerResponse rsp
中添加
doStopTracking(int id, org.kohsuke.stapler.StaplerResponse rsp)
:

import org.jenkinsci.plugins.resourcedisposer.AsyncResourceDisposer

AsyncResourceDisposer disposer = AsyncResourceDisposer.get()
disposer.backlog.each {
  disposer.doStopTracking( it.id, <what should I put here> )
}

目前我可以获取项目ID,以及其他信息,如下所示:

import org.jenkinsci.plugins.resourcedisposer.AsyncResourceDisposer

AsyncResourceDisposer disposer = AsyncResourceDisposer.get()
String url = Jenkins.instance.rootUrl + disposer.url

disposer.getBacklog().each { item ->
  println "\n${item.id} : \t${url}/stopTracking/?id=${item.id} : \t${item.class.simpleName} : \n" +
          "\t${item.getLastState().getDisplayName()} : \n" + 
          "\t${item.getDisposable().node} : ${item.getDisposable().path}\n" +
          "\t${item.toString()}"
}

如果我在浏览器中访问网址

"${url}/stopTracking/?id=${item.id}"
(先登录),则单击使用帖子重试后可以删除该项目(如下所示)

jenkins groovy jenkins-plugins jenkins-groovy
2个回答
1
投票
所以...我正在使用API调用

curl -H <crumbIssues> -X POST <url>

通过传递
disposer.doStopTracking(int, org.kohsuke.stapler.StaplerResponse)
仍然真的想知道如何使用它

在运行以下脚本之前,需要安装和配置

Strict Crumb Issuers Plugin(或设置-Dhudson.security.csrf.DefaultCrumbIssuer.EXCLUDE_SESSION_ID=true

),因为
SECURITY-626:改进了CSRF保护,因为:

使用 /crumbIssuer/api URL 获取 crumb 现在将无法执行受 CSRF 保护的操作,除非脚本在后续请求中保留 Web 会话 ID。

详情如下:

import org.jenkinsci.plugins.resourcedisposer.AsyncResourceDisposer import org.jenkinsci.plugins.strictcrumbissuer.StrictCrumbIssuer AsyncResourceDisposer disposer = AsyncResourceDisposer.get() StrictCrumbIssuer issuer = jenkins.model.Jenkins.instance.crumbIssuer String jenkinsCrumb = "${issuer.crumbRequestField}:${issuer.crumb}" String url = Jenkins.instance.rootUrl + disposer.url disposer.getBacklog().each { item -> println "\n ~~> removeing ${item.id} : " [ 'bash', '-c', 'curl -s ' + '-u <user>:<token> ' + '-X POST ' + "-H \"Content-Type: application/json\" " + "-H \"Accept: application/json\" " + "-H \"${jenkinsCrumb}\" " + "${url}/stopTracking/?id=${item.id} " ].execute().with{ def stdout = new StringBuffer() def stderr = new StringBuffer() it.waitForProcessOutput( stdout, stderr ) println "EXIT CODE: ${it.exitValue()}" println "ERROR: ${stderr}" println "OUTPUT: ${stdout}" } }
尽管如此,我仍然有一个问题......我们知道,如果groovy脚本在

${JENKINS_URL}/script

中运行,这意味着“运行者”是管理员,那么,我如何删除特定用户授权
'-u <user>:<token>'
(通过在curl中使用jenkins管理员授权)?


0
投票
有同样的问题来清理卡在那里的消耗内存的资源。这是清除所有 groovy 的解决方案:

import org.jenkinsci.plugins.resourcedisposer.AsyncResourceDisposer import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.Stapler AsyncResourceDisposer disposer = AsyncResourceDisposer.get() backlog = disposer.getBacklog() stap = Stapler resp = stap.getCurrentResponse() for (item in disposer.backlog) { disposer.doStopTracking( item.id, resp ) }
    
© www.soinside.com 2019 - 2024. All rights reserved.