使用Jenkinsfile运行salt命令的最佳方法



我最近开始使用Jenkinsfile和管道插件,我想知道当测试通过或当我们合并pull请求时,要求我的salt主服务器运行命令的最佳方式是什么。

有这个jenkinsci/saltstack-plugin工作得很好(不处理彩色输出,但没关系)。


  1. Jenkinsfile中运行salt步骤会更好吗?b. 与上述插件交互的语法是什么?

  2. 或者我应该设置我的Salt master(它在不同的服务器上)作为jenkins slave节点并直接在Salt master上执行命令吗?

草案:

node("salt-master") {
    sh "salt -E 'some.target.*' state.sls some.state"
}

我认为选项2会工作,但我还没有设置主作为e詹金斯的奴隶。

这是对旧帖子的更新,但如果它对任何人有所帮助,在jenkins wiki上给出了saltplugin作为JenkinsFile中的步骤的语法:https://wiki.jenkins-ci.org/display/JENKINS/saltstack-plugin

下面的代码将给你prettyprint json输出

import groovy.json.*
node() {
  saltresult = salt authtype: 'pam', clientInterface: local(arguments: '"ls -la"', blockbuild: true,
function: 'cmd.run', jobPollTime: 16, target: '*', targetType: 'glob'),
credentialsId: 'a3d814c2-84ed-4752-94a8-271791bb5375', servername: 'http://localhost:8000'
  def prettyJson = JsonOutput.prettyPrint(saltresult)
  println(prettyJson)
}

使用jenkins插件的一个好处是你可以访问其他的salt-api端点,比如hook。我们有我们的詹金斯服务器在内部网络,这是无法到达互联网,但我们的盐大师是在另一个网络,并能够得到。在我们的JenkinsFiles中,我们可以发送一个salt钩子调用,它会触发saltmaster上的一个反应器,从而向Slack或MS Teams发送通知。因此,我们的jenkins服务器能够将构建状态发布到互联网服务,而无需自己能够访问互联网。

JenkinsSaltStack都是我们CI/CD过程的核心。Jenkins负责工件(deb s, rpm s, Docker映像,静态文件等),而SaltStack在集群中执行工件的部署。Jenkins集群和SaltMaster集群位于不同主机上。

不幸的是,我既不知道Jenkinsfile(我们现在一定要使用Jenkins 1.x),也不知道把SaltMaster变成Jenkins奴隶的选项。目前,我们的CD由几十个不同的Jenkins作业组成(由我们后端中的许多微服务组成),这些作业由相应的上游构建作业触发。每个部署作业都有一个saltstack-plugin步骤。

SaltMaster在不同的端口SaltApi上提供了一个入口点。也许我们的/etc/salt/master的某些部分可能是有用的:

external_auth:
  pam:
    jenkins:
    - .*
rest_cherrypy:
  port: 8001
  host: 0.0.0.0

因此,在我们的示例中,Jenkins通过SaltAPISaltMaster进行身份验证,并在集群中启动公共盐rpc。没有管道,因为我们的项目太复杂,管道不适合。

相关内容

  • 没有找到相关文章

最新更新