首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jenkinsfile声明管道sh命令不能工作

Jenkinsfile声明管道sh命令不能工作
EN

Stack Overflow用户
提问于 2021-04-21 14:25:02
回答 1查看 1.5K关注 0票数 0

我想在Jenkins管道中完成这些步骤:

在构建器节点上构建一个RPM (用于install

  • etc.

)

  1. 从主节点创建一个新的proxmox容器(curl用于调用PVE )
  2. 将构建的RPM从构建器节点复制到容器节点以测试yum

来自终端或bash脚本的初始工作代码是:

代码语言:javascript
复制
// Retrieving the CT list in the VMID range 901 --> 999
VMID_LIST=$(curl --insecure --silent --cookie "$(<~/PVE_API/cookie)" -X GET https://my-proxmox:8006/api2/json/nodes/my-node/lxc | jq '.' | grep vmid | sort | cut -d'"' -f4 | grep "9[0-9][0-9]")

// Determine the first available integer
for i in $(seq 901 999)
do
    if ! echo "$VMID_LIST" | grep $i
    then
        CT_VMID=$i
        break
    fi
done

// Creating my proxmox container
curl command...

当我试图在某些步骤中执行sh/bash命令时,它多次失败.

我创建了一个小小的管道来解释我的错误。

代码语言:javascript
复制
pipeline {
  agent { label 'master' }
  stages {
    stage("Create container") {
      steps {
        script {
          SEQ = sh(returnStdout: true, script: 'seq 1 9').trim()
          sh "echo '${SEQ}'"
          CTID = sh(returnStdout: true, script: "for id in '${SEQ}'; do echo $id; done").trim()
          sh "echo '${CTID}'"
        }
      }
    }
  }
}

如果我使用三重双引号,结果是相同的:

代码语言:javascript
复制
pipeline {
  agent { label 'master' }
  stages {
    stage("Create container") {
      steps {
        script {
          SEQ = sh(returnStdout: true, script: 'seq 1 9').trim()
          sh "echo '${SEQ}'"
          sh """
          for id in '{$SEQ}'
          do
            echo $id
          done
          """
        }
      }
    }
  }
}

结果:

代码语言:javascript
复制
Running in Durability level: MAX_SURVIVABILITY
[Pipeline] Start of Pipeline
[Pipeline] node
Running on Jenkins in /home/jenkins/.jenkins/jobs/Services/jobs/hello_world/branches/my_branch-7.15773s/workspace
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Declarative: Checkout SCM)
[Pipeline] checkout
The recommended git tool is: git
[...snip...]
[Pipeline] }
[Pipeline] // stage
[Pipeline] withEnv
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Create container)
[Pipeline] script
[Pipeline] {
[Pipeline] sh
+ seq 1 9
[Pipeline] sh
+ echo '1
2
3
4
5
6
7
8
9'
1
2
3
4
5
6
7
8
9
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
groovy.lang.MissingPropertyException: No such property: id for class: groovy.lang.Binding
    at groovy.lang.Binding.getVariable(Binding.java:63)
    at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onGetProperty(SandboxInterceptor.java:270)
    at org.kohsuke.groovy.sandbox.impl.Checker$7.call(Checker.java:353)
    at org.kohsuke.groovy.sandbox.impl.Checker.checkedGetProperty(Checker.java:357)
    at org.kohsuke.groovy.sandbox.impl.Checker.checkedGetProperty(Checker.java:333)
    at org.kohsuke.groovy.sandbox.impl.Checker.checkedGetProperty(Checker.java:333)
    at org.kohsuke.groovy.sandbox.impl.Checker.checkedGetProperty(Checker.java:333)
    at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.getProperty(SandboxInvoker.java:29)
    at com.cloudbees.groovy.cps.impl.PropertyAccessBlock.rawGet(PropertyAccessBlock.java:20)
    at WorkflowScript.run(WorkflowScript:9)
    at ___cps.transform___(Native Method)
    at com.cloudbees.groovy.cps.impl.PropertyishBlock$ContinuationImpl.get(PropertyishBlock.java:74)
    at com.cloudbees.groovy.cps.LValueBlock$GetAdapter.receive(LValueBlock.java:30)
    at com.cloudbees.groovy.cps.impl.PropertyishBlock$ContinuationImpl.fixName(PropertyishBlock.java:66)
    at sun.reflect.GeneratedMethodAccessor336.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72)
    at com.cloudbees.groovy.cps.impl.ConstantBlock.eval(ConstantBlock.java:21)
    at com.cloudbees.groovy.cps.Next.step(Next.java:83)
    at com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:174)
    at com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:163)
    at org.codehaus.groovy.runtime.GroovyCategorySupport$ThreadCategoryInfo.use(GroovyCategorySupport.java:129)
    at org.codehaus.groovy.runtime.GroovyCategorySupport.use(GroovyCategorySupport.java:268)
    at com.cloudbees.groovy.cps.Continuable.run0(Continuable.java:163)
    at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.access$001(SandboxContinuable.java:18)
    at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.run0(SandboxContinuable.java:51)
    at org.jenkinsci.plugins.workflow.cps.CpsThread.runNextChunk(CpsThread.java:185)
    at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:400)
    at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$400(CpsThreadGroup.java:96)
    at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:312)
    at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:276)
    at org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.java:67)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.java:139)
    at jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28)
    at jenkins.security.ImpersonatingExecutorService$1.run(ImpersonatingExecutorService.java:68)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Finished: FAILURE

如何按预期在Jenkins步骤中运行sh/bash脚本?

在Jenkins管道中执行所有检查或linux本机命令的最佳实践是什么?

为什么Jenkins提供了一种使用sh/bash命令的方法,而不像预期的那么多?

詹金斯的专家们做的事情和我想做的相似吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-21 14:56:45

您需要将$id转义到\$id,否则Jenkins认为您正在尝试使用Groovy而不是\$id变量。

代码语言:javascript
复制
pipeline {
  agent { label 'master' }
  stages {
     stage("Create container") {
        steps {
        script {
           SEQ = sh(returnStdout: true, script: 'seq 1 9').trim()
           sh "echo '${SEQ}'"
           sh """
           for id in '{$SEQ}'
           do
              echo \$id
           done
           """
        }
        }
     }
  }
  }

会给你

代码语言:javascript
复制
  [Pipeline] {
  [Pipeline] stage
  [Pipeline] { (Create container)
  [Pipeline] script
  [Pipeline] {
  [Pipeline] sh
  + seq 1 9
  [Pipeline] sh
  + echo 1
  2
  3
  4
  5
  6
  7
  8
  9
  1
  2
  3
  4
  5
  6
  7
  8
  9
  [Pipeline] sh
  + echo {1 2 3 4 5 6 7 8 9}
  {1 2 3 4 5 6 7 8 9}
  [Pipeline] }
  [Pipeline] // script
  [Pipeline] }
  [Pipeline] // stage
  [Pipeline] }
  [Pipeline] // node
  [Pipeline] End of Pipeline

您可能遇到的另一个问题是,seq在它打印的每个数字之后都添加了一个换行符,所以for循环无法工作,因为它期望空格分隔的值,而不是新行,因此您的示例需要修复才能像您预期的那样工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67197830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档