代码构建(一)
pass平台的主要功能之一就是代码构建,代码构建可以简单的描述为:关联代码管理库(如:github,gitlab等),然后获取代码管理库中的项目源码进行平台的镜像打包,之后将打包后的应用镜像上传到镜像仓库(包括私有镜像仓库和公有镜像仓库)。其中获取代码管理库中的项目源码需要一个认证的过程,只有认证成功后才能进行项目源码的获取。本博文主要讲解了github,gitlab两个代码管理库的认证以及实现(由于目前我所开发的只涉及到这两个代码管理库)。
gitlab的认证以及获取项目
认证
通过查阅gitilab官网api有两种方式:
1. 第一种方式可以参考 Gitlab OAuth2 Application简明教程
2. 第二种方式可以参考如 使用gitlab API
3. 以上两种方式都都不是我想要的,我想要就是通过用户名和密码认证获取到private_token,接下来就是第三种方式:http://gitlaburl/api/v3/session?login=username&&password=password,该api会返回当前用胡的信息,从返回用户信息中提取出private_token。以下是golang实现的部分代码:
//获取private_token
path := beego.AppConfig.String("gitlab_api_url")
getTokenUrl := fmt.Sprintf("%s/session?login=%s&&password=%s", path, name, password)
tokenReq := httplib.Post(getTokenUrl)
resp := &Resp{}
err := tokenReq.ToJSON(resp)
if err != nil {
controllerLog.Error("认证失败 %s", err.Error())
baseController.err = fmt.Errorf("认证失败 %s", err.Error())
baseController.status = INVALID_REQUEST
baseController.data = map[string]interface{}{"sucess": false, "reason": err.Error()}
controllerLog.Debug("get private token is ending")
return
}
获取项目
获取到private_token之后获取当前用户的代码库项目就比较简单了,直接调用api:https://gitlaburl/api/v3/projects?private_token=xxxxxx,以下是golang实现的部分代码:
//获取项目
getProjectsUrl := fmt.Sprintf("%s/projects?private_token=%s", path, resp.PrivateToken)
projectsReq := httplib.Get(getProjectsUrl)
var data []map[string]interface{}
err = projectsReq.ToJSON(&data)
if err != nil {
controllerLog.Error("获取项目列表失败 %s", err.Error())
baseController.err = fmt.Errorf("获取项目列表失败 %s", err.Error())
baseController.status = INTERNAL_SERVER_ERROR
baseController.data = map[string]interface{}{"sucess": false, "reason": err.Error()}
return
}
baseController.status = OK
baseController.data = data
github的认证以及获取项目
github有点不一样,github针对非企业级的私有的github账号,获取某个账户的项目源码时,是不需要进行认证的,但是对企业级的私有账号就需要进行认证才能获取。
认证以及获取项目
- github的认证也可以在官网的api中去查阅,跟gitlab的前两种方式类似,都是需要在github的个人信息中的设置中去手动构建或者需要知道token,才能进行认证,这里不在多述。
- 我所采用的方式就通过用户名和密码的方式去实现的,api如下:
https://api.github.com/users/usname 用户名和密码则需要通过设置httprequest的header的方式实现(在此过程中需要注意一点,你的username和password组层的串必须要经过base64 encode,而且格式必须是:Basic aHVhbmdqaWFzaW5nbGU6aGxoajUyNTExNQ==,其中aHVhbmdqaWFzaW5nbGU6aGxoajUyNTExNQ==是username:password 连接的字符串通过base64 encode之后得到的),我简化了获取项目,没有单独的走完认证流程,然后在去获取项目。我直接就是调用api:https://api.github.com/users/usname/repos 获取项目,该api会先走认证,如果认证通过之后就返回repos信息(即项目列表的json数组)。以下是golang实现的代码片段:
//获取项目
//如果需要分页,则加上参数page 当前页 per_page 每页数量
path := beego.AppConfig.String("github_api_url")
getProjectsUrl := fmt.Sprintf("%s/users/%s/repos", path, name)
authStr := "Basic " + base64.StdEncoding.EncodeToString([]byte(name+":"+password))
controllerLog.Error(authStr)
projectsReq := httplib.Get(getProjectsUrl)
projectsReq.Header("authorization", authStr)
var data []map[string]interface{}
err := projectsReq.ToJSON(&data)
if err != nil {
controllerLog.Error("获取项目列表失败 %s", err.Error())
baseController.err = fmt.Errorf("获取项目列表失败 %s", err.Error())
baseController.status = INTERNAL_SERVER_ERROR
baseController.data = map[string]interface{}{"sucess": false, "reason": err.Error()}
return
}
baseController.status = OK
baseController.data = data