@catladder/cli
Version:
Panter cli tool for cloud CI/CD and DevOps
109 lines (108 loc) • 3.71 kB
JavaScript
;
var __importDefault = this && this.__importDefault || function (mod) {
return mod && mod.__esModule ? mod : {
"default": mod
};
};
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.commandCiJobLog = exports.commandCiJobOpen = void 0;
const child_process_promise_1 = require("child-process-promise");
const lodash_es_1 = require("lodash-es");
const open_1 = __importDefault(require("open"));
const defineCommand_1 = require("../../core/defineCommand");
const gitlab_1 = require("../../utils/gitlab");
const statusEmojiMap = {
failed: "🙀",
warning: "😿",
pending: "🍺",
running: "🏃",
manual: "🤚",
scheduled: "🍺",
canceled: "😽",
success: "😻",
skipped: "🤭",
created: "🍺"
};
const statusTxt = status => statusEmojiMap[status] ? `${statusEmojiMap[status]} ${status}` : status;
const getCurrentCommit = async () => {
const result = await (0, child_process_promise_1.exec)("git rev-parse HEAD");
return result.stdout && result.stdout.replace(/\n$/, "");
};
const delay = async ms => new Promise(resolve => setTimeout(resolve, ms));
const getJobChoices = async io => {
const {
id: projectId
} = await (0, gitlab_1.getProjectInfo)(io);
const jobs = await (0, gitlab_1.doGitlabRequest)(io, `projects/${projectId}/jobs`);
const commitId = await getCurrentCommit();
const jobsToName = jo => jo.map(j => `${j.ref}-${j.name}-${j.user.username}-${j.status}-${j.id}`);
const preferredJobs = jobs.filter(j => j.commit.id === commitId);
const moreJobs = jobs.filter(j => !preferredJobs.includes(j.ref));
return preferredJobs.length > 1 ? [...jobsToName(preferredJobs), "========================================================", ...jobsToName(moreJobs)] : jobsToName([...preferredJobs, ...moreJobs]);
};
const findJobById = async (io, jobName) => {
const {
id: projectId
} = await (0, gitlab_1.getProjectInfo)(io);
const jobs = await (0, gitlab_1.doGitlabRequest)(io, `projects/${projectId}/jobs`);
const jobId = Number((0, lodash_es_1.last)(jobName.split("-")));
return {
job: jobs.find(j => j.id === jobId),
projectId
};
};
exports.commandCiJobOpen = (0, defineCommand_1.defineCommand)({
name: "project ci job-open",
description: "Open a Job",
group: "project",
inputs: {
jobName: {
type: "string",
message: "Which job? 🤔",
choices: async ctx => getJobChoices(ctx)
}
},
execute: async ctx => {
const jobName = await ctx.get("jobName");
const {
job
} = await findJobById(ctx, jobName);
(0, open_1.default)(job.web_url);
}
});
exports.commandCiJobLog = (0, defineCommand_1.defineCommand)({
name: "project ci job-log",
description: "Show a job's log",
group: "project",
inputs: {
jobName: {
type: "string",
message: "Which job? 🤔",
choices: async ctx => getJobChoices(ctx)
}
},
execute: async ctx => {
const jobName = await ctx.get("jobName");
const {
job: selectedJob,
projectId
} = await findJobById(ctx, jobName);
const id = selectedJob.id;
let finished = false;
while (!finished) {
const trace = await (0, child_process_promise_1.exec)(`curl -s --header "PRIVATE-TOKEN: ${await (0, gitlab_1.getGitlabToken)(ctx)}" "https://git.panter.ch/api/v4/projects/${projectId}/jobs/${id}/trace"`);
const job = await (0, gitlab_1.doGitlabRequest)(ctx, `projects/${projectId}/jobs/${id}`);
if (trace.stdout) {
ctx.log(trace.stdout);
} else {
ctx.log(`\n${statusTxt(job.status)}\n${job.web_url}\n`);
}
finished = !!job.finished_at;
if (!finished) {
await delay(5000);
}
}
}
});