UNPKG

bia

Version:

a tool for download git repository

340 lines (321 loc) 10.2 kB
/* * @Author: hzxulin@yeah.net * @Date: 2018-11-20 20:59:08 * @Last Modified by: hzxulin * @Last Modified time: 2021-05-18 15:12:47 */ const path = require('path') const request = require('request') const fse = require('fs-extra') const xlsx = require('node-xlsx') const colors = require('colors') const question = require('./question') const GIT_CONFIG = require('../../config/git.json') /** * 导出excel * @param {string} _dist 导出的路径 */ const exportExcel = (_dist) => { return new Promise((resolve, reject) => { try { const token = GIT_CONFIG.token const data = GIT_CONFIG.excel // 将 token 直接更新到excel模板上 try { if (token) { data[1][0] = token data[2][0] = token } } catch (e) { // } let buffer = xlsx.build([{ name: 'git-tpl', data: data }]) let dist = path.resolve(_dist, 'git-tpl.xlsx') fse.outputFileSync(dist, buffer) resolve(dist) } catch (err) { reject(err) } }) } /** * 创建git的地址,流程1 * @param {object} projectOpts git的配置项 */ const createGitUrl = (projectOpts = {}) => { return new Promise((resolve, reject) => { request({ method: 'POST', url: 'https://git.yx.netease.com/api/v4/projects', headers: { 'PRIVATE-TOKEN': projectOpts.token, }, body: { 'name': projectOpts.name, 'namespace_id': projectOpts.namespace_id, 'description': projectOpts.description, }, json: true, }, (err, response, body) => { if (err || !body.id) { reject(err) } else { projectOpts = Object.assign(projectOpts, { id: body.id, web_url: body.web_url }) resolve(projectOpts) } }) }) } /** * 创建git的分支,流程2 * @param {object} projectOpts git的配置项 */ const createGitBranch = (projectOpts = {}) => { return new Promise((resolve, reject) => { request({ method: 'POST', url: `https://git.yx.netease.com/api/v4/projects/${projectOpts.id}/repository/commits`, headers: { 'PRIVATE-TOKEN': projectOpts.token, }, body: { 'branch': 'master', 'commit_message': 'init', 'actions': [ { 'action': 'create', 'file_path': 'LICENSE', 'content': '', }, ], }, json: true, }, (err, response, body) => { if (err) { reject(err) } else { resolve(projectOpts) } }) }) } /** * 查询git的runner list,流程3 * @param {object} projectOpts git的配置项 */ const getGitRunnerList = (projectOpts = {}) => { return new Promise((resolve, reject) => { request({ method: 'GET', url: 'https://git.yx.netease.com/api/v4/runners', headers: { 'PRIVATE-TOKEN': projectOpts.token, }, json: true, }, (err, response, body) => { if (err || !(body && body.length)) { reject(err) } else { projectOpts = Object.assign(projectOpts, { runnerList: body }) resolve(projectOpts) } }) }) } /** * 激活git的runner list,流程4 * @param {object} projectOpts git的配置项 */ const enableGitRunner = (projectOpts = {}) => { return new Promise((resolve, reject) => { request({ method: 'POST', url: `https://git.yx.netease.com/api/v4/projects/${projectOpts.id}/runners`, body: { 'runner_id': projectOpts.runner_id, }, headers: { 'PRIVATE-TOKEN': projectOpts.token, }, json: true, }, (err, response, body) => { if (err) { reject(err) } else { resolve(projectOpts) } }) }) } /** * 设置保护分支,流程5 * @param {object} projectOpts git的配置项 */ const protectBranch = (projectOpts = {}) => { return new Promise((resolve, reject) => { projectOpts = Object.assign(projectOpts, { branch: 'release-*' }) request({ method: 'POST', url: `https://git.yx.netease.com/api/v4/projects/${projectOpts.id}/protected_branches`, body: { 'name': projectOpts.branch, 'push_access_level': '40', 'merge_access_level': '40', }, headers: { 'PRIVATE-TOKEN': projectOpts.token, }, json: true, }, (err, response, body) => { if (err) { reject(err) } else { resolve(projectOpts) } }) }) } /** * 禁用pre分支,流程6 * @param {object} projectOpts git的配置项 */ const protectPreBranch = (projectOpts = {}) => { return new Promise((resolve, reject) => { projectOpts = Object.assign(projectOpts, { devBranch: 'dev*' }) request({ method: 'POST', url: `https://git.yx.netease.com/api/v4/projects/${projectOpts.id}/protected_branches`, body: { 'name': projectOpts.devBranch, 'push_access_level': '30', 'merge_access_level': '0', }, headers: { 'PRIVATE-TOKEN': projectOpts.token, }, json: true, }, (err, response, body) => { if (err) { reject(err) } else { resolve(projectOpts) } }) }) } /** * 创建git项目总流程 * @param {object} projectOpts git的配置项 * @argument {sting} opts.token git-api的token * @argument {sting} opts.namespace_id git group的namespace_id * @argument {sting} opts.name git项目的name * @argument {sting} opts.description git项目的description */ const createGitRepo = (projectOpts = {}) => { return new Promise((resolve, reject) => { return createGitUrl(projectOpts).then(newOpts => { return createGitBranch(newOpts) }).then(newOpts => { if (newOpts.runner_id) { return enableGitRunner(newOpts) } else { return getGitRunnerList(newOpts).then(newOpts => { return question.askGitRunner(newOpts) }).then(newOpts => { return enableGitRunner(newOpts) }) } }).then(newOpts => { return protectBranch(newOpts) }).then(newOpts => { return protectPreBranch(newOpts) }).then(newOpts => { resolve(newOpts) }).catch(err => { reject(err) }) }) } /** * 导入excel,读取excel内容 * @param {string} file 导入的excel文件名 */ const importExcel = (file) => { return new Promise((resolve, reject) => { try { let excel = xlsx.parse(file) let list = [] excel.forEach((_v) => { let _data = _v.data _data && _data.length && _data.forEach((_y, _j) => { if (_j > 0 && _y && _y.length) { list.push({ token: _y[0], namespace_id: _y[1], name: _y[2], description: _y[3], runner_id: _y[4], }) } }) }) resolve(list) } catch (err) { reject(err) } }) } /** * 打印 token */ const consoleToken = () => { return new Promise((resolve, reject) => { try { const data = GIT_CONFIG.token if (!data) { console.log(colors.red('┌───────────────────────────────┐')) console.log(colors.red('│ git token: │')) console.log(colors.red('│ │')) console.log(colors.red('│ empty, please set it! │')) console.log(colors.red('└───────────────────────────────┘')) } else { console.log(colors.green('┌───────────────────────────────┐')) console.log(colors.green('│ git token: │')) console.log(colors.green('│ │')) console.log(colors.green(`│ ${data} │`)) console.log(colors.green('└───────────────────────────────┘')) } resolve() } catch (err) { reject(err) } }) } /** * 设置token的值 * @param {string} val token */ const setGitToken = (token) => { return new Promise((resolve, reject) => { const res = Object.assign(GIT_CONFIG, { token, }) let dist = path.resolve(__dirname, '../../config/git.json') let content = JSON.stringify(res, null, 4) fse.outputFile(dist, content, err => { if (err) { reject(err) } else { resolve() } }) }) } module.exports = { exportExcel, createGitRepo, importExcel, consoleToken, setGitToken, }