UNPKG

@notadd/cli

Version:

notadd core none dependence

150 lines (141 loc) 7.77 kB
import { Command } from '@notadd/cli-core' import shelljs from 'shelljs' import axios from 'axios'; import { Args, Controller, EntityService } from '@notadd/core'; @Controller() 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 @Command('jenkins') async build( @Args(`sn`) serviceName: string, @Args(`gb`) gitBranchName: string, @Args(`gt`) gitTag: string, @Args(`du`) dockerUsername: string, @Args(`dp`) dockerPassword: string, @Args(`pf`) prefix: string, @Args(`dd`) reqAddr: string, @Args(`d1du`) dingdingUrl: string, @Args(`ddp`) dingdingAtPeoples: string, @Args(`qyu`) qiyeWeChatUrl: string, @Args(`qyp`) weChatAtPeoples: string, @Args(`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')