【问题标题】:Saltstack Result Fails but Jenkins Finished: SUCCESSSaltstack 结果失败但 Jenkins 完成:成功
【发布时间】:2018-09-13 07:34:44
【问题描述】:

我尝试使用 Jenkins 调用以下 salt 脚本:

   create_script:
    file.managed:
    - name: /tmp/broc/import_props.sh
    - source: salt://projects/broc/jboss/files/import.sh.jinja
    - template: jinja

Import_properties:
cmd.script:
- name: /tmp/broc/import.sh
- cwd: /tmp/broc`

Jenkins 控制台输出为:

`ID: create_script
Function: file.managed
Name: /tmp/broc/import.sh
  Result: True
 Comment: File /tmp/broc/import.sh updated
 Started: 11:31:13.736928
Duration: 166.319 ms
 Changes:   
          ----------
          diff:
              New file
          mode:
              0644

      ID: Import_properties
 Function: cmd.script
    Name: /tmp/broc/import.sh
  Result: False
 Comment: Command '/tmp/broc/import.sh' run
 Started: 11:31:13.903378
 Duration: 399.825 ms
 Changes:   
          ----------
          pid:
              8292
          retcode:
              1`   

Jenkins 构建完成成功:

`Succeeded: 21 (changed=22)
Failed:     1

Total states run:     22
Total run time:   30.338 s"}}]
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS`

我的问题是 saltstack 作业 ID Import_properties 结果为 False。所以 Jenkins 构建也应该以失败告终。在上述情况下,saltstack 结果被忽略并构建完成 SUCCESS。有没有办法根据 saltstack Result 使 jenkins 构建失败?

我看到下面的 Jenkins 管道: `试试{ saltCmd = "\"salt -E \"($target)\" \ state.apply projects.alip.process-server \ 支柱=\'{\"region\":\"${Region}\",\"siteid\":\"${SiteID}\",\"dbuser\":\"${DBUSER}\", \"dbpass\":\"${DBPASS}\"}\'\""

        result = salt authtype: 'pam', 
            clientInterface: local(
                arguments: saltCmd, 
                blockbuild: true, 
                function: 'cmd.run', 
                target: "$my_salttarget",
                saveFile: true,
                targettype: 'glob'),
            credentialsId: "$my_saltcred", 
            servername: "$my_saltserver"
        }
    }catch(e){
        result = e.toString()
        currentBuild.result = 'FAILURE'
    }finally{
        echo result.replace("\\n",'\n')
    }
}`

我是 Jenkins 管道脚本的新手,您能否帮助建议输入以在 finally 下添加构建后步骤以解析 Jenkins 控制台输出,识别字符串,如果匹配则标记构建失败。这类似于文本查找器插件,只是我们编写了一个管道脚本。

【问题讨论】:

  • 你能用 h-l debug 在 salt 中运行,看看它为什么会失败吗?
  • salt 失败是由于 import.sh 上的文件权限,更正权限并重新运行作业可以解决问题。但问题是詹金斯在盐结果为假后未能完成构建为失败。当盐结果在任何工作中失败时,詹金斯应该以失败结束。
  • 您没有展示如何从 Jenkins 管道调用 salt。
  • Jenkins 调用在 Git 存储库上提交的 saltstack 管道脚本。我们可以使用 try catch 添加任何管道阶段吗?

标签: jenkins jenkins-pipeline salt-stack


【解决方案1】:

即使你的状态失败了,Jenkins 相信它调用的 salt 命令仍然运行成功。

Jenkins 无法检测到 salt 本身的错误。 它只能判断 salt 是否运行成功。

这与运行 salt 命令行时相同。即使状态失败,shell 命令 salt 仍然返回 0。

【讨论】:

    【解决方案2】:

    您的问题是(正如其他人所说)由于詹金斯使用盐命令本身的返回码而不是您应用的状态所采取的操作的返回码。

    我这里的 2 美分是

    --retcode-passthrough

    您可以将选项传递给您的 salt 命令。

    此选项允许 salt 命令返回码与状态所采取的操作相匹配。

    简单地说,如果某个状态出现任何故障,那么 salt 命令将返回一个故障返回码。

    官方文档here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-21
      • 1970-01-01
      • 1970-01-01
      • 2014-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多