Estou usando o Jenkins 2 para compilar projetos Java, quero ler a versão de um pom.xml, estava seguindo este exemplo:
https://github.com/jenkinsci/pipeline-plugin/blob/master/TUTORIAL.md
O exemplo sugere:
Parece que há algum problema de segurança ao acessar o sistema de arquivos, mas não consigo descobrir o que está causando (ou por que) esse problema:
Estou apenas fazendo um pouco diferente do exemplo:
def version() {
String path = pwd();
def matcher = readFile("${path}/pom.xml") =~ '<version>(.+)</version>'
return matcher ? matcher[0][1] : null
}
O erro que estou obtendo ao executar o método 'version':
org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts not permitted to use method groovy.lang.GroovyObject invokeMethod java.lang.String java.lang.Object (org.codehaus.groovy.runtime.GStringImpl call org.codehaus.groovy.runtime.GStringImpl)
at org.jenkinsci.plugins.scriptsecurity.sandbox.whitelists.StaticWhitelist.rejectMethod(StaticWhitelist.java:165)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onMethodCall(SandboxInterceptor.java:117)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onMethodCall(SandboxInterceptor.java:103)
at org.kohsuke.groovy.sandbox.impl.Checker$1.call(Checker.java:149)
at org.kohsuke.groovy.sandbox.impl.Checker.checkedCall(Checker.java:146)
at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.methodCall(SandboxInvoker.java:15)
at WorkflowScript.run(WorkflowScript:71)
at ___cps.transform___(Native Method)
at com.cloudbees.groovy.cps.impl.ContinuationGroup.methodCall(ContinuationGroup.java:55)
at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.dispatchOrArg(FunctionCallBlock.java:106)
at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.fixArg(FunctionCallBlock.java:79)
at sun.reflect.GeneratedMethodAccessor408.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72)
at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.dispatchOrArg(FunctionCallBlock.java:100)
at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.fixArg(FunctionCallBlock.java:79)
at sun.reflect.GeneratedMethodAccessor408.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72)
at com.cloudbees.groovy.cps.impl.ContinuationGroup.methodCall(ContinuationGroup.java:57)
at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.dispatchOrArg(FunctionCallBlock.java:106)
at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.fixArg(FunctionCallBlock.java:79)
at sun.reflect.GeneratedMethodAccessor408.invoke(Unknown Source)
Estou usando estas versões: Plugin Pipeline 2.1 Jenkins 2.2
maven
jenkins
continuous-integration
jenkins-pipeline
Daniel Hernández
fonte
fonte
Scripts not permitted to use method
, mas aconteceu porque escrevi emscm 'checkout'
vez decheckou scm
. Caso alguém caia nisso, preste atenção à sintaxe errada :). Fazer o que Maarten Kieft disse me permitiu ver uma mensagem de erro mais clara sobre o comando incorreto :)Respostas:
Conserto rápido
Eu tive um problema semelhante e resolvi fazendo o seguinte
Alternativa 1: Desativar sandbox
Como este artigo explica em detalhes, os scripts bacanas são executados no modo sandbox por padrão. Isso significa que um subconjunto de métodos interessantes pode ser executado sem a aprovação do administrador. Também é possível executar scripts fora do modo sandbox, o que implica que todo o script precisa ser aprovado por um administrador de uma vez. Isso evita que os usuários aprovem cada linha no momento.
A execução de scripts sem sandbox pode ser feita desmarcando esta caixa de seleção na configuração do projeto logo abaixo do script:
Alternativa 2: Desative a segurança do script
Como este artigo explica, também é possível desabilitar completamente a segurança do script. Primeiro instale o plug - in de segurança de script permissivo e depois altere seu arquivo jenkins.xml, adicione este argumento:
Então seu jenkins.xml será parecido com isto:
Certifique-se de saber o que está fazendo se implementar isso!
fonte
@NonCPS
para oMatcher
uso seria suficiente. Não há necessidade, neste caso, de desativar a segurança de todo o pipeline e, especialmente, de toda a instalação do Jenkins. Avalie cada chamada bloqueada individualmente e decida se você realmente precisa aprová-las.@NonCPS
não ajuda.Matcher
propriamente dito, poisMatcher
não implementa aSerializable
interface. Pode valer a pena fazer uma nova pergunta. Desejo que a documentação referenciada na pergunta original seja mantida e não esteja errada para começar.NonCPS
uma função que usacurrentBuild.rawBuild.getCause(Cause.UserIdCause).getUserId()
. O NonCPS não ajuda em nada com os problemas de segurança, pelo que li.Você tem que desabilitar a sandbox para Groovy em sua configuração de trabalho.
Atualmente, isso não é possível para projetos multibrânquicos em que o script bacana vem do scm. Para obter mais informações, consulte https://issues.jenkins-ci.org/browse/JENKINS-28178
fonte
Eu encontrei isso quando reduzi o número de parâmetros de entrada do usuário em userInput de 3 para 1. Isso mudou o tipo de saída variável de userInput de um array para um primitivo.
Exemplo:
para:
fonte
org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts not permitted to use method groovy.lang.GroovyObject invokeMethod java.lang.String java.lang.Object
. O método esperava 2 parâmetros e estava recebendo 3.Para contornar a sandbox de scripts Groovy armazenados no SCM, recomendo executar o script como Comando Groovy (em vez de arquivo de Script Groovy ):
nesse caso, o script bacana é transferido da área de trabalho para o Jenkins Master, onde pode ser executado como um
system Groovy Script
. O sandboxing é suprimido enquanto a opção Usar Groovy Sandbox não estiver marcada .fonte