improve logging

This commit is contained in:
David Blass
2025-10-31 01:58:43 -04:00
parent 434458a068
commit 15a7154aea
13 changed files with 132 additions and 142 deletions
+51 -5
View File
@@ -5,6 +5,7 @@
import * as core from "@actions/core";
const isGitHubActions = !!process.env.GITHUB_ACTIONS;
const isDebugEnabled = process.env.LOG_LEVEL === "debug";
/**
* Print a formatted box with text (for console output)
@@ -87,7 +88,12 @@ function box(
maxWidth?: number;
}
): void {
core.info(boxString(text, options));
const boxContent = boxString(text, options);
core.info(boxContent);
if (isGitHubActions) {
// Add as markdown code block for summary (no headers)
core.summary.addRaw(`\`\`\`\n${text}\n\`\`\`\n`);
}
}
/**
@@ -115,10 +121,10 @@ async function summaryTable(
if (isGitHubActions) {
const summary = core.summary;
if (title) {
summary.addHeading(title);
summary.addRaw(`**${title}**\n\n`);
}
summary.addTable(formattedRows);
await summary.write();
// Note: Don't write immediately, let it accumulate with other summary content
}
// Also log to console for visibility
@@ -133,7 +139,11 @@ async function summaryTable(
* Print a separator line
*/
function separator(length: number = 50): void {
core.info("─".repeat(length));
const separatorText = "─".repeat(length);
core.info(separatorText);
if (isGitHubActions) {
core.summary.addRaw(`---\n`);
}
}
/**
@@ -145,6 +155,9 @@ export const log = {
*/
info: (message: string): void => {
core.info(message);
if (isGitHubActions) {
core.summary.addRaw(`${message}\n`);
}
},
/**
@@ -152,6 +165,9 @@ export const log = {
*/
warning: (message: string): void => {
core.warning(message);
if (isGitHubActions) {
core.summary.addRaw(`⚠️ ${message}\n`);
}
},
/**
@@ -159,13 +175,33 @@ export const log = {
*/
error: (message: string): void => {
core.error(message);
if (isGitHubActions) {
core.summary.addRaw(`${message}\n`);
}
},
/**
* Print success message
*/
success: (message: string): void => {
core.info(`${message}`);
const successMessage = `${message}`;
core.info(successMessage);
if (isGitHubActions) {
core.summary.addRaw(`${successMessage}\n`);
}
},
/**
* Print debug message (only if LOG_LEVEL=debug)
*/
debug: (message: string): void => {
if (isDebugEnabled) {
if (isGitHubActions) {
core.debug(message);
} else {
core.info(`[DEBUG] ${message}`);
}
}
},
/**
@@ -183,4 +219,14 @@ export const log = {
* Print a separator line
*/
separator,
/**
* Write all accumulated summary content to the job summary
* Call this at the end of execution to finalize the summary
*/
writeSummary: async (): Promise<void> => {
if (isGitHubActions) {
await core.summary.write();
}
},
};
+6 -5
View File
@@ -1,5 +1,6 @@
import { createSign } from "node:crypto";
import * as core from "@actions/core";
import { log } from "./cli.ts";
export interface InstallationToken {
token: string;
@@ -53,14 +54,14 @@ function isGitHubActionsEnvironment(): boolean {
}
async function acquireTokenViaOIDC(): Promise<string> {
core.info("Generating OIDC token...");
log.info("Generating OIDC token...");
const oidcToken = await core.getIDToken("pullfrog-api");
core.info("OIDC token generated successfully");
log.info("OIDC token generated successfully");
const apiUrl = process.env.API_URL || "https://pullfrog.ai";
core.info("Exchanging OIDC token for installation token...");
log.info("Exchanging OIDC token for installation token...");
const tokenResponse = await fetch(`${apiUrl}/api/github/installation-token`, {
method: "POST",
headers: {
@@ -77,7 +78,7 @@ async function acquireTokenViaOIDC(): Promise<string> {
}
const tokenData = (await tokenResponse.json()) as InstallationToken;
core.info(`Installation token obtained for ${tokenData.repository || "all repositories"}`);
log.info(`Installation token obtained for ${tokenData.repository || "all repositories"}`);
return tokenData.token;
}
@@ -238,7 +239,7 @@ export async function setupGitHubInstallationToken(): Promise<string> {
const existingToken = checkExistingToken();
if (existingToken) {
core.setSecret(existingToken);
core.info("Using provided GitHub installation token");
log.info("Using provided GitHub installation token");
return existingToken;
}
-30
View File
@@ -1,30 +0,0 @@
/**
* Centralized debug logging utility
* Controls debug behavior based on LOG_LEVEL environment variable
*/
import * as core from "@actions/core";
const isDebugEnabled = process.env.LOG_LEVEL === "debug";
const isGitHubActions = !!process.env.GITHUB_ACTIONS;
/**
* Check if debug logging is enabled
*/
export function isDebug(): boolean {
return isDebugEnabled;
}
/**
* Log debug message if debug is enabled
* Uses core.debug() in GitHub Actions, console.log() locally
*/
export function debugLog(message: string): void {
if (isDebugEnabled) {
if (isGitHubActions) {
core.debug(message);
} else {
console.log(`[DEBUG] ${message}`);
}
}
}
+10 -9
View File
@@ -1,5 +1,6 @@
import { execSync } from "node:child_process";
import { existsSync, rmSync } from "node:fs";
import { log } from "./cli.ts";
import type { RepoContext } from "./github.ts";
export interface SetupOptions {
@@ -20,20 +21,20 @@ export function setupTestRepo(options: SetupOptions): void {
if (existsSync(tempDir)) {
if (forceClean) {
console.log("🗑️ Removing existing .temp directory...");
log.info("🗑️ Removing existing .temp directory...");
rmSync(tempDir, { recursive: true, force: true });
console.log("📦 Cloning pullfrogai/scratch into .temp...");
log.info("📦 Cloning pullfrogai/scratch into .temp...");
execSync(`git clone ${repoUrl} ${tempDir}`, { stdio: "inherit" });
} else {
console.log("📦 Resetting existing .temp repository...");
log.info("📦 Resetting existing .temp repository...");
execSync("git reset --hard HEAD && git clean -fd", {
cwd: tempDir,
stdio: "inherit",
});
}
} else {
console.log("📦 Cloning pullfrogai/scratch into .temp...");
log.info("📦 Cloning pullfrogai/scratch into .temp...");
execSync(`git clone ${repoUrl} ${tempDir}`, { stdio: "inherit" });
}
}
@@ -42,7 +43,7 @@ export function setupTestRepo(options: SetupOptions): void {
* Setup git configuration to avoid identity errors
*/
export function setupGitConfig(): void {
console.log("🔧 Setting up git configuration...");
log.info("🔧 Setting up git configuration...");
execSync('git config user.email "action@pullfrog.ai"', { stdio: "inherit" });
execSync('git config user.name "Pullfrog Action"', { stdio: "inherit" });
}
@@ -51,18 +52,18 @@ export function setupGitConfig(): void {
* Setup git authentication using GitHub token
*/
export function setupGitAuth(githubToken: string, repoContext: RepoContext): void {
console.log("🔐 Setting up git authentication...");
log.info("🔐 Setting up git authentication...");
// Remove existing git auth headers that actions/checkout might have set
try {
execSync("git config --unset-all http.https://github.com/.extraheader", { stdio: "inherit" });
console.log("✓ Removed existing authentication headers");
log.info("✓ Removed existing authentication headers");
} catch {
console.log("No existing authentication headers to remove");
log.info("No existing authentication headers to remove");
}
// Update remote URL to embed the token
const remoteUrl = `https://x-access-token:${githubToken}@github.com/${repoContext.owner}/${repoContext.name}.git`;
execSync(`git remote set-url origin "${remoteUrl}"`, { stdio: "inherit" });
console.log("✓ Updated remote URL with authentication token");
log.info("✓ Updated remote URL with authentication token");
}