bia
Version:
a tool for download git repository
340 lines (321 loc) • 10.2 kB
JavaScript
/*
* @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,
}