diff --git a/CHANGELOG.md b/CHANGELOG.md index 665a0ac..72ffcf6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unreleased] +## [v0.2.0](https://github.com/vig-os/commit-action/releases/tag/v0.2.0) - 2026-03-24 ### Added diff --git a/README.md b/README.md index f62c64a..06bd723 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ A modular GitHub Action that commits changes via GitHub API, creating automatica ```yaml - name: Commit and push changes via API - uses: vig-os/commit-action@main + uses: vig-os/commit-action@v0.1.5 env: GITHUB_TOKEN: ${{ steps.sync.outputs.app-token || steps.sync.outputs.github-token }} GITHUB_REPOSITORY: ${{ github.repository }} @@ -29,6 +29,7 @@ A modular GitHub Action that commits changes via GitHub API, creating automatica COMMIT_MESSAGE: "chore: sync issues and PRs" FILE_PATHS: ${{ steps.sync.outputs.modified-files || 'docs' }} ALLOW_EMPTY: "false" # Optional: when true, create empty commit if no file changes + MAX_ATTEMPTS: "3" # Optional: retry on transient API errors (default: 1 = no retries) ``` Inline `createTree` optimization is in `[Unreleased]`; until the next release, pin `@main` for that behavior. Published tags (e.g. `@v0.1.5`) use the previous implementation. @@ -48,6 +49,7 @@ npm run commit - `FILE_PATHS` - Comma-separated list of file paths or directories (or auto-detects from git status); `.git` metadata paths in `FILE_PATHS` are ignored (both direct paths and directory expansion) - `ALLOW_EMPTY` - Optional flag (`true`/`false`, default `false`) to create an empty commit when no files changed - `BASE_SHA` - Optional base commit SHA (defaults to branch HEAD) +- `MAX_ATTEMPTS` - Max retry attempts for transient GitHub API failures (default: `1` = no retries). When > 1, retries only on: HTTP 404 (transient ref/commit lookup), 5xx server errors, 429 rate limit, or 403 with rate-limit message. Uses bounded exponential backoff (1s base, 30s cap). Invalid values (e.g. `0`, `-1`, non-numeric) are clamped to 1. **Note:** Use `TARGET_BRANCH` instead of `GITHUB_REF` to avoid conflicts when your workflow runs on a different branch than the target commit branch. GitHub Actions sets `GITHUB_REF` automatically based on the workflow trigger, which can override your explicit setting. @@ -82,6 +84,8 @@ Main function to commit changes via GitHub API. - `message: string` - Commit message - `filePaths: string[]` - Array of file paths to commit - `baseSha?: string` - Optional base commit SHA +- `maxAttempts?: number` - Max retry attempts for transient API errors (default: 1) +- `logger?: (msg: string) => void` - Logger for retry messages (default: console.info) **Returns:** - `commitSha: string` - SHA of the created commit diff --git a/dist/index.js b/dist/index.js index ba751c9..bf15c1a 100755 --- a/dist/index.js +++ b/dist/index.js @@ -35258,6 +35258,7 @@ function wrappy (fn, cb) { * - COMMIT_MESSAGE: Commit message * - FILE_PATHS: Comma-separated list of file paths to commit (or read from git status) * - ALLOW_EMPTY: Set to "true" to allow empty commits when no files changed (default: false) + * - MAX_ATTEMPTS: Max retry attempts for transient API failures (default: 1 = no retries) */ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; @@ -35453,6 +35454,21 @@ async function main() { core.info(`Files: ${filePaths.join(", ")}`); // Get base SHA if provided (for testing or specific use cases) const baseSha = process.env.BASE_SHA; + // Parse MAX_ATTEMPTS for retry (default 1 = no retries) + let maxAttempts = 1; + const rawAttempts = process.env.MAX_ATTEMPTS; + if (rawAttempts) { + const parsed = parseInt(rawAttempts, 10); + if (Number.isNaN(parsed) || parsed < 1) { + core.info(`MAX_ATTEMPTS="${rawAttempts}" invalid, using 1 (no retries)`); + } + else { + maxAttempts = parsed; + if (maxAttempts > 1) { + core.info(`API retries enabled: max ${maxAttempts} attempts`); + } + } + } // Commit changes via API const result = await (0, commit_1.commitViaAPI)({ token, @@ -35463,6 +35479,8 @@ async function main() { filePaths, allowEmpty, baseSha, + maxAttempts, + logger: core.info, }); core.info(`Created signed commit ${result.commitSha} via GitHub API`); core.setOutput("commit-sha", result.commitSha); @@ -35537,6 +35555,7 @@ exports.getBranchInfo = getBranchInfo; exports.commitViaAPI = commitViaAPI; const github = __importStar(__nccwpck_require__(3228)); const fs = __importStar(__nccwpck_require__(9896)); +const retry_1 = __nccwpck_require__(9809); /** * Max tree entries per createTree request. Keeps payloads comfortably under * GitHub's ~25 MB request body limit and avoids slow single-call responses. @@ -35645,18 +35664,12 @@ async function createTree(octokit, owner, repo, baseTreeSha, filePaths) { }); } catch { - const base64Content = raw.toString("base64"); - const { data: blob } = await octokit.rest.git.createBlob({ - owner, - repo, - content: base64Content, - encoding: "base64", - }); + const result = await createBlob(octokit, owner, repo, filePath, { mode }); treeEntries.push({ path: filePath, - mode, + mode: result.mode, type: "blob", - sha: blob.sha, + sha: result.sha, }); } } @@ -35714,38 +35727,44 @@ async function getBranchInfo(octokit, owner, repo, branch) { * This is designed to be modular and reusable - can be used as a standalone action */ async function commitViaAPI(options) { - const { token, owner, repo, branch, message, filePaths, allowEmpty, baseSha } = options; + const { token, owner, repo, branch, message, filePaths, allowEmpty, baseSha, maxAttempts = 1, logger, baseDelayMs, maxDelayMs, } = options; if (filePaths.length === 0 && !allowEmpty) { throw new Error("No files to commit"); } const octokit = github.getOctokit(token); + const retryConfig = { + maxAttempts, + ...(baseDelayMs !== undefined && { baseDelayMs }), + ...(maxDelayMs !== undefined && { maxDelayMs }), + }; + const log = logger ?? console.info; // Get branch info (SHA and tree SHA) let branchSha; let baseTreeSha; if (baseSha) { // Use provided base SHA branchSha = baseSha; - const { data: commit } = await octokit.rest.git.getCommit({ + const { data: commit } = await (0, retry_1.withRetry)(() => octokit.rest.git.getCommit({ owner, repo, commit_sha: baseSha, - }); + }), retryConfig, log); baseTreeSha = commit.tree.sha; } else { // Fetch from branch - const branchInfo = await getBranchInfo(octokit, owner, repo, branch); + const branchInfo = await (0, retry_1.withRetry)(() => getBranchInfo(octokit, owner, repo, branch), retryConfig, log); branchSha = branchInfo.sha; baseTreeSha = branchInfo.treeSha; } // For empty commits, reuse parent tree SHA; otherwise create a new tree. const newTreeSha = filePaths.length === 0 ? baseTreeSha - : await createTree(octokit, owner, repo, baseTreeSha, filePaths); + : await (0, retry_1.withRetry)(() => createTree(octokit, owner, repo, baseTreeSha, filePaths), retryConfig, log); // Create commit (automatically signed by GitHub) - const commitSha = await createCommit(octokit, owner, repo, newTreeSha, branchSha, message); + const commitSha = await (0, retry_1.withRetry)(() => createCommit(octokit, owner, repo, newTreeSha, branchSha, message), retryConfig, log); // Update branch reference - await updateBranch(octokit, owner, repo, branch, commitSha, false); + await (0, retry_1.withRetry)(() => updateBranch(octokit, owner, repo, branch, commitSha, false), retryConfig, log); return { commitSha, treeSha: newTreeSha, @@ -35754,6 +35773,116 @@ async function commitViaAPI(options) { } +/***/ }), + +/***/ 9809: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DEFAULT_MAX_DELAY_MS = exports.DEFAULT_BASE_DELAY_MS = exports.DEFAULT_MAX_ATTEMPTS = void 0; +exports.isTransientError = isTransientError; +exports.classifyError = classifyError; +exports.calculateDelay = calculateDelay; +exports.withRetry = withRetry; +/** Default max attempts (1 = no retries, backward compatible). */ +exports.DEFAULT_MAX_ATTEMPTS = 1; +/** Default base delay for exponential backoff, in milliseconds. */ +exports.DEFAULT_BASE_DELAY_MS = 1000; +/** Default maximum delay cap for backoff, in milliseconds. */ +exports.DEFAULT_MAX_DELAY_MS = 30000; +/** HTTP-like error shape from Octokit RequestError. */ +function hasStatus(e) { + if (typeof e !== "object" || e === null || !("status" in e)) { + return false; + } + return typeof e.status === "number"; +} +/** + * Returns true if the error is a transient condition worth retrying: + * - 404 (transient ref/commit lookup) + * - 5xx (server error) + * - 429 (primary rate limit) + * - 403 with rate limit / secondary rate limit / abuse in message + */ +function isTransientError(error) { + if (!hasStatus(error)) + return false; + const { status, message = "" } = error; + const msg = message.toLowerCase(); + if (status === 404) + return true; + if (status >= 500 && status < 600) + return true; + if (status === 429) + return true; + if (status === 403) { + return (msg.includes("rate limit") || + msg.includes("secondary rate limit") || + msg.includes("abuse")); + } + return false; +} +/** Human-readable classification for logging. */ +function classifyError(error) { + if (!hasStatus(error)) + return "non-transient"; + const { status, message = "" } = error; + const msg = message.toLowerCase(); + if (status === 404) + return "HTTP 404 (transient)"; + if (status >= 500 && status < 600) + return `HTTP ${status} (server error)`; + if (status === 429) + return "HTTP 429 (rate limit)"; + if (status === 403 && (msg.includes("rate limit") || msg.includes("abuse"))) { + return "rate limit (403)"; + } + return "non-transient"; +} +/** + * Exponential backoff with jitter. + * Delay = min(base * 2^attempt, maxDelayMs) + jitter (0-25% of computed). + */ +function calculateDelay(attempt, baseDelayMs, maxDelayMs) { + const raw = Math.min(baseDelayMs * Math.pow(2, attempt), maxDelayMs); + const jitter = raw * 0.25 * Math.random(); + return Math.floor(raw + jitter); +} +function sleep(ms) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} +/** + * Retries an async operation on transient errors only. + * Logs attempt number, classification, and delay via logger when retrying. + */ +async function withRetry(fn, config, logger) { + const baseDelayMs = config.baseDelayMs ?? exports.DEFAULT_BASE_DELAY_MS; + const maxDelayMs = config.maxDelayMs ?? exports.DEFAULT_MAX_DELAY_MS; + const log = logger ?? (() => { }); + const maxAttempts = Math.max(1, Number.isFinite(config.maxAttempts) ? config.maxAttempts : 1); + let lastError; + for (let attempt = 0; attempt < maxAttempts; attempt++) { + try { + return await fn(); + } + catch (e) { + lastError = e; + const isLast = attempt === maxAttempts - 1; + if (isLast || !isTransientError(e)) { + throw e; + } + const classification = classifyError(e); + const delay = calculateDelay(attempt, baseDelayMs, maxDelayMs); + log(`GitHub API attempt ${attempt + 1}/${maxAttempts} failed (${classification}), retrying in ${delay}ms`); + await sleep(delay); + } + } + throw lastError; +} + + /***/ }), /***/ 2613: diff --git a/dist/src/__tests__/unit/commit-runner.test.js b/dist/src/__tests__/unit/commit-runner.test.js index 9f2e966..d02083f 100644 --- a/dist/src/__tests__/unit/commit-runner.test.js +++ b/dist/src/__tests__/unit/commit-runner.test.js @@ -286,5 +286,67 @@ describe("commit-runner", () => { })); }); }); + describe("main MAX_ATTEMPTS behavior", () => { + const originalEnv = process.env; + beforeEach(() => { + jest.clearAllMocks(); + process.env = { + ...originalEnv, + GITHUB_TOKEN: "test-token", + GITHUB_REPOSITORY: "owner/repo", + TARGET_BRANCH: "refs/heads/main", + COMMIT_MESSAGE: "Test commit", + FILE_PATHS: "file.txt", + }; + github.context.ref = "refs/heads/main"; + commit_1.commitViaAPI.mockResolvedValue({ + commitSha: "commit-sha", + treeSha: "tree-sha", + filesCommitted: 1, + }); + const fs = jest.requireMock("fs"); + fs.existsSync = jest.fn().mockReturnValue(true); + fs.statSync = jest.fn().mockReturnValue({ isDirectory: () => false }); + }); + afterAll(() => { + process.env = originalEnv; + }); + it("should pass maxAttempts 1 when MAX_ATTEMPTS is not set", async () => { + delete process.env.MAX_ATTEMPTS; + await (0, commit_runner_1.main)(); + expect(commit_1.commitViaAPI).toHaveBeenCalledWith(expect.objectContaining({ + maxAttempts: 1, + })); + }); + it("should pass parsed maxAttempts 3 when MAX_ATTEMPTS=3", async () => { + process.env.MAX_ATTEMPTS = "3"; + await (0, commit_runner_1.main)(); + expect(commit_1.commitViaAPI).toHaveBeenCalledWith(expect.objectContaining({ + maxAttempts: 3, + })); + }); + it("should clamp invalid MAX_ATTEMPTS to 1 with warning", async () => { + process.env.MAX_ATTEMPTS = "0"; + await (0, commit_runner_1.main)(); + expect(commit_1.commitViaAPI).toHaveBeenCalledWith(expect.objectContaining({ + maxAttempts: 1, + })); + expect(core.info).toHaveBeenCalledWith(expect.stringMatching(/MAX_ATTEMPTS|1|invalid|clamp/i)); + }); + it("should clamp negative MAX_ATTEMPTS to 1", async () => { + process.env.MAX_ATTEMPTS = "-1"; + await (0, commit_runner_1.main)(); + expect(commit_1.commitViaAPI).toHaveBeenCalledWith(expect.objectContaining({ + maxAttempts: 1, + })); + }); + it("should clamp non-numeric MAX_ATTEMPTS to 1", async () => { + process.env.MAX_ATTEMPTS = "abc"; + await (0, commit_runner_1.main)(); + expect(commit_1.commitViaAPI).toHaveBeenCalledWith(expect.objectContaining({ + maxAttempts: 1, + })); + }); + }); }); //# sourceMappingURL=commit-runner.test.js.map \ No newline at end of file diff --git a/dist/src/__tests__/unit/commit-runner.test.js.map b/dist/src/__tests__/unit/commit-runner.test.js.map index 5761a57..914ba55 100644 --- a/dist/src/__tests__/unit/commit-runner.test.js.map +++ b/dist/src/__tests__/unit/commit-runner.test.js.map @@ -1 +1 @@ -{"version":3,"file":"commit-runner.test.js","sourceRoot":"","sources":["../../../../src/__tests__/unit/commit-runner.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"commit-runner.test.js","sourceRoot":"","sources":["../../../../src/__tests__/unit/commit-runner.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/src/__tests__/unit/commit.test.js b/dist/src/__tests__/unit/commit.test.js index 2ba9cfc..64bbab6 100644 --- a/dist/src/__tests__/unit/commit.test.js +++ b/dist/src/__tests__/unit/commit.test.js @@ -570,6 +570,147 @@ describe("commit", () => { expect(result.treeSha).toBe("new-tree-sha"); expect(result.filesCommitted).toBe(1); }); + describe("retry behavior", () => { + it("with maxAttempts 1 (default) does not retry on 404 from getRef", async () => { + mockOctokit.rest.git.getRef.mockRejectedValue({ status: 404 }); + mockOctokit.rest.git.getCommit.mockResolvedValue({ + data: { tree: { sha: "base-tree-sha" } }, + }); + await expect((0, commit_1.commitViaAPI)({ + token: "test-token", + owner: "owner", + repo: "repo", + branch: "dev", + message: "Test", + filePaths: ["x.txt"], + })).rejects.toMatchObject({ status: 404 }); + expect(mockOctokit.rest.git.getRef).toHaveBeenCalledTimes(1); + }); + it("with maxAttempts 3 retries transient 404 on getRef and succeeds on second attempt", async () => { + const fs = require("fs"); + fs.existsSync = jest.fn().mockReturnValue(true); + fs.readFileSync = jest.fn((path, enc) => enc === "utf-8" ? "x" : Buffer.from("x")); + fs.statSync = jest.fn().mockReturnValue({ mode: 0o644, size: 1 }); + mockOctokit.rest.git.getRef + .mockRejectedValueOnce({ status: 404 }) + .mockResolvedValueOnce({ + data: { object: { sha: "base-sha" } }, + }); + mockOctokit.rest.git.getCommit.mockResolvedValue({ + data: { tree: { sha: "base-tree-sha" } }, + }); + mockOctokit.rest.git.createTree.mockResolvedValue({ + data: { sha: "new-tree-sha" }, + }); + mockOctokit.rest.git.createCommit.mockResolvedValue({ + data: { sha: "commit-sha" }, + }); + mockOctokit.rest.git.updateRef.mockResolvedValue({ data: {} }); + const result = await (0, commit_1.commitViaAPI)({ + token: "test-token", + owner: "owner", + repo: "repo", + branch: "dev", + message: "Test", + filePaths: ["x.txt"], + maxAttempts: 3, + baseDelayMs: 1, + maxDelayMs: 5, + }); + expect(result.commitSha).toBe("commit-sha"); + expect(mockOctokit.rest.git.getRef).toHaveBeenCalledTimes(2); + }); + it("with maxAttempts 2 retries 503 on createCommit and succeeds", async () => { + const fs = require("fs"); + fs.existsSync = jest.fn().mockReturnValue(true); + fs.readFileSync = jest.fn((path, enc) => enc === "utf-8" ? "x" : Buffer.from("x")); + fs.statSync = jest.fn().mockReturnValue({ mode: 0o644, size: 1 }); + mockOctokit.rest.git.getRef.mockResolvedValue({ + data: { object: { sha: "base-sha" } }, + }); + mockOctokit.rest.git.getCommit.mockResolvedValue({ + data: { tree: { sha: "base-tree-sha" } }, + }); + mockOctokit.rest.git.createTree.mockResolvedValue({ + data: { sha: "new-tree-sha" }, + }); + mockOctokit.rest.git.createCommit + .mockRejectedValueOnce({ status: 503 }) + .mockResolvedValueOnce({ data: { sha: "commit-sha" } }); + mockOctokit.rest.git.updateRef.mockResolvedValue({ data: {} }); + const result = await (0, commit_1.commitViaAPI)({ + token: "test-token", + owner: "owner", + repo: "repo", + branch: "dev", + message: "Test", + filePaths: ["x.txt"], + maxAttempts: 2, + baseDelayMs: 1, + maxDelayMs: 5, + }); + expect(result.commitSha).toBe("commit-sha"); + expect(mockOctokit.rest.git.createCommit).toHaveBeenCalledTimes(2); + }); + it("exhausts attempts and surfaces original error", async () => { + const fs = require("fs"); + fs.existsSync = jest.fn().mockReturnValue(true); + fs.readFileSync = jest.fn((path, enc) => enc === "utf-8" ? "x" : Buffer.from("x")); + fs.statSync = jest.fn().mockReturnValue({ mode: 0o644, size: 1 }); + mockOctokit.rest.git.getRef.mockRejectedValue({ status: 404 }); + mockOctokit.rest.git.getCommit.mockResolvedValue({ + data: { tree: { sha: "base-tree-sha" } }, + }); + await expect((0, commit_1.commitViaAPI)({ + token: "test-token", + owner: "owner", + repo: "repo", + branch: "dev", + message: "Test", + filePaths: ["x.txt"], + maxAttempts: 2, + baseDelayMs: 1, + maxDelayMs: 5, + })).rejects.toMatchObject({ status: 404 }); + expect(mockOctokit.rest.git.getRef).toHaveBeenCalledTimes(2); + }); + it("calls logger on retry", async () => { + const logger = jest.fn(); + const fs = require("fs"); + fs.existsSync = jest.fn().mockReturnValue(true); + fs.readFileSync = jest.fn((path, enc) => enc === "utf-8" ? "x" : Buffer.from("x")); + fs.statSync = jest.fn().mockReturnValue({ mode: 0o644, size: 1 }); + mockOctokit.rest.git.getRef + .mockRejectedValueOnce({ status: 404 }) + .mockResolvedValueOnce({ + data: { object: { sha: "base-sha" } }, + }); + mockOctokit.rest.git.getCommit.mockResolvedValue({ + data: { tree: { sha: "base-tree-sha" } }, + }); + mockOctokit.rest.git.createTree.mockResolvedValue({ + data: { sha: "new-tree-sha" }, + }); + mockOctokit.rest.git.createCommit.mockResolvedValue({ + data: { sha: "commit-sha" }, + }); + mockOctokit.rest.git.updateRef.mockResolvedValue({ data: {} }); + await (0, commit_1.commitViaAPI)({ + token: "test-token", + owner: "owner", + repo: "repo", + branch: "dev", + message: "Test", + filePaths: ["x.txt"], + maxAttempts: 3, + baseDelayMs: 1, + maxDelayMs: 5, + logger, + }); + expect(logger).toHaveBeenCalled(); + expect(logger.mock.calls[0][0]).toMatch(/attempt|404|retry/i); + }); + }); }); }); //# sourceMappingURL=commit.test.js.map \ No newline at end of file diff --git a/dist/src/__tests__/unit/commit.test.js.map b/dist/src/__tests__/unit/commit.test.js.map index b674265..46c80a7 100644 --- a/dist/src/__tests__/unit/commit.test.js.map +++ b/dist/src/__tests__/unit/commit.test.js.map @@ -1 +1 @@ -{"version":3,"file":"commit.test.js","sourceRoot":"","sources":["../../../../src/__tests__/unit/commit.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"commit.test.js","sourceRoot":"","sources":["../../../../src/__tests__/unit/commit.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/src/__tests__/unit/retry.test.d.ts b/dist/src/__tests__/unit/retry.test.d.ts new file mode 100644 index 0000000..1965cdc --- /dev/null +++ b/dist/src/__tests__/unit/retry.test.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=retry.test.d.ts.map \ No newline at end of file diff --git a/dist/src/__tests__/unit/retry.test.d.ts.map b/dist/src/__tests__/unit/retry.test.d.ts.map new file mode 100644 index 0000000..16d4dc3 --- /dev/null +++ b/dist/src/__tests__/unit/retry.test.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"retry.test.d.ts","sourceRoot":"","sources":["file:///workspace/commit_action/src/__tests__/unit/retry.test.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/dist/src/__tests__/unit/retry.test.js b/dist/src/__tests__/unit/retry.test.js new file mode 100644 index 0000000..3c79548 --- /dev/null +++ b/dist/src/__tests__/unit/retry.test.js @@ -0,0 +1,163 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const retry_1 = require("../../retry"); +describe("retry", () => { + describe("isTransientError", () => { + it("returns true for error with status 404", () => { + expect((0, retry_1.isTransientError)({ status: 404 })).toBe(true); + }); + it("returns true for errors with status 500, 502, 503", () => { + expect((0, retry_1.isTransientError)({ status: 500 })).toBe(true); + expect((0, retry_1.isTransientError)({ status: 502 })).toBe(true); + expect((0, retry_1.isTransientError)({ status: 503 })).toBe(true); + }); + it("returns true for status 429", () => { + expect((0, retry_1.isTransientError)({ status: 429 })).toBe(true); + }); + it("returns true for status 403 with message containing 'secondary rate limit'", () => { + expect((0, retry_1.isTransientError)({ status: 403, message: "secondary rate limit exceeded" })).toBe(true); + expect((0, retry_1.isTransientError)({ status: 403, message: "API rate limit exceeded" })).toBe(true); + expect((0, retry_1.isTransientError)({ status: 403, message: "You have exceeded abuse rate limit" })).toBe(true); + }); + it("returns false for status 403 without rate-limit message", () => { + expect((0, retry_1.isTransientError)({ status: 403, message: "Forbidden" })).toBe(false); + }); + it("returns false for status 422 (validation error)", () => { + expect((0, retry_1.isTransientError)({ status: 422 })).toBe(false); + }); + it("returns false for generic Error with no status", () => { + expect((0, retry_1.isTransientError)(new Error("something broke"))).toBe(false); + }); + it("returns false when status is not a number", () => { + expect((0, retry_1.isTransientError)({ status: "404" })).toBe(false); + expect((0, retry_1.isTransientError)({ status: null })).toBe(false); + }); + }); + describe("classifyError", () => { + it("returns descriptive string for 404", () => { + expect((0, retry_1.classifyError)({ status: 404 })).toContain("404"); + expect((0, retry_1.classifyError)({ status: 404 })).toContain("transient"); + }); + it("returns descriptive string for 5xx", () => { + expect((0, retry_1.classifyError)({ status: 500 })).toContain("500"); + expect((0, retry_1.classifyError)({ status: 503 })).toContain("503"); + }); + it("returns descriptive string for 429", () => { + expect((0, retry_1.classifyError)({ status: 429 })).toContain("429"); + }); + it("returns descriptive string for 403 rate limit", () => { + expect((0, retry_1.classifyError)({ status: 403, message: "secondary rate limit" })).toMatch(/rate limit|403/i); + }); + it("returns non-transient for unknown errors", () => { + expect((0, retry_1.classifyError)(new Error("unknown"))).toContain("non-transient"); + }); + }); + describe("calculateDelay", () => { + const base = 1000; + const max = 10000; + it("returns value in expected range for attempt 0", () => { + const delay = (0, retry_1.calculateDelay)(0, base, max); + expect(delay).toBeGreaterThanOrEqual(1000); + expect(delay).toBeLessThanOrEqual(1000 * 1.25); + }); + it("returns value in expected range for attempt 1", () => { + const delay = (0, retry_1.calculateDelay)(1, base, max); + expect(delay).toBeGreaterThanOrEqual(2000); + expect(delay).toBeLessThanOrEqual(2000 * 1.25); + }); + it("never exceeds maxDelayMs plus jitter", () => { + const delay = (0, retry_1.calculateDelay)(10, base, max); + expect(delay).toBeLessThanOrEqual(max * 1.25); + }); + }); + describe("withRetry", () => { + it("resolves immediately on success with single call", async () => { + const fn = jest.fn().mockResolvedValue("ok"); + const result = await (0, retry_1.withRetry)(fn, { maxAttempts: 3 }); + expect(result).toBe("ok"); + expect(fn).toHaveBeenCalledTimes(1); + }); + it("does not retry when maxAttempts is 1", async () => { + const fn = jest.fn().mockRejectedValue({ status: 404 }); + await expect((0, retry_1.withRetry)(fn, { maxAttempts: 1 })).rejects.toEqual({ + status: 404, + }); + expect(fn).toHaveBeenCalledTimes(1); + }); + it("treats maxAttempts 0 or negative as 1 (single attempt)", async () => { + const fn404 = jest.fn().mockRejectedValue({ status: 404 }); + await expect((0, retry_1.withRetry)(fn404, { maxAttempts: 0 })).rejects.toEqual({ + status: 404, + }); + expect(fn404).toHaveBeenCalledTimes(1); + const fn503 = jest.fn().mockRejectedValue({ status: 503 }); + await expect((0, retry_1.withRetry)(fn503, { maxAttempts: -1 })).rejects.toMatchObject({ + status: 503, + }); + expect(fn503).toHaveBeenCalledTimes(1); + }); + it("retries transient errors up to maxAttempts and succeeds on later attempt", async () => { + const fn = jest + .fn() + .mockRejectedValueOnce({ status: 404 }) + .mockResolvedValueOnce("ok"); + jest.useFakeTimers(); + const resultPromise = (0, retry_1.withRetry)(fn, { maxAttempts: 3 }); + await jest.runAllTimersAsync(); + const result = await resultPromise; + expect(result).toBe("ok"); + expect(fn).toHaveBeenCalledTimes(2); + jest.useRealTimers(); + }); + it("throws after exhausting all attempts on persistent transient error", async () => { + const fn = jest.fn().mockRejectedValue({ status: 503 }); + const resultPromise = (0, retry_1.withRetry)(fn, { + maxAttempts: 3, + baseDelayMs: 1, + maxDelayMs: 5, + }); + await expect(resultPromise).rejects.toMatchObject({ status: 503 }); + expect(fn).toHaveBeenCalledTimes(3); + }); + it("does not retry non-transient errors, throws immediately", async () => { + const fn = jest.fn().mockRejectedValue({ status: 422 }); + await expect((0, retry_1.withRetry)(fn, { maxAttempts: 3 })).rejects.toEqual({ + status: 422, + }); + expect(fn).toHaveBeenCalledTimes(1); + }); + it("calls logger with attempt number, classification, and delay", async () => { + const logger = jest.fn(); + const fn = jest + .fn() + .mockRejectedValueOnce({ status: 404 }) + .mockResolvedValueOnce("ok"); + jest.useFakeTimers(); + const resultPromise = (0, retry_1.withRetry)(fn, { maxAttempts: 3 }, logger); + await jest.runAllTimersAsync(); + await resultPromise; + expect(logger).toHaveBeenCalled(); + const logCall = logger.mock.calls[0][0]; + expect(logCall).toMatch(/attempt|404|retry/i); + jest.useRealTimers(); + }); + it("applies backoff delay between attempts", async () => { + const fn = jest + .fn() + .mockRejectedValueOnce({ status: 404 }) + .mockRejectedValueOnce({ status: 404 }) + .mockResolvedValueOnce("ok"); + jest.useFakeTimers(); + const resultPromise = (0, retry_1.withRetry)(fn, { + maxAttempts: 3, + baseDelayMs: 100, + maxDelayMs: 500, + }); + await jest.runAllTimersAsync(); + await resultPromise; + expect(fn).toHaveBeenCalledTimes(3); + jest.useRealTimers(); + }); + }); +}); +//# sourceMappingURL=retry.test.js.map \ No newline at end of file diff --git a/dist/src/__tests__/unit/retry.test.js.map b/dist/src/__tests__/unit/retry.test.js.map new file mode 100644 index 0000000..e124389 --- /dev/null +++ b/dist/src/__tests__/unit/retry.test.js.map @@ -0,0 +1 @@ +{"version":3,"file":"retry.test.js","sourceRoot":"","sources":["../../../../src/__tests__/unit/retry.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/src/commit-runner.d.ts b/dist/src/commit-runner.d.ts index 5aa3cb0..4c573cf 100644 --- a/dist/src/commit-runner.d.ts +++ b/dist/src/commit-runner.d.ts @@ -9,6 +9,7 @@ * - COMMIT_MESSAGE: Commit message * - FILE_PATHS: Comma-separated list of file paths to commit (or read from git status) * - ALLOW_EMPTY: Set to "true" to allow empty commits when no files changed (default: false) + * - MAX_ATTEMPTS: Max retry attempts for transient API failures (default: 1 = no retries) */ /** * Normalizes a Git reference to a branch name diff --git a/dist/src/commit-runner.d.ts.map b/dist/src/commit-runner.d.ts.map index cd5ad4c..a17149f 100644 --- a/dist/src/commit-runner.d.ts.map +++ b/dist/src/commit-runner.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"commit-runner.d.ts","sourceRoot":"","sources":["file:///workspace/commit_action/src/commit-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AASH;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAOnD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,MAAM,CAaT;AA6BD,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAqI1C"} \ No newline at end of file +{"version":3,"file":"commit-runner.d.ts","sourceRoot":"","sources":["file:///workspace/commit_action/src/commit-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AASH;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAOnD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,MAAM,CAaT;AA6BD,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAwJ1C"} \ No newline at end of file diff --git a/dist/src/commit-runner.js b/dist/src/commit-runner.js index 1d1d056..95895cc 100644 --- a/dist/src/commit-runner.js +++ b/dist/src/commit-runner.js @@ -11,6 +11,7 @@ * - COMMIT_MESSAGE: Commit message * - FILE_PATHS: Comma-separated list of file paths to commit (or read from git status) * - ALLOW_EMPTY: Set to "true" to allow empty commits when no files changed (default: false) + * - MAX_ATTEMPTS: Max retry attempts for transient API failures (default: 1 = no retries) */ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; @@ -206,6 +207,21 @@ async function main() { core.info(`Files: ${filePaths.join(", ")}`); // Get base SHA if provided (for testing or specific use cases) const baseSha = process.env.BASE_SHA; + // Parse MAX_ATTEMPTS for retry (default 1 = no retries) + let maxAttempts = 1; + const rawAttempts = process.env.MAX_ATTEMPTS; + if (rawAttempts) { + const parsed = parseInt(rawAttempts, 10); + if (Number.isNaN(parsed) || parsed < 1) { + core.info(`MAX_ATTEMPTS="${rawAttempts}" invalid, using 1 (no retries)`); + } + else { + maxAttempts = parsed; + if (maxAttempts > 1) { + core.info(`API retries enabled: max ${maxAttempts} attempts`); + } + } + } // Commit changes via API const result = await (0, commit_1.commitViaAPI)({ token, @@ -216,6 +232,8 @@ async function main() { filePaths, allowEmpty, baseSha, + maxAttempts, + logger: core.info, }); core.info(`Created signed commit ${result.commitSha} via GitHub API`); core.setOutput("commit-sha", result.commitSha); diff --git a/dist/src/commit-runner.js.map b/dist/src/commit-runner.js.map index 3e655b3..a103479 100644 --- a/dist/src/commit-runner.js.map +++ b/dist/src/commit-runner.js.map @@ -1 +1 @@ -{"version":3,"file":"commit-runner.js","sourceRoot":"","sources":["../../src/commit-runner.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"commit-runner.js","sourceRoot":"","sources":["../../src/commit-runner.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/src/commit.d.ts b/dist/src/commit.d.ts index e9b5ed9..9358fbc 100644 --- a/dist/src/commit.d.ts +++ b/dist/src/commit.d.ts @@ -8,6 +8,14 @@ export interface CommitOptions { filePaths: string[]; allowEmpty?: boolean; baseSha?: string; + /** Max API attempt count (default 1 = no retries). */ + maxAttempts?: number; + /** Logger for retry messages (default: console.info). */ + logger?: (msg: string) => void; + /** Base delay in ms for retry backoff (test tuning). */ + baseDelayMs?: number; + /** Max delay cap in ms for retry backoff (test tuning). */ + maxDelayMs?: number; } export interface CommitResult { commitSha: string; diff --git a/dist/src/commit.d.ts.map b/dist/src/commit.d.ts.map index 0c0c25b..e74889e 100644 --- a/dist/src/commit.d.ts.map +++ b/dist/src/commit.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"commit.d.ts","sourceRoot":"","sources":["file:///workspace/commit_action/src/commit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAC;AAG1C,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;GAGG;AACH,eAAO,MAAM,qBAAqB,MAAM,CAAC;AAsBzC;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAMtD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAGjE;AAED,8BAA8B;AAC9B,MAAM,WAAW,iBAAiB;IAChC,8DAA8D;IAC9D,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAC5B;AAgBD;;GAEG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,UAAU,CAAC,OAAO,MAAM,CAAC,UAAU,CAAC,EAC7C,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAA;CAAE,CAAC,CAkBrD;AA0BD;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,UAAU,CAAC,OAAO,MAAM,CAAC,UAAU,CAAC,EAC7C,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EAAE,GAClB,OAAO,CAAC,MAAM,CAAC,CAmDjB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,UAAU,CAAC,OAAO,MAAM,CAAC,UAAU,CAAC,EAC7C,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAUjB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,UAAU,CAAC,OAAO,MAAM,CAAC,UAAU,CAAC,EAC7C,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,KAAK,GAAE,OAAe,GACrB,OAAO,CAAC,IAAI,CAAC,CAQf;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,UAAU,CAAC,OAAO,MAAM,CAAC,UAAU,CAAC,EAC7C,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAiB3C;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,YAAY,CAAC,CAsDvB"} \ No newline at end of file +{"version":3,"file":"commit.d.ts","sourceRoot":"","sources":["file:///workspace/commit_action/src/commit.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/src/commit.js b/dist/src/commit.js index 6f11136..237d340 100644 --- a/dist/src/commit.js +++ b/dist/src/commit.js @@ -44,6 +44,7 @@ exports.getBranchInfo = getBranchInfo; exports.commitViaAPI = commitViaAPI; const github = __importStar(require("@actions/github")); const fs = __importStar(require("fs")); +const retry_1 = require("./retry"); /** * Max tree entries per createTree request. Keeps payloads comfortably under * GitHub's ~25 MB request body limit and avoids slow single-call responses. @@ -152,18 +153,12 @@ async function createTree(octokit, owner, repo, baseTreeSha, filePaths) { }); } catch { - const base64Content = raw.toString("base64"); - const { data: blob } = await octokit.rest.git.createBlob({ - owner, - repo, - content: base64Content, - encoding: "base64", - }); + const result = await createBlob(octokit, owner, repo, filePath, { mode }); treeEntries.push({ path: filePath, - mode, + mode: result.mode, type: "blob", - sha: blob.sha, + sha: result.sha, }); } } @@ -221,38 +216,44 @@ async function getBranchInfo(octokit, owner, repo, branch) { * This is designed to be modular and reusable - can be used as a standalone action */ async function commitViaAPI(options) { - const { token, owner, repo, branch, message, filePaths, allowEmpty, baseSha } = options; + const { token, owner, repo, branch, message, filePaths, allowEmpty, baseSha, maxAttempts = 1, logger, baseDelayMs, maxDelayMs, } = options; if (filePaths.length === 0 && !allowEmpty) { throw new Error("No files to commit"); } const octokit = github.getOctokit(token); + const retryConfig = { + maxAttempts, + ...(baseDelayMs !== undefined && { baseDelayMs }), + ...(maxDelayMs !== undefined && { maxDelayMs }), + }; + const log = logger ?? console.info; // Get branch info (SHA and tree SHA) let branchSha; let baseTreeSha; if (baseSha) { // Use provided base SHA branchSha = baseSha; - const { data: commit } = await octokit.rest.git.getCommit({ + const { data: commit } = await (0, retry_1.withRetry)(() => octokit.rest.git.getCommit({ owner, repo, commit_sha: baseSha, - }); + }), retryConfig, log); baseTreeSha = commit.tree.sha; } else { // Fetch from branch - const branchInfo = await getBranchInfo(octokit, owner, repo, branch); + const branchInfo = await (0, retry_1.withRetry)(() => getBranchInfo(octokit, owner, repo, branch), retryConfig, log); branchSha = branchInfo.sha; baseTreeSha = branchInfo.treeSha; } // For empty commits, reuse parent tree SHA; otherwise create a new tree. const newTreeSha = filePaths.length === 0 ? baseTreeSha - : await createTree(octokit, owner, repo, baseTreeSha, filePaths); + : await (0, retry_1.withRetry)(() => createTree(octokit, owner, repo, baseTreeSha, filePaths), retryConfig, log); // Create commit (automatically signed by GitHub) - const commitSha = await createCommit(octokit, owner, repo, newTreeSha, branchSha, message); + const commitSha = await (0, retry_1.withRetry)(() => createCommit(octokit, owner, repo, newTreeSha, branchSha, message), retryConfig, log); // Update branch reference - await updateBranch(octokit, owner, repo, branch, commitSha, false); + await (0, retry_1.withRetry)(() => updateBranch(octokit, owner, repo, branch, commitSha, false), retryConfig, log); return { commitSha, treeSha: newTreeSha, diff --git a/dist/src/commit.js.map b/dist/src/commit.js.map index 48db961..a831290 100644 --- a/dist/src/commit.js.map +++ b/dist/src/commit.js.map @@ -1 +1 @@ -{"version":3,"file":"commit.js","sourceRoot":"","sources":["../../src/commit.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"commit.js","sourceRoot":"","sources":["../../src/commit.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/src/retry.d.ts b/dist/src/retry.d.ts new file mode 100644 index 0000000..1be9b13 --- /dev/null +++ b/dist/src/retry.d.ts @@ -0,0 +1,32 @@ +/** Default max attempts (1 = no retries, backward compatible). */ +export declare const DEFAULT_MAX_ATTEMPTS = 1; +/** Default base delay for exponential backoff, in milliseconds. */ +export declare const DEFAULT_BASE_DELAY_MS = 1000; +/** Default maximum delay cap for backoff, in milliseconds. */ +export declare const DEFAULT_MAX_DELAY_MS = 30000; +export interface RetryConfig { + maxAttempts: number; + baseDelayMs?: number; + maxDelayMs?: number; +} +/** + * Returns true if the error is a transient condition worth retrying: + * - 404 (transient ref/commit lookup) + * - 5xx (server error) + * - 429 (primary rate limit) + * - 403 with rate limit / secondary rate limit / abuse in message + */ +export declare function isTransientError(error: unknown): boolean; +/** Human-readable classification for logging. */ +export declare function classifyError(error: unknown): string; +/** + * Exponential backoff with jitter. + * Delay = min(base * 2^attempt, maxDelayMs) + jitter (0-25% of computed). + */ +export declare function calculateDelay(attempt: number, baseDelayMs: number, maxDelayMs: number): number; +/** + * Retries an async operation on transient errors only. + * Logs attempt number, classification, and delay via logger when retrying. + */ +export declare function withRetry(fn: () => Promise, config: RetryConfig, logger?: (msg: string) => void): Promise; +//# sourceMappingURL=retry.d.ts.map \ No newline at end of file diff --git a/dist/src/retry.d.ts.map b/dist/src/retry.d.ts.map new file mode 100644 index 0000000..f49152e --- /dev/null +++ b/dist/src/retry.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["file:///workspace/commit_action/src/retry.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC,mEAAmE;AACnE,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAE1C,8DAA8D;AAC9D,eAAO,MAAM,oBAAoB,QAAS,CAAC;AAE3C,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAUD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAgBxD;AAED,iDAAiD;AACjD,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAYpD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,MAAM,CAIR;AAMD;;;GAGG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAC/B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,MAAM,EAAE,WAAW,EACnB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAC7B,OAAO,CAAC,CAAC,CAAC,CA4BZ"} \ No newline at end of file diff --git a/dist/src/retry.js b/dist/src/retry.js new file mode 100644 index 0000000..6e186e7 --- /dev/null +++ b/dist/src/retry.js @@ -0,0 +1,103 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DEFAULT_MAX_DELAY_MS = exports.DEFAULT_BASE_DELAY_MS = exports.DEFAULT_MAX_ATTEMPTS = void 0; +exports.isTransientError = isTransientError; +exports.classifyError = classifyError; +exports.calculateDelay = calculateDelay; +exports.withRetry = withRetry; +/** Default max attempts (1 = no retries, backward compatible). */ +exports.DEFAULT_MAX_ATTEMPTS = 1; +/** Default base delay for exponential backoff, in milliseconds. */ +exports.DEFAULT_BASE_DELAY_MS = 1000; +/** Default maximum delay cap for backoff, in milliseconds. */ +exports.DEFAULT_MAX_DELAY_MS = 30000; +/** HTTP-like error shape from Octokit RequestError. */ +function hasStatus(e) { + if (typeof e !== "object" || e === null || !("status" in e)) { + return false; + } + return typeof e.status === "number"; +} +/** + * Returns true if the error is a transient condition worth retrying: + * - 404 (transient ref/commit lookup) + * - 5xx (server error) + * - 429 (primary rate limit) + * - 403 with rate limit / secondary rate limit / abuse in message + */ +function isTransientError(error) { + if (!hasStatus(error)) + return false; + const { status, message = "" } = error; + const msg = message.toLowerCase(); + if (status === 404) + return true; + if (status >= 500 && status < 600) + return true; + if (status === 429) + return true; + if (status === 403) { + return (msg.includes("rate limit") || + msg.includes("secondary rate limit") || + msg.includes("abuse")); + } + return false; +} +/** Human-readable classification for logging. */ +function classifyError(error) { + if (!hasStatus(error)) + return "non-transient"; + const { status, message = "" } = error; + const msg = message.toLowerCase(); + if (status === 404) + return "HTTP 404 (transient)"; + if (status >= 500 && status < 600) + return `HTTP ${status} (server error)`; + if (status === 429) + return "HTTP 429 (rate limit)"; + if (status === 403 && (msg.includes("rate limit") || msg.includes("abuse"))) { + return "rate limit (403)"; + } + return "non-transient"; +} +/** + * Exponential backoff with jitter. + * Delay = min(base * 2^attempt, maxDelayMs) + jitter (0-25% of computed). + */ +function calculateDelay(attempt, baseDelayMs, maxDelayMs) { + const raw = Math.min(baseDelayMs * Math.pow(2, attempt), maxDelayMs); + const jitter = raw * 0.25 * Math.random(); + return Math.floor(raw + jitter); +} +function sleep(ms) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} +/** + * Retries an async operation on transient errors only. + * Logs attempt number, classification, and delay via logger when retrying. + */ +async function withRetry(fn, config, logger) { + const baseDelayMs = config.baseDelayMs ?? exports.DEFAULT_BASE_DELAY_MS; + const maxDelayMs = config.maxDelayMs ?? exports.DEFAULT_MAX_DELAY_MS; + const log = logger ?? (() => { }); + const maxAttempts = Math.max(1, Number.isFinite(config.maxAttempts) ? config.maxAttempts : 1); + let lastError; + for (let attempt = 0; attempt < maxAttempts; attempt++) { + try { + return await fn(); + } + catch (e) { + lastError = e; + const isLast = attempt === maxAttempts - 1; + if (isLast || !isTransientError(e)) { + throw e; + } + const classification = classifyError(e); + const delay = calculateDelay(attempt, baseDelayMs, maxDelayMs); + log(`GitHub API attempt ${attempt + 1}/${maxAttempts} failed (${classification}), retrying in ${delay}ms`); + await sleep(delay); + } + } + throw lastError; +} +//# sourceMappingURL=retry.js.map \ No newline at end of file diff --git a/dist/src/retry.js.map b/dist/src/retry.js.map new file mode 100644 index 0000000..910c662 --- /dev/null +++ b/dist/src/retry.js.map @@ -0,0 +1 @@ +{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/retry.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 553a45b..550511c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "commit-action", - "version": "0.1.5", + "version": "0.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "commit-action", - "version": "0.1.5", + "version": "0.2.0", "license": "MIT", "dependencies": { "@actions/core": "^1.10.1", diff --git a/package.json b/package.json index 828f021..fdb4149 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "commit-action", - "version": "0.1.5", + "version": "0.2.0", "description": "Commit changes via GitHub API (signed commits, bypasses rulesets)", "main": "dist/commit.js", "scripts": { diff --git a/src/__tests__/unit/commit-runner.test.ts b/src/__tests__/unit/commit-runner.test.ts index 68402f6..c55d42b 100644 --- a/src/__tests__/unit/commit-runner.test.ts +++ b/src/__tests__/unit/commit-runner.test.ts @@ -305,4 +305,96 @@ describe("commit-runner", () => { ); }); }); + + describe("main MAX_ATTEMPTS behavior", () => { + const originalEnv = process.env; + + beforeEach(() => { + jest.clearAllMocks(); + process.env = { + ...originalEnv, + GITHUB_TOKEN: "test-token", + GITHUB_REPOSITORY: "owner/repo", + TARGET_BRANCH: "refs/heads/main", + COMMIT_MESSAGE: "Test commit", + FILE_PATHS: "file.txt", + }; + (github.context as any).ref = "refs/heads/main"; + (commitViaAPI as jest.Mock).mockResolvedValue({ + commitSha: "commit-sha", + treeSha: "tree-sha", + filesCommitted: 1, + }); + const fs = jest.requireMock("fs"); + fs.existsSync = jest.fn().mockReturnValue(true); + fs.statSync = jest.fn().mockReturnValue({ isDirectory: () => false }); + }); + + afterAll(() => { + process.env = originalEnv; + }); + + it("should pass maxAttempts 1 when MAX_ATTEMPTS is not set", async () => { + delete process.env.MAX_ATTEMPTS; + + await main(); + + expect(commitViaAPI).toHaveBeenCalledWith( + expect.objectContaining({ + maxAttempts: 1, + }) + ); + }); + + it("should pass parsed maxAttempts 3 when MAX_ATTEMPTS=3", async () => { + process.env.MAX_ATTEMPTS = "3"; + + await main(); + + expect(commitViaAPI).toHaveBeenCalledWith( + expect.objectContaining({ + maxAttempts: 3, + }) + ); + }); + + it("should clamp invalid MAX_ATTEMPTS to 1 with warning", async () => { + process.env.MAX_ATTEMPTS = "0"; + + await main(); + + expect(commitViaAPI).toHaveBeenCalledWith( + expect.objectContaining({ + maxAttempts: 1, + }) + ); + expect(core.info).toHaveBeenCalledWith( + expect.stringMatching(/MAX_ATTEMPTS|1|invalid|clamp/i) + ); + }); + + it("should clamp negative MAX_ATTEMPTS to 1", async () => { + process.env.MAX_ATTEMPTS = "-1"; + + await main(); + + expect(commitViaAPI).toHaveBeenCalledWith( + expect.objectContaining({ + maxAttempts: 1, + }) + ); + }); + + it("should clamp non-numeric MAX_ATTEMPTS to 1", async () => { + process.env.MAX_ATTEMPTS = "abc"; + + await main(); + + expect(commitViaAPI).toHaveBeenCalledWith( + expect.objectContaining({ + maxAttempts: 1, + }) + ); + }); + }); }); diff --git a/src/__tests__/unit/commit.test.ts b/src/__tests__/unit/commit.test.ts index 4be3518..21bb178 100644 --- a/src/__tests__/unit/commit.test.ts +++ b/src/__tests__/unit/commit.test.ts @@ -705,5 +705,177 @@ describe("commit", () => { expect(result.treeSha).toBe("new-tree-sha"); expect(result.filesCommitted).toBe(1); }); + + describe("retry behavior", () => { + it("with maxAttempts 1 (default) does not retry on 404 from getRef", async () => { + mockOctokit.rest.git.getRef.mockRejectedValue({ status: 404 }); + mockOctokit.rest.git.getCommit.mockResolvedValue({ + data: { tree: { sha: "base-tree-sha" } }, + }); + + await expect( + commitViaAPI({ + token: "test-token", + owner: "owner", + repo: "repo", + branch: "dev", + message: "Test", + filePaths: ["x.txt"], + }) + ).rejects.toMatchObject({ status: 404 }); + + expect(mockOctokit.rest.git.getRef).toHaveBeenCalledTimes(1); + }); + + it("with maxAttempts 3 retries transient 404 on getRef and succeeds on second attempt", async () => { + const fs = require("fs"); + fs.existsSync = jest.fn().mockReturnValue(true); + fs.readFileSync = jest.fn((path: string, enc?: string) => + enc === "utf-8" ? "x" : Buffer.from("x") + ); + fs.statSync = jest.fn().mockReturnValue({ mode: 0o644, size: 1 }); + + mockOctokit.rest.git.getRef + .mockRejectedValueOnce({ status: 404 }) + .mockResolvedValueOnce({ + data: { object: { sha: "base-sha" } }, + }); + mockOctokit.rest.git.getCommit.mockResolvedValue({ + data: { tree: { sha: "base-tree-sha" } }, + }); + mockOctokit.rest.git.createTree.mockResolvedValue({ + data: { sha: "new-tree-sha" }, + }); + mockOctokit.rest.git.createCommit.mockResolvedValue({ + data: { sha: "commit-sha" }, + }); + mockOctokit.rest.git.updateRef.mockResolvedValue({ data: {} }); + + const result = await commitViaAPI({ + token: "test-token", + owner: "owner", + repo: "repo", + branch: "dev", + message: "Test", + filePaths: ["x.txt"], + maxAttempts: 3, + baseDelayMs: 1, + maxDelayMs: 5, + }); + + expect(result.commitSha).toBe("commit-sha"); + expect(mockOctokit.rest.git.getRef).toHaveBeenCalledTimes(2); + }); + + it("with maxAttempts 2 retries 503 on createCommit and succeeds", async () => { + const fs = require("fs"); + fs.existsSync = jest.fn().mockReturnValue(true); + fs.readFileSync = jest.fn((path: string, enc?: string) => + enc === "utf-8" ? "x" : Buffer.from("x") + ); + fs.statSync = jest.fn().mockReturnValue({ mode: 0o644, size: 1 }); + + mockOctokit.rest.git.getRef.mockResolvedValue({ + data: { object: { sha: "base-sha" } }, + }); + mockOctokit.rest.git.getCommit.mockResolvedValue({ + data: { tree: { sha: "base-tree-sha" } }, + }); + mockOctokit.rest.git.createTree.mockResolvedValue({ + data: { sha: "new-tree-sha" }, + }); + mockOctokit.rest.git.createCommit + .mockRejectedValueOnce({ status: 503 }) + .mockResolvedValueOnce({ data: { sha: "commit-sha" } }); + mockOctokit.rest.git.updateRef.mockResolvedValue({ data: {} }); + + const result = await commitViaAPI({ + token: "test-token", + owner: "owner", + repo: "repo", + branch: "dev", + message: "Test", + filePaths: ["x.txt"], + maxAttempts: 2, + baseDelayMs: 1, + maxDelayMs: 5, + }); + + expect(result.commitSha).toBe("commit-sha"); + expect(mockOctokit.rest.git.createCommit).toHaveBeenCalledTimes(2); + }); + + it("exhausts attempts and surfaces original error", async () => { + const fs = require("fs"); + fs.existsSync = jest.fn().mockReturnValue(true); + fs.readFileSync = jest.fn((path: string, enc?: string) => + enc === "utf-8" ? "x" : Buffer.from("x") + ); + fs.statSync = jest.fn().mockReturnValue({ mode: 0o644, size: 1 }); + + mockOctokit.rest.git.getRef.mockRejectedValue({ status: 404 }); + mockOctokit.rest.git.getCommit.mockResolvedValue({ + data: { tree: { sha: "base-tree-sha" } }, + }); + + await expect( + commitViaAPI({ + token: "test-token", + owner: "owner", + repo: "repo", + branch: "dev", + message: "Test", + filePaths: ["x.txt"], + maxAttempts: 2, + baseDelayMs: 1, + maxDelayMs: 5, + }) + ).rejects.toMatchObject({ status: 404 }); + + expect(mockOctokit.rest.git.getRef).toHaveBeenCalledTimes(2); + }); + + it("calls logger on retry", async () => { + const logger = jest.fn(); + const fs = require("fs"); + fs.existsSync = jest.fn().mockReturnValue(true); + fs.readFileSync = jest.fn((path: string, enc?: string) => + enc === "utf-8" ? "x" : Buffer.from("x") + ); + fs.statSync = jest.fn().mockReturnValue({ mode: 0o644, size: 1 }); + + mockOctokit.rest.git.getRef + .mockRejectedValueOnce({ status: 404 }) + .mockResolvedValueOnce({ + data: { object: { sha: "base-sha" } }, + }); + mockOctokit.rest.git.getCommit.mockResolvedValue({ + data: { tree: { sha: "base-tree-sha" } }, + }); + mockOctokit.rest.git.createTree.mockResolvedValue({ + data: { sha: "new-tree-sha" }, + }); + mockOctokit.rest.git.createCommit.mockResolvedValue({ + data: { sha: "commit-sha" }, + }); + mockOctokit.rest.git.updateRef.mockResolvedValue({ data: {} }); + + await commitViaAPI({ + token: "test-token", + owner: "owner", + repo: "repo", + branch: "dev", + message: "Test", + filePaths: ["x.txt"], + maxAttempts: 3, + baseDelayMs: 1, + maxDelayMs: 5, + logger, + }); + + expect(logger).toHaveBeenCalled(); + expect(logger.mock.calls[0][0]).toMatch(/attempt|404|retry/i); + }); + }); }); }); diff --git a/src/__tests__/unit/retry.test.ts b/src/__tests__/unit/retry.test.ts new file mode 100644 index 0000000..efaba23 --- /dev/null +++ b/src/__tests__/unit/retry.test.ts @@ -0,0 +1,206 @@ +import { + calculateDelay, + classifyError, + isTransientError, + withRetry, +} from "../../retry"; + +describe("retry", () => { + describe("isTransientError", () => { + it("returns true for error with status 404", () => { + expect(isTransientError({ status: 404 })).toBe(true); + }); + + it("returns true for errors with status 500, 502, 503", () => { + expect(isTransientError({ status: 500 })).toBe(true); + expect(isTransientError({ status: 502 })).toBe(true); + expect(isTransientError({ status: 503 })).toBe(true); + }); + + it("returns true for status 429", () => { + expect(isTransientError({ status: 429 })).toBe(true); + }); + + it("returns true for status 403 with message containing 'secondary rate limit'", () => { + expect( + isTransientError({ status: 403, message: "secondary rate limit exceeded" }) + ).toBe(true); + expect( + isTransientError({ status: 403, message: "API rate limit exceeded" }) + ).toBe(true); + expect( + isTransientError({ status: 403, message: "You have exceeded abuse rate limit" }) + ).toBe(true); + }); + + it("returns false for status 403 without rate-limit message", () => { + expect(isTransientError({ status: 403, message: "Forbidden" })).toBe(false); + }); + + it("returns false for status 422 (validation error)", () => { + expect(isTransientError({ status: 422 })).toBe(false); + }); + + it("returns false for generic Error with no status", () => { + expect(isTransientError(new Error("something broke"))).toBe(false); + }); + + it("returns false when status is not a number", () => { + expect(isTransientError({ status: "404" })).toBe(false); + expect(isTransientError({ status: null })).toBe(false); + }); + }); + + describe("classifyError", () => { + it("returns descriptive string for 404", () => { + expect(classifyError({ status: 404 })).toContain("404"); + expect(classifyError({ status: 404 })).toContain("transient"); + }); + + it("returns descriptive string for 5xx", () => { + expect(classifyError({ status: 500 })).toContain("500"); + expect(classifyError({ status: 503 })).toContain("503"); + }); + + it("returns descriptive string for 429", () => { + expect(classifyError({ status: 429 })).toContain("429"); + }); + + it("returns descriptive string for 403 rate limit", () => { + expect( + classifyError({ status: 403, message: "secondary rate limit" }) + ).toMatch(/rate limit|403/i); + }); + + it("returns non-transient for unknown errors", () => { + expect(classifyError(new Error("unknown"))).toContain("non-transient"); + }); + }); + + describe("calculateDelay", () => { + const base = 1000; + const max = 10000; + + it("returns value in expected range for attempt 0", () => { + const delay = calculateDelay(0, base, max); + expect(delay).toBeGreaterThanOrEqual(1000); + expect(delay).toBeLessThanOrEqual(1000 * 1.25); + }); + + it("returns value in expected range for attempt 1", () => { + const delay = calculateDelay(1, base, max); + expect(delay).toBeGreaterThanOrEqual(2000); + expect(delay).toBeLessThanOrEqual(2000 * 1.25); + }); + + it("never exceeds maxDelayMs plus jitter", () => { + const delay = calculateDelay(10, base, max); + expect(delay).toBeLessThanOrEqual(max * 1.25); + }); + }); + + describe("withRetry", () => { + it("resolves immediately on success with single call", async () => { + const fn = jest.fn().mockResolvedValue("ok"); + const result = await withRetry(fn, { maxAttempts: 3 }); + expect(result).toBe("ok"); + expect(fn).toHaveBeenCalledTimes(1); + }); + + it("does not retry when maxAttempts is 1", async () => { + const fn = jest.fn().mockRejectedValue({ status: 404 }); + await expect(withRetry(fn, { maxAttempts: 1 })).rejects.toEqual({ + status: 404, + }); + expect(fn).toHaveBeenCalledTimes(1); + }); + + it("treats maxAttempts 0 or negative as 1 (single attempt)", async () => { + const fn404 = jest.fn().mockRejectedValue({ status: 404 }); + await expect(withRetry(fn404, { maxAttempts: 0 })).rejects.toEqual({ + status: 404, + }); + expect(fn404).toHaveBeenCalledTimes(1); + + const fn503 = jest.fn().mockRejectedValue({ status: 503 }); + await expect(withRetry(fn503, { maxAttempts: -1 })).rejects.toMatchObject({ + status: 503, + }); + expect(fn503).toHaveBeenCalledTimes(1); + }); + + it("retries transient errors up to maxAttempts and succeeds on later attempt", async () => { + const fn = jest + .fn() + .mockRejectedValueOnce({ status: 404 }) + .mockResolvedValueOnce("ok"); + jest.useFakeTimers(); + + const resultPromise = withRetry(fn, { maxAttempts: 3 }); + await jest.runAllTimersAsync(); + const result = await resultPromise; + + expect(result).toBe("ok"); + expect(fn).toHaveBeenCalledTimes(2); + jest.useRealTimers(); + }); + + it("throws after exhausting all attempts on persistent transient error", async () => { + const fn = jest.fn().mockRejectedValue({ status: 503 }); + const resultPromise = withRetry(fn, { + maxAttempts: 3, + baseDelayMs: 1, + maxDelayMs: 5, + }); + + await expect(resultPromise).rejects.toMatchObject({ status: 503 }); + expect(fn).toHaveBeenCalledTimes(3); + }); + + it("does not retry non-transient errors, throws immediately", async () => { + const fn = jest.fn().mockRejectedValue({ status: 422 }); + await expect(withRetry(fn, { maxAttempts: 3 })).rejects.toEqual({ + status: 422, + }); + expect(fn).toHaveBeenCalledTimes(1); + }); + + it("calls logger with attempt number, classification, and delay", async () => { + const logger = jest.fn(); + const fn = jest + .fn() + .mockRejectedValueOnce({ status: 404 }) + .mockResolvedValueOnce("ok"); + jest.useFakeTimers(); + + const resultPromise = withRetry(fn, { maxAttempts: 3 }, logger); + await jest.runAllTimersAsync(); + await resultPromise; + + expect(logger).toHaveBeenCalled(); + const logCall = logger.mock.calls[0][0]; + expect(logCall).toMatch(/attempt|404|retry/i); + jest.useRealTimers(); + }); + + it("applies backoff delay between attempts", async () => { + const fn = jest + .fn() + .mockRejectedValueOnce({ status: 404 }) + .mockRejectedValueOnce({ status: 404 }) + .mockResolvedValueOnce("ok"); + jest.useFakeTimers(); + + const resultPromise = withRetry(fn, { + maxAttempts: 3, + baseDelayMs: 100, + maxDelayMs: 500, + }); + await jest.runAllTimersAsync(); + await resultPromise; + + expect(fn).toHaveBeenCalledTimes(3); + jest.useRealTimers(); + }); + }); +}); diff --git a/src/commit-runner.ts b/src/commit-runner.ts index b1a7e0d..0ecb1d6 100644 --- a/src/commit-runner.ts +++ b/src/commit-runner.ts @@ -10,6 +10,7 @@ * - COMMIT_MESSAGE: Commit message * - FILE_PATHS: Comma-separated list of file paths to commit (or read from git status) * - ALLOW_EMPTY: Set to "true" to allow empty commits when no files changed (default: false) + * - MAX_ATTEMPTS: Max retry attempts for transient API failures (default: 1 = no retries) */ import * as core from "@actions/core"; @@ -194,6 +195,23 @@ export async function main(): Promise { // Get base SHA if provided (for testing or specific use cases) const baseSha = process.env.BASE_SHA; + // Parse MAX_ATTEMPTS for retry (default 1 = no retries) + let maxAttempts = 1; + const rawAttempts = process.env.MAX_ATTEMPTS; + if (rawAttempts) { + const parsed = parseInt(rawAttempts, 10); + if (Number.isNaN(parsed) || parsed < 1) { + core.info( + `MAX_ATTEMPTS="${rawAttempts}" invalid, using 1 (no retries)` + ); + } else { + maxAttempts = parsed; + if (maxAttempts > 1) { + core.info(`API retries enabled: max ${maxAttempts} attempts`); + } + } + } + // Commit changes via API const result = await commitViaAPI({ token, @@ -204,6 +222,8 @@ export async function main(): Promise { filePaths, allowEmpty, baseSha, + maxAttempts, + logger: core.info, }); core.info(`Created signed commit ${result.commitSha} via GitHub API`); diff --git a/src/commit.ts b/src/commit.ts index de66c16..48211a3 100644 --- a/src/commit.ts +++ b/src/commit.ts @@ -1,5 +1,6 @@ import * as github from "@actions/github"; import * as fs from "fs"; +import { withRetry } from "./retry"; export interface CommitOptions { token: string; @@ -10,6 +11,14 @@ export interface CommitOptions { filePaths: string[]; allowEmpty?: boolean; baseSha?: string; + /** Max API attempt count (default 1 = no retries). */ + maxAttempts?: number; + /** Logger for retry messages (default: console.info). */ + logger?: (msg: string) => void; + /** Base delay in ms for retry backoff (test tuning). */ + baseDelayMs?: number; + /** Max delay cap in ms for retry backoff (test tuning). */ + maxDelayMs?: number; } export interface CommitResult { @@ -176,18 +185,12 @@ export async function createTree( content, }); } catch { - const base64Content = raw.toString("base64"); - const { data: blob } = await octokit.rest.git.createBlob({ - owner, - repo, - content: base64Content, - encoding: "base64", - }); + const result = await createBlob(octokit, owner, repo, filePath, { mode }); treeEntries.push({ path: filePath, - mode, + mode: result.mode, type: "blob" as const, - sha: blob.sha, + sha: result.sha, }); } } @@ -275,14 +278,32 @@ export async function getBranchInfo( export async function commitViaAPI( options: CommitOptions ): Promise { - const { token, owner, repo, branch, message, filePaths, allowEmpty, baseSha } = - options; + const { + token, + owner, + repo, + branch, + message, + filePaths, + allowEmpty, + baseSha, + maxAttempts = 1, + logger, + baseDelayMs, + maxDelayMs, + } = options; if (filePaths.length === 0 && !allowEmpty) { throw new Error("No files to commit"); } const octokit = github.getOctokit(token); + const retryConfig = { + maxAttempts, + ...(baseDelayMs !== undefined && { baseDelayMs }), + ...(maxDelayMs !== undefined && { maxDelayMs }), + }; + const log = logger ?? console.info; // Get branch info (SHA and tree SHA) let branchSha: string; @@ -291,15 +312,24 @@ export async function commitViaAPI( if (baseSha) { // Use provided base SHA branchSha = baseSha; - const { data: commit } = await octokit.rest.git.getCommit({ - owner, - repo, - commit_sha: baseSha, - }); + const { data: commit } = await withRetry( + () => + octokit.rest.git.getCommit({ + owner, + repo, + commit_sha: baseSha, + }), + retryConfig, + log + ); baseTreeSha = commit.tree.sha; } else { // Fetch from branch - const branchInfo = await getBranchInfo(octokit, owner, repo, branch); + const branchInfo = await withRetry( + () => getBranchInfo(octokit, owner, repo, branch), + retryConfig, + log + ); branchSha = branchInfo.sha; baseTreeSha = branchInfo.treeSha; } @@ -308,20 +338,33 @@ export async function commitViaAPI( const newTreeSha = filePaths.length === 0 ? baseTreeSha - : await createTree(octokit, owner, repo, baseTreeSha, filePaths); + : await withRetry( + () => createTree(octokit, owner, repo, baseTreeSha, filePaths), + retryConfig, + log + ); // Create commit (automatically signed by GitHub) - const commitSha = await createCommit( - octokit, - owner, - repo, - newTreeSha, - branchSha, - message + const commitSha = await withRetry( + () => + createCommit( + octokit, + owner, + repo, + newTreeSha, + branchSha, + message + ), + retryConfig, + log ); // Update branch reference - await updateBranch(octokit, owner, repo, branch, commitSha, false); + await withRetry( + () => updateBranch(octokit, owner, repo, branch, commitSha, false), + retryConfig, + log + ); return { commitSha, diff --git a/src/retry.ts b/src/retry.ts new file mode 100644 index 0000000..542c5dc --- /dev/null +++ b/src/retry.ts @@ -0,0 +1,118 @@ +/** Default max attempts (1 = no retries, backward compatible). */ +export const DEFAULT_MAX_ATTEMPTS = 1; + +/** Default base delay for exponential backoff, in milliseconds. */ +export const DEFAULT_BASE_DELAY_MS = 1000; + +/** Default maximum delay cap for backoff, in milliseconds. */ +export const DEFAULT_MAX_DELAY_MS = 30_000; + +export interface RetryConfig { + maxAttempts: number; + baseDelayMs?: number; + maxDelayMs?: number; +} + +/** HTTP-like error shape from Octokit RequestError. */ +function hasStatus(e: unknown): e is { status: number; message?: string } { + if (typeof e !== "object" || e === null || !("status" in e)) { + return false; + } + return typeof (e as { status: unknown }).status === "number"; +} + +/** + * Returns true if the error is a transient condition worth retrying: + * - 404 (transient ref/commit lookup) + * - 5xx (server error) + * - 429 (primary rate limit) + * - 403 with rate limit / secondary rate limit / abuse in message + */ +export function isTransientError(error: unknown): boolean { + if (!hasStatus(error)) return false; + const { status, message = "" } = error; + const msg = message.toLowerCase(); + + if (status === 404) return true; + if (status >= 500 && status < 600) return true; + if (status === 429) return true; + if (status === 403) { + return ( + msg.includes("rate limit") || + msg.includes("secondary rate limit") || + msg.includes("abuse") + ); + } + return false; +} + +/** Human-readable classification for logging. */ +export function classifyError(error: unknown): string { + if (!hasStatus(error)) return "non-transient"; + const { status, message = "" } = error; + const msg = message.toLowerCase(); + + if (status === 404) return "HTTP 404 (transient)"; + if (status >= 500 && status < 600) return `HTTP ${status} (server error)`; + if (status === 429) return "HTTP 429 (rate limit)"; + if (status === 403 && (msg.includes("rate limit") || msg.includes("abuse"))) { + return "rate limit (403)"; + } + return "non-transient"; +} + +/** + * Exponential backoff with jitter. + * Delay = min(base * 2^attempt, maxDelayMs) + jitter (0-25% of computed). + */ +export function calculateDelay( + attempt: number, + baseDelayMs: number, + maxDelayMs: number +): number { + const raw = Math.min(baseDelayMs * Math.pow(2, attempt), maxDelayMs); + const jitter = raw * 0.25 * Math.random(); + return Math.floor(raw + jitter); +} + +function sleep(ms: number): Promise { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +/** + * Retries an async operation on transient errors only. + * Logs attempt number, classification, and delay via logger when retrying. + */ +export async function withRetry( + fn: () => Promise, + config: RetryConfig, + logger?: (msg: string) => void +): Promise { + const baseDelayMs = config.baseDelayMs ?? DEFAULT_BASE_DELAY_MS; + const maxDelayMs = config.maxDelayMs ?? DEFAULT_MAX_DELAY_MS; + const log = logger ?? (() => {}); + const maxAttempts = Math.max( + 1, + Number.isFinite(config.maxAttempts) ? config.maxAttempts : 1 + ); + + let lastError: unknown; + for (let attempt = 0; attempt < maxAttempts; attempt++) { + try { + return await fn(); + } catch (e) { + lastError = e; + const isLast = attempt === maxAttempts - 1; + if (isLast || !isTransientError(e)) { + throw e; + } + const classification = classifyError(e); + const delay = calculateDelay(attempt, baseDelayMs, maxDelayMs); + log( + `GitHub API attempt ${attempt + 1}/${maxAttempts} failed (${classification}), retrying in ${delay}ms` + ); + await sleep(delay); + } + } + throw lastError; +}