@notadd/cli
Version:
notadd core none dependence
150 lines (141 loc) • 7.77 kB
text/typescript
import { Command } from '@notadd/cli-core'
import shelljs from 'shelljs'
import axios from 'axios';
import { Args, Controller, EntityService } from '@notadd/core';
()
export class JenkinsCommand {
serviceName: string;
gitBranchName: string;
gitTag: string;
dockerUsername: string;
dockerPassword: string;
prefix: string;
reqAddr: string;
dingdingUrl: string;
dingdingAtPeoples: string;
qiyeWeChatUrl: string;
weChatAtPeoples: string;
dockerHost: string
('jenkins')
async build(
`sn`)
serviceName: string,
(`gb`)
gitBranchName: string,
(`gt`)
gitTag: string,
(`du`)
dockerUsername: string,
(`dp`)
dockerPassword: string,
(`pf`)
prefix: string,
(`dd`)
reqAddr: string,
(`d1du`)
dingdingUrl: string,
(`ddp`)
dingdingAtPeoples: string,
(`qyu`)
qiyeWeChatUrl: string,
(`qyp`)
weChatAtPeoples: string,
(`host`)
dockerHost: string
) {
(this.serviceName = serviceName;
this.gitBranchName = gitBranchName;
this.gitTag = gitTag;
this.dockerUsername = dockerUsername;
this.dockerPassword = dockerPassword;
this.prefix = prefix;
this.reqAddr = reqAddr;
this.dingdingUrl = dingdingUrl;
this.dingdingAtPeoples = dingdingAtPeoples;
this.qiyeWeChatUrl = qiyeWeChatUrl;
this.weChatAtPeoples = weChatAtPeoples;
this.dockerHost = dockerHost
const SERVICE_NAME = this.serviceName
const GIT_BRANCH_NAME = this.gitBranchName
const GIT_TAG = this.gitTag
const DAOCLOUD_HOST = this.dockerHost
console.log(SERVICE_NAME, GIT_BRANCH_NAME, GIT_TAG)
if (this.dockerBuild(SERVICE_NAME, GIT_BRANCH_NAME, GIT_TAG, DAOCLOUD_HOST) === false) {
console.log("构建镜像失败")
await this.dingding(`[jenkins] 项目: ${SERVICE_NAME} 的 ${GIT_BRANCH_NAME} 构建镜像失败`, GIT_BRANCH_NAME)
// await this.enterpriseWeChat(`[DEPLOY] ${SERVICE_NAME} JEEKINS ${GIT_BRANCH_NAME} 构建镜像失败`, GIT_BRANCH_NAME)
return
}
if (await this.reBoot(SERVICE_NAME, GIT_BRANCH_NAME) === false) {
console.log("请求重启docker服务失败")
await this.dingding(`[jenkins] ${SERVICE_NAME} JEEKINS ${GIT_BRANCH_NAME} 远程重启服务失败`, GIT_BRANCH_NAME)
// await this.enterpriseWeChat(`[DEPLOY] ${SERVICE_NAME} JEEKINS ${GIT_BRANCH_NAME} 远程重启服务失败`, GIT_BRANCH_NAME)
return
}
await this.dingding(`[jenkins]${SERVICE_NAME} JEEKINS ${GIT_BRANCH_NAME} 部署服务成功`, GIT_BRANCH_NAME)
// await this.enterpriseWeChat(`[DEPLOY]${SERVICE_NAME} JEEKINS ${GIT_BRANCH_NAME} 部署服务成功`, GIT_BRANCH_NAME)
console.log("服务部署成功")
}
//构建镜像
dockerBuild(SERVICE_NAME: string, GIT_BRANCH_NAME: string, GIT_TAG: string, DAOCLOUD_HOST: string) {
const DOCKER_IMAGE = ((this.prefix == null || this.prefix == undefined) ? `guanjie/` : (this.prefix + '/')) + SERVICE_NAME
const DOCKER_USERNAME = (this.dockerUsername == null || this.dockerUsername == undefined) ? 'sun_y' : this.dockerUsername
const DOCKER_PASSWORD = (this.dockerPassword == null || this.dockerPassword == undefined) ? '123456sy' : this.dockerPassword
let codeArr = []
shelljs.echo(` ###################### BUILD IMAGE NAME:${SERVICE_NAME} GIT_BRANCH: ${GIT_BRANCH_NAME} ######################`)
shelljs.echo(` ###################### BUILD IMAGE NAME:${SERVICE_NAME} GIT_BRANCH: ${GIT_BRANCH_NAME} ######################`)
console.log(`镜像名: ${DAOCLOUD_HOST}/${DOCKER_IMAGE}`)
codeArr.push(shelljs.exec(` docker login -u ${DOCKER_USERNAME} -p ${DOCKER_PASSWORD} ${DAOCLOUD_HOST}`).code)
codeArr.push(shelljs.exec(` docker build --pull --no-cache -t ${DAOCLOUD_HOST}/${DOCKER_IMAGE}:${GIT_BRANCH_NAME}_${GIT_TAG} --build-arg BASE_IMAGE=${GIT_BRANCH_NAME} .`).code)
codeArr.push(shelljs.exec(` docker tag ${DAOCLOUD_HOST}/${DOCKER_IMAGE}:${GIT_BRANCH_NAME}_${GIT_TAG} ${DAOCLOUD_HOST}/${DOCKER_IMAGE}:${GIT_BRANCH_NAME}_latest`).code)
codeArr.push(shelljs.exec(` docker push ${DAOCLOUD_HOST}/${DOCKER_IMAGE}:${GIT_BRANCH_NAME}_${GIT_TAG}`).code)
codeArr.push(shelljs.exec(` docker push ${DAOCLOUD_HOST}/${DOCKER_IMAGE}:${GIT_BRANCH_NAME}_latest`).code)
codeArr.push(shelljs.exec(` docker rmi ${DAOCLOUD_HOST}/${DOCKER_IMAGE}:${GIT_BRANCH_NAME}_${GIT_TAG}`).code)
codeArr.push(shelljs.exec(` docker rmi ${DAOCLOUD_HOST}/${DOCKER_IMAGE}:${GIT_BRANCH_NAME}_latest`).code)
let code = codeArr.reduce((pre, next) => {
return pre + next
})
console.log(`构建结果 ${code}`)
return code === 0 ? true : false
}
async reBoot(SERVICE: string, GIT_BRANCH_NAME: string) {
const HOOK_PORT = GIT_BRANCH_NAME === 'dev' ? 50081 : 50082
const REQ_ADDR = GIT_BRANCH_NAME === 'dev' ? '10.0.1.24' : '10.0.1.25'
console.log(`reboot address: http://${REQ_ADDR}:${HOOK_PORT}`)
console.log(`reboot service: ${SERVICE}`)
const res = await axios.get(`http://${REQ_ADDR}:${HOOK_PORT}/docker/build-image/${SERVICE}`)
console.log(`reboot response code: ${res.status}`)
return res.status == 200 ? true : false
}
async dingding(msg: string, GIT_BRANCH_NAME: string) {
const URL = (this.dingdingUrl == null || this.dingdingUrl == undefined) ? 'https://oapi.dingtalk.com/robot/send?access_token=dac1c21968a2535816d71f646eb4c84aaded4115fe3390529bdaeefa29468124' : this.dingdingUrl
const ATPEOPLES = (this.dingdingAtPeoples == null || this.dingdingAtPeoples == undefined) ? `["18336315834"]` : this.dingdingAtPeoples
console.log("URL:" + URL)
console.log("ATPEOPLES:" + ATPEOPLES)
if (GIT_BRANCH_NAME == 'master') {
const res = await axios.post(`${URL}`, `{"msgtype": "text", "text": {"content": "${msg}"},"at":{"atMobiles":${ATPEOPLES},"isAtAll":false}}`, { headers: { 'Content-Type': 'application/json' } })
console.log(res.data)
return
}
const res = await axios.post(`${URL}`, `{ "msgtype": "text", "text": { "content": "${msg}"}}`, { headers: { 'Content-Type': 'application/json' } })
console.log(res.data)
return
}
/**
*
* @param msg 要通知的内容
*/
// async enterpriseWeChat(msg: string, GIT_BRANCH_NAME: string) {
// const URL = (this.qiyeWeChatUrl == null || this.qiyeWeChatUrl == undefined) ? 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=04a50e5c-6dd5-4fc4-a052-c686184fe6ea' : this.qiyeWeChatUrl
// const ATPEOPLES = (this.weChatAtPeoples == null || this.weChatAtPeoples == undefined) ? `["15237118758", "18336315834"]` : this.weChatAtPeoples
// console.log("URL:" + URL)
// console.log("ATPEOPLES:" + ATPEOPLES)
// if (GIT_BRANCH_NAME == 'master') {
// await axios.post(`${URL}`, `{"msgtype": "text", "text": {"content": "${msg}","mentioned_mobile_list":${ATPEOPLES}}}`)
// return
// }
// await axios.post(`${URL}`, `{ "msgtype":"text", "text":{"content":"${msg}"}}`)
// return
// }
}
// new JenkinsCommand().dockerBuild('cdn-web', 'dev', '222', '10.0.1.32')