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

2023-11-20

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • lpv4dns服务器怎么修改,超简单方法让电脑网速飞起来,只需这么做:更改DNS服务器地址!...

    今天教大教一个技巧 让电脑浏览器打开网页速度更快 一般电脑默认是自动获取IP地址跟DNS服务器 我们手动更改为谷歌DNS 这样电脑浏览器打开网页的速度会快很多 1 鼠标右击任务栏本地连接图标 点击打开网络和共享中心 2 点击更改适配器设置
  • 计算机网络,用Excel画3种编码方式图(非归零编码,曼彻斯特编码,差分曼彻斯特编码)

    计算机网络 用Excel画3种编码方式图 非归零编码 曼彻斯特编码 差分曼彻斯特编码
  • Java及数据库事务

    数据库并发问题 1 脏读 读取未提交数据 A事务读取B事务尚未提交的数据 此时如果B事务发生错误并执行回滚操作 那么A事务读取到的数据就是脏数据 就好像原本的数据比较干净 纯粹 此时由于B事务更改了它 这个数据变得不再纯粹 这个时候A事务立
  • golang:环境变量GOPROXY和GO111MODULE设置

    我们安装完golang后 我们在windows的cmd命令下就可以直接查看和使用go命令和环境变量了 同样的在linux下可以在控制台使用 如下图所示 C Users lijie1 gt go env set GO111MODULE set
  • JUC并发编程共享模型之管程(三)(中)

    4 5Monitor概念 Java 对象头 以 32 位虚拟机为例 在32位虚拟机中 1个机器码等于4字节 也就是32bit 在64位虚拟机中 1个机器码是8个字节 也就是64bit 普通对象 数组对象 其中Mark Word 结构为 最后
  • A *a=new B();

    include
  • Anaconda 安装 Python 库(MySQLdb)的方法-(转)

    安装python库的过程中 最重要的地方就是版本需要兼容 其中操作系统为64位 Python为2 X 64位 下载安装文件的时候也要注意版本匹配 其中文件名中包含的cp27表示CPython 2 7版本 cp34表示CPython 3 4
  • 区块链项目 - 2 工作量证明

    2 1 ProofOfWork框架 我们在区块中添加一个属性Nonce来表示区块的生成难度 它是区块生成的一个重要条件 Nonce值越高 代表生成区块的难度越大 通过这种难度从而避免区块随意生成 工作量证明则是要完成这一系列难度区块生产所需
  • Qt 常用调试错误

    1 调试错误 问题 解决 可能是打开了两个Qt Creator 关闭一个 2 无法打开 debug sss exe 问题 解决 可能已经运行该程序 将其关闭 3 构建项目时发生错误 目标 桌面 问题 解决 点击左侧的项目 gt QT版本中选
  • 为什么在三线城市,Python工程师也能月薪20K?

    Python是这两年编程语言绝对的霸主 你可以发现 几乎所有和程序沾边的人 都在学Python 那么 Python到底有没有用 好在哪里 适合你学吗 今天就来详细分析一下 01 Python究竟能做什么 都说Python易学 究竟好学在哪里
  • Multitor:一款带有负载均衡功能的多Tor实例创建工具

    关于Multitor Multitor是一款带有负载均衡功能的多Tor实例创建工具 Multitor的主要目的是以最快的速度完成大量Tor进程的初始化 并将大量实例应用到我们日常使用的程序中 例如Web浏览器和聊天工具等等 除此之外 在该工
  • 如何做自动化测试

    这个话题比较大 相信大家也都有自己的想法 我在这里写一些我自己的看法 请大家指教 什么叫做自动化测试工程师 首先 会使用自动化测试工具的测试人员不能够称之为完全的自动化测试人员 这类测试人员被称为 工具小子 Script Kid 这个阶段还
  • 关于babel配置使用可选链

    什么是可选链 具体而言它是一种操作符 MDN给出的官方解释是 允许读取位于连接对象链深处的属性的值 而不必明确验证链中的每个引用是否有效 操作符的功能类似于 链式操作符 不同之处在于 在引用为空 nullish null 或者 undefi
  • 第4章 数据库应用系统功能设计与实施

    4 1软件体系结构与设计过程 4 1 1软件体系结构 软件体系结构又称软件架构 软件体系结构 构件 连接件 约束 其中 构件 Component 是组成系统的具有一定独立功能的不同粒度的程序模块 独立程序或软件子系统 是组成软件的系统元素
  • 关于jupyter notebook 更换环境的方法

    一 查看conda现有的环境 打开Anaconda Powershell Prompt 输入以下代码 conda env list 查看环境变量 可以看到如下已经配置的环境变量 二 激活现有环境 在Anaconda Powershell P
  • 使用react-markdown来解析markdown语法

    什么是 react markdown 组件 它是一个基于React的Markdown 编辑器组件 可以对代码进行高亮显示 链接 github网址 react markdown的安装 yarn add react markdown 引入 im
  • 链语BTChat力推“加密+社交” 引领区块链新社交时代

    近些年来互联网的发展日新月异 大数据化 人工智能 物联网这些都在成为人们生活中触手可及的东西 而区块链技能则被认为是继互联网之后最具颠覆性的创新技术 此前区块链技术在金融服务业 游戏 供应链等不同的产业中都有着广泛应用 同样的对于社交平台而
  • wsfuzzer video

    http www neurofuzz com modules software vidz php
  • 14-4_Qt 5.9 C++开发指南_QUdpSocket实现 UDP 通信_UDP组播

    文章目录 1 UDP组播的特性 2 UDP 组播实例程序的功能 3 组播功能的程序实现 4 源码 4 1 可视化UI设计 4 2 mainwindow h 4 3 mainwindow cpp 1 UDP组播的特性 下图简单表示了组播的原理
  • Golang连接Jenkins获取Job Build状态及相关信息

    文章目录 1 连接Jenkins 2 controller 3 module 4 router 5 效果展示 第三方包 gojenkins 方法文档 gojenkins docs 实现起来很简单 利用第三方库 连接jenkins 调用相关方