第三方包:gojenkins
方法文档:gojenkins docs
实现起来很简单,利用第三方库,连接jenkins,调用相关方法,处理返回结果,返回数据至前端
下边贴一下核心代码
1 连接Jenkins
package connect
import (
"context"
"github.com/bndr/gojenkins"
"github.com/go-ini/ini"
"log"
"jenkins_service/utils"
)
func OpenJenkins() (Conn *gojenkins.Jenkins) {
cfg, err := ini.Load("./conf/jenkins.ini")
if err != nil {
code := utils.ERROR_JENKINS_CONNECTION_FAIL
log.Println(code)
panic(err)
}
// 读取配置文件
jenkinsUrl := cfg.Section("jenkins").Key("url").String()
jenkinsUser := cfg.Section("jenkins").Key("user").String()
jenkinsPass := cfg.Section("jenkins").Key("passwd").String()
// 连接jenkins
jenkinsConn := gojenkins.CreateJenkins(nil, jenkinsUrl, jenkinsUser, jenkinsPass)
ctx := context.Background()
_, err = jenkinsConn.Init(ctx)
if err != nil {
code := utils.ERROR_JENKINS_INIT_FAIL
log.Println(code, err)
} else {
code := utils.SUCCESS
log.Println(code)
}
return jenkinsConn
}
jenkins.ini
[http]
port = ":8890"
[jenkins]
url = "http://jenkins.rsq.com/"
user = "admin"
passwd = "123456"
2 controller
controller层主要实现了gin api的一些方法
package controller
import (
"github.com/Anderson-Lu/gofasion/gofasion"
"github.com/gin-gonic/gin"
"io/ioutil"
"net/http"
"jenkins_service/module"
"jenkins_service/utils"
)
func GetJobBuildStatus(c *gin.Context) {
app := utils.Gin{C: c}
dataByte, _ := ioutil.ReadAll(c.Request.Body)
gf := gofasion.NewFasion(string(dataByte))
// 解析前端json参数
jobName := gf.Get("jobName").ValueStr()
parentIDs := gf.Get("parentIDs").ValueStr()
err, result := module.GetJenkinsBuildStatus(jobName, parentIDs)
if err != nil {
app.Response(http.StatusInternalServerError, utils.ERROR_GET_JENKINS_JOB_STATUS, nil)
return
}
app.Response(http.StatusOK, utils.SUCCESS, result)
}
func GetJobBuildLogs(c *gin.Context) {
app := utils.Gin{C: c}
dataByte, _ := ioutil.ReadAll(c.Request.Body)
gf := gofasion.NewFasion(string(dataByte))
// 解析前端json参数
jobName := gf.Get("jobName").ValueStr()
parentIDs := gf.Get("parentIDs").ValueStr()
err, result := module.GetJenkinsBuildLogs(jobName, parentIDs)
if err != nil {
app.Response(http.StatusInternalServerError, utils.ERROR_GET_JENKINS_JOB_LOGS, nil)
return
}
app.Response(http.StatusOK, utils.SUCCESS, result)
}
3 module
module层实现了具体连接jenkins后的一些方法,如获取Job Build状态、日志。
package module
import (
"context"
"log"
"simone_service/connect"
)
// 获取jenkins job build状态
func GetJenkinsBuildStatus(jobName string, parentIDs string) (error, string) {
var status string
ctx := context.Background()
jenkinsConn := connect.OpenJenkins()
// 判断JobName和目录都不为空执行如下流程
if parentIDs != "" && jobName != "" {
build, err := jenkinsConn.GetJob(ctx, jobName, parentIDs)
if err != nil {
return err, "JOB NOT EXIST"
} else {
info, _ := build.GetLastBuild(ctx)
status = info.GetResult()
if status != "" {
return nil, status
}
return nil, "RUNNING"
}
} else { // 否则走如下流程
build, err := jenkinsConn.GetJob(ctx, jobName)
log.Println("GetJenkinsBuildStatus err =========>", err)
if err != nil {
return err, "JOB NOT EXIST"
} else {
// 获取最新的build
info, err := build.GetLastBuild(ctx)
if err != nil {
return err, "JOB NOT EXIST"
}
// 获取最新build的状态
status = info.GetResult()
if status != "" {
return nil, status
}
// 这里做了处理,当Job正在运行时,status会返回空值,这里直接返回RUNNING状态
return nil, "RUNNING"
}
}
}
// 获取jenkins job build日志
func GetJenkinsBuildLogs(jobName string, parentIDs string) (error, string) {
var consoleOutput string
ctx := context.Background()
jenkinsConn := connect.OpenJenkins()
// 判断JobName和目录都不为空执行如下流程
if parentIDs != "" && jobName != "" {
build, err := jenkinsConn.GetJob(ctx, jobName, parentIDs)
if err != nil {
return err, "JOB NOT EXIST"
} else {
// 获取最新的build
info, _ := build.GetLastBuild(ctx)
// 获取最新build输出内容
consoleOutput = info.GetConsoleOutput(ctx)
return nil, consoleOutput
}
} else {
build, err := jenkinsConn.GetJob(ctx, jobName)
if err != nil {
return err, "JOB NOT EXIST"
} else {
info, err := build.GetLastBuild(ctx)
if err != nil {
return err, "JOB NOT EXIST"
}
consoleOutput = info.GetConsoleOutput(ctx)
return nil, consoleOutput
}
}
}
4 router
router定义路由
package router
import (
"github.com/gin-contrib/cors"
"github.com/gin-gonic/gin"
"jenkins_service/controller"
)
func InitRouter() (r *gin.Engine) {
r = gin.Default()
// 跨域配置
config := cors.DefaultConfig()
config.AllowAllOrigins = true
r.Use(cors.New(config))
jobStatus := r.Group("/api/jenkins")
{
jobStatus.POST("/GetJobBuildStatus", controller.GetJobBuildStatus)
jobStatus.POST("/GetJobBuildLogs", controller.GetJobBuildLogs)
}
return
}
5 效果展示
状态一:Job执行中断(ABORTED)
状态二:Job执行中(RUNNING)
状态三:Job执行失败(FAILURE)
状态四:Job执行成功(SUCCESS)
当一个Job存在父目录,前端传参不带父目录请求时就会报错