Saltstack结果失败,但Jenkins完成了:成功

时间:2018-09-13 07:34:44

标签: jenkins jenkins-pipeline salt-stack

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

   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`

我的问题是一个盐堆作业ID Import_properties,结果为False。因此,Jenkins构建也应该以失败告终。在上述情况下,saltstack结果将被忽略并建立成功的SUCCESS。有没有一种方法可以根据saltstack结果使詹金斯构建失败?

我看到了下面的詹金斯管道: `尝试{     saltCmd =“ \”盐-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管道脚本的新手,您可以帮忙建议一些输入,以便最终在Jenkins控制台输出下添加后期构建步骤,以解析Jenkins控制台输出,识别字符串,如果匹配则标记构建失败。这类似于文本查找器插件,只不过我们编写了管道脚本。

2 个答案:

答案 0 :(得分:0)

即使您的状态失败,詹金斯也认为它引发的盐命令仍然可以成功执行。

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

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

答案 1 :(得分:0)

您的问题是(如其他人所说)归因于詹金斯使用了返回代码(如果salt命令本身),而不是您所应用的状态采取的操作的返回代码。

我这里的2美分是

--retcode-passthrough

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

此选项允许salt命令返回代码与国家采取的行动相匹配。

简而言之,如果任何状态失败,那么salt命令将返回失败返回码。

官方文档here