在Jenkins pipeline的groovy脚本中可以实现很多复杂灵活的功能,但是:
1 一来对java、groovy不是很熟,也不知道能不能引入一些三方库?比如搞个jdbc操作下mysql什么的。
2 二是自己对go和python比较熟悉,所以想能够更加灵活的实现更多的功能:
比如:

  • 操作数据库,无需依赖构建宿主机必须有数据库client来靠shell操作数据库。
  • 操作gitlab,比如参数化构建,传递进来的各仓库的tag参数,需要先将tag在gitlab中对应起来一一先打tag,然后再拉取新打的tag的代码去构建。这需要调gitlab的rest API接口。
  • 还有一些比如发邮件,钉钉,企业微信 等告警通知时,虽然都有插件,但插件太多还是比较烦,特别如果需要依赖插件里面的各种自带的环境变量时,很乱,不好维护。而如果是维护一些编程语言写的代码,感觉会好维护很多。
  • 其他各种在pipeline中难以实现的功能,都可以轻松实现。。。

python:

  1. 那么,如果用python,想想挺简单的,直接把python脚本放在源代码仓库或者自己建一个专门放python脚本的仓库。因为一般的构建过程都会先checkout scm,而linux系统自带python,所以在pipeline中想用python脚本时,直接调用需要的python文件即可。
  2. 调用python脚本时如何传递参数?
    可以直接在调用python脚本时将参数传递进去;如果参数比较复杂,可以传json对象,先在groovy中序列化,然后在python中反序列化即可。

go:

  1. go语言可以编译成二进制文件直接执行,所以如果需要第三方库会很方便,在开发时就可以引入第三方库,而无需考虑环境。
  2. 最好是将所有的go语言脚本源码文件和其二进制文件单独放在另外一个代码库,在pipeline中需要时,直接checkout 该仓库,然后给go二进制脚本加权限执行。
  3. 参数传递还是可以传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"`
}