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,
})
}
}