golang连接jenkins构建build

发布于:2025-02-11 ⋅ 阅读:(41) ⋅ 点赞:(0)

1.安装jenkins依赖

go get github.com/bndr/gojenkins

2.代码

import (
	"context"
	"file/utils/logs"
	"github.com/bndr/gojenkins"
	"github.com/gin-gonic/gin"
	"net/http"
	"time"
)

// 接收单个静态文件上线参数
type ReceiveParametersForDeployingASingleStaticFile struct {
	StaticFileName string `json:"staticFileName"`
	BuildJobDate   string `json:"buildjobdate"`
}

// 返回给前端数据
type ReturnJenkinsData struct {
	BuildResult interface{} `json:"buildResult"`
	BuildLog    interface{} `json:"buildLog"`
	BuildNumber interface{} `json:"buildNumber"`
	BuildName   interface{} `json:"buildName"`
}

func UpdataSingleStaticFile(r *gin.Context) {
	//实例化接收参数的结构体
	var receiveParameters ReceiveParametersForDeployingASingleStaticFile
	ctx := context.Background()
	//接收前端传递过来的参数
	error := r.ShouldBindBodyWithJSON(&receiveParameters)
	if error != nil {
		logs.Error(map[string]interface{}{"msg": error}, "接收更新参数失败!请检查前端选择的参数是否正确!")
		r.JSON(http.StatusBadRequest, gin.H{"msg": error})
		return
	}
	//创建jenkins连接
	jenkins := gojenkins.CreateJenkins(nil, JenkinsUrl, JenkinsUser, JenkinsPass)
	_, err := jenkins.Init(ctx)
	if err != nil {
		logs.Error(map[string]interface{}{"msg": err}, "连接jenkins失败,请检查用户名密码和Url地址是否正确!")
		r.JSON(http.StatusInternalServerError, gin.H{"msg": err})
		return
	}
	logs.Info(map[string]interface{}{"msg": "连接jenkins成功!"}, "jenkins已连接,更新正在继续!")
	//创建一个map将参数传递给jenkins
	returnParm := make(map[string]string)
	returnParm["static_project"] = receiveParameters.StaticFileName
	returnParm["buildJobDate"] = receiveParameters.BuildJobDate
	//调用jenkins构建job并将参数传递给jenkins
	queueId, buErr := jenkins.BuildJob(ctx, "update-static", returnParm)
	//fmt.Println(receiveParameters.StaticFileName, "------", receiveParameters.BuildJobDate)
	if buErr != nil {
		logs.Error(map[string]interface{}{"msg": "构建失败"}, "请检查配置或者服务是否存在!")
		r.JSON(http.StatusInternalServerError, gin.H{"msg": buErr})
		return
	} else {
		build, err := jenkins.GetBuildFromQueueID(ctx, queueId)
		if err != nil {
			logs.Error(map[string]interface{}{"msg": "获取构建信息失败!"}, "请检查Jenkins信息具体报错位置")
			r.JSON(http.StatusInternalServerError, gin.H{"msg": err})
			return
		}
		// 等待构建完成
		for build.IsRunning(ctx) {
			time.Sleep(5000 * time.Millisecond)
			build.Poll(ctx)
		}
		//fmt.Printf("build number %d with result: %v\n", build.GetBuildNumber(), build.GetResult())
		returnJenkinsData := ReturnJenkinsData{
			BuildResult: build.GetResult(),
			BuildLog:    ctx,
			BuildNumber: build.GetBuildNumber(),
			BuildName:   receiveParameters.StaticFileName,
		}
		//返回给前端构建结果
		r.JSON(
			http.StatusOK,
			gin.H{
				"status":  http.StatusOK,
				"message": "升级成功!",
				"data":    returnJenkinsData,
			})
	}
}