[golang]-gitlab api将用户加入指定项目组

导语: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

		}

	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爷来辣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值