我最近开始使用Jenkinsfile
和管道插件,我想知道当测试通过或当我们合并pull请求时,要求我的salt主服务器运行命令的最佳方式是什么。
有这个jenkinsci/saltstack-plugin工作得很好(不处理彩色输出,但没关系)。
-
。
在Jenkinsfile
中运行salt步骤会更好吗?b. 与上述插件交互的语法是什么? -
或者我应该设置我的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服务器能够将构建状态发布到互联网服务,而无需自己能够访问互联网。
Jenkins
和SaltStack
都是我们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
通过SaltAPI
对SaltMaster
进行身份验证,并在集群中启动公共盐rpc。没有管道,因为我们的项目太复杂,管道不适合。