fission-worker 0.2.1 → 0.3.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/docker.d.ts +1 -1
- package/dist/docker.js +65 -57
- package/dist/docker.js.map +1 -1
- package/package.json +4 -3
- package/runner/common/decorators/current-user.decorator.js +10 -0
- package/runner/common/decorators/public.decorator.js +7 -0
- package/runner/common/decorators/roles.decorator.js +7 -0
- package/runner/common/services/activity-log.service.js +48 -0
- package/runner/common/services/event-bus.service.js +38 -0
- package/runner/modules/github/github.controller.js +155 -0
- package/runner/modules/github/github.module.js +22 -0
- package/runner/modules/github/github.service.js +104 -0
- package/runner/modules/pipeline/data/api-data.service.js +140 -0
- package/runner/modules/pipeline/data/pipeline-data.interface.js +2 -0
- package/runner/modules/pipeline/data/prisma-data.service.js +149 -0
- package/runner/modules/pipeline/pipeline-cto.service.js +129 -0
- package/runner/modules/pipeline/pipeline-helpers.service.js +318 -0
- package/runner/modules/pipeline/pipeline-orchestrator.js +399 -0
- package/runner/modules/pipeline/pipeline-queue.service.js +121 -0
- package/runner/modules/pipeline/pipeline-techlead.service.js +127 -0
- package/runner/modules/pipeline/pipeline-worker.service.js +343 -0
- package/runner/modules/pipeline/pipeline.controller.js +310 -0
- package/runner/modules/pipeline/pipeline.module.js +51 -0
- package/runner/modules/pipeline/pipeline.service.js +706 -0
- package/runner/modules/worker-api/worker-api.controller.js +497 -0
- package/runner/modules/worker-api/worker-api.guard.js +41 -0
- package/runner/modules/worker-api/worker-api.module.js +25 -0
- package/runner/modules/worker-api/worker-dispatch.service.js +87 -0
- package/runner/pipeline-runner/index.js +108 -0
- package/runner/prisma/prisma.service.js +23 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Pipeline Runner — standalone entrypoint for Docker containers.
|
|
4
|
+
*
|
|
5
|
+
* This script runs inside an ephemeral worker container. It:
|
|
6
|
+
* 1. Clones the project repo
|
|
7
|
+
* 2. Wires up ApiDataService (HTTP → Fission API)
|
|
8
|
+
* 3. Manually constructs pipeline services (no NestJS DI)
|
|
9
|
+
* 4. Runs the pipeline orchestration loop
|
|
10
|
+
*
|
|
11
|
+
* Env vars are injected by the fission-worker agent via docker create.
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
const child_process_1 = require("child_process");
|
|
15
|
+
const fs_1 = require("fs");
|
|
16
|
+
const api_data_service_1 = require("../modules/pipeline/data/api-data.service");
|
|
17
|
+
const pipeline_helpers_service_1 = require("../modules/pipeline/pipeline-helpers.service");
|
|
18
|
+
const pipeline_cto_service_1 = require("../modules/pipeline/pipeline-cto.service");
|
|
19
|
+
const pipeline_techlead_service_1 = require("../modules/pipeline/pipeline-techlead.service");
|
|
20
|
+
const pipeline_worker_service_1 = require("../modules/pipeline/pipeline-worker.service");
|
|
21
|
+
const pipeline_orchestrator_1 = require("../modules/pipeline/pipeline-orchestrator");
|
|
22
|
+
// ── Env vars ────────────────────────────────────────────────────── //
|
|
23
|
+
const FISSION_API_URL = process.env.FISSION_API_URL;
|
|
24
|
+
const FISSION_API_KEY = process.env.FISSION_API_KEY;
|
|
25
|
+
const SESSION_ID = process.env.SESSION_ID;
|
|
26
|
+
const PROJECT_ID = process.env.PROJECT_ID;
|
|
27
|
+
const REPO_URL = process.env.REPO_URL;
|
|
28
|
+
const REPO_BRANCH = process.env.REPO_BRANCH || "main";
|
|
29
|
+
const GITHUB_TOKEN = process.env.GITHUB_TOKEN;
|
|
30
|
+
const USER_ID = process.env.USER_ID || undefined;
|
|
31
|
+
const WORKSPACE = "/workspace";
|
|
32
|
+
// If the worker already cloned the repo, use that path
|
|
33
|
+
const PRE_CLONED_PATH = process.env.FISSION_REPO_PATH || "";
|
|
34
|
+
async function main() {
|
|
35
|
+
console.log(`[pipeline-runner] Starting session ${SESSION_ID} for project ${PROJECT_ID}`);
|
|
36
|
+
let repoPath;
|
|
37
|
+
if (PRE_CLONED_PATH && (0, fs_1.existsSync)(PRE_CLONED_PATH)) {
|
|
38
|
+
// Worker already cloned — skip clone step
|
|
39
|
+
repoPath = PRE_CLONED_PATH;
|
|
40
|
+
console.log(`[pipeline-runner] Using pre-cloned repo at ${repoPath}`);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
// Clone the repo (Docker container mode)
|
|
44
|
+
const cacheDir = "/workspace/.git-cache";
|
|
45
|
+
let cloneUrl;
|
|
46
|
+
if (GITHUB_TOKEN) {
|
|
47
|
+
if (REPO_URL.startsWith("https://")) {
|
|
48
|
+
cloneUrl = REPO_URL.replace("https://", `https://x-access-token:${GITHUB_TOKEN}@`);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
cloneUrl = `https://x-access-token:${GITHUB_TOKEN}@github.com/${REPO_URL}.git`;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
cloneUrl = REPO_URL;
|
|
56
|
+
}
|
|
57
|
+
console.log(`[pipeline-runner] Cloning ${REPO_URL} (branch: ${REPO_BRANCH})`);
|
|
58
|
+
if ((0, fs_1.existsSync)(`${cacheDir}/objects`)) {
|
|
59
|
+
(0, child_process_1.execSync)(`git clone --reference ${cacheDir} --depth=50 -b ${REPO_BRANCH} ${cloneUrl} ${WORKSPACE}/repo`, { stdio: "inherit" });
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
(0, child_process_1.execSync)(`git clone --depth=50 -b ${REPO_BRANCH} ${cloneUrl} ${WORKSPACE}/repo`, { stdio: "inherit" });
|
|
63
|
+
try {
|
|
64
|
+
(0, child_process_1.execSync)(`cp -r ${WORKSPACE}/repo/.git ${cacheDir}`, { stdio: "inherit" });
|
|
65
|
+
}
|
|
66
|
+
catch { }
|
|
67
|
+
}
|
|
68
|
+
repoPath = `${WORKSPACE}/repo`;
|
|
69
|
+
}
|
|
70
|
+
// 2. Wire up the data layer (HTTP → Fission API)
|
|
71
|
+
const data = new api_data_service_1.ApiDataService(FISSION_API_URL, FISSION_API_KEY, SESSION_ID);
|
|
72
|
+
// 3. Wire up pipeline services (manual construction — no NestJS DI)
|
|
73
|
+
const helpers = new pipeline_helpers_service_1.PipelineHelpersService(data);
|
|
74
|
+
const cto = new pipeline_cto_service_1.PipelineCtoService(data, helpers);
|
|
75
|
+
const techLead = new pipeline_techlead_service_1.PipelineTechLeadService(data, helpers);
|
|
76
|
+
const worker = new pipeline_worker_service_1.PipelineWorkerService(data, helpers);
|
|
77
|
+
// 4. Run the orchestration loop
|
|
78
|
+
const stopSignal = { stopped: false };
|
|
79
|
+
// Handle graceful shutdown
|
|
80
|
+
process.on("SIGTERM", () => {
|
|
81
|
+
console.log("[pipeline-runner] Received SIGTERM, finishing current work...");
|
|
82
|
+
stopSignal.stopped = true;
|
|
83
|
+
});
|
|
84
|
+
process.on("SIGINT", () => {
|
|
85
|
+
console.log("[pipeline-runner] Received SIGINT, finishing current work...");
|
|
86
|
+
stopSignal.stopped = true;
|
|
87
|
+
});
|
|
88
|
+
await (0, pipeline_orchestrator_1.runPipelineLoop)({
|
|
89
|
+
data,
|
|
90
|
+
helpers,
|
|
91
|
+
cto,
|
|
92
|
+
techLead,
|
|
93
|
+
worker,
|
|
94
|
+
sessionId: SESSION_ID,
|
|
95
|
+
projectId: PROJECT_ID,
|
|
96
|
+
repoPath,
|
|
97
|
+
repoPaths: `repo: ${repoPath}`,
|
|
98
|
+
repoList: [{ name: "repo", repoPath }],
|
|
99
|
+
projectContext: "", // Worker containers don't cache project context
|
|
100
|
+
userId: USER_ID,
|
|
101
|
+
stopSignal,
|
|
102
|
+
});
|
|
103
|
+
console.log(`[pipeline-runner] Session ${SESSION_ID} complete`);
|
|
104
|
+
}
|
|
105
|
+
main().catch((err) => {
|
|
106
|
+
console.error(`[pipeline-runner] Fatal error:`, err);
|
|
107
|
+
process.exit(1);
|
|
108
|
+
});
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.PrismaService = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const client_1 = require("@prisma/client");
|
|
12
|
+
let PrismaService = class PrismaService extends client_1.PrismaClient {
|
|
13
|
+
async onModuleInit() {
|
|
14
|
+
await this.$connect();
|
|
15
|
+
}
|
|
16
|
+
async onModuleDestroy() {
|
|
17
|
+
await this.$disconnect();
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
exports.PrismaService = PrismaService;
|
|
21
|
+
exports.PrismaService = PrismaService = __decorate([
|
|
22
|
+
(0, common_1.Injectable)()
|
|
23
|
+
], PrismaService);
|