paas平台之代码构建(一)

时间:2021-03-09 15:46:22

代码构建(一)

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账号,获取某个账户的项目源码时,是不需要进行认证的,但是对企业级的私有账号就需要进行认证才能获取。

认证以及获取项目

  1. github的认证也可以在官网的api中去查阅,跟gitlab的前两种方式类似,都是需要在github的个人信息中的设置中去手动构建或者需要知道token,才能进行认证,这里不在多述。
  2. 我所采用的方式就通过用户名和密码的方式去实现的,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