我正试图找到一种让jenkins允许用户保留代理供私人使用的方法。这与禁用代理不同,因为用户保留它可能仍然希望在其上运行jenkins作业。一个简单的用例是代理在运行作业时遇到问题,因此当有人调查出错时,它会进入这个保留状态。
我尝试过使用所有权插件的一个相当hacky的解决方案,如果代理由一个名为“free”的虚拟用户拥有或者由该作业的提交者拥有,则该作业将运行,否则它将失败。
我所拥有的解决方案的问题是:
另一个解决方案是有一个标签“免费”,有人需要更改,当他们想要保留它像“reserved-bob”之类的东西,然后让所有的工作都采取额外的标签参数,默认为“免费” ”。这个问题是:
但它确实具有以下优势:知道该标签的任何人都可以运行工作,因此可以由团队保留。
有什么想法吗?
答案 0 :(得分:0)
因此,通过一些游戏,我最终创建了2个作业,一个将保留一个代理,另一个将释放一个代理。它的工作原理是代理商拥有一个标签用户:每个人都可以使用它。保留它时,它会将标签更改为user:并添加用户的电子邮件地址(下一步是创建一个工作,提醒人们是否保留了某些内容)。
预订代理的代码是:
pipeline{
agent {
label "$SELECTION_CRITERIA && user:everyone"
}
stages {
stage ( "Run"){
steps {
wrap([$class: 'BuildUser']) {
script{
for (node in jenkins.model.Jenkins.instance.nodes) {
if ( node.getNodeName() == "$NODE_NAME" ) {
oldLabelString = node.getLabelString()
if ( oldLabelString.contains("user:everyone") ) {
oldLabelString = oldLabelString.replace("user:everyone","user:$NEWUSER")
oldLabelString += " user-email:$BUILD_USER_EMAIL"
node.setLabelString(oldLabelString)
node.save()
}
}
}
}
}
}
}
}
}
然后将其释放回来的代码是:
pipeline{
agent {
label "user:$OLDUSER"
}
stages {
stage ( "Run"){
steps {
wrap([$class: 'BuildUser']) {
script{
for (node in jenkins.model.Jenkins.instance.nodes) {
if ( node.getNodeName() == "$NODE_NAME" ) {
oldLabelString = node.getLabelString()
if ( oldLabelString.contains("user:$OLDUSER") ) {
oldLabelString = oldLabelString.replace("user:$OLDUSER","user:everyone")
oldLabelString = oldLabelString.replaceAll(/ user-email:\S*/, "")
node.setLabelString(oldLabelString)
node.save()
}
}
}
}
}
}
}
}
}
我对此比较陌生,所以我的猜测是你可以用更好的方式做到这一点(比如不循环遍历所有节点)。
这消除了用户意外弄乱标签的问题。如果代理人已被保留,仍然会很明显。