clouddreamai-cicd-setup 1.0.5 → 1.2.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/dist/cli.js CHANGED
@@ -48,6 +48,7 @@ const prompts_1 = require("./utils/prompts");
48
48
  const gitlab_client_1 = require("./core/gitlab-client");
49
49
  const variables_1 = require("./core/variables");
50
50
  const template_1 = require("./utils/template");
51
+ const package_helper_1 = require("./utils/package-helper");
51
52
  const path = __importStar(require("path"));
52
53
  const fs_1 = require("fs");
53
54
  // 读取 package.json 获取版本号
@@ -77,7 +78,17 @@ program
77
78
  process.exit(1);
78
79
  }
79
80
  spinner.succeed(chalk_1.default.green(`GitLab 连接成功 (用户: ${testResult.data?.username})`));
80
- // 3. 生成文件
81
+ // 3. 检查并修复 package.json
82
+ spinner.start('检查 package.json scripts...');
83
+ const packageHelper = (0, package_helper_1.createPackageHelper)();
84
+ const packageResult = await packageHelper.ensureLintScripts(options.output, config.project.type);
85
+ if (packageResult.modified) {
86
+ spinner.succeed(chalk_1.default.green(`已添加 ${packageResult.addedScripts.length} 个 script: ${packageResult.addedScripts.join(', ')}`));
87
+ }
88
+ else {
89
+ spinner.succeed(chalk_1.default.green('package.json 检查完成'));
90
+ }
91
+ // 4. 生成文件
81
92
  spinner.start('正在生成 CI/CD 配置文件...');
82
93
  const templateGenerator = (0, template_1.createTemplateGenerator)();
83
94
  const generateResult = await templateGenerator.generateAll(options.output, config.project.type, config.project, config.gitlab.baseUrl, config.registry.type);
@@ -174,7 +185,7 @@ program
174
185
  console.log(chalk_1.default.yellow('\n⚠️ 已取消上传变量\n'));
175
186
  return;
176
187
  }
177
- // 6. 批量上传变量
188
+ // 7. 批量上传变量
178
189
  spinner.start('正在上传 CI/CD 变量到 GitLab...');
179
190
  const uploadResult = await gitlabClient.batchUpsertVariables(selectedProject, variables);
180
191
  if (uploadResult.success.length > 0) {
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
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,2DAA6D;AAC7D,2CAA6B;AAC7B,2BAAkC;AAElC,wBAAwB;AACxB,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,IAAA,iBAAY,EAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC,CAC/D,CAAC;AAEF,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CAAC,kCAAkC,CAAC;KAC/C,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AAEhC,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,wBAAwB;QACxB,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC5C,MAAM,aAAa,GAAG,IAAA,oCAAmB,GAAE,CAAC;QAC5C,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC,iBAAiB,CACzD,OAAO,CAAC,MAAM,EACd,MAAM,CAAC,OAAO,CAAC,IAAI,CACpB,CAAC;QAEF,IAAI,aAAa,CAAC,QAAQ,EAAE,CAAC;YAC3B,OAAO,CAAC,OAAO,CACb,eAAK,CAAC,KAAK,CACT,OAAO,aAAa,CAAC,YAAY,CAAC,MAAM,cAAc,aAAa,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC9F,CACF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,OAAO,CAAC,eAAK,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;QACpD,CAAC;QAED,UAAU;QACV,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACpC,MAAM,iBAAiB,GAAG,IAAA,kCAAuB,GAAE,CAAC;QACpD,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAAC,WAAW,CACxD,OAAO,CAAC,MAAM,EACd,MAAM,CAAC,OAAO,CAAC,IAAI,EACnB,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,MAAM,CAAC,OAAO,EACrB,MAAM,CAAC,QAAQ,CAAC,IAAI,CACrB,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,UAAU;QACV,MAAM,QAAQ,GAAG,CAAC,wDAAa,UAAU,GAAC,CAAC,CAAC,OAAO,CAAC;QAEpD,IAAI,eAAe,GAAkB,IAAI,CAAC;QAE1C,OAAO,CAAC,eAAe,EAAE,CAAC;YACxB,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;gBAC9C;oBACE,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,eAAe;oBACrB,OAAO,EAAE,0BAA0B;oBACnC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU;iBAC/C;aACF,CAAC,CAAC;YAEH,OAAO,CAAC,KAAK,CAAC,WAAW,aAAa,MAAM,CAAC,CAAC;YAC9C,MAAM,cAAc,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAE/D,IAAI,CAAC,cAAc,CAAC,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;gBACpD,OAAO,CAAC,IAAI,CAAC,eAAK,CAAC,GAAG,CAAC,aAAa,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,YAAY;YACZ,MAAM,gBAAgB,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACtD,CAAC,CAAC,mBAAmB,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC;gBACzE,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,CAC3D,CAAC;YAEF,OAAO,CAAC,IAAI,EAAE,CAAC;YAEf,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAClC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,YAAY,aAAa,eAAe,CAAC,CAAC,CAAC;gBACpE,SAAS;YACX,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,QAAQ,gBAAgB,CAAC,MAAM,YAAY,CAAC,CAAC,CAAC;YAEtE,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;gBAC9C;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,eAAe;oBACrB,OAAO,EAAE,WAAW;oBACpB,OAAO,EAAE;wBACP,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;4BAC9B,IAAI,EAAE,GAAG,CAAC,CAAC,mBAAmB,KAAK,CAAC,CAAC,cAAc,GAAG;4BACtD,KAAK,EAAE,CAAC,CAAC,EAAE;yBACZ,CAAC,CAAC;wBACH,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE;qBAC3C;iBACF;aACF,CAAC,CAAC;YAEH,IAAI,aAAa,KAAK,cAAc,EAAE,CAAC;gBACrC,SAAS;YACX,CAAC;YAED,eAAe,GAAG,aAAa,CAAC;QAClC,CAAC;QAED,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,26 @@
1
+ /**
2
+ * CloudDreamAI CI/CD Setup - package.json 辅助工具
3
+ * 用于检查和添加必要的 npm scripts
4
+ */
5
+ import { ProjectType } from '../core/types';
6
+ /**
7
+ * package.json 辅助类
8
+ */
9
+ export declare class PackageHelper {
10
+ /**
11
+ * 检查并修复 package.json 中的 lint 命令
12
+ */
13
+ ensureLintScripts(projectDir: string, projectType: ProjectType): Promise<{
14
+ modified: boolean;
15
+ addedScripts: string[];
16
+ }>;
17
+ /**
18
+ * 获取需要添加的脚本
19
+ */
20
+ private getRequiredScripts;
21
+ }
22
+ /**
23
+ * 创建 PackageHelper 实例
24
+ */
25
+ export declare function createPackageHelper(): PackageHelper;
26
+ //# sourceMappingURL=package-helper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-helper.d.ts","sourceRoot":"","sources":["../../src/utils/package-helper.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C;;GAEG;AACH,qBAAa,aAAa;IACxB;;OAEG;IACG,iBAAiB,CACrB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,YAAY,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAgEzD;;OAEG;IACH,OAAO,CAAC,kBAAkB;CAyE3B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,aAAa,CAEnD"}
@@ -0,0 +1,176 @@
1
+ "use strict";
2
+ /**
3
+ * CloudDreamAI CI/CD Setup - package.json 辅助工具
4
+ * 用于检查和添加必要的 npm scripts
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.PackageHelper = void 0;
41
+ exports.createPackageHelper = createPackageHelper;
42
+ const fs = __importStar(require("fs"));
43
+ const path = __importStar(require("path"));
44
+ /**
45
+ * package.json 辅助类
46
+ */
47
+ class PackageHelper {
48
+ /**
49
+ * 检查并修复 package.json 中的 lint 命令
50
+ */
51
+ async ensureLintScripts(projectDir, projectType) {
52
+ const packageJsonPath = path.join(projectDir, 'package.json');
53
+ if (!fs.existsSync(packageJsonPath)) {
54
+ console.log('\n⚠️ 未找到 package.json,跳过脚本检查\n');
55
+ return { modified: false, addedScripts: [] };
56
+ }
57
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
58
+ const scripts = packageJson.scripts || {};
59
+ const addedScripts = [];
60
+ let modified = false;
61
+ // 根据项目类型确定需要的命令
62
+ const requiredScripts = this.getRequiredScripts(projectType, scripts);
63
+ if (requiredScripts.length === 0) {
64
+ return { modified: false, addedScripts: [] };
65
+ }
66
+ console.log('\n📋 检查 package.json scripts...\n');
67
+ // 询问用户是否添加
68
+ const inquirer = (await Promise.resolve().then(() => __importStar(require('inquirer')))).default;
69
+ const { confirm } = await inquirer.prompt([
70
+ {
71
+ type: 'confirm',
72
+ name: 'confirm',
73
+ message: `检测到缺少以下推荐的 npm scripts,是否自动添加?\n${requiredScripts.map((s) => ` - ${s.name}: ${s.command}`).join('\n')}\n`,
74
+ default: true,
75
+ },
76
+ ]);
77
+ if (!confirm) {
78
+ console.log('\n⚠️ 已跳过添加 scripts,CI/CD 将使用智能检测\n');
79
+ return { modified: false, addedScripts: [] };
80
+ }
81
+ // 添加缺失的脚本
82
+ for (const script of requiredScripts) {
83
+ packageJson.scripts[script.name] = script.command;
84
+ addedScripts.push(script.name);
85
+ modified = true;
86
+ }
87
+ if (modified) {
88
+ // 备份原文件
89
+ const backupPath = `${packageJsonPath}.backup`;
90
+ fs.copyFileSync(packageJsonPath, backupPath);
91
+ // 写入更新后的 package.json
92
+ fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\n', 'utf-8');
93
+ console.log(`\n✅ 已添加 ${addedScripts.length} 个 script`);
94
+ console.log(` 备份文件: ${backupPath}\n`);
95
+ }
96
+ return { modified, addedScripts };
97
+ }
98
+ /**
99
+ * 获取需要添加的脚本
100
+ */
101
+ getRequiredScripts(projectType, existingScripts) {
102
+ const required = [];
103
+ // NestJS 项目
104
+ if (projectType === 'nestjs' || projectType === 'node') {
105
+ // 检查是否有 lint:check
106
+ if (!existingScripts['lint:check']) {
107
+ // 如果有 lint,基于它创建 lint:check
108
+ if (existingScripts['lint']) {
109
+ const lintCommand = existingScripts['lint'];
110
+ // 移除 --fix 参数
111
+ const checkCommand = lintCommand.replace(/\s+--fix\s*$/, '').trim();
112
+ required.push({
113
+ name: 'lint:check',
114
+ command: checkCommand,
115
+ description: 'ESLint 检查(不自动修复)',
116
+ });
117
+ }
118
+ else {
119
+ // 默认 NestJS lint 命令
120
+ required.push({
121
+ name: 'lint:check',
122
+ command: 'eslint "{src,apps,libs,test}/**/*.ts"',
123
+ description: 'ESLint 检查',
124
+ });
125
+ required.push({
126
+ name: 'lint',
127
+ command: 'eslint "{src,apps,libs,test}/**/*.ts" --fix',
128
+ description: 'ESLint 检查并自动修复',
129
+ });
130
+ }
131
+ }
132
+ }
133
+ // Vue/React 项目
134
+ if (projectType === 'vue' || projectType === 'react') {
135
+ // 检查是否有 type-check
136
+ if (!existingScripts['type-check']) {
137
+ if (projectType === 'vue') {
138
+ required.push({
139
+ name: 'type-check',
140
+ command: 'vue-tsc --noEmit',
141
+ description: 'TypeScript 类型检查',
142
+ });
143
+ }
144
+ else {
145
+ required.push({
146
+ name: 'type-check',
147
+ command: 'tsc --noEmit',
148
+ description: 'TypeScript 类型检查',
149
+ });
150
+ }
151
+ }
152
+ // 如果没有 lint:check 也没有 lint
153
+ if (!existingScripts['lint:check'] && !existingScripts['lint']) {
154
+ required.push({
155
+ name: 'lint',
156
+ command: 'eslint . --ext .ts,.tsx,.vue --fix',
157
+ description: 'ESLint 检查并自动修复',
158
+ });
159
+ required.push({
160
+ name: 'lint:check',
161
+ command: 'eslint . --ext .ts,.tsx,.vue',
162
+ description: 'ESLint 检查',
163
+ });
164
+ }
165
+ }
166
+ return required;
167
+ }
168
+ }
169
+ exports.PackageHelper = PackageHelper;
170
+ /**
171
+ * 创建 PackageHelper 实例
172
+ */
173
+ function createPackageHelper() {
174
+ return new PackageHelper();
175
+ }
176
+ //# sourceMappingURL=package-helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-helper.js","sourceRoot":"","sources":["../../src/utils/package-helper.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "clouddreamai-cicd-setup",
3
- "version": "1.0.5",
3
+ "version": "1.2.0",
4
4
  "description": "CloudDreamAI GitLab CI/CD 自动配置工具 - 支持 NestJS/Vue/React 项目的一键 CI/CD 配置",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -35,7 +35,7 @@ lint:
35
35
  - .npm/
36
36
  policy: pull-push
37
37
  before_script:
38
- - apk add --no-cache git curl
38
+ - apk add --no-cache git curl jq
39
39
  - git --version
40
40
  - echo "Setting up Git authentication..."
41
41
  - git config --global http.sslVerify false
@@ -43,7 +43,67 @@ lint:
43
43
  - git config --global url."https://oauth2:${GITLAB_ACCESS_TOKEN}@{{GITLAB_HOST}}".insteadOf "https://{{GITLAB_HOST}}"
44
44
  - npm ci --cache .npm --prefer-offline
45
45
  script:
46
- - {{LINT_COMMAND}}
46
+ - |
47
+ # 智能检测并运行 lint 命令
48
+ echo "检测可用的 lint 命令..."
49
+ LINT_FAILED=0
50
+
51
+ if npm run | grep -q "lint:check"; then
52
+ echo "✓ 运行 npm run lint:check"
53
+ if ! npm run lint:check; then
54
+ LINT_FAILED=1
55
+ fi
56
+ elif npm run | grep -q "lint"; then
57
+ echo "✓ 运行 npm run lint"
58
+ if ! npm run lint; then
59
+ LINT_FAILED=1
60
+ fi
61
+ elif npm run | grep -q "type-check"; then
62
+ echo "✓ 运行 npm run type-check"
63
+ if ! npm run type-check; then
64
+ LINT_FAILED=1
65
+ fi
66
+ else
67
+ echo "⚠️ 未找到 lint 相关命令,跳过代码检查"
68
+ echo "建议在 package.json 中添加以下命令之一:"
69
+ echo " - lint:check (推荐)"
70
+ echo " - lint"
71
+ echo " - type-check"
72
+ fi
73
+
74
+ # 如果 lint 失败,输出友好的中文提示
75
+ if [ $LINT_FAILED -eq 1 ]; then
76
+ echo ""
77
+ echo "======================================================================"
78
+ echo "❌ 代码质量检查未通过"
79
+ echo "======================================================================"
80
+ echo ""
81
+ echo "📋 发现了一些代码质量问题,需要修复后才能继续部署。"
82
+ echo ""
83
+ echo "🔧 快速修复方法:"
84
+ echo ""
85
+ echo " 1. 在本地运行自动修复:"
86
+ echo " npm run lint"
87
+ echo ""
88
+ echo " 2. 查看具体问题:"
89
+ echo " npm run lint:check"
90
+ echo ""
91
+ echo " 3. 修复后提交:"
92
+ echo " git add ."
93
+ echo " git commit -m \"fix: 修复代码质量问题\""
94
+ echo " git push"
95
+ echo ""
96
+ echo "💡 常见问题类型:"
97
+ echo " - TypeScript 类型安全问题(使用了 any 类型)"
98
+ echo " - 未使用的变量或导入"
99
+ echo " - async 函数缺少 await"
100
+ echo " - Promise 未正确处理"
101
+ echo ""
102
+ echo "📖 详细错误信息请查看上方输出"
103
+ echo "======================================================================"
104
+ echo ""
105
+ exit 1
106
+ fi
47
107
  only:
48
108
  - merge_requests
49
109
  - main
@@ -92,8 +152,6 @@ deploy_dev:
92
152
  # 使用密码认证,跳过 SSH 主机密钥检查
93
153
  - echo "StrictHostKeyChecking no" >> ~/.ssh/config
94
154
  - chmod 600 ~/.ssh/config
95
- - echo "StrictHostKeyChecking no" >> ~/.ssh/config
96
- - chmod 600 ~/.ssh/config
97
155
  script:
98
156
  - sshpass -p "$SSH_PASSWORD" ssh root@$TEST_SERVER_HOST "mkdir -p $DEPLOY_DIR"
99
157
  - sshpass -p "$SSH_PASSWORD" ssh root@$TEST_SERVER_HOST "which rsync || apk add --no-cache rsync"
@@ -102,7 +160,7 @@ deploy_dev:
102
160
  - sshpass -p "$SSH_PASSWORD" ssh root@$TEST_SERVER_HOST "export REGISTRY_URL='$CI_REGISTRY' && export REGISTRY_USERNAME='$CI_REGISTRY_USER' && export REGISTRY_PASSWORD='$CI_REGISTRY_PASSWORD' && export APP_PORT='$APP_PORT' && cd $DEPLOY_DIR && chmod +x ci/deploy.sh && bash ci/deploy.sh $ENV_TYPE gitlab"
103
161
  environment:
104
162
  name: development
105
- url: {{DEV_URL}}
163
+ url: "{{DEV_URL}}"
106
164
  only:
107
165
  - develop
108
166
 
@@ -125,8 +183,6 @@ deploy_prod:
125
183
  # 使用密码认证,跳过 SSH 主机密钥检查
126
184
  - echo "StrictHostKeyChecking no" >> ~/.ssh/config
127
185
  - chmod 600 ~/.ssh/config
128
- - echo "StrictHostKeyChecking no" >> ~/.ssh/config
129
- - chmod 600 ~/.ssh/config
130
186
  script:
131
187
  - sshpass -p "$SSH_PASSWORD" ssh root@$PROD_SERVER_HOST "mkdir -p $DEPLOY_DIR"
132
188
  - sshpass -p "$SSH_PASSWORD" ssh root@$PROD_SERVER_HOST "which rsync || apk add --no-cache rsync"
@@ -135,7 +191,7 @@ deploy_prod:
135
191
  - sshpass -p "$SSH_PASSWORD" ssh root@$PROD_SERVER_HOST "export REGISTRY_URL='$CI_REGISTRY' && export REGISTRY_USERNAME='$CI_REGISTRY_USER' && export REGISTRY_PASSWORD='$CI_REGISTRY_PASSWORD' && export APP_PORT='$APP_PORT' && cd $DEPLOY_DIR && chmod +x ci/deploy.sh && bash ci/deploy.sh $ENV_TYPE gitlab"
136
192
  environment:
137
193
  name: production
138
- url: {{PROD_URL}}
194
+ url: "{{PROD_URL}}"
139
195
  only:
140
196
  - main
141
197
  when: manual
@@ -151,20 +207,19 @@ rollback:
151
207
  APP_PORT: "{{PROD_PORT}}"
152
208
  cache: {}
153
209
  before_script:
154
- - apk add --no-cache openssh-client openssl
210
+ - apk add --no-cache sshpass bash openssl
155
211
  - mkdir -p ~/.ssh
156
212
  - chmod 700 ~/.ssh
157
213
  # 使用密码认证,跳过 SSH 主机密钥检查
158
214
  - echo "StrictHostKeyChecking no" >> ~/.ssh/config
159
215
  - chmod 600 ~/.ssh/config
160
- - chmod 644 ~/.ssh/known_hosts
161
216
  script:
162
217
  - sshpass -p "$SSH_PASSWORD" ssh root@$PROD_SERVER_HOST "cd $DEPLOY_DIR && export APP_PORT=$APP_PORT && docker-compose down"
163
218
  - sshpass -p "$SSH_PASSWORD" ssh root@$PROD_SERVER_HOST "cd $DEPLOY_DIR && export APP_PORT=$APP_PORT && docker-compose pull"
164
219
  - sshpass -p "$SSH_PASSWORD" ssh root@$PROD_SERVER_HOST "cd $DEPLOY_DIR && export APP_PORT=$APP_PORT && docker-compose up -d"
165
220
  environment:
166
221
  name: production
167
- url: {{PROD_URL}}
222
+ url: "{{PROD_URL}}"
168
223
  when: manual
169
224
  only:
170
225
  - main
@@ -35,7 +35,7 @@ lint:
35
35
  - .npm/
36
36
  policy: pull-push
37
37
  before_script:
38
- - apk add --no-cache git curl
38
+ - apk add --no-cache git curl jq
39
39
  - git --version
40
40
  - echo "Setting up Git authentication..."
41
41
  - git config --global http.sslVerify false
@@ -43,7 +43,67 @@ lint:
43
43
  - git config --global url."https://oauth2:${GITLAB_ACCESS_TOKEN}@{{GITLAB_HOST}}".insteadOf "https://{{GITLAB_HOST}}"
44
44
  - npm ci --cache .npm --prefer-offline
45
45
  script:
46
- - {{LINT_COMMAND}}
46
+ - |
47
+ # 智能检测并运行 lint 命令
48
+ echo "检测可用的 lint 命令..."
49
+ LINT_FAILED=0
50
+
51
+ if npm run | grep -q "lint:check"; then
52
+ echo "✓ 运行 npm run lint:check"
53
+ if ! npm run lint:check; then
54
+ LINT_FAILED=1
55
+ fi
56
+ elif npm run | grep -q "lint"; then
57
+ echo "✓ 运行 npm run lint"
58
+ if ! npm run lint; then
59
+ LINT_FAILED=1
60
+ fi
61
+ elif npm run | grep -q "type-check"; then
62
+ echo "✓ 运行 npm run type-check"
63
+ if ! npm run type-check; then
64
+ LINT_FAILED=1
65
+ fi
66
+ else
67
+ echo "⚠️ 未找到 lint 相关命令,跳过代码检查"
68
+ echo "建议在 package.json 中添加以下命令之一:"
69
+ echo " - lint:check (推荐)"
70
+ echo " - lint"
71
+ echo " - type-check"
72
+ fi
73
+
74
+ # 如果 lint 失败,输出友好的中文提示
75
+ if [ $LINT_FAILED -eq 1 ]; then
76
+ echo ""
77
+ echo "======================================================================"
78
+ echo "❌ 代码质量检查未通过"
79
+ echo "======================================================================"
80
+ echo ""
81
+ echo "📋 发现了一些代码质量问题,需要修复后才能继续部署。"
82
+ echo ""
83
+ echo "🔧 快速修复方法:"
84
+ echo ""
85
+ echo " 1. 在本地运行自动修复:"
86
+ echo " npm run lint"
87
+ echo ""
88
+ echo " 2. 查看具体问题:"
89
+ echo " npm run lint:check"
90
+ echo ""
91
+ echo " 3. 修复后提交:"
92
+ echo " git add ."
93
+ echo " git commit -m \"fix: 修复代码质量问题\""
94
+ echo " git push"
95
+ echo ""
96
+ echo "💡 常见问题类型:"
97
+ echo " - TypeScript 类型安全问题(使用了 any 类型)"
98
+ echo " - 未使用的变量或导入"
99
+ echo " - async 函数缺少 await"
100
+ echo " - Promise 未正确处理"
101
+ echo ""
102
+ echo "📖 详细错误信息请查看上方输出"
103
+ echo "======================================================================"
104
+ echo ""
105
+ exit 1
106
+ fi
47
107
  only:
48
108
  - merge_requests
49
109
  - main
@@ -57,10 +117,48 @@ build:
57
117
  name: docker:24.0.5
58
118
  pull_policy: if-not-present
59
119
  before_script:
120
+ - |
121
+ # 智能检测并运行 lint 命令
122
+ echo "检测可用的 lint 命令..."
123
+ if npm run | grep -q "lint:check"; then
124
+ echo "✓ 运行 npm run lint:check"
125
+ npm run lint:check
126
+ elif npm run | grep -q "lint"; then
127
+ echo "✓ 运行 npm run lint"
128
+ npm run lint
129
+ elif npm run | grep -q "type-check"; then
130
+ echo "✓ 运行 npm run type-check"
131
+ npm run type-check
132
+ else
133
+ echo "⚠️ 未找到 lint 相关命令,跳过代码检查"
134
+ echo "建议在 package.json 中添加以下命令之一:"
135
+ echo " - lint:check (推荐)"
136
+ echo " - lint"
137
+ echo " - type-check"
138
+ fi
60
139
  - docker info
61
140
  - echo "登录到Docker Hub..."
62
141
  - echo "$DOCKER_HUB_PASSWORD" | docker login -u $DOCKER_HUB_USERNAME --password-stdin
63
142
  script:
143
+ - |
144
+ # 智能检测并运行 lint 命令
145
+ echo "检测可用的 lint 命令..."
146
+ if npm run | grep -q "lint:check"; then
147
+ echo "✓ 运行 npm run lint:check"
148
+ npm run lint:check
149
+ elif npm run | grep -q "lint"; then
150
+ echo "✓ 运行 npm run lint"
151
+ npm run lint
152
+ elif npm run | grep -q "type-check"; then
153
+ echo "✓ 运行 npm run type-check"
154
+ npm run type-check
155
+ else
156
+ echo "⚠️ 未找到 lint 相关命令,跳过代码检查"
157
+ echo "建议在 package.json 中添加以下命令之一:"
158
+ echo " - lint:check (推荐)"
159
+ echo " - lint"
160
+ echo " - type-check"
161
+ fi
64
162
  - echo "尝试拉取最新镜像作为缓存..."
65
163
  - docker pull $DOCKER_HUB_IMAGE:latest || true
66
164
  - echo "构建Docker镜像..."
@@ -86,18 +184,56 @@ deploy_dev:
86
184
  REGISTRY_TYPE: "{{REGISTRY_TYPE}}"
87
185
  cache: {}
88
186
  before_script:
187
+ - |
188
+ # 智能检测并运行 lint 命令
189
+ echo "检测可用的 lint 命令..."
190
+ if npm run | grep -q "lint:check"; then
191
+ echo "✓ 运行 npm run lint:check"
192
+ npm run lint:check
193
+ elif npm run | grep -q "lint"; then
194
+ echo "✓ 运行 npm run lint"
195
+ npm run lint
196
+ elif npm run | grep -q "type-check"; then
197
+ echo "✓ 运行 npm run type-check"
198
+ npm run type-check
199
+ else
200
+ echo "⚠️ 未找到 lint 相关命令,跳过代码检查"
201
+ echo "建议在 package.json 中添加以下命令之一:"
202
+ echo " - lint:check (推荐)"
203
+ echo " - lint"
204
+ echo " - type-check"
205
+ fi
89
206
  - apk add --no-cache sshpass bash openssl rsync
90
207
  - mkdir -p ~/.ssh
91
208
  - chmod 700 ~/.ssh
92
209
  - chmod 644 ~/.ssh/known_hosts
93
210
  script:
211
+ - |
212
+ # 智能检测并运行 lint 命令
213
+ echo "检测可用的 lint 命令..."
214
+ if npm run | grep -q "lint:check"; then
215
+ echo "✓ 运行 npm run lint:check"
216
+ npm run lint:check
217
+ elif npm run | grep -q "lint"; then
218
+ echo "✓ 运行 npm run lint"
219
+ npm run lint
220
+ elif npm run | grep -q "type-check"; then
221
+ echo "✓ 运行 npm run type-check"
222
+ npm run type-check
223
+ else
224
+ echo "⚠️ 未找到 lint 相关命令,跳过代码检查"
225
+ echo "建议在 package.json 中添加以下命令之一:"
226
+ echo " - lint:check (推荐)"
227
+ echo " - lint"
228
+ echo " - type-check"
229
+ fi
94
230
  - sshpass -p "$SSH_PASSWORD" ssh root@$TEST_SERVER_HOST "mkdir -p $DEPLOY_DIR"
95
231
  - sshpass -p "$SSH_PASSWORD" ssh root@$TEST_SERVER_HOST "which rsync || apk add --no-cache rsync"
96
232
  - sshpass -p "$SSH_PASSWORD" rsync -avz --delete --exclude='.git/' --exclude='node_modules/' . root@$TEST_SERVER_HOST:$DEPLOY_DIR/
97
233
  - sshpass -p "$SSH_PASSWORD" ssh root@$TEST_SERVER_HOST "export DOCKER_HUB_USERNAME='$DOCKER_HUB_USERNAME' && export DOCKER_HUB_PASSWORD='$DOCKER_HUB_PASSWORD' && export APP_PORT='$APP_PORT' && cd $DEPLOY_DIR && chmod +x ci/deploy.sh && bash ci/deploy.sh $ENV_TYPE $REGISTRY_TYPE"
98
234
  environment:
99
235
  name: development
100
- url: {{DEV_URL}}
236
+ url: "{{DEV_URL}}"
101
237
  only:
102
238
  - develop
103
239
 
@@ -115,18 +251,56 @@ deploy_prod:
115
251
  REGISTRY_TYPE: "{{REGISTRY_TYPE}}"
116
252
  cache: {}
117
253
  before_script:
254
+ - |
255
+ # 智能检测并运行 lint 命令
256
+ echo "检测可用的 lint 命令..."
257
+ if npm run | grep -q "lint:check"; then
258
+ echo "✓ 运行 npm run lint:check"
259
+ npm run lint:check
260
+ elif npm run | grep -q "lint"; then
261
+ echo "✓ 运行 npm run lint"
262
+ npm run lint
263
+ elif npm run | grep -q "type-check"; then
264
+ echo "✓ 运行 npm run type-check"
265
+ npm run type-check
266
+ else
267
+ echo "⚠️ 未找到 lint 相关命令,跳过代码检查"
268
+ echo "建议在 package.json 中添加以下命令之一:"
269
+ echo " - lint:check (推荐)"
270
+ echo " - lint"
271
+ echo " - type-check"
272
+ fi
118
273
  - apk add --no-cache sshpass bash openssl rsync
119
274
  - mkdir -p ~/.ssh
120
275
  - chmod 700 ~/.ssh
121
276
  - chmod 644 ~/.ssh/known_hosts
122
277
  script:
278
+ - |
279
+ # 智能检测并运行 lint 命令
280
+ echo "检测可用的 lint 命令..."
281
+ if npm run | grep -q "lint:check"; then
282
+ echo "✓ 运行 npm run lint:check"
283
+ npm run lint:check
284
+ elif npm run | grep -q "lint"; then
285
+ echo "✓ 运行 npm run lint"
286
+ npm run lint
287
+ elif npm run | grep -q "type-check"; then
288
+ echo "✓ 运行 npm run type-check"
289
+ npm run type-check
290
+ else
291
+ echo "⚠️ 未找到 lint 相关命令,跳过代码检查"
292
+ echo "建议在 package.json 中添加以下命令之一:"
293
+ echo " - lint:check (推荐)"
294
+ echo " - lint"
295
+ echo " - type-check"
296
+ fi
123
297
  - sshpass -p "$SSH_PASSWORD" ssh root@$PROD_SERVER_HOST "mkdir -p $DEPLOY_DIR"
124
298
  - sshpass -p "$SSH_PASSWORD" ssh root@$PROD_SERVER_HOST "which rsync || apk add --no-cache rsync"
125
299
  - sshpass -p "$SSH_PASSWORD" rsync -avz --delete --exclude='.git/' --exclude='node_modules/' . root@$PROD_SERVER_HOST:$DEPLOY_DIR/
126
300
  - sshpass -p "$SSH_PASSWORD" ssh root@$PROD_SERVER_HOST "export DOCKER_HUB_USERNAME='$DOCKER_HUB_USERNAME' && export DOCKER_HUB_PASSWORD='$DOCKER_HUB_PASSWORD' && export APP_PORT='$APP_PORT' && cd $DEPLOY_DIR && chmod +x ci/deploy.sh && bash ci/deploy.sh $ENV_TYPE $REGISTRY_TYPE"
127
301
  environment:
128
302
  name: production
129
- url: {{PROD_URL}}
303
+ url: "{{PROD_URL}}"
130
304
  only:
131
305
  - main
132
306
  when: manual
@@ -142,17 +316,55 @@ rollback:
142
316
  APP_PORT: "{{PROD_PORT}}"
143
317
  cache: {}
144
318
  before_script:
319
+ - |
320
+ # 智能检测并运行 lint 命令
321
+ echo "检测可用的 lint 命令..."
322
+ if npm run | grep -q "lint:check"; then
323
+ echo "✓ 运行 npm run lint:check"
324
+ npm run lint:check
325
+ elif npm run | grep -q "lint"; then
326
+ echo "✓ 运行 npm run lint"
327
+ npm run lint
328
+ elif npm run | grep -q "type-check"; then
329
+ echo "✓ 运行 npm run type-check"
330
+ npm run type-check
331
+ else
332
+ echo "⚠️ 未找到 lint 相关命令,跳过代码检查"
333
+ echo "建议在 package.json 中添加以下命令之一:"
334
+ echo " - lint:check (推荐)"
335
+ echo " - lint"
336
+ echo " - type-check"
337
+ fi
145
338
  - apk add --no-cache openssh-client openssl
146
339
  - mkdir -p ~/.ssh
147
340
  - chmod 700 ~/.ssh
148
341
  - chmod 644 ~/.ssh/known_hosts
149
342
  script:
343
+ - |
344
+ # 智能检测并运行 lint 命令
345
+ echo "检测可用的 lint 命令..."
346
+ if npm run | grep -q "lint:check"; then
347
+ echo "✓ 运行 npm run lint:check"
348
+ npm run lint:check
349
+ elif npm run | grep -q "lint"; then
350
+ echo "✓ 运行 npm run lint"
351
+ npm run lint
352
+ elif npm run | grep -q "type-check"; then
353
+ echo "✓ 运行 npm run type-check"
354
+ npm run type-check
355
+ else
356
+ echo "⚠️ 未找到 lint 相关命令,跳过代码检查"
357
+ echo "建议在 package.json 中添加以下命令之一:"
358
+ echo " - lint:check (推荐)"
359
+ echo " - lint"
360
+ echo " - type-check"
361
+ fi
150
362
  - sshpass -p "$SSH_PASSWORD" ssh root@$PROD_SERVER_HOST "cd $DEPLOY_DIR && export APP_PORT=$APP_PORT && docker-compose down"
151
363
  - sshpass -p "$SSH_PASSWORD" ssh root@$PROD_SERVER_HOST "cd $DEPLOY_DIR && export APP_PORT=$APP_PORT && docker-compose pull"
152
364
  - sshpass -p "$SSH_PASSWORD" ssh root@$PROD_SERVER_HOST "cd $DEPLOY_DIR && export APP_PORT=$APP_PORT && docker-compose up -d"
153
365
  environment:
154
366
  name: production
155
- url: {{PROD_URL}}
367
+ url: "{{PROD_URL}}"
156
368
  when: manual
157
369
  only:
158
370
  - main
@@ -35,7 +35,7 @@ lint:
35
35
  - .npm/
36
36
  policy: pull-push
37
37
  before_script:
38
- - apk add --no-cache git curl
38
+ - apk add --no-cache git curl jq
39
39
  - git --version
40
40
  - echo "Setting up Git authentication..."
41
41
  - git config --global http.sslVerify false
@@ -43,7 +43,67 @@ lint:
43
43
  - git config --global url."https://oauth2:${GITLAB_ACCESS_TOKEN}@{{GITLAB_HOST}}".insteadOf "https://{{GITLAB_HOST}}"
44
44
  - npm ci --cache .npm --prefer-offline
45
45
  script:
46
- - {{LINT_COMMAND}}
46
+ - |
47
+ # 智能检测并运行 lint 命令
48
+ echo "检测可用的 lint 命令..."
49
+ LINT_FAILED=0
50
+
51
+ if npm run | grep -q "lint:check"; then
52
+ echo "✓ 运行 npm run lint:check"
53
+ if ! npm run lint:check; then
54
+ LINT_FAILED=1
55
+ fi
56
+ elif npm run | grep -q "lint"; then
57
+ echo "✓ 运行 npm run lint"
58
+ if ! npm run lint; then
59
+ LINT_FAILED=1
60
+ fi
61
+ elif npm run | grep -q "type-check"; then
62
+ echo "✓ 运行 npm run type-check"
63
+ if ! npm run type-check; then
64
+ LINT_FAILED=1
65
+ fi
66
+ else
67
+ echo "⚠️ 未找到 lint 相关命令,跳过代码检查"
68
+ echo "建议在 package.json 中添加以下命令之一:"
69
+ echo " - lint:check (推荐)"
70
+ echo " - lint"
71
+ echo " - type-check"
72
+ fi
73
+
74
+ # 如果 lint 失败,输出友好的中文提示
75
+ if [ $LINT_FAILED -eq 1 ]; then
76
+ echo ""
77
+ echo "======================================================================"
78
+ echo "❌ 代码质量检查未通过"
79
+ echo "======================================================================"
80
+ echo ""
81
+ echo "📋 发现了一些代码质量问题,需要修复后才能继续部署。"
82
+ echo ""
83
+ echo "🔧 快速修复方法:"
84
+ echo ""
85
+ echo " 1. 在本地运行自动修复:"
86
+ echo " npm run lint"
87
+ echo ""
88
+ echo " 2. 查看具体问题:"
89
+ echo " npm run lint:check"
90
+ echo ""
91
+ echo " 3. 修复后提交:"
92
+ echo " git add ."
93
+ echo " git commit -m \"fix: 修复代码质量问题\""
94
+ echo " git push"
95
+ echo ""
96
+ echo "💡 常见问题类型:"
97
+ echo " - TypeScript 类型安全问题(使用了 any 类型)"
98
+ echo " - 未使用的变量或导入"
99
+ echo " - async 函数缺少 await"
100
+ echo " - Promise 未正确处理"
101
+ echo ""
102
+ echo "📖 详细错误信息请查看上方输出"
103
+ echo "======================================================================"
104
+ echo ""
105
+ exit 1
106
+ fi
47
107
  only:
48
108
  - merge_requests
49
109
  - main
@@ -57,11 +117,49 @@ build:
57
117
  name: docker:24.0.5
58
118
  pull_policy: if-not-present
59
119
  before_script:
120
+ - |
121
+ # 智能检测并运行 lint 命令
122
+ echo "检测可用的 lint 命令..."
123
+ if npm run | grep -q "lint:check"; then
124
+ echo "✓ 运行 npm run lint:check"
125
+ npm run lint:check
126
+ elif npm run | grep -q "lint"; then
127
+ echo "✓ 运行 npm run lint"
128
+ npm run lint
129
+ elif npm run | grep -q "type-check"; then
130
+ echo "✓ 运行 npm run type-check"
131
+ npm run type-check
132
+ else
133
+ echo "⚠️ 未找到 lint 相关命令,跳过代码检查"
134
+ echo "建议在 package.json 中添加以下命令之一:"
135
+ echo " - lint:check (推荐)"
136
+ echo " - lint"
137
+ echo " - type-check"
138
+ fi
60
139
  - docker info
61
140
  - echo "登录到 GitLab Container Registry..."
62
141
  # 使用 GitLab CI 预定义变量登录
63
142
  - echo "$CI_REGISTRY_PASSWORD" | docker login -u $CI_REGISTRY_USER --password-stdin $CI_REGISTRY
64
143
  script:
144
+ - |
145
+ # 智能检测并运行 lint 命令
146
+ echo "检测可用的 lint 命令..."
147
+ if npm run | grep -q "lint:check"; then
148
+ echo "✓ 运行 npm run lint:check"
149
+ npm run lint:check
150
+ elif npm run | grep -q "lint"; then
151
+ echo "✓ 运行 npm run lint"
152
+ npm run lint
153
+ elif npm run | grep -q "type-check"; then
154
+ echo "✓ 运行 npm run type-check"
155
+ npm run type-check
156
+ else
157
+ echo "⚠️ 未找到 lint 相关命令,跳过代码检查"
158
+ echo "建议在 package.json 中添加以下命令之一:"
159
+ echo " - lint:check (推荐)"
160
+ echo " - lint"
161
+ echo " - type-check"
162
+ fi
65
163
  - echo "尝试拉取最新镜像作为缓存..."
66
164
  - docker pull $DOCKER_IMAGE:latest || true
67
165
  - echo "构建Docker镜像..."
@@ -86,6 +184,25 @@ deploy_dev:
86
184
  APP_PORT: "{{DEV_PORT}}"
87
185
  cache: {}
88
186
  before_script:
187
+ - |
188
+ # 智能检测并运行 lint 命令
189
+ echo "检测可用的 lint 命令..."
190
+ if npm run | grep -q "lint:check"; then
191
+ echo "✓ 运行 npm run lint:check"
192
+ npm run lint:check
193
+ elif npm run | grep -q "lint"; then
194
+ echo "✓ 运行 npm run lint"
195
+ npm run lint
196
+ elif npm run | grep -q "type-check"; then
197
+ echo "✓ 运行 npm run type-check"
198
+ npm run type-check
199
+ else
200
+ echo "⚠️ 未找到 lint 相关命令,跳过代码检查"
201
+ echo "建议在 package.json 中添加以下命令之一:"
202
+ echo " - lint:check (推荐)"
203
+ echo " - lint"
204
+ echo " - type-check"
205
+ fi
89
206
  - apk add --no-cache sshpass bash openssl rsync
90
207
  - mkdir -p ~/.ssh
91
208
  - chmod 700 ~/.ssh
@@ -94,6 +211,25 @@ deploy_dev:
94
211
  - chmod 600 ~/.ssh/config
95
212
  - chmod 644 ~/.ssh/known_hosts
96
213
  script:
214
+ - |
215
+ # 智能检测并运行 lint 命令
216
+ echo "检测可用的 lint 命令..."
217
+ if npm run | grep -q "lint:check"; then
218
+ echo "✓ 运行 npm run lint:check"
219
+ npm run lint:check
220
+ elif npm run | grep -q "lint"; then
221
+ echo "✓ 运行 npm run lint"
222
+ npm run lint
223
+ elif npm run | grep -q "type-check"; then
224
+ echo "✓ 运行 npm run type-check"
225
+ npm run type-check
226
+ else
227
+ echo "⚠️ 未找到 lint 相关命令,跳过代码检查"
228
+ echo "建议在 package.json 中添加以下命令之一:"
229
+ echo " - lint:check (推荐)"
230
+ echo " - lint"
231
+ echo " - type-check"
232
+ fi
97
233
  - sshpass -p "$SSH_PASSWORD" ssh root@$TEST_SERVER_HOST "mkdir -p $DEPLOY_DIR"
98
234
  - sshpass -p "$SSH_PASSWORD" ssh root@$TEST_SERVER_HOST "which rsync || apk add --no-cache rsync"
99
235
  - sshpass -p "$SSH_PASSWORD" rsync -avz --delete --exclude='.git/' --exclude='node_modules/' . root@$TEST_SERVER_HOST:$DEPLOY_DIR/
@@ -101,7 +237,7 @@ deploy_dev:
101
237
  - sshpass -p "$SSH_PASSWORD" ssh root@$TEST_SERVER_HOST "export REGISTRY_URL='$CI_REGISTRY' && export REGISTRY_USERNAME='$CI_REGISTRY_USER' && export REGISTRY_PASSWORD='$CI_REGISTRY_PASSWORD' && export APP_PORT='$APP_PORT' && cd $DEPLOY_DIR && chmod +x ci/deploy.sh && bash ci/deploy.sh $ENV_TYPE gitlab"
102
238
  environment:
103
239
  name: development
104
- url: {{DEV_URL}}
240
+ url: "{{DEV_URL}}"
105
241
  only:
106
242
  - develop
107
243
 
@@ -118,6 +254,25 @@ deploy_prod:
118
254
  APP_PORT: "{{PROD_PORT}}"
119
255
  cache: {}
120
256
  before_script:
257
+ - |
258
+ # 智能检测并运行 lint 命令
259
+ echo "检测可用的 lint 命令..."
260
+ if npm run | grep -q "lint:check"; then
261
+ echo "✓ 运行 npm run lint:check"
262
+ npm run lint:check
263
+ elif npm run | grep -q "lint"; then
264
+ echo "✓ 运行 npm run lint"
265
+ npm run lint
266
+ elif npm run | grep -q "type-check"; then
267
+ echo "✓ 运行 npm run type-check"
268
+ npm run type-check
269
+ else
270
+ echo "⚠️ 未找到 lint 相关命令,跳过代码检查"
271
+ echo "建议在 package.json 中添加以下命令之一:"
272
+ echo " - lint:check (推荐)"
273
+ echo " - lint"
274
+ echo " - type-check"
275
+ fi
121
276
  - apk add --no-cache sshpass bash openssl rsync
122
277
  - mkdir -p ~/.ssh
123
278
  - chmod 700 ~/.ssh
@@ -126,6 +281,25 @@ deploy_prod:
126
281
  - chmod 600 ~/.ssh/config
127
282
  - chmod 644 ~/.ssh/known_hosts
128
283
  script:
284
+ - |
285
+ # 智能检测并运行 lint 命令
286
+ echo "检测可用的 lint 命令..."
287
+ if npm run | grep -q "lint:check"; then
288
+ echo "✓ 运行 npm run lint:check"
289
+ npm run lint:check
290
+ elif npm run | grep -q "lint"; then
291
+ echo "✓ 运行 npm run lint"
292
+ npm run lint
293
+ elif npm run | grep -q "type-check"; then
294
+ echo "✓ 运行 npm run type-check"
295
+ npm run type-check
296
+ else
297
+ echo "⚠️ 未找到 lint 相关命令,跳过代码检查"
298
+ echo "建议在 package.json 中添加以下命令之一:"
299
+ echo " - lint:check (推荐)"
300
+ echo " - lint"
301
+ echo " - type-check"
302
+ fi
129
303
  - sshpass -p "$SSH_PASSWORD" ssh root@$PROD_SERVER_HOST "mkdir -p $DEPLOY_DIR"
130
304
  - sshpass -p "$SSH_PASSWORD" ssh root@$PROD_SERVER_HOST "which rsync || apk add --no-cache rsync"
131
305
  - sshpass -p "$SSH_PASSWORD" rsync -avz --delete --exclude='.git/' --exclude='node_modules/' . root@$PROD_SERVER_HOST:$DEPLOY_DIR/
@@ -133,7 +307,7 @@ deploy_prod:
133
307
  - sshpass -p "$SSH_PASSWORD" ssh root@$PROD_SERVER_HOST "export REGISTRY_URL='$CI_REGISTRY' && export REGISTRY_USERNAME='$CI_REGISTRY_USER' && export REGISTRY_PASSWORD='$CI_REGISTRY_PASSWORD' && export APP_PORT='$APP_PORT' && cd $DEPLOY_DIR && chmod +x ci/deploy.sh && bash ci/deploy.sh $ENV_TYPE gitlab"
134
308
  environment:
135
309
  name: production
136
- url: {{PROD_URL}}
310
+ url: "{{PROD_URL}}"
137
311
  only:
138
312
  - main
139
313
  when: manual
@@ -149,6 +323,25 @@ rollback:
149
323
  APP_PORT: "{{PROD_PORT}}"
150
324
  cache: {}
151
325
  before_script:
326
+ - |
327
+ # 智能检测并运行 lint 命令
328
+ echo "检测可用的 lint 命令..."
329
+ if npm run | grep -q "lint:check"; then
330
+ echo "✓ 运行 npm run lint:check"
331
+ npm run lint:check
332
+ elif npm run | grep -q "lint"; then
333
+ echo "✓ 运行 npm run lint"
334
+ npm run lint
335
+ elif npm run | grep -q "type-check"; then
336
+ echo "✓ 运行 npm run type-check"
337
+ npm run type-check
338
+ else
339
+ echo "⚠️ 未找到 lint 相关命令,跳过代码检查"
340
+ echo "建议在 package.json 中添加以下命令之一:"
341
+ echo " - lint:check (推荐)"
342
+ echo " - lint"
343
+ echo " - type-check"
344
+ fi
152
345
  - apk add --no-cache openssh-client openssl
153
346
  - mkdir -p ~/.ssh
154
347
  - chmod 700 ~/.ssh
@@ -157,12 +350,31 @@ rollback:
157
350
  - chmod 600 ~/.ssh/config
158
351
  - chmod 644 ~/.ssh/known_hosts
159
352
  script:
353
+ - |
354
+ # 智能检测并运行 lint 命令
355
+ echo "检测可用的 lint 命令..."
356
+ if npm run | grep -q "lint:check"; then
357
+ echo "✓ 运行 npm run lint:check"
358
+ npm run lint:check
359
+ elif npm run | grep -q "lint"; then
360
+ echo "✓ 运行 npm run lint"
361
+ npm run lint
362
+ elif npm run | grep -q "type-check"; then
363
+ echo "✓ 运行 npm run type-check"
364
+ npm run type-check
365
+ else
366
+ echo "⚠️ 未找到 lint 相关命令,跳过代码检查"
367
+ echo "建议在 package.json 中添加以下命令之一:"
368
+ echo " - lint:check (推荐)"
369
+ echo " - lint"
370
+ echo " - type-check"
371
+ fi
160
372
  - sshpass -p "$SSH_PASSWORD" ssh root@$PROD_SERVER_HOST "cd $DEPLOY_DIR && export APP_PORT=$APP_PORT && docker-compose down"
161
373
  - sshpass -p "$SSH_PASSWORD" ssh root@$PROD_SERVER_HOST "cd $DEPLOY_DIR && export APP_PORT=$APP_PORT && docker-compose pull"
162
374
  - sshpass -p "$SSH_PASSWORD" ssh root@$PROD_SERVER_HOST "cd $DEPLOY_DIR && export APP_PORT=$APP_PORT && docker-compose up -d"
163
375
  environment:
164
376
  name: production
165
- url: {{PROD_URL}}
377
+ url: "{{PROD_URL}}"
166
378
  when: manual
167
379
  only:
168
380
  - main
@@ -35,7 +35,7 @@ lint:
35
35
  - .npm/
36
36
  policy: pull-push
37
37
  before_script:
38
- - apk add --no-cache git curl
38
+ - apk add --no-cache git curl jq
39
39
  - git --version
40
40
  - echo "Setting up Git authentication..."
41
41
  - git config --global http.sslVerify false
@@ -43,7 +43,67 @@ lint:
43
43
  - git config --global url."https://oauth2:${GITLAB_ACCESS_TOKEN}@{{GITLAB_HOST}}".insteadOf "https://{{GITLAB_HOST}}"
44
44
  - npm ci --cache .npm --prefer-offline
45
45
  script:
46
- - {{LINT_COMMAND}}
46
+ - |
47
+ # 智能检测并运行 lint 命令
48
+ echo "检测可用的 lint 命令..."
49
+ LINT_FAILED=0
50
+
51
+ if npm run | grep -q "lint:check"; then
52
+ echo "✓ 运行 npm run lint:check"
53
+ if ! npm run lint:check; then
54
+ LINT_FAILED=1
55
+ fi
56
+ elif npm run | grep -q "lint"; then
57
+ echo "✓ 运行 npm run lint"
58
+ if ! npm run lint; then
59
+ LINT_FAILED=1
60
+ fi
61
+ elif npm run | grep -q "type-check"; then
62
+ echo "✓ 运行 npm run type-check"
63
+ if ! npm run type-check; then
64
+ LINT_FAILED=1
65
+ fi
66
+ else
67
+ echo "⚠️ 未找到 lint 相关命令,跳过代码检查"
68
+ echo "建议在 package.json 中添加以下命令之一:"
69
+ echo " - lint:check (推荐)"
70
+ echo " - lint"
71
+ echo " - type-check"
72
+ fi
73
+
74
+ # 如果 lint 失败,输出友好的中文提示
75
+ if [ $LINT_FAILED -eq 1 ]; then
76
+ echo ""
77
+ echo "======================================================================"
78
+ echo "❌ 代码质量检查未通过"
79
+ echo "======================================================================"
80
+ echo ""
81
+ echo "📋 发现了一些代码质量问题,需要修复后才能继续部署。"
82
+ echo ""
83
+ echo "🔧 快速修复方法:"
84
+ echo ""
85
+ echo " 1. 在本地运行自动修复:"
86
+ echo " npm run lint"
87
+ echo ""
88
+ echo " 2. 查看具体问题:"
89
+ echo " npm run lint:check"
90
+ echo ""
91
+ echo " 3. 修复后提交:"
92
+ echo " git add ."
93
+ echo " git commit -m \"fix: 修复代码质量问题\""
94
+ echo " git push"
95
+ echo ""
96
+ echo "💡 常见问题类型:"
97
+ echo " - TypeScript 类型安全问题(使用了 any 类型)"
98
+ echo " - 未使用的变量或导入"
99
+ echo " - async 函数缺少 await"
100
+ echo " - Promise 未正确处理"
101
+ echo ""
102
+ echo "📖 详细错误信息请查看上方输出"
103
+ echo "======================================================================"
104
+ echo ""
105
+ exit 1
106
+ fi
47
107
  only:
48
108
  - merge_requests
49
109
  - main
@@ -57,10 +117,48 @@ build:
57
117
  name: docker:24.0.5
58
118
  pull_policy: if-not-present
59
119
  before_script:
120
+ - |
121
+ # 智能检测并运行 lint 命令
122
+ echo "检测可用的 lint 命令..."
123
+ if npm run | grep -q "lint:check"; then
124
+ echo "✓ 运行 npm run lint:check"
125
+ npm run lint:check
126
+ elif npm run | grep -q "lint"; then
127
+ echo "✓ 运行 npm run lint"
128
+ npm run lint
129
+ elif npm run | grep -q "type-check"; then
130
+ echo "✓ 运行 npm run type-check"
131
+ npm run type-check
132
+ else
133
+ echo "⚠️ 未找到 lint 相关命令,跳过代码检查"
134
+ echo "建议在 package.json 中添加以下命令之一:"
135
+ echo " - lint:check (推荐)"
136
+ echo " - lint"
137
+ echo " - type-check"
138
+ fi
60
139
  - docker info
61
140
  - echo "登录到Docker Hub..."
62
141
  - echo "$DOCKER_HUB_PASSWORD" | docker login -u $DOCKER_HUB_USERNAME --password-stdin
63
142
  script:
143
+ - |
144
+ # 智能检测并运行 lint 命令
145
+ echo "检测可用的 lint 命令..."
146
+ if npm run | grep -q "lint:check"; then
147
+ echo "✓ 运行 npm run lint:check"
148
+ npm run lint:check
149
+ elif npm run | grep -q "lint"; then
150
+ echo "✓ 运行 npm run lint"
151
+ npm run lint
152
+ elif npm run | grep -q "type-check"; then
153
+ echo "✓ 运行 npm run type-check"
154
+ npm run type-check
155
+ else
156
+ echo "⚠️ 未找到 lint 相关命令,跳过代码检查"
157
+ echo "建议在 package.json 中添加以下命令之一:"
158
+ echo " - lint:check (推荐)"
159
+ echo " - lint"
160
+ echo " - type-check"
161
+ fi
64
162
  - echo "尝试拉取最新镜像作为缓存..."
65
163
  - docker pull $DOCKER_HUB_IMAGE:latest || true
66
164
  - echo "构建Docker镜像..."
@@ -86,18 +184,56 @@ deploy_dev:
86
184
  REGISTRY_TYPE: "{{REGISTRY_TYPE}}"
87
185
  cache: {}
88
186
  before_script:
187
+ - |
188
+ # 智能检测并运行 lint 命令
189
+ echo "检测可用的 lint 命令..."
190
+ if npm run | grep -q "lint:check"; then
191
+ echo "✓ 运行 npm run lint:check"
192
+ npm run lint:check
193
+ elif npm run | grep -q "lint"; then
194
+ echo "✓ 运行 npm run lint"
195
+ npm run lint
196
+ elif npm run | grep -q "type-check"; then
197
+ echo "✓ 运行 npm run type-check"
198
+ npm run type-check
199
+ else
200
+ echo "⚠️ 未找到 lint 相关命令,跳过代码检查"
201
+ echo "建议在 package.json 中添加以下命令之一:"
202
+ echo " - lint:check (推荐)"
203
+ echo " - lint"
204
+ echo " - type-check"
205
+ fi
89
206
  - apk add --no-cache sshpass bash openssl rsync
90
207
  - mkdir -p ~/.ssh
91
208
  - chmod 700 ~/.ssh
92
209
  - chmod 644 ~/.ssh/known_hosts
93
210
  script:
211
+ - |
212
+ # 智能检测并运行 lint 命令
213
+ echo "检测可用的 lint 命令..."
214
+ if npm run | grep -q "lint:check"; then
215
+ echo "✓ 运行 npm run lint:check"
216
+ npm run lint:check
217
+ elif npm run | grep -q "lint"; then
218
+ echo "✓ 运行 npm run lint"
219
+ npm run lint
220
+ elif npm run | grep -q "type-check"; then
221
+ echo "✓ 运行 npm run type-check"
222
+ npm run type-check
223
+ else
224
+ echo "⚠️ 未找到 lint 相关命令,跳过代码检查"
225
+ echo "建议在 package.json 中添加以下命令之一:"
226
+ echo " - lint:check (推荐)"
227
+ echo " - lint"
228
+ echo " - type-check"
229
+ fi
94
230
  - sshpass -p "$SSH_PASSWORD" ssh root@$TEST_SERVER_HOST "mkdir -p $DEPLOY_DIR"
95
231
  - sshpass -p "$SSH_PASSWORD" ssh root@$TEST_SERVER_HOST "which rsync || apk add --no-cache rsync"
96
232
  - sshpass -p "$SSH_PASSWORD" rsync -avz --delete --exclude='.git/' --exclude='node_modules/' . root@$TEST_SERVER_HOST:$DEPLOY_DIR/
97
233
  - sshpass -p "$SSH_PASSWORD" ssh root@$TEST_SERVER_HOST "export DOCKER_HUB_USERNAME='$DOCKER_HUB_USERNAME' && export DOCKER_HUB_PASSWORD='$DOCKER_HUB_PASSWORD' && export APP_PORT='$APP_PORT' && cd $DEPLOY_DIR && chmod +x ci/deploy.sh && bash ci/deploy.sh $ENV_TYPE $REGISTRY_TYPE"
98
234
  environment:
99
235
  name: development
100
- url: {{DEV_URL}}
236
+ url: "{{DEV_URL}}"
101
237
  only:
102
238
  - develop
103
239
 
@@ -115,18 +251,56 @@ deploy_prod:
115
251
  REGISTRY_TYPE: "{{REGISTRY_TYPE}}"
116
252
  cache: {}
117
253
  before_script:
254
+ - |
255
+ # 智能检测并运行 lint 命令
256
+ echo "检测可用的 lint 命令..."
257
+ if npm run | grep -q "lint:check"; then
258
+ echo "✓ 运行 npm run lint:check"
259
+ npm run lint:check
260
+ elif npm run | grep -q "lint"; then
261
+ echo "✓ 运行 npm run lint"
262
+ npm run lint
263
+ elif npm run | grep -q "type-check"; then
264
+ echo "✓ 运行 npm run type-check"
265
+ npm run type-check
266
+ else
267
+ echo "⚠️ 未找到 lint 相关命令,跳过代码检查"
268
+ echo "建议在 package.json 中添加以下命令之一:"
269
+ echo " - lint:check (推荐)"
270
+ echo " - lint"
271
+ echo " - type-check"
272
+ fi
118
273
  - apk add --no-cache sshpass bash openssl rsync
119
274
  - mkdir -p ~/.ssh
120
275
  - chmod 700 ~/.ssh
121
276
  - chmod 644 ~/.ssh/known_hosts
122
277
  script:
278
+ - |
279
+ # 智能检测并运行 lint 命令
280
+ echo "检测可用的 lint 命令..."
281
+ if npm run | grep -q "lint:check"; then
282
+ echo "✓ 运行 npm run lint:check"
283
+ npm run lint:check
284
+ elif npm run | grep -q "lint"; then
285
+ echo "✓ 运行 npm run lint"
286
+ npm run lint
287
+ elif npm run | grep -q "type-check"; then
288
+ echo "✓ 运行 npm run type-check"
289
+ npm run type-check
290
+ else
291
+ echo "⚠️ 未找到 lint 相关命令,跳过代码检查"
292
+ echo "建议在 package.json 中添加以下命令之一:"
293
+ echo " - lint:check (推荐)"
294
+ echo " - lint"
295
+ echo " - type-check"
296
+ fi
123
297
  - sshpass -p "$SSH_PASSWORD" ssh root@$PROD_SERVER_HOST "mkdir -p $DEPLOY_DIR"
124
298
  - sshpass -p "$SSH_PASSWORD" ssh root@$PROD_SERVER_HOST "which rsync || apk add --no-cache rsync"
125
299
  - sshpass -p "$SSH_PASSWORD" rsync -avz --delete --exclude='.git/' --exclude='node_modules/' . root@$PROD_SERVER_HOST:$DEPLOY_DIR/
126
300
  - sshpass -p "$SSH_PASSWORD" ssh root@$PROD_SERVER_HOST "export DOCKER_HUB_USERNAME='$DOCKER_HUB_USERNAME' && export DOCKER_HUB_PASSWORD='$DOCKER_HUB_PASSWORD' && export APP_PORT='$APP_PORT' && cd $DEPLOY_DIR && chmod +x ci/deploy.sh && bash ci/deploy.sh $ENV_TYPE $REGISTRY_TYPE"
127
301
  environment:
128
302
  name: production
129
- url: {{PROD_URL}}
303
+ url: "{{PROD_URL}}"
130
304
  only:
131
305
  - main
132
306
  when: manual
@@ -142,17 +316,55 @@ rollback:
142
316
  APP_PORT: "{{PROD_PORT}}"
143
317
  cache: {}
144
318
  before_script:
319
+ - |
320
+ # 智能检测并运行 lint 命令
321
+ echo "检测可用的 lint 命令..."
322
+ if npm run | grep -q "lint:check"; then
323
+ echo "✓ 运行 npm run lint:check"
324
+ npm run lint:check
325
+ elif npm run | grep -q "lint"; then
326
+ echo "✓ 运行 npm run lint"
327
+ npm run lint
328
+ elif npm run | grep -q "type-check"; then
329
+ echo "✓ 运行 npm run type-check"
330
+ npm run type-check
331
+ else
332
+ echo "⚠️ 未找到 lint 相关命令,跳过代码检查"
333
+ echo "建议在 package.json 中添加以下命令之一:"
334
+ echo " - lint:check (推荐)"
335
+ echo " - lint"
336
+ echo " - type-check"
337
+ fi
145
338
  - apk add --no-cache openssh-client openssl
146
339
  - mkdir -p ~/.ssh
147
340
  - chmod 700 ~/.ssh
148
341
  - chmod 644 ~/.ssh/known_hosts
149
342
  script:
343
+ - |
344
+ # 智能检测并运行 lint 命令
345
+ echo "检测可用的 lint 命令..."
346
+ if npm run | grep -q "lint:check"; then
347
+ echo "✓ 运行 npm run lint:check"
348
+ npm run lint:check
349
+ elif npm run | grep -q "lint"; then
350
+ echo "✓ 运行 npm run lint"
351
+ npm run lint
352
+ elif npm run | grep -q "type-check"; then
353
+ echo "✓ 运行 npm run type-check"
354
+ npm run type-check
355
+ else
356
+ echo "⚠️ 未找到 lint 相关命令,跳过代码检查"
357
+ echo "建议在 package.json 中添加以下命令之一:"
358
+ echo " - lint:check (推荐)"
359
+ echo " - lint"
360
+ echo " - type-check"
361
+ fi
150
362
  - sshpass -p "$SSH_PASSWORD" ssh root@$PROD_SERVER_HOST "cd $DEPLOY_DIR && export APP_PORT=$APP_PORT && docker-compose down"
151
363
  - sshpass -p "$SSH_PASSWORD" ssh root@$PROD_SERVER_HOST "cd $DEPLOY_DIR && export APP_PORT=$APP_PORT && docker-compose pull"
152
364
  - sshpass -p "$SSH_PASSWORD" ssh root@$PROD_SERVER_HOST "cd $DEPLOY_DIR && export APP_PORT=$APP_PORT && docker-compose up -d"
153
365
  environment:
154
366
  name: production
155
- url: {{PROD_URL}}
367
+ url: "{{PROD_URL}}"
156
368
  when: manual
157
369
  only:
158
370
  - main