UNPKG

@catladder/cli

Version:

Panter cli tool for cloud CI/CD and DevOps

109 lines (108 loc) 3.71 kB
"use strict"; 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); } } } });