导语:golang调用gitlab api 给用户加入到某个项目中。目前只支持ssh地址。http地址在后续匹配项目时 还没做判断。先给自己做个笔记 记录一下。
主要代码
func (c *GitlabController) AddMember() {
beego.Info("AddMember")
c.TplName = "admin/gitlab/addMember.html"
}
func (c *GitlabController) DoAddMember() {
beego.Info("DoAddMember")
beego.Info("Gitlabtest")
infra_access_token := beego.AppConfig.String("infra_access_token")
infra_gitlab_url := beego.AppConfig.String("infra_gitlab_url")
chinesename := strings.Trim(c.GetString("chinesename"), " ")
projname := strings.Trim(c.GetString("projname"), " ")
beego.Info(chinesename, projname)
// http获取传入用户名的userid
username := models.ChineseTo(chinesename)
beego.Info(username)
beego.Info(infra_access_token)
beego.Info(infra_gitlab_url)
// 拼接url
url := infra_gitlab_url + "/api/v4/users"
beego.Info(url)
// get请求根据项目id获取项目分支json
// url := "https://361way.com/api/users"
req2, _ := http.NewRequest("GET", url, nil)
req2.Header.Add("PRIVATE-TOKEN", infra_access_token)
res2, _ := http.DefaultClient.Do(req2)
defer res2.Body.Close()
body2, _ := ioutil.ReadAll(res2.Body)
// beego.Info(body2) // [91 123 34 105 100 34 58] 输出看不懂的东西
// fmt.Println(string(body2))
beego.Info("-----------------------------------------------")
beego.Info("-----------------------------------------------")
beego.Info("-----------------------------------------------")
// 把body2转换为string
jobjson := string(body2)
beego.Info(jobjson)
// 提取json中的用户信息
raw := []byte(jobjson)
helloFilter, err := jsonpath.Prepare("$..username")
if err != nil {
panic(err)
}
var data interface{}
if err = json.Unmarshal(raw, &data); err != nil {
panic(err)
}
out, err := helloFilter(data)
if err != nil {
panic(err)
}
// 输出用户列表
fmt.Printf("out type:%T\n", out)
beego.Info("已创建用户名如下")
beego.Info(out)
// 判断用户是否存在并获取用户的id
beego.Info(jobjson)
var person []Person
err = json.Unmarshal(raw, &person)
if err != nil {
fmt.Println("error:", err)
}
beego.Info("jq")
fmt.Printf("%+v", person)
fmt.Printf("out type:%T\n", person)
beego.Info("jq")
// beego.Info("jq")
// beego.Info(jq)
for _, v := range person {
// beego.Info(v)
// fmt.Printf("out type:%T\n", v)
beego.Info(v.Id, v.Username)
if v.Username != username {
beego.Info("用户名不匹配", v.Username)
} else {
beego.Info("用户名匹配成功", v.Username)
beego.Info("用户id为", v.Id)
fmt.Printf("out type:%T\n", v.Id)
user_id := strconv.Itoa(v.Id)
// 获取传入项目的id
beego.Info("projname", projname)
// 获取xml中包含git@git开头.git结尾的代码地址 测试pipeline里或者常规job输入的git地址都可以获取到
gitRegexp := regexp.MustCompile(`^(http(s)?:\/\/([^\/]+?\/){2}|git@[^:]+:[^\/]+?\/).*?.git$`)
// gitRegexp := regexp.MustCompile(`git@[^:]+:[^\/]+?\/.*?.git`)
// 校验git开头的地址: /^git@[^:]+:[^\/]+?\/.*?.git$/
// 校验http开头的地址: /^http(s)?:\/\/([^\/]+?\/){2}.*?.git$/
// 同时支持git和http开头的地址: /^(http(s)?:\/\/([^\/]+?\/){2}|git@[^:]+:[^\/]+?\/).*?.git$/
params := gitRegexp.FindStringSubmatch(projname)
beego.Info(params)
// 输出xml 看看
// fmt.Printf(config)
for _, param := range params {
// 输出获取的params信息 gitlab地址
beego.Info("gitlab地址为:" + param)
// 确保git@gitlab.xxxx.com:java_service/ydjk/Java.git 这种形式
r1, _ := regexp.Compile(`[^\/]+(\.git)`)
s1 := r1.FindString(param)
// hello.git
beego.Info("gitlab项目名为:" + s1)
gitproj := strings.Replace(s1, ".git", " ", -1)
beego.Info("gitlab项目名为:" + gitproj)
gitlabUrl := infra_gitlab_url + "/api/v4/projects?private_token=" + infra_access_token + "&search=" + gitproj
beego.Info("gitlab项目url为:" + gitlabUrl)
// 获取id
req, req_err := http.NewRequest("GET", gitlabUrl, nil)
if req_err != nil {
beego.Warning("error", req_err)
beego.Warning("gitlab上似乎没有这个项目")
beego.Warning("gitlab上似乎没有这个项目")
beego.Warning("gitlab上似乎没有这个项目")
}
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := ioutil.ReadAll(res.Body)
// beego.Info("body")
fmt.Println(reflect.TypeOf(body))
beego.Info("先判断gitlab中是否有这个项目")
jobjson := string(body)
beego.Info("jobjson", jobjson)
// 提取json中的分支
raw := []byte(jobjson)
// beego.Info("raw", raw)
var projjson []Projjson
err := json.Unmarshal(raw, &projjson)
if err != nil {
fmt.Println("error:", err)
}
beego.Info("jq")
beego.Info(projjson)
for _, v := range projjson {
beego.Info(v.Id)
beego.Info(v.Ssh_url_to_repo)
// 这里是否在加一层http url的判断
if v.Ssh_url_to_repo != param {
beego.Info("ssh地址不匹配")
} else if v.Ssh_url_to_repo == param {
beego.Info("ssh地址匹配")
beego.Info(param, v.Ssh_url_to_repo)
beego.Info(v.Id)
fmt.Println(reflect.TypeOf(v.Id))
// 获取id之后开始操作
// 转换int为string 方便后面拼接url
proj_id := strconv.Itoa(v.Id)
fmt.Println(reflect.TypeOf(proj_id))
// 拼接url
// curl -v -X POST -H "PRIVATE-TOKEN: ${access_token}" http://${gitlab_url}/api/v4/projects/2/members -H 'cache-control: no-cache' -H 'content-type: application/json' -d '{ "user_id": "18", "access_level": "30" }'
add_member_url := infra_gitlab_url + "/api/v4/projects/" + strconv.Itoa(v.Id) + "/members"
beego.Info("add_member_url", add_member_url)
beego.Info("infra_access_token", infra_access_token)
// curl -v -X POST -H "PRIVATE-TOKEN: ${access_token}" http://${gitlab_url}/api/v4/projects/2/members -H 'cache-control: no-cache' -H 'content-type: application/json' -d '{ "user_id": "18", "access_level": "30" }'
//json序列化
post := "{\"user_id\":\"" + user_id +
"\",\"access_level\":\"" + "30" +
"\"}"
var jsonStr = []byte(post)
// jsonStr := []byte(`{ "email": emailaddr, "username": username, "password": "12345678", "name": chinesename, "skip_confirmation": "true" }`)
req3, err3 := http.NewRequest("POST", add_member_url, bytes.NewBuffer(jsonStr))
req3.Header.Add("PRIVATE-TOKEN", infra_access_token)
req3.Header.Set("Content-Type", "application/json")
req3.Header.Set("cache-control", "no-cache")
client3 := &http.Client{}
resp3, _ := client3.Do(req3)
if err3 != nil {
// handle error
}
defer resp3.Body.Close()
statuscode3 := resp3.StatusCode
head3 := resp3.Header
body3, _ := ioutil.ReadAll(resp3.Body)
beego.Info("body3")
fmt.Println(string(body3))
beego.Info("statuscode3")
fmt.Println(statuscode3)
beego.Info("head3")
fmt.Println(head3)
// 判断statuscode 判断是否成功
if statuscode3 < 300 {
c.Success("用户授权成功", "/gitlab/")
} else if statuscode3 == 409 {
c.Error("用户授权失败 项目中用户已存在", "/gitlab/")
}else {
c.Error("用户授权失败 请手动确认", "/gitlab/")
}
break
} else {
beego.Warning("gitlab上似乎没有这个项目")
beego.Warning("gitlab上似乎没有这个项目")
beego.Warning("gitlab上似乎没有这个项目")
}
}
break
}
break
}
}
// c.Ctx.WriteString("gitlabtest")
}
效果如下
这里做了中文转英文的操作 也支持输入用户名
界面上也已经添加成功
后续支持http地址判断
func (c *GitlabController) AddMember() {
beego.Info("AddMember")
c.TplName = "admin/gitlab/addMember.html"
}
func (c *GitlabController) DoAddMember() {
beego.Info("DoAddMember")
beego.Info("Gitlabtest")
infra_access_token := beego.AppConfig.String("infra_access_token")
infra_gitlab_url := beego.AppConfig.String("infra_gitlab_url")
chinesename := strings.Trim(c.GetString("chinesename"), " ")
projname := strings.Trim(c.GetString("projname"), " ")
beego.Info(chinesename, projname)
// http获取传入用户名的userid
username := models.ChineseTo(chinesename)
beego.Info(username)
beego.Info(infra_access_token)
beego.Info(infra_gitlab_url)
// 拼接url
url := infra_gitlab_url + "/api/v4/users"
beego.Info(url)
// get请求根据项目id获取项目分支json
// url := "https://361way.com/api/users"
req2, _ := http.NewRequest("GET", url, nil)
req2.Header.Add("PRIVATE-TOKEN", infra_access_token)
res2, _ := http.DefaultClient.Do(req2)
defer res2.Body.Close()
body2, _ := ioutil.ReadAll(res2.Body)
// beego.Info(body2) // [91 123 34 105 100 34 58] 输出看不懂的东西
// fmt.Println(string(body2))
beego.Info("-----------------------------------------------")
beego.Info("-----------------------------------------------")
beego.Info("-----------------------------------------------")
// 把body2转换为string
jobjson := string(body2)
beego.Info(jobjson)
// 提取json中的用户信息
raw := []byte(jobjson)
helloFilter, err := jsonpath.Prepare("$..username")
if err != nil {
panic(err)
}
var data interface{}
if err = json.Unmarshal(raw, &data); err != nil {
panic(err)
}
out, err := helloFilter(data)
if err != nil {
panic(err)
}
// 输出用户列表
fmt.Printf("out type:%T\n", out)
beego.Info("已创建用户名如下")
beego.Info(out)
// 判断用户是否存在并获取用户的id
beego.Info(jobjson)
var person []Person
err = json.Unmarshal(raw, &person)
if err != nil {
fmt.Println("error:", err)
}
beego.Info("jq")
fmt.Printf("%+v", person)
fmt.Printf("out type:%T\n", person)
beego.Info("jq")
// beego.Info("jq")
// beego.Info(jq)
for _, v := range person {
// beego.Info(v)
// fmt.Printf("out type:%T\n", v)
beego.Info(v.Id, v.Username)
if v.Username != username {
beego.Info("用户名不匹配", v.Username)
} else {
beego.Info("用户名匹配成功", v.Username)
beego.Info("用户id为", v.Id)
fmt.Printf("out type:%T\n", v.Id)
user_id := strconv.Itoa(v.Id)
// 获取传入项目的id
beego.Info("projname", projname)
// 获取xml中包含git@git开头.git结尾的代码地址 测试pipeline里或者常规job输入的git地址都可以获取到
gitRegexp := regexp.MustCompile(`^(http(s)?:\/\/([^\/]+?\/){2}|git@[^:]+:[^\/]+?\/).*?.git$`)
// gitRegexp := regexp.MustCompile(`git@[^:]+:[^\/]+?\/.*?.git`)
// 校验git开头的地址: /^git@[^:]+:[^\/]+?\/.*?.git$/
// 校验http开头的地址: /^http(s)?:\/\/([^\/]+?\/){2}.*?.git$/
// 同时支持git和http开头的地址: /^(http(s)?:\/\/([^\/]+?\/){2}|git@[^:]+:[^\/]+?\/).*?.git$/
params := gitRegexp.FindStringSubmatch(projname)
beego.Info(params)
// 输出xml 看看
// fmt.Printf(config)
for _, param := range params {
// 输出获取的params信息 gitlab地址
beego.Info("gitlab地址为:" + param)
// 确保git@gitlab.xxxx.com:java_service/ydjk/Java.git 这种形式
r1, _ := regexp.Compile(`[^\/]+(\.git)`)
s1 := r1.FindString(param)
// hello.git
beego.Info("1gitlab项目名为:" + s1)
gitproj := strings.Replace(s1, ".git", " ", -1)
beego.Info("gitlab项目名为:" + gitproj)
gitlabUrl := infra_gitlab_url + "/api/v4/projects?private_token=" + infra_access_token + "&search=" + gitproj
beego.Info("gitlab项目url为:" + gitlabUrl)
// 获取id
req, req_err := http.NewRequest("GET", gitlabUrl, nil)
if req_err != nil {
beego.Warning("error", req_err)
beego.Warning("gitlab上似乎没有这个项目")
beego.Warning("gitlab上似乎没有这个项目")
beego.Warning("gitlab上似乎没有这个项目")
}
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := ioutil.ReadAll(res.Body)
// beego.Info("body")
fmt.Println(reflect.TypeOf(body))
beego.Info("先判断gitlab中是否有这个项目")
jobjson := string(body)
beego.Info("jobjson", jobjson)
// 提取json中的分支
raw := []byte(jobjson)
// beego.Info("raw", raw)
var gitlabprojjson []GitlabProjjson
err := json.Unmarshal(raw, &gitlabprojjson)
if err != nil {
fmt.Println("error:", err)
}
beego.Info("jq")
beego.Info(gitlabprojjson)
for _, v := range gitlabprojjson {
beego.Info(v.Id)
beego.Info(v.Ssh_url_to_repo)
beego.Info(v.Http_url_to_repo)
// beego.Info(v.)
// beego.Info(v.)
// 这里是否在加一层http url的判断
if v.Ssh_url_to_repo == param {
beego.Info("ssh地址匹配")
beego.Info("gitlab地址匹配成功")
// beego.Info(param, v.Ssh_url_to_repo)
beego.Info(v.Id)
fmt.Println(reflect.TypeOf(v.Id))
// 获取id之后开始操作
// 转换int为string 方便后面拼接url
proj_id := strconv.Itoa(v.Id)
fmt.Println(reflect.TypeOf(proj_id))
// 拼接url
// curl -v -X POST -H "PRIVATE-TOKEN: ${access_token}" http://${gitlab_url}/api/v4/projects/2/members -H 'cache-control: no-cache' -H 'content-type: application/json' -d '{ "user_id": "18", "access_level": "30" }'
add_member_url := infra_gitlab_url + "/api/v4/projects/" + strconv.Itoa(v.Id) + "/members"
beego.Info("add_member_url", add_member_url)
beego.Info("infra_access_token", infra_access_token)
// curl -v -X POST -H "PRIVATE-TOKEN: ${access_token}" http://${gitlab_url}/api/v4/projects/2/members -H 'cache-control: no-cache' -H 'content-type: application/json' -d '{ "user_id": "18", "access_level": "30" }'
//json序列化
post := "{\"user_id\":\"" + user_id +
"\",\"access_level\":\"" + "30" +
"\"}"
var jsonStr = []byte(post)
// jsonStr := []byte(`{ "email": emailaddr, "username": username, "password": "12345678", "name": chinesename, "skip_confirmation": "true" }`)
req3, err3 := http.NewRequest("POST", add_member_url, bytes.NewBuffer(jsonStr))
req3.Header.Add("PRIVATE-TOKEN", infra_access_token)
req3.Header.Set("Content-Type", "application/json")
req3.Header.Set("cache-control", "no-cache")
client3 := &http.Client{}
resp3, _ := client3.Do(req3)
if err3 != nil {
// handle error
}
defer resp3.Body.Close()
statuscode3 := resp3.StatusCode
head3 := resp3.Header
body3, _ := ioutil.ReadAll(resp3.Body)
beego.Info("body3")
fmt.Println(string(body3))
beego.Info("statuscode3")
fmt.Println(statuscode3)
beego.Info("head3")
fmt.Println(head3)
// 判断statuscode 判断是否成功
if statuscode3 < 300 {
c.Success("用户授权成功", "/gitlab/")
} else if statuscode3 == 409 {
c.Error("用户授权失败 项目中用户已存在", "/gitlab/")
} else {
c.Error("用户授权失败 请手动确认", "/gitlab/")
}
break
} else if v.Http_url_to_repo == param {
beego.Info("http地址匹配")
beego.Info("gitlab地址匹配成功")
// beego.Info(param, v.Ssh_url_to_repo)
beego.Info(v.Id)
fmt.Println(reflect.TypeOf(v.Id))
// 获取id之后开始操作
// 转换int为string 方便后面拼接url
proj_id := strconv.Itoa(v.Id)
fmt.Println(reflect.TypeOf(proj_id))
// 拼接url
// curl -v -X POST -H "PRIVATE-TOKEN: ${access_token}" http://${gitlab_url}/api/v4/projects/2/members -H 'cache-control: no-cache' -H 'content-type: application/json' -d '{ "user_id": "18", "access_level": "30" }'
add_member_url := infra_gitlab_url + "/api/v4/projects/" + strconv.Itoa(v.Id) + "/members"
beego.Info("add_member_url", add_member_url)
beego.Info("infra_access_token", infra_access_token)
// curl -v -X POST -H "PRIVATE-TOKEN: ${access_token}" http://${gitlab_url}/api/v4/projects/2/members -H 'cache-control: no-cache' -H 'content-type: application/json' -d '{ "user_id": "18", "access_level": "30" }'
//json序列化
post := "{\"user_id\":\"" + user_id +
"\",\"access_level\":\"" + "30" +
"\"}"
var jsonStr = []byte(post)
// jsonStr := []byte(`{ "email": emailaddr, "username": username, "password": "12345678", "name": chinesename, "skip_confirmation": "true" }`)
req3, err3 := http.NewRequest("POST", add_member_url, bytes.NewBuffer(jsonStr))
req3.Header.Add("PRIVATE-TOKEN", infra_access_token)
req3.Header.Set("Content-Type", "application/json")
req3.Header.Set("cache-control", "no-cache")
client3 := &http.Client{}
resp3, _ := client3.Do(req3)
if err3 != nil {
// handle error
}
defer resp3.Body.Close()
statuscode3 := resp3.StatusCode
head3 := resp3.Header
body3, _ := ioutil.ReadAll(resp3.Body)
beego.Info("body3")
fmt.Println(string(body3))
beego.Info("statuscode3")
fmt.Println(statuscode3)
beego.Info("head3")
fmt.Println(head3)
// 判断statuscode 判断是否成功
if statuscode3 < 300 {
c.Success("用户授权成功", "/gitlab/")
} else if statuscode3 == 409 {
c.Error("用户授权失败 项目中用户已存在", "/gitlab/")
} else {
c.Error("用户授权失败 请手动确认", "/gitlab/")
}
break
} else {
beego.Warning("gitlab上似乎没有这个项目")
beego.Warning("gitlab上似乎没有这个项目")
beego.Warning("gitlab上似乎没有这个项目")
}
}
break
}
break
}
}
}