我正在尝试通过 groovy 脚本 (
${JENKINS_URL}/administrativeMonitor/AsyncResourceDisposer
) 从 Jenkins AsyncResourceDisposer (${JENKINS_URL}/script
) 中删除(停止跟踪)trackig 项目。
// 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}"
(先登录),则单击使用帖子重试后可以删除该项目(如下所示)
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管理员授权)?
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 )
}