在Jenkins pipeline的groovy脚本中可以实现很多复杂灵活的功能,但是:
1 一来对java、groovy不是很熟,也不知道能不能引入一些三方库?比如搞个jdbc操作下mysql什么的。
2 二是自己对go和python比较熟悉,所以想能够更加灵活的实现更多的功能:
比如:
- 操作数据库,无需依赖构建宿主机必须有数据库client来靠shell操作数据库。
- 操作gitlab,比如参数化构建,传递进来的各仓库的tag参数,需要先将tag在gitlab中对应起来一一先打tag,然后再拉取新打的tag的代码去构建。这需要调gitlab的rest API接口。
- 还有一些比如发邮件,钉钉,企业微信 等告警通知时,虽然都有插件,但插件太多还是比较烦,特别如果需要依赖插件里面的各种自带的环境变量时,很乱,不好维护。而如果是维护一些编程语言写的代码,感觉会好维护很多。
- 其他各种在pipeline中难以实现的功能,都可以轻松实现。。。
python:
- 那么,如果用python,想想挺简单的,直接把python脚本放在源代码仓库或者自己建一个专门放python脚本的仓库。因为一般的构建过程都会先checkout scm,而linux系统自带python,所以在pipeline中想用python脚本时,直接调用需要的python文件即可。
- 调用python脚本时如何传递参数?
可以直接在调用python脚本时将参数传递进去;如果参数比较复杂,可以传json对象,先在groovy中序列化,然后在python中反序列化即可。go:
- go语言可以编译成二进制文件直接执行,所以如果需要第三方库会很方便,在开发时就可以引入第三方库,而无需考虑环境。
- 最好是将所有的go语言脚本源码文件和其二进制文件单独放在另外一个代码库,在pipeline中需要时,直接checkout 该仓库,然后给go二进制脚本加权限执行。
- 参数传递还是可以传json,序列化和反序列化。
示例:用go执行发送邮件和操作数据库
groovy脚本片段:
stage('send email to sendList and exec mysqlDB') {
checkout([$class: 'GitSCM', branches: [[name: '*/master']],
doGenerateSubmoduleConfigurations: false,
extensions: [],
submoduleCfg: [],
userRemoteConfigs: [[credentialsId: 'gitlabAdmin',
url: 'http://gitlab-ip/group/go-script.git']]])
def sendList = [
"XXXXXXXX@qq.com",
"XXXXXXXX@qq.com",
"XXXXXXXX@qq.com",
"XXXXXXXX@qq.com",
"XXXXXXXX@qq.com"
]
def goMail = [
user: "发送者邮箱地址",
secret: "发送者邮箱秘钥",
smtpHost: "smtp.qq.com",
sslPort: "465",
sendTo: sendList,
subject: "测试subject",
content: "测试content", // 这里自定义html,或者将html模板放在代码库中替换,
// 在go脚本中定义好相应的header就行了
]
def goMysql = [
DSN: "root:passwd@tcp(1.1.1.1:3306)/jenkins?charset=utf8",
sql: [
"update XXX set XX=XX where id=XX AND XX=XX",
"update XXX set XX=XX where id=XX AND XX=XX",
"update XXX set XX=XX where id=XX AND XX=XX",
"update XXX set XX=XX where id=XX AND XX=XX"
]
]
def scriptParams = [
GoMail: goMail,
GoMysql: goMysql
]
def output = JsonOutput.toJson(scriptParams)
try {
echo '执行go脚本,参数:'
println(output);
sh "chmod +x ./run && ./run -scriptParams \'${output}\'"
}
go语言脚本片段:
type GoMail struct {
User string `json:"user"`
Secret string `json:"secret"`
SmtpHost string `json:"smtpHost"`
SslPort string `json:"sslPort"`
SendTo []string `json:"sendTo"`
Subject string `json:"subject"`
Content string `json:"content"`
}
type GoMysql struct {
DSN string `json:"DSN"`
Sql []string `json:"sql"`
}
type ScriptParams struct {
GoMail GoMail `json:"GoMail"`
GoMysql GoMysql `json:"GoMysql"`
}
有疑问加站长微信联系(非本文作者)