脚手架gitlab下载模板工程-2023新

544 阅读4分钟

我们都知道github 是开源的,不需要登录,就可以浏览任意一个public开源项目。所以项目模板托管在这个上面,不涉及到token登录认证操作的。

但是,我们实际场景是,公司内部项目。一般都托管到一个内部部署的gitlab服上。此时你的脚手架想取到内部的gitlab上托管的模板项目时候,就需要走gitlab 官方提供的token认证方式。

获取token

切刀群组下,点击个人资料,点击setting.

2023-07-26.172609.png

选择 access tokens。

image.png

输入token的name。选择一个过期时间,不选默认是365天。scopes下选择第一个选项 api ,代表这个token可以操作的gitlab范围是:读写仓库。你可以简单的理解是下边那些选项的合集。 官方对token的解读

使用token

官方对token的使用说明

这里我们采用最后一种形式:

You can also use personal, project, or group access tokens with OAuth-compliant headers:

curl --header "Authorization: Bearer <your_access_token>" "gitlab.example.com/api/v4/proj…"

gitlab api介绍

功能接口功能描述
获取项目代码GET /projects/:id/repository/archive.zip?ref=branch可以获取指定分支代码的zip包
获取项目信息GET /projects/:id可以获取指定项目的详细信息,包括项目的名称、描述、创建者、创建时间、最近更新时间、访问级别、仓库 URL、分支信息、标签信息等。
获取项目列表GET /projects可以获取当前用户或指定用户下的项目列表,可以设置不同的参数来筛选和排序项目,例如项目的可见性、访问级别、所属组织、创建者、名称等。
获取项目文件内容GET /projects/:id/repository/files/:file_path可以获取指定项目中某个文件的内容,可以设置文件路径、分支名称、文件格式等参数。
获取项目目录内容GET /projects/:id/repository/tree可以获取指定项目中某个目录下的文件和子目录的信息,可以设置目录路径、分支名称、递归深度等参数。
获取项目提交列表GET /projects/:id/repository/commits可以获取指定项目的提交列表,包括提交 ID、提交者信息、提交时间、提交信息、变更文件等。
获取项目分支列表GET /projects/:id/repository/branches可以获取指定项目的分支列表,包括分支名称、最近提交信息、保护状态等。
获取项目标签列表GET /projects/:id/repository/tags可以获取指定项目的标签列表,包括标签名称、标签信息、提交信息等。
获取项目合并请求列表GET /projects/:id/merge_requests可以获取指定项目的合并请求列表,包括合并请求的标题、描述、状态、提交信息等。

获取代码的API

根据官方api 说明:我们构造出了可以拿到项目代码的地址了。

http://192.168.9.918/api/v4/projects/251/repository/archive.zip?ref=master 

那我们平时下载gitlab的代码压缩包,有啥区别呢?

http://192.168.9.918/web/yourPrjectTplName/repository/archive.zip?ref=master

前者 我们是通过git-api 的方式,发请求拿资源时候需要头中携带先前生成好的token。后者就是我们浏览器里已经登录过了,我们在地址栏里直接输入资源地址,浏览器帮我们完成了下载动作。

代码实现


const fs = require("fs")

const path = require("path")

const currentPath = process.cwd();

const spinner = require("./spinner")

const os = require("os")

const { deletePath , unzipFile } = require("./io")

const axios = require("axios")

  


let baseUrl = "http://192.168.9.918/api/v4"//gitlab api

  


let token = "s1jrCUXD6QLgKvbnD2xy"//token name :Bearer

  


let projectID = '251';//锁定具体项目

  


let url = `${baseUrl}/projects/${projectID}/repository/archive.zip?ref=master`

  


module.exports = function(templateName,projectName,callback){

   

    // 压缩包下载的目录,这里是在系统临时文件目录创建一个目录

    const tempProjectPath = fs.mkdtempSync(path.join(os.tmpdir(), `${projectName}-`));

  
    // 压缩包保存的路径

    const file = path.join(tempProjectPath,`${templateName}.zip`);

  


    axios({

        method:"GET",

        url:url,

        responseType:"arraybuffer",

        responseEncoding:"binary",

        headers:{

                    'Authorization':`Bearer ${token}`

        },

    }).then((res)=>{

        fs.writeFileSync(file,res.data,"binary")

            // 获取解压的目录

            const destPath = path.join(currentPath,`${projectName}`);

 
            // 解压已下载的模板压缩包

            unzipFile(file,destPath,(error)=>{

                // 删除创建的临时文件夹

                deletePath(tempProjectPath);

                callback && callback()

            });

  


    }).catch((error)=>{

        console.log(error,"下载出错")

    })

}

注意:

  • 请求方式:一定是get。gitlab 官网已经写了:所以注意保持一致。

image.png

  • 我们下载zip文件,注意请求类型,请求编码。
responseType: "arraybuffer",
responseEncoding: "binary"
  • 下载后二进制文件流 同步写入文件系统时,注意格式也是 binary

相关链接