mirror of
https://gitcode.com/github-mirrors/react-native-update-cli.git
synced 2025-09-16 01:41:37 +08:00

* add logic to support SENTRY_PROPERTIES parameter * remove update.json and meta.json files in ppk * udpapte * refactor modles * update * add package-module file * update * update readme file * modifu cli.json file * fix command issues * improve version workflow logic * udpate * update * update * update * udpate * udpate * add example * update readme file * udpate version * change logic to use pushy command uniformly
343 lines
9.1 KiB
TypeScript
343 lines
9.1 KiB
TypeScript
#!/usr/bin/env ts-node
|
|
|
|
import { moduleManager } from '../../src/module-manager';
|
|
import type { CLIProvider, Platform } from '../../src/types';
|
|
|
|
/**
|
|
* Provider API 使用示例
|
|
* 演示如何使用 CLIProvider 进行编程式操作
|
|
*/
|
|
|
|
class DeploymentService {
|
|
private provider: CLIProvider;
|
|
|
|
constructor() {
|
|
this.provider = moduleManager.getProvider();
|
|
}
|
|
|
|
/**
|
|
* 自动化构建和发布流程
|
|
*/
|
|
async buildAndPublish(platform: Platform, version: string) {
|
|
console.log(
|
|
`🚀 开始 ${platform} 平台的构建和发布流程 (版本: ${version})\n`,
|
|
);
|
|
|
|
try {
|
|
// 1. 打包应用
|
|
console.log('📦 正在打包应用...');
|
|
const bundleResult = await this.provider.bundle({
|
|
platform,
|
|
dev: false,
|
|
sourcemap: true,
|
|
bundleName: `app-${version}.bundle`,
|
|
});
|
|
|
|
if (!bundleResult.success) {
|
|
throw new Error(`打包失败: ${bundleResult.error}`);
|
|
}
|
|
console.log('✅ 打包完成');
|
|
|
|
// 2. 发布版本
|
|
console.log('\n📡 正在发布版本...');
|
|
const publishResult = await this.provider.publish({
|
|
name: version,
|
|
description: `自动发布版本 ${version}`,
|
|
rollout: 100,
|
|
});
|
|
|
|
if (!publishResult.success) {
|
|
throw new Error(`发布失败: ${publishResult.error}`);
|
|
}
|
|
console.log('✅ 发布完成');
|
|
|
|
return {
|
|
success: true,
|
|
bundleData: bundleResult.data,
|
|
publishData: publishResult.data,
|
|
};
|
|
} catch (error) {
|
|
console.error('❌ 构建发布失败:', error);
|
|
return {
|
|
success: false,
|
|
error: error instanceof Error ? error.message : 'Unknown error',
|
|
};
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 应用管理示例
|
|
*/
|
|
async manageApp(platform: Platform) {
|
|
console.log(`📱 管理 ${platform} 应用\n`);
|
|
|
|
try {
|
|
// 获取当前选中的应用
|
|
const { appId } = await this.provider.getSelectedApp(platform);
|
|
console.log(`当前应用ID: ${appId}`);
|
|
|
|
// 列出应用版本
|
|
const versionsResult = await this.provider.listVersions(appId);
|
|
if (versionsResult.success && versionsResult.data) {
|
|
console.log('📋 应用版本列表:');
|
|
versionsResult.data.forEach((version: any, index: number) => {
|
|
console.log(` ${index + 1}. ${version.name} (${version.id})`);
|
|
});
|
|
}
|
|
|
|
// 列出应用包
|
|
const packagesResult = await (this.provider as any).listPackages(appId);
|
|
if (packagesResult.success && packagesResult.data) {
|
|
console.log('\n📦 应用包列表:');
|
|
packagesResult.data.forEach((pkg: any, index: number) => {
|
|
console.log(` ${index + 1}. ${pkg.name} (${pkg.id})`);
|
|
});
|
|
}
|
|
|
|
return { appId, platform };
|
|
} catch (error) {
|
|
console.error('❌ 应用管理失败:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 批量操作示例
|
|
*/
|
|
async batchOperations() {
|
|
console.log('🔄 批量操作示例\n');
|
|
|
|
const platforms: Platform[] = ['ios', 'android'];
|
|
const results = [];
|
|
|
|
for (const platform of platforms) {
|
|
try {
|
|
console.log(`--- 处理 ${platform} 平台 ---`);
|
|
|
|
// 获取平台信息
|
|
const platformInfo = await this.provider.getPlatform(platform);
|
|
console.log(`平台: ${platformInfo}`);
|
|
|
|
// 模拟打包操作
|
|
const bundleResult = await this.provider.bundle({
|
|
platform,
|
|
dev: true,
|
|
sourcemap: false,
|
|
});
|
|
|
|
results.push({
|
|
platform,
|
|
success: bundleResult.success,
|
|
data: bundleResult.data,
|
|
});
|
|
|
|
console.log(
|
|
`${platform} 处理完成: ${bundleResult.success ? '✅' : '❌'}\n`,
|
|
);
|
|
} catch (error) {
|
|
console.error(`${platform} 处理失败:`, error);
|
|
results.push({
|
|
platform,
|
|
success: false,
|
|
error: error instanceof Error ? error.message : 'Unknown error',
|
|
});
|
|
}
|
|
}
|
|
|
|
return results;
|
|
}
|
|
|
|
/**
|
|
* 文件上传示例
|
|
*/
|
|
async uploadExample() {
|
|
console.log('📤 文件上传示例\n');
|
|
|
|
// 模拟上传文件路径
|
|
const mockFilePaths = {
|
|
ios: '/path/to/app.ipa',
|
|
android: '/path/to/app.apk',
|
|
};
|
|
|
|
try {
|
|
for (const [platform, filePath] of Object.entries(mockFilePaths)) {
|
|
console.log(`上传 ${platform} 文件: ${filePath}`);
|
|
|
|
// 注意:这里是模拟,实际使用时需要真实的文件路径
|
|
const uploadResult = await this.provider.upload({
|
|
platform: platform as Platform,
|
|
filePath,
|
|
appId: 'mock-app-id',
|
|
});
|
|
|
|
console.log(
|
|
`${platform} 上传结果:`,
|
|
uploadResult.success ? '✅' : '❌',
|
|
);
|
|
if (!uploadResult.success) {
|
|
console.log(`错误: ${uploadResult.error}`);
|
|
}
|
|
}
|
|
} catch (error) {
|
|
console.error('❌ 上传过程中发生错误:', error);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 高级工作流示例
|
|
*/
|
|
async function demonstrateAdvancedWorkflows() {
|
|
console.log('\n🔧 高级工作流示例\n');
|
|
|
|
const provider = moduleManager.getProvider();
|
|
|
|
// 注册自定义工作流
|
|
provider.registerWorkflow({
|
|
name: 'advanced-ci-cd',
|
|
description: '高级CI/CD流程',
|
|
steps: [
|
|
{
|
|
name: 'environment-check',
|
|
description: '环境检查',
|
|
execute: async (context) => {
|
|
console.log('🔍 检查环境配置...');
|
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
return { environmentValid: true };
|
|
},
|
|
},
|
|
{
|
|
name: 'quality-gate',
|
|
description: '质量门禁',
|
|
execute: async (context, previousResult) => {
|
|
console.log('🛡️ 执行质量门禁检查...');
|
|
await new Promise((resolve) => setTimeout(resolve, 1500));
|
|
|
|
// 模拟质量检查
|
|
const qualityScore = Math.random() * 100;
|
|
const passed = qualityScore > 80;
|
|
|
|
console.log(
|
|
`质量分数: ${qualityScore.toFixed(1)}/100 ${passed ? '✅' : '❌'}`,
|
|
);
|
|
|
|
if (!passed) {
|
|
throw new Error('质量门禁检查未通过');
|
|
}
|
|
|
|
return { ...previousResult, qualityScore };
|
|
},
|
|
},
|
|
{
|
|
name: 'multi-platform-build',
|
|
description: '多平台构建',
|
|
execute: async (context, previousResult) => {
|
|
console.log('🏗️ 多平台并行构建...');
|
|
|
|
const platforms: Platform[] = ['ios', 'android'];
|
|
const buildResults = [];
|
|
|
|
// 模拟并行构建
|
|
for (const platform of platforms) {
|
|
console.log(` 构建 ${platform}...`);
|
|
await new Promise((resolve) => setTimeout(resolve, 800));
|
|
buildResults.push({ platform, success: true });
|
|
}
|
|
|
|
return { ...previousResult, builds: buildResults };
|
|
},
|
|
},
|
|
{
|
|
name: 'deployment-notification',
|
|
description: '部署通知',
|
|
execute: async (context, previousResult) => {
|
|
console.log('📢 发送部署通知...');
|
|
|
|
const notification = {
|
|
message: '部署完成',
|
|
platforms: previousResult.builds?.map((b: any) => b.platform) || [],
|
|
timestamp: new Date().toISOString(),
|
|
};
|
|
|
|
console.log('通知内容:', JSON.stringify(notification, null, 2));
|
|
|
|
return { ...previousResult, notification };
|
|
},
|
|
},
|
|
],
|
|
validate: (context) => {
|
|
if (!context.options.environment) {
|
|
console.error('❌ 必须指定环境参数');
|
|
return false;
|
|
}
|
|
return true;
|
|
},
|
|
options: {
|
|
environment: {
|
|
hasValue: true,
|
|
description: '部署环境 (必需)',
|
|
},
|
|
},
|
|
});
|
|
|
|
// 执行高级工作流
|
|
try {
|
|
const result = await provider.executeWorkflow('advanced-ci-cd', {
|
|
args: [],
|
|
options: {
|
|
environment: 'production',
|
|
},
|
|
});
|
|
console.log('\n🎉 高级工作流执行完成:', result);
|
|
} catch (error) {
|
|
console.error('❌ 高级工作流执行失败:', error);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 主函数
|
|
*/
|
|
async function main() {
|
|
console.log('🎯 Provider API 使用示例\n');
|
|
|
|
const service = new DeploymentService();
|
|
|
|
try {
|
|
// 1. 构建和发布示例
|
|
await service.buildAndPublish('ios', '1.2.3');
|
|
console.log('\n' + '='.repeat(50) + '\n');
|
|
|
|
// 2. 应用管理示例
|
|
await service.manageApp('ios');
|
|
console.log('\n' + '='.repeat(50) + '\n');
|
|
|
|
// 3. 批量操作示例
|
|
const batchResults = await service.batchOperations();
|
|
console.log('批量操作结果:', batchResults);
|
|
console.log('\n' + '='.repeat(50) + '\n');
|
|
|
|
// 4. 文件上传示例
|
|
await service.uploadExample();
|
|
console.log('\n' + '='.repeat(50) + '\n');
|
|
|
|
// 5. 高级工作流示例
|
|
await demonstrateAdvancedWorkflows();
|
|
} catch (error) {
|
|
console.error('❌ 示例执行失败:', error);
|
|
process.exit(1);
|
|
}
|
|
}
|
|
|
|
// 执行示例
|
|
if (require.main === module) {
|
|
main()
|
|
.then(() => {
|
|
console.log('\n✨ Provider API 示例执行完成');
|
|
process.exit(0);
|
|
})
|
|
.catch((error) => {
|
|
console.error('❌ 示例执行失败:', error);
|
|
process.exit(1);
|
|
});
|
|
}
|