clouddreamai-cicd-setup 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +189 -0
- package/bin/cicd-setup.js +3 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +187 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/gitlab-client.d.ts +80 -0
- package/dist/core/gitlab-client.d.ts.map +1 -0
- package/dist/core/gitlab-client.js +252 -0
- package/dist/core/gitlab-client.js.map +1 -0
- package/dist/core/types.d.ts +152 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +6 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/variables.d.ts +50 -0
- package/dist/core/variables.d.ts.map +1 -0
- package/dist/core/variables.js +243 -0
- package/dist/core/variables.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/prompts.d.ts +47 -0
- package/dist/utils/prompts.d.ts.map +1 -0
- package/dist/utils/prompts.js +369 -0
- package/dist/utils/prompts.js.map +1 -0
- package/dist/utils/template.d.ts +50 -0
- package/dist/utils/template.d.ts.map +1 -0
- package/dist/utils/template.js +189 -0
- package/dist/utils/template.js.map +1 -0
- package/package.json +50 -0
- package/templates/gitlab-ci/nestjs.yml +167 -0
- package/templates/gitlab-ci/vue.yml +167 -0
- package/templates/scripts/deploy.sh +141 -0
- package/templates/scripts/generate-env.sh +84 -0
package/README.md
ADDED
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
# CloudDreamAI CI/CD Setup
|
|
2
|
+
|
|
3
|
+
🚀 GitLab CI/CD 自动配置工具 - 支持 NestJS/Vue/React 项目的一键 CI/CD 配置
|
|
4
|
+
|
|
5
|
+
## 功能特性
|
|
6
|
+
|
|
7
|
+
- ✨ **交互式配置** - 友好的命令行交互,无需手动编辑配置文件
|
|
8
|
+
- 🔄 **自动化部署** - 自动生成 `.gitlab-ci.yml` 和部署脚本
|
|
9
|
+
- 🔐 **安全管理** - 自动上传 CI/CD 变量到 GitLab,支持加密和保护
|
|
10
|
+
- 📦 **多项目支持** - 支持 NestJS、Vue、React 等多种项目类型
|
|
11
|
+
- 🐳 **Docker 化** - 基于 Docker 的完整部署流程
|
|
12
|
+
- 🌍 **多环境** - 支持开发/生产环境分离或单服务器多环境
|
|
13
|
+
|
|
14
|
+
## 安装
|
|
15
|
+
|
|
16
|
+
### 全局安装(推荐)
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npm install -g clouddreamai-cicd-setup
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### 本地开发
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
cd clouddreamai-cicd-setup
|
|
26
|
+
npm install
|
|
27
|
+
npm run build
|
|
28
|
+
npm link
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## 使用方法
|
|
32
|
+
|
|
33
|
+
### 初始化 CI/CD 配置
|
|
34
|
+
|
|
35
|
+
在你的项目根目录运行:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
cicd-setup init
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
该命令会:
|
|
42
|
+
|
|
43
|
+
1. **交互式收集配置信息**
|
|
44
|
+
- GitLab 实例 URL 和 Access Token
|
|
45
|
+
- 项目类型(NestJS/Vue/React)
|
|
46
|
+
- Docker Hub 凭据
|
|
47
|
+
- 服务器信息和 SSH 密钥
|
|
48
|
+
- 环境变量文件
|
|
49
|
+
|
|
50
|
+
2. **测试 GitLab 连接**
|
|
51
|
+
- 验证 Token 有效性
|
|
52
|
+
- 获取用户信息
|
|
53
|
+
|
|
54
|
+
3. **生成配置文件**
|
|
55
|
+
- `.gitlab-ci.yml` - GitLab CI/CD 配置
|
|
56
|
+
- `ci/deploy.sh` - 部署脚本
|
|
57
|
+
- `ci/generate-env.sh` - 环境变量生成脚本
|
|
58
|
+
|
|
59
|
+
4. **上传 CI/CD 变量到 GitLab**
|
|
60
|
+
- 自动创建/更新所需的环境变量
|
|
61
|
+
- 支持加密(Masked)和保护(Protected)
|
|
62
|
+
|
|
63
|
+
### 仅生成文件(不上传变量)
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
cicd-setup init --dry-run
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### 指定输出目录
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
cicd-setup init --output /path/to/project
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## GitLab Token 创建
|
|
76
|
+
|
|
77
|
+
1. 登录 GitLab
|
|
78
|
+
2. 进入 **User Settings** → **Access Tokens**
|
|
79
|
+
3. 创建新 Token,至少需要以下权限:
|
|
80
|
+
- `api` - 访问 API
|
|
81
|
+
- `write_repository` - 写入仓库(用于 CI/CD)
|
|
82
|
+
4. 复制生成的 Token
|
|
83
|
+
|
|
84
|
+
## CI/CD 变量说明
|
|
85
|
+
|
|
86
|
+
工具会自动配置以下 GitLab CI/CD 变量:
|
|
87
|
+
|
|
88
|
+
| 变量名 | 类型 | 说明 | Protected | Masked |
|
|
89
|
+
|--------|------|------|-----------|--------|
|
|
90
|
+
| `GITLAB_ACCESS_TOKEN` | env_var | GitLab Personal Access Token | ✓ | ✓ |
|
|
91
|
+
| `DOCKER_HUB_USERNAME` | env_var | Docker Hub 用户名 | ✓ | ✗ |
|
|
92
|
+
| `DOCKER_HUB_PASSWORD` | env_var | Docker Hub 密码 | ✓ | ✓ |
|
|
93
|
+
| `SSH_PRIVATE_KEY` | env_var | 服务器 SSH 私钥 | ✓ | ✓ |
|
|
94
|
+
| `TEST_SERVER_HOST` | env_var | 测试服务器地址 | ✗ | ✗ |
|
|
95
|
+
| `PROD_SERVER_HOST` | env_var | 生产服务器地址 | ✓ | ✗ |
|
|
96
|
+
| `DEV_ENV_FILE` | file | 开发环境 .env 文件 | ✓ | ✗ |
|
|
97
|
+
| `PROD_ENV_FILE` | file | 生产环境 .env 文件 | ✓ | ✗ |
|
|
98
|
+
|
|
99
|
+
## CI/CD 流程
|
|
100
|
+
|
|
101
|
+
### 分支策略
|
|
102
|
+
|
|
103
|
+
- `develop` 分支 → 自动部署到开发环境
|
|
104
|
+
- `main` 分支 → 手动部署到生产环境
|
|
105
|
+
|
|
106
|
+
### Pipeline 阶段
|
|
107
|
+
|
|
108
|
+
1. **lint** - 代码质量检查
|
|
109
|
+
- NestJS: `npm run lint:check`
|
|
110
|
+
- Vue/React: `npm run type-check`
|
|
111
|
+
|
|
112
|
+
2. **build** - 构建 Docker 镜像
|
|
113
|
+
- 构建镜像并推送到 Docker Hub
|
|
114
|
+
- 支持 BuildKit 缓存加速
|
|
115
|
+
|
|
116
|
+
3. **deploy** - 部署到服务器
|
|
117
|
+
- 使用 rsync 同步代码
|
|
118
|
+
- 通过 SSH 执行远程部署
|
|
119
|
+
- 健康检查确保服务正常
|
|
120
|
+
|
|
121
|
+
## 项目结构
|
|
122
|
+
|
|
123
|
+
生成的文件结构:
|
|
124
|
+
|
|
125
|
+
```
|
|
126
|
+
your-project/
|
|
127
|
+
├── .gitlab-ci.yml # GitLab CI/CD 配置
|
|
128
|
+
└── ci/
|
|
129
|
+
├── deploy.sh # 部署脚本
|
|
130
|
+
└── generate-env.sh # 环境变量生成脚本
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## 服务器要求
|
|
134
|
+
|
|
135
|
+
- 安装 Docker 和 Docker Compose
|
|
136
|
+
- 配置 SSH 密钥认证
|
|
137
|
+
- 开放所需端口
|
|
138
|
+
|
|
139
|
+
## 常见问题
|
|
140
|
+
|
|
141
|
+
### 1. SSH 连接失败
|
|
142
|
+
|
|
143
|
+
检查:
|
|
144
|
+
- SSH 私钥格式是否正确
|
|
145
|
+
- 服务器是否允许 root 登录
|
|
146
|
+
- 防火墙配置
|
|
147
|
+
|
|
148
|
+
### 2. Docker 镜像拉取失败
|
|
149
|
+
|
|
150
|
+
检查:
|
|
151
|
+
- Docker Hub 凭据是否正确
|
|
152
|
+
- 镜像名称格式是否为 `username/image-name`
|
|
153
|
+
- 网络连接
|
|
154
|
+
|
|
155
|
+
### 3. 环境变量未生效
|
|
156
|
+
|
|
157
|
+
检查:
|
|
158
|
+
- CI/CD 变量是否正确上传到 GitLab
|
|
159
|
+
- 变量类型是否正确(env_var 或 file)
|
|
160
|
+
- Environment Scope 是否为 `*`
|
|
161
|
+
|
|
162
|
+
## 开发
|
|
163
|
+
|
|
164
|
+
### 本地开发
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
npm install
|
|
168
|
+
npm run dev
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### 构建
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
npm run build
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### 发布
|
|
178
|
+
|
|
179
|
+
```bash
|
|
180
|
+
npm publish
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
## License
|
|
184
|
+
|
|
185
|
+
MIT
|
|
186
|
+
|
|
187
|
+
## 作者
|
|
188
|
+
|
|
189
|
+
CloudDreamAI Team
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;GAGG"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* CloudDreamAI CI/CD Setup - CLI 入口
|
|
5
|
+
* 交互式 GitLab CI/CD 配置工具
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
41
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
42
|
+
};
|
|
43
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
44
|
+
const commander_1 = require("commander");
|
|
45
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
46
|
+
const ora_1 = __importDefault(require("ora"));
|
|
47
|
+
const prompts_1 = require("./utils/prompts");
|
|
48
|
+
const gitlab_client_1 = require("./core/gitlab-client");
|
|
49
|
+
const variables_1 = require("./core/variables");
|
|
50
|
+
const template_1 = require("./utils/template");
|
|
51
|
+
const path = __importStar(require("path"));
|
|
52
|
+
const program = new commander_1.Command();
|
|
53
|
+
program
|
|
54
|
+
.name('cicd-setup')
|
|
55
|
+
.description('CloudDreamAI GitLab CI/CD 自动配置工具')
|
|
56
|
+
.version('1.0.0');
|
|
57
|
+
program
|
|
58
|
+
.command('init')
|
|
59
|
+
.description('初始化 CI/CD 配置(交互式)')
|
|
60
|
+
.option('-o, --output <dir>', '输出目录', process.cwd())
|
|
61
|
+
.option('--dry-run', '仅生成文件,不上传变量到 GitLab')
|
|
62
|
+
.action(async (options) => {
|
|
63
|
+
try {
|
|
64
|
+
console.log(chalk_1.default.bold.cyan('\n🚀 CloudDreamAI CI/CD 自动配置工具\n'));
|
|
65
|
+
// 1. 收集配置信息
|
|
66
|
+
const collector = (0, prompts_1.createPromptCollector)();
|
|
67
|
+
const config = await collector.collectConfig();
|
|
68
|
+
// 2. 测试 GitLab 连接
|
|
69
|
+
const spinner = (0, ora_1.default)('正在测试 GitLab 连接...').start();
|
|
70
|
+
const gitlabClient = (0, gitlab_client_1.createGitLabClient)(config.gitlab);
|
|
71
|
+
const testResult = await gitlabClient.testConnection();
|
|
72
|
+
if (!testResult.success) {
|
|
73
|
+
spinner.fail(chalk_1.default.red(`GitLab 连接失败: ${testResult.error}`));
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
spinner.succeed(chalk_1.default.green(`GitLab 连接成功 (用户: ${testResult.data?.username})`));
|
|
77
|
+
// 3. 生成文件
|
|
78
|
+
spinner.start('正在生成 CI/CD 配置文件...');
|
|
79
|
+
const templateGenerator = (0, template_1.createTemplateGenerator)();
|
|
80
|
+
const generateResult = templateGenerator.generateAll(options.output, config.project.type, config.project, config.gitlab.baseUrl);
|
|
81
|
+
if (!generateResult.success) {
|
|
82
|
+
spinner.fail(chalk_1.default.red(`文件生成失败: ${generateResult.error}`));
|
|
83
|
+
process.exit(1);
|
|
84
|
+
}
|
|
85
|
+
spinner.succeed(chalk_1.default.green('CI/CD 配置文件生成成功'));
|
|
86
|
+
console.log(chalk_1.default.gray('\n生成的文件:'));
|
|
87
|
+
generateResult.files.forEach((file) => {
|
|
88
|
+
console.log(chalk_1.default.gray(` - ${path.relative(process.cwd(), file)}`));
|
|
89
|
+
});
|
|
90
|
+
if (options.dryRun) {
|
|
91
|
+
console.log(chalk_1.default.yellow('\n⚠️ --dry-run 模式:已跳过上传变量到 GitLab\n'));
|
|
92
|
+
console.log(chalk_1.default.cyan('后续步骤:'));
|
|
93
|
+
console.log(chalk_1.default.gray(' 1. 提交生成的文件到 Git 仓库'));
|
|
94
|
+
console.log(chalk_1.default.gray(' 2. 手动在 GitLab 项目中配置 CI/CD 变量'));
|
|
95
|
+
console.log(chalk_1.default.gray(' 3. 或使用 `cicd-setup upload` 命令上传变量\n'));
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
// 4. 搜索或选择项目
|
|
99
|
+
spinner.start('正在获取 GitLab 项目列表...');
|
|
100
|
+
const projectsResult = await gitlabClient.listProjects(1, 10);
|
|
101
|
+
if (!projectsResult.success || !projectsResult.data) {
|
|
102
|
+
spinner.fail(chalk_1.default.red(`获取项目列表失败: ${projectsResult.error}`));
|
|
103
|
+
process.exit(1);
|
|
104
|
+
}
|
|
105
|
+
spinner.stop();
|
|
106
|
+
const inquirer = (await Promise.resolve().then(() => __importStar(require('inquirer')))).default;
|
|
107
|
+
const { selectedProject } = await inquirer.prompt([
|
|
108
|
+
{
|
|
109
|
+
type: 'list',
|
|
110
|
+
name: 'selectedProject',
|
|
111
|
+
message: '选择要配置的 GitLab 项目:',
|
|
112
|
+
choices: projectsResult.data.map((p) => ({
|
|
113
|
+
name: `${p.path_with_namespace} (${p.default_branch})`,
|
|
114
|
+
value: p.id,
|
|
115
|
+
})),
|
|
116
|
+
},
|
|
117
|
+
]);
|
|
118
|
+
// 5. 生成并上传变量
|
|
119
|
+
spinner.start('正在生成 CI/CD 变量...');
|
|
120
|
+
const variableConfigurator = (0, variables_1.createVariableConfigurator)();
|
|
121
|
+
const variables = variableConfigurator.generateVariables(config);
|
|
122
|
+
// 验证配置
|
|
123
|
+
const validation = variableConfigurator.validateConfig(config);
|
|
124
|
+
if (!validation.valid) {
|
|
125
|
+
spinner.fail(chalk_1.default.red('配置验证失败:'));
|
|
126
|
+
validation.errors.forEach((err) => {
|
|
127
|
+
console.log(chalk_1.default.red(` - ${err}`));
|
|
128
|
+
});
|
|
129
|
+
process.exit(1);
|
|
130
|
+
}
|
|
131
|
+
spinner.succeed(chalk_1.default.green(`生成了 ${variables.length} 个 CI/CD 变量`));
|
|
132
|
+
// 显示变量摘要
|
|
133
|
+
console.log(chalk_1.default.cyan('\nCI/CD 变量摘要:'));
|
|
134
|
+
console.log(chalk_1.default.gray(variableConfigurator.getVariableSummary(variables)));
|
|
135
|
+
// 确认上传
|
|
136
|
+
const { confirm } = await inquirer.prompt([
|
|
137
|
+
{
|
|
138
|
+
type: 'confirm',
|
|
139
|
+
name: 'confirm',
|
|
140
|
+
message: '确认上传这些变量到 GitLab?',
|
|
141
|
+
default: true,
|
|
142
|
+
},
|
|
143
|
+
]);
|
|
144
|
+
if (!confirm) {
|
|
145
|
+
console.log(chalk_1.default.yellow('\n⚠️ 已取消上传变量\n'));
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
// 6. 批量上传变量
|
|
149
|
+
spinner.start('正在上传 CI/CD 变量到 GitLab...');
|
|
150
|
+
const uploadResult = await gitlabClient.batchUpsertVariables(selectedProject, variables);
|
|
151
|
+
if (uploadResult.success.length > 0) {
|
|
152
|
+
spinner.succeed(chalk_1.default.green(`成功上传 ${uploadResult.success.length} 个变量`));
|
|
153
|
+
uploadResult.success.forEach((key) => {
|
|
154
|
+
console.log(chalk_1.default.green(` ✓ ${key}`));
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
if (uploadResult.failed.length > 0) {
|
|
158
|
+
console.log(chalk_1.default.red(`\n失败 ${uploadResult.failed.length} 个变量:`));
|
|
159
|
+
uploadResult.failed.forEach(({ key, error }) => {
|
|
160
|
+
console.log(chalk_1.default.red(` ✗ ${key}: ${error}`));
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
console.log(chalk_1.default.bold.green('\n✨ CI/CD 配置完成!\n'));
|
|
164
|
+
console.log(chalk_1.default.cyan('后续步骤:'));
|
|
165
|
+
console.log(chalk_1.default.gray(' 1. 提交生成的文件到 Git 仓库'));
|
|
166
|
+
console.log(chalk_1.default.gray(' 2. 推送到 GitLab (main 或 develop 分支)'));
|
|
167
|
+
console.log(chalk_1.default.gray(' 3. 查看 CI/CD Pipeline 运行状态\n'));
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
console.error(chalk_1.default.red('\n❌ 发生错误:'), error);
|
|
171
|
+
process.exit(1);
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
program
|
|
175
|
+
.command('upload')
|
|
176
|
+
.description('仅上传 CI/CD 变量到 GitLab(需要已有配置)')
|
|
177
|
+
.option('-c, --config <file>', '配置文件路径 (JSON 格式)')
|
|
178
|
+
.action(async (options) => {
|
|
179
|
+
console.log(chalk_1.default.yellow('\n⚠️ upload 命令尚未实现\n'));
|
|
180
|
+
console.log(chalk_1.default.gray('提示: 使用 `cicd-setup init` 完成完整配置\n'));
|
|
181
|
+
});
|
|
182
|
+
program.parse(process.argv);
|
|
183
|
+
// 如果没有提供命令,显示帮助
|
|
184
|
+
if (!process.argv.slice(2).length) {
|
|
185
|
+
program.outputHelp();
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;AAEA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,yCAAoC;AACpC,kDAA0B;AAC1B,8CAAsB;AACtB,6CAAwD;AACxD,wDAA0D;AAC1D,gDAA8D;AAC9D,+CAA2D;AAC3D,2CAA6B;AAE7B,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CAAC,kCAAkC,CAAC;KAC/C,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,mBAAmB,CAAC;KAChC,MAAM,CAAC,oBAAoB,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;KACnD,MAAM,CAAC,WAAW,EAAE,qBAAqB,CAAC;KAC1C,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC,CAAC;QAEjE,YAAY;QACZ,MAAM,SAAS,GAAG,IAAA,+BAAqB,GAAE,CAAC;QAC1C,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,aAAa,EAAE,CAAC;QAE/C,kBAAkB;QAClB,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,mBAAmB,CAAC,CAAC,KAAK,EAAE,CAAC;QACjD,MAAM,YAAY,GAAG,IAAA,kCAAkB,EAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC,cAAc,EAAE,CAAC;QAEvD,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,eAAK,CAAC,GAAG,CAAC,gBAAgB,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,OAAO,CACb,eAAK,CAAC,KAAK,CAAC,oBAAoB,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,CAAC,CAC9D,CAAC;QAEF,UAAU;QACV,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACpC,MAAM,iBAAiB,GAAG,IAAA,kCAAuB,GAAE,CAAC;QACpD,MAAM,cAAc,GAAG,iBAAiB,CAAC,WAAW,CAClD,OAAO,CAAC,MAAM,EACd,MAAM,CAAC,OAAO,CAAC,IAAI,EACnB,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,MAAM,CAAC,OAAO,CACtB,CAAC;QAEF,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC,eAAK,CAAC,GAAG,CAAC,WAAW,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,OAAO,CAAC,eAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QACpC,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACpC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,MAAM,CACV,sCAAsC,CACvC,CACF,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC,CAAC;YACjE,OAAO;QACT,CAAC;QAED,aAAa;QACb,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACrC,MAAM,cAAc,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAE9D,IAAI,CAAC,cAAc,CAAC,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,eAAK,CAAC,GAAG,CAAC,aAAa,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,MAAM,QAAQ,GAAG,CAAC,wDAAa,UAAU,GAAC,CAAC,CAAC,OAAO,CAAC;QACpD,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;YAChD;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,iBAAiB;gBACvB,OAAO,EAAE,mBAAmB;gBAC5B,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACvC,IAAI,EAAE,GAAG,CAAC,CAAC,mBAAmB,KAAK,CAAC,CAAC,cAAc,GAAG;oBACtD,KAAK,EAAE,CAAC,CAAC,EAAE;iBACZ,CAAC,CAAC;aACJ;SACF,CAAC,CAAC;QAEH,aAAa;QACb,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAClC,MAAM,oBAAoB,GAAG,IAAA,sCAA0B,GAAE,CAAC;QAC1D,MAAM,SAAS,GAAG,oBAAoB,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAEjE,OAAO;QACP,MAAM,UAAU,GAAG,oBAAoB,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC/D,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC,eAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;YACnC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;gBAChC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC;YACvC,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,OAAO,CAAC,eAAK,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,MAAM,aAAa,CAAC,CAAC,CAAC;QAEnE,SAAS;QACT,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAC/D,CAAC;QAEF,OAAO;QACP,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;YACxC;gBACE,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,mBAAmB;gBAC5B,OAAO,EAAE,IAAI;aACd;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC;YAC7C,OAAO;QACT,CAAC;QAED,YAAY;QACZ,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC1C,MAAM,YAAY,GAAG,MAAM,YAAY,CAAC,oBAAoB,CAC1D,eAAe,EACf,SAAS,CACV,CAAC;QAEF,IAAI,YAAY,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpC,OAAO,CAAC,OAAO,CACb,eAAK,CAAC,KAAK,CAAC,QAAQ,YAAY,CAAC,OAAO,CAAC,MAAM,MAAM,CAAC,CACvD,CAAC;YACF,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;gBACnC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC;YACzC,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,YAAY,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,QAAQ,YAAY,CAAC,MAAM,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC;YAClE,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE;gBAC7C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,OAAO,GAAG,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC;YACjD,CAAC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,CAAC;IAC3D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC,CAAC;QAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,8BAA8B,CAAC;KAC3C,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,CAAC;KACjD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC,CAAC;AAC/D,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAE5B,gBAAgB;AAChB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAClC,OAAO,CAAC,UAAU,EAAE,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CloudDreamAI CI/CD Setup - GitLab API 客户端
|
|
3
|
+
*/
|
|
4
|
+
import { GitLabConfig, GitLabProject, GitLabVariable, CICDVariable, ApiResult } from './types';
|
|
5
|
+
/**
|
|
6
|
+
* GitLab API 客户端
|
|
7
|
+
* 封装 GitLab REST API 调用
|
|
8
|
+
*/
|
|
9
|
+
export declare class GitLabClient {
|
|
10
|
+
private client;
|
|
11
|
+
private config;
|
|
12
|
+
constructor(config: GitLabConfig);
|
|
13
|
+
/**
|
|
14
|
+
* 测试连接和 Token 有效性
|
|
15
|
+
*/
|
|
16
|
+
testConnection(): Promise<ApiResult<{
|
|
17
|
+
username: string;
|
|
18
|
+
}>>;
|
|
19
|
+
/**
|
|
20
|
+
* 获取项目信息
|
|
21
|
+
* @param projectPath 项目路径,如 "group/project-name"
|
|
22
|
+
*/
|
|
23
|
+
getProject(projectPath: string): Promise<ApiResult<GitLabProject>>;
|
|
24
|
+
/**
|
|
25
|
+
* 根据项目 ID 获取项目信息
|
|
26
|
+
*/
|
|
27
|
+
getProjectById(projectId: number): Promise<ApiResult<GitLabProject>>;
|
|
28
|
+
/**
|
|
29
|
+
* 搜索项目
|
|
30
|
+
* @param search 搜索关键词
|
|
31
|
+
*/
|
|
32
|
+
searchProjects(search: string): Promise<ApiResult<GitLabProject[]>>;
|
|
33
|
+
/**
|
|
34
|
+
* 列出用户有权限的所有项目
|
|
35
|
+
*/
|
|
36
|
+
listProjects(page?: number, perPage?: number): Promise<ApiResult<GitLabProject[]>>;
|
|
37
|
+
/**
|
|
38
|
+
* 获取项目的所有 CI/CD 变量
|
|
39
|
+
*/
|
|
40
|
+
listVariables(projectId: number): Promise<ApiResult<GitLabVariable[]>>;
|
|
41
|
+
/**
|
|
42
|
+
* 获取单个变量
|
|
43
|
+
*/
|
|
44
|
+
getVariable(projectId: number, key: string): Promise<ApiResult<GitLabVariable>>;
|
|
45
|
+
/**
|
|
46
|
+
* 创建 CI/CD 变量
|
|
47
|
+
*/
|
|
48
|
+
createVariable(projectId: number, variable: CICDVariable): Promise<ApiResult<GitLabVariable>>;
|
|
49
|
+
/**
|
|
50
|
+
* 更新 CI/CD 变量
|
|
51
|
+
*/
|
|
52
|
+
updateVariable(projectId: number, variable: CICDVariable): Promise<ApiResult<GitLabVariable>>;
|
|
53
|
+
/**
|
|
54
|
+
* 创建或更新变量(如果存在则更新,不存在则创建)
|
|
55
|
+
*/
|
|
56
|
+
upsertVariable(projectId: number, variable: CICDVariable): Promise<ApiResult<GitLabVariable>>;
|
|
57
|
+
/**
|
|
58
|
+
* 删除 CI/CD 变量
|
|
59
|
+
*/
|
|
60
|
+
deleteVariable(projectId: number, key: string): Promise<ApiResult<void>>;
|
|
61
|
+
/**
|
|
62
|
+
* 批量创建或更新变量
|
|
63
|
+
*/
|
|
64
|
+
batchUpsertVariables(projectId: number, variables: CICDVariable[]): Promise<{
|
|
65
|
+
success: string[];
|
|
66
|
+
failed: Array<{
|
|
67
|
+
key: string;
|
|
68
|
+
error: string;
|
|
69
|
+
}>;
|
|
70
|
+
}>;
|
|
71
|
+
/**
|
|
72
|
+
* 统一错误处理
|
|
73
|
+
*/
|
|
74
|
+
private handleError;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* 创建 GitLab 客户端实例
|
|
78
|
+
*/
|
|
79
|
+
export declare function createGitLabClient(config: GitLabConfig): GitLabClient;
|
|
80
|
+
//# sourceMappingURL=gitlab-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitlab-client.d.ts","sourceRoot":"","sources":["../../src/core/gitlab-client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,YAAY,EACZ,aAAa,EACb,cAAc,EACd,YAAY,EACZ,SAAS,EACV,MAAM,SAAS,CAAC;AAEjB;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAAe;gBAEjB,MAAM,EAAE,YAAY;IAkBhC;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,SAAS,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAYhE;;;OAGG;IACG,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAUxE;;OAEG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAS1E;;;OAGG;IACG,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,aAAa,EAAE,CAAC,CAAC;IAezE;;OAEG;IACG,YAAY,CAAC,IAAI,SAAI,EAAE,OAAO,SAAK,GAAG,OAAO,CAAC,SAAS,CAAC,aAAa,EAAE,CAAC,CAAC;IAmB/E;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC,CAAC;IAS5E;;OAEG;IACG,WAAW,CACf,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IAWrC;;OAEG;IACG,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,YAAY,GACrB,OAAO,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IAoBrC;;OAEG;IACG,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,YAAY,GACrB,OAAO,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IAmBrC;;OAEG;IACG,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,YAAY,GACrB,OAAO,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IAarC;;OAEG;IACG,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAW3B;;OAEG;IACG,oBAAoB,CACxB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,YAAY,EAAE,GACxB,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,KAAK,CAAC;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;IAgBhF;;OAEG;IACH,OAAO,CAAC,WAAW;CAwBpB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CAErE"}
|