我正在尝试建立一个jenkins管道,以进行一些持续的集成和自动部署。 由于我使用的是Gitea,因此我已经安装了gitea插件并将其配置为执行我的jenkins文件管道。 到目前为止,一切都很好。
我设法编写了一些“有用”的东西,但是代码太可怕了,我不得不大量使用全局变量和其他“坏”东西。
因此,我认为应该重写管道,但是使用类来保持事物整洁是一个好主意,但是我最终遇到了一个又一个问题! 问题是我不习惯在Groovy中进行编码,而我目前正在发现Jenkins。
首先,我不知道在哪里声明该类,所以我只是将其放在管道之外。
pipeline {
agent any
stages {
stage('blabla') {
steps {
script {
def var = new MyClass()
}
}
}
}
}
class MyClass {
/* Some propeties, methods ... */
}
这是最重要的地方吗?还是其他任何地方?
第二,当像我之前的示例中那样声明类时,如果我在类方法中使用“ echo”或“ println”,则安全插件/ jenkins沙箱将停止我的管道。
pipeline {
agent any
stages {
stage('blabla') {
steps {
script {
def var = new MyClass()
}
}
}
}
}
class MyClass {
def MyClass()
{
echo "This echo will make my pipeline fail"
}
}
给我
不允许脚本使用groovy.lang.GroovyObject方法 invokeMethod java.lang.String java.lang.Object(MyClass echo java.lang.String)。管理员可以决定是否批准或 拒绝此签名。
我不明白为什么我不能调用su一个基本函数,我猜这是范围问题(因为类声明在“ pipeline”块之外),但是我没有找到一种方法使它工作干净。 我不喜欢通过Jenkins批准此安全异常,也不喜欢禁用Jenkins沙箱。 为什么我不能使用简单的“回声”?关于“ println”是一样的事情...
最后,看来我无法调用在同一级别声明的我自己的函数...
pipeline {
agent any
stages {
stage('blabla') {
steps {
script {
MyFunc() // This work
def var = new MyClass()
}
}
}
}
}
def MyFunc()
{
return sh(returnStdout: true, script: 'ls -lsa')
}
class MyClass {
def MyClass()
{
MyFunc() // This doesn't work ...
}
}
不允许脚本使用groovy.lang.GroovyObject方法 invokeMethod java.lang.String java.lang.Object(MyClass MyFunc)。 管理员可以决定是批准还是拒绝此签名。
该死的?我严重缺失的内容使我什至无法在管道中使用基本功能或我自己的功能?
答案 0 :(得分:0)
您应该使用Jenkins共享库并将类放在此处。
在以下位置查看有关如何使用它的更多信息:https://jenkins.io/doc/book/pipeline/shared-libraries/
答案 1 :(得分:0)
该错误消息极具误导性。
当您收到一个专门针对groovy.lang.GroovyObject invokeMethod
的“不允许使用脚本”错误时,这并不意味着它的含义。 (除非您实际上是真正地使用invokeMethod,因为您想做一些奇怪的动态方法调用之类的事情)
几乎总是,当您看到此错误时,这意味着您试图在不具有该方法的类上调用该方法。在这里,错误应该真正告诉您“ MyClass
没有称为MyFunc
的方法”,但是安全系统挡住了路并抛出了您收到的错误。
此处涵盖了“如何从Groovy定义的类内部调用顶级函数”的一般问题:Call top level function from groovy method
简短版本:是的,您应该将函数放在共享库中,但是安全错误只是一个红色的鲱鱼。
(注意:如果您收到关于groovy.lang.GroovyObject invokeMethod
的“ 不允许”错误,这是一个诚实的权限错误,您可能需要管理员您的Jenkins实例批准您的脚本或一揽子批准所讨论的方法)