栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Go语言

Golang连接Jenkins获取Job Build状态及相关信息

Go语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Golang连接Jenkins获取Job Build状态及相关信息

文章目录
  • 1 连接Jenkins
  • 2 controller
  • 3 module
  • 4 router
  • 5 效果展示

第三方包: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存在父目录,前端传参不带父目录请求时就会报错

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/991662.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号