【问题标题】:Execute a script from jenkins pipeline从詹金斯管道执行脚本
【发布时间】:2016-08-14 18:42:14
【问题描述】:

我有一个构建 java 工件的 jenkins 管道, 将其复制到目录,然后尝试执行外部脚本。

我在管道脚本中使用此语法来执行外部脚本

dir('/opt/script-directory') {
    sh './run.sh'
}

脚本只是一个简单的docker build脚本,但是build会失败 除了这个例外:

java.io.IOException: Failed to mkdirs: /opt/script-directory@tmp/durable-ae56483c

该错误令人困惑,因为该脚本没有创建任何目录。它只是构建一个 docker 镜像并将新构建的 java 工件放置在该镜像中。

如果我在 jenkins 中创建一个执行外部脚本的不同作业 它是唯一的构建步骤,然后使用以下语法从我的管道脚本中调用该作业:

build 'docker test build'

一切正常,脚本在其他作业和管道中执行 按预期继续。

这是执行工作区外部脚本的唯一方法吗?

我尝试从内部执行脚本时做错了什么 管道脚本?

【问题讨论】:

  • dir('/tmp') { sh '/opt/script-directory/run.sh' } --- 这行得通吗?
  • 不是脚本创建文件。 (我猜)Jenkins在这里存储恢复信息
  • 是的,我完全不确定它在做什么。我将脚本更改为简单地回显,但失败并出现相同的错误。
  • 附带说明,您是否尝试过“管道速度/耐用性覆盖”-->“性能优化”。据我了解,此模式不应将任何信息存储到磁盘,因此可以作为一种解决方法。
  • 这是一个docker build 脚本,仅仅授予 Jenkins 用户对脚本文件的读取和执行权限是不够的:用户还必须添加到 docker 组,因为 root/sudo需要运行docker build 脚本。如果没有添加用户,那么如果两个用户具有相同的 ID(这通常用于向内部 docker 容器用户授予对主机路径的访问权限),那么构建可能仍然纯粹是偶然的。

标签: jenkins jenkins-pipeline


【解决方案1】:

问题是 jenkins 用户(或运行 Jenkins 从属进程的任何用户)没有对 /opt 的写入权限,并且 sh 步骤想要在那里创建 script-directory@tmp/durable-ae56483c 子目录。

要么删除dir 块并使用脚本的绝对路径:

sh '/opt/script-directory/run.sh'

或授予 jenkins 用户对文件夹 /opt 的写入权限(出于安全原因不推荐)

【讨论】:

    【解决方案2】:

    看起来像 Jenkins 中的一个错误,durable 目录用于存储恢复信息,例如在使用sh 执行外部脚本之前。 现在你能做的就是确保 /opt/script-directory 为 jenkins 用户设置了 +r +w+x

    另一种解决方法是不更改当前目录,只需执行 sh 即可:

    sh '/opt/script-directory/run.sh'
    

    【讨论】:

      【解决方案3】:

      在尝试使用 Jenkinsfile 在 Jenkins 管道中执行脚本时,我也有类似的担忧。

      我试图用sudo 运行脚本restart_rb.sh

      为了运行它,我指定了当前的工作目录 ($PWD):

      sh 'sudo sh $PWD/restart_rb.sh'
      

      就是这样

      【讨论】:

        最近更新 更多