如何保留jenkins代理供私人使用

时间:2017-04-28 20:46:42

标签: jenkins jenkins-pipeline

我正试图找到一种让jenkins允许用户保留代理供私人使用的方法。这与禁用代理不同,因为用户保留它可能仍然希望在其上运行jenkins作业。一个简单的用例是代理在运行作业时遇到问题,因此当有人调查出错时,它会进入这个保留状态。

我尝试过使用所有权插件的一个相当hacky的解决方案,如果代理由一个名为“free”的虚拟用户拥有或者由该作业的提交者拥有,则该作业将运行,否则它将失败。

我所拥有的解决方案的问题是:

  • 除非您转到某个节点,否则您无法看到所有者是谁。
  • 它真的需要一种方法来避免尝试在代理上运行作业而不是失败,如果碰巧选择了一个已保留的作业。

另一个解决方案是有一个标签“免费”,有人需要更改,当他们想要保留它像“reserved-bob”之类的东西,然后让所有的工作都采取额外的标签参数,默认为“免费” ”。这个问题是:

  • 很容易出错,在保留代理商时不设置免费标签,或在添加保留标签时将其保留。
  • 不容易找到非空闲的节点集

但它确实具有以下优势:知道该标签的任何人都可以运行工作,因此可以由团队保留。

有什么想法吗?

1 个答案:

答案 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()
                                }
                            }
                        }                        
                    }
                }
            }
        }
    }
}    

我对此比较陌生,所以我的猜测是你可以用更好的方式做到这一点(比如不循环遍历所有节点)。

这消除了用户意外弄乱标签的问题。如果代理人已被保留,仍然会很明显。