UNPKG

@tarojs/plugin-mini-ci

Version:

Taro 小程序端构建后支持CI(持续集成)的插件

174 lines 7.64 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /* eslint-disable no-console */ const fs = require("node:fs"); const path = require("node:path"); const BaseCi_1 = require("./BaseCi"); const npm_1 = require("./utils/npm"); const qrcode_1 = require("./utils/qrcode"); /** * 钉钉小程序CI https://github.com/open-dingtalk/dingtalk-design-cli/blob/develop/packages/opensdk/package.json */ class DingtalkCI extends BaseCi_1.default { init() { if (this.pluginOpts.dd == null) { throw new Error('请为"@tarojs/plugin-mini-ci"插件配置 "dd" 选项'); } const { printLog, processTypeEnum, chalk } = this.ctx.helper; const { token } = this.pluginOpts.dd; try { this.dingtalkSDK = (0, npm_1.getNpmPkgSync)('dingtalk-miniapp-opensdk', process.cwd()).sdk; } catch (error) { printLog("error" /* processTypeEnum.ERROR */, chalk.red('请安装依赖:dingtalk-miniapp-opensdk , 该依赖用于CI预览、上传钉钉小程序')); process.exit(1); } this.dingtalkSDK.setConfig({ appKey: '', appSecret: '', accessToken: token, host: 'https://oapi.dingtalk.com', }); const appInfo = JSON.parse(fs.readFileSync(path.join(this.projectPath, 'app.json'), { encoding: 'utf8' })); this.entryPage = appInfo.pages[0]; } // 和支付宝小程序共用ide async open() { const { devToolsInstallPath, projectType = 'dingtalk-biz' } = this.pluginOpts.dd; const { chalk, printLog, processTypeEnum } = this.ctx.helper; let minidev; try { minidev = (0, npm_1.getNpmPkgSync)('minidev', process.cwd()); } catch (error) { printLog("error" /* processTypeEnum.ERROR */, chalk.red('请安装依赖:minidev ,该依赖用于编译后自动打开小程序开发者工具')); process.exit(1); } try { printLog("start" /* processTypeEnum.START */, '小程序开发者工具...', this.projectPath); await minidev.minidev.startIde(Object.assign({ project: this.projectPath, projectType, }, devToolsInstallPath ? { appPath: devToolsInstallPath } : {})); } catch (error) { printLog("error" /* processTypeEnum.ERROR */, chalk.red(error.message)); } } // 特性: CI 内部会自己打印二维码; 预览版不会上传到后台,只有预览码作为入口访问 async preview() { const { chalk, printLog, processTypeEnum } = this.ctx.helper; const { appid, } = this.pluginOpts.dd; try { const previewUrl = await this.dingtalkSDK.previewBuild({ project: this.projectPath, miniAppId: appid, page: this.entryPage, query: '', ignoreHttpReqPermission: true, ignoreWebViewDomainCheck: true, buildTarget: 'Preview', onProgressUpdate(info) { // logger.debug('拉取构建结果', info); console.log('info.status', info.status); if (info.status === 'failed') { console.error('构建失败'); } else if (info.status === 'overtime') { console.error('构建超时'); } else if (info.status === 'success') { console.log('构建成功', info); } }, }); const previewQrcodePath = path.join(this.projectPath, 'preview.png'); await (0, qrcode_1.generateQrcodeImageFile)(previewQrcodePath, previewUrl); printLog("remind" /* processTypeEnum.REMIND */, `预览版二维码已生成,存储在:"${previewQrcodePath}",二维码内容是:"${previewUrl}"`); this.triggerPreviewHooks({ success: true, data: { platform: 'dd', qrCodeContent: previewUrl, qrCodeLocalPath: previewQrcodePath } }); } catch (error) { printLog("error" /* processTypeEnum.ERROR */, chalk.red(`预览失败 ${new Date().toLocaleString()} \n${error.message}`)); this.triggerPreviewHooks({ success: false, data: { platform: 'dd', qrCodeContent: '', qrCodeLocalPath: '' }, error }); } } // 特性: CI内部暂时未支持上传后返回体验码,等待官方支持: https://github.com/open-dingtalk/dingtalk-design-cli/issues/34 async upload() { const { chalk, printLog, processTypeEnum } = this.ctx.helper; const { appid } = this.pluginOpts.dd; printLog("start" /* processTypeEnum.START */, '上传代码到钉钉小程序后台'); let hasDone = false; const uploadCommonParams = { project: this.projectPath, miniAppId: appid, packageVersion: this.version }; try { const result = await this.dingtalkSDK.miniUpload(Object.assign(Object.assign({}, uploadCommonParams), { onProgressUpdate: info => { console.log(info); const { data = {}, status } = info; const logId = path.basename(data.logUrl || ''); // @ts-ignore const log = data.log; if (status === 'success') { if (!hasDone) { console.log('构建成功'); console.log('本次上传版本号', data.version); hasDone = true; } } else if (status === 'building') { console.log(`构建中,正在查询构建结果。 ${logId ? `logId: ${logId}` : ''}`); } else if (status === 'overtime') { console.log('构建超时,请重试', log); } else if (status === 'failed') { console.log('构建失败', logId); console.error(log); } } })); // 体验码规则:dingtalk://dingtalkclient/action/open_micro_app?corpId=xxx&miniAppId=yyy&source=trial&version=构建id&agentId=xxx&pVersion=1&packageType=1 console.log(chalk.green(`版本 ${result.packageVersion} 上传成功 ${new Date().toLocaleString()}`)); this.triggerUploadHooks({ success: true, data: { platform: 'dd', qrCodeContent: '', qrCodeLocalPath: '' } }); } catch (error) { printLog("error" /* processTypeEnum.ERROR */, chalk.red(`体验版上传失败 ${new Date().toLocaleString()} \n${error.message}`)); this.triggerUploadHooks({ success: false, data: { platform: 'dd', qrCodeContent: '', qrCodeLocalPath: '' }, error }); } } } exports.default = DingtalkCI; //# sourceMappingURL=DingtalkCI.js.map