From 98802b294ee101572ae11fff019604b6daf8f4a0 Mon Sep 17 00:00:00 2001 From: Ankit Gupta Date: Thu, 19 Jun 2025 13:30:02 +0530 Subject: [PATCH 1/4] request context added with idempotency key --- dist/cleanup.js | 19 +++++++++++++++++-- dist/main.js | 27 +++++++++++++++++++++++---- main.js | 8 ++++++-- utils/warpbuild.js | 19 +++++++++++++++++-- 4 files changed, 63 insertions(+), 10 deletions(-) diff --git a/dist/cleanup.js b/dist/cleanup.js index 31386d7..fa83fb9 100644 --- a/dist/cleanup.js +++ b/dist/cleanup.js @@ -25711,6 +25711,21 @@ class WarpBuildConfig { getBuilderTeardownEndpoint() { return `${this.apiDomain}/api/v1/builder-session-requests/complete`; } + + /** + * Get request context from github action job environment variables + * + * @returns {Object} + */ + getRequestContext() { + return { + runner_name: process.env.RUNNER_NAME, + github_job_id: process.env.GITHUB_JOB, + run_id: process.env.GITHUB_RUN_ID, + run_attempt: process.env.GITHUB_RUN_ATTEMPT, + repo: process.env.GITHUB_REPOSITORY, + }; + } } /** @@ -25745,7 +25760,7 @@ async function makeWarpBuildRequest(url, options, data = null) { * @param {string} profileName - Profile name to assign builders for * @returns {Promise} - Parsed response with builder instances */ -async function assignBuilders(config, profileName, timeout) { +async function assignBuilders(config, builderName, profileName, timeout) { const [authType, authValue] = config.authHeader.split(':').map(s => s.trim()); let profileNameList = profileName.split(','); @@ -25772,7 +25787,7 @@ async function assignBuilders(config, profileName, timeout) { [authType]: authValue } }, - JSON.stringify({ profile_name: profile }) + JSON.stringify({ profile_name: profile , request_metadata: config.getRequestContext(), unique_external_id: builderName}) ); const responseData = JSON.parse(response.data); diff --git a/dist/main.js b/dist/main.js index 98205bb..8a25434 100644 --- a/dist/main.js +++ b/dist/main.js @@ -26392,6 +26392,21 @@ class WarpBuildConfig { getBuilderTeardownEndpoint() { return `${this.apiDomain}/api/v1/builder-session-requests/complete`; } + + /** + * Get request context from github action job environment variables + * + * @returns {Object} + */ + getRequestContext() { + return { + runner_name: process.env.RUNNER_NAME, + github_job_id: process.env.GITHUB_JOB, + run_id: process.env.GITHUB_RUN_ID, + run_attempt: process.env.GITHUB_RUN_ATTEMPT, + repo: process.env.GITHUB_REPOSITORY, + }; + } } /** @@ -26426,7 +26441,7 @@ async function makeWarpBuildRequest(url, options, data = null) { * @param {string} profileName - Profile name to assign builders for * @returns {Promise} - Parsed response with builder instances */ -async function assignBuilders(config, profileName, timeout) { +async function assignBuilders(config, builderName, profileName, timeout) { const [authType, authValue] = config.authHeader.split(':').map(s => s.trim()); let profileNameList = profileName.split(','); @@ -26453,7 +26468,7 @@ async function assignBuilders(config, profileName, timeout) { [authType]: authValue } }, - JSON.stringify({ profile_name: profile }) + JSON.stringify({ profile_name: profile , request_metadata: config.getRequestContext(), unique_external_id: builderName}) ); const responseData = JSON.parse(response.data); @@ -28575,9 +28590,13 @@ async function run() { // Initialize WarpBuild configuration const config = new WarpBuildConfig(); + // Example output: lq1cr8p2n5x7d3fy + const timestamp = Date.now().toString(36); + const random = Math.random().toString(36).substring(2, 10); + const builderName = `${timestamp}${random}`.substring(0, 16); + //const builderName = `builder-${uuidv4()}`; // Assign builders - const responseData = await assignBuilders(config, profileName, timeout); - const builderName = `builder-${uuidv4()}`; + const responseData = await assignBuilders(config, builderName, profileName, timeout); // Save builder information for cleanup const buildersState = { diff --git a/main.js b/main.js index bd578f1..40b289f 100644 --- a/main.js +++ b/main.js @@ -109,9 +109,13 @@ async function run() { // Initialize WarpBuild configuration const config = new WarpBuildConfig(); + // Example output: lq1cr8p2n5x7d3fy + const timestamp = Date.now().toString(36); + const random = Math.random().toString(36).substring(2, 10); + const builderName = `${timestamp}${random}`.substring(0, 16); + //const builderName = `builder-${uuidv4()}`; // Assign builders - const responseData = await assignBuilders(config, profileName, timeout); - const builderName = `builder-${uuidv4()}`; + const responseData = await assignBuilders(config, builderName, profileName, timeout); // Save builder information for cleanup const buildersState = { diff --git a/utils/warpbuild.js b/utils/warpbuild.js index 62b1f6f..88cadae 100644 --- a/utils/warpbuild.js +++ b/utils/warpbuild.js @@ -63,6 +63,21 @@ class WarpBuildConfig { getBuilderTeardownEndpoint() { return `${this.apiDomain}/api/v1/builder-session-requests/complete`; } + + /** + * Get request context from github action job environment variables + * + * @returns {Object} + */ + getRequestContext() { + return { + runner_name: process.env.RUNNER_NAME, + github_job_id: process.env.GITHUB_JOB, + run_id: process.env.GITHUB_RUN_ID, + run_attempt: process.env.GITHUB_RUN_ATTEMPT, + repo: process.env.GITHUB_REPOSITORY, + }; + } } /** @@ -97,7 +112,7 @@ async function makeWarpBuildRequest(url, options, data = null) { * @param {string} profileName - Profile name to assign builders for * @returns {Promise} - Parsed response with builder instances */ -async function assignBuilders(config, profileName, timeout) { +async function assignBuilders(config, builderName, profileName, timeout) { const [authType, authValue] = config.authHeader.split(':').map(s => s.trim()); let profileNameList = profileName.split(','); @@ -124,7 +139,7 @@ async function assignBuilders(config, profileName, timeout) { [authType]: authValue } }, - JSON.stringify({ profile_name: profile }) + JSON.stringify({ profile_name: profile , request_metadata: config.getRequestContext(), unique_external_id: builderName}) ); const responseData = JSON.parse(response.data); From a446c0b0a40bdab9d54da49a5604de5b3e325539 Mon Sep 17 00:00:00 2001 From: Ankit Gupta Date: Thu, 19 Jun 2025 13:36:26 +0530 Subject: [PATCH 2/4] refact --- cleanup.js | 4 ++-- dist/cleanup.js | 10 +++++----- dist/main.js | 13 +++++++------ main.js | 7 ++++--- utils/warpbuild.js | 6 +++--- 5 files changed, 21 insertions(+), 19 deletions(-) diff --git a/cleanup.js b/cleanup.js index cade834..812403c 100644 --- a/cleanup.js +++ b/cleanup.js @@ -12,7 +12,7 @@ async function cleanup() { } const buildersState = JSON.parse(buildersStateJson); - const { builderName, builders } = buildersState; + const { builderName, idempotencyKey, builders } = buildersState; core.info(`Cleaning up ${builders.length} builders...`); @@ -30,7 +30,7 @@ async function cleanup() { // Cleanup each builder using the WarpBuild API for (const builder of builders) { try { - let response = await teardownBuilder(config, builder); + let response = await teardownBuilder(config, idempotencyKey, builder); // Handle retry for server errors if (response.statusCode >= 500 && response.statusCode < 600) { diff --git a/dist/cleanup.js b/dist/cleanup.js index fa83fb9..77a495f 100644 --- a/dist/cleanup.js +++ b/dist/cleanup.js @@ -25760,7 +25760,7 @@ async function makeWarpBuildRequest(url, options, data = null) { * @param {string} profileName - Profile name to assign builders for * @returns {Promise} - Parsed response with builder instances */ -async function assignBuilders(config, builderName, profileName, timeout) { +async function assignBuilders(config, idempotencyKey, profileName, timeout) { const [authType, authValue] = config.authHeader.split(':').map(s => s.trim()); let profileNameList = profileName.split(','); @@ -25787,7 +25787,7 @@ async function assignBuilders(config, builderName, profileName, timeout) { [authType]: authValue } }, - JSON.stringify({ profile_name: profile , request_metadata: config.getRequestContext(), unique_external_id: builderName}) + JSON.stringify({ profile_name: profile , request_metadata: config.getRequestContext(), external_unique_id: idempotencyKey}) ); const responseData = JSON.parse(response.data); @@ -25842,7 +25842,7 @@ async function getBuilderDetails(config, builderId) { * @param {WarpBuildConfig} config - WarpBuild configuration * @param {string} builderId - Builder ID to teardown */ -async function teardownBuilder(config, builder) { +async function teardownBuilder(config, idempotencyKey, builder) { const [authType, authValue] = config.authHeader.split(':').map(s => s.trim()); try { @@ -27812,7 +27812,7 @@ async function cleanup() { } const buildersState = JSON.parse(buildersStateJson); - const { builderName, builders } = buildersState; + const { builderName, idempotencyKey, builders } = buildersState; core.info(`Cleaning up ${builders.length} builders...`); @@ -27830,7 +27830,7 @@ async function cleanup() { // Cleanup each builder using the WarpBuild API for (const builder of builders) { try { - let response = await teardownBuilder(config, builder); + let response = await teardownBuilder(config, idempotencyKey, builder); // Handle retry for server errors if (response.statusCode >= 500 && response.statusCode < 600) { diff --git a/dist/main.js b/dist/main.js index 8a25434..dcd6b98 100644 --- a/dist/main.js +++ b/dist/main.js @@ -26441,7 +26441,7 @@ async function makeWarpBuildRequest(url, options, data = null) { * @param {string} profileName - Profile name to assign builders for * @returns {Promise} - Parsed response with builder instances */ -async function assignBuilders(config, builderName, profileName, timeout) { +async function assignBuilders(config, idempotencyKey, profileName, timeout) { const [authType, authValue] = config.authHeader.split(':').map(s => s.trim()); let profileNameList = profileName.split(','); @@ -26468,7 +26468,7 @@ async function assignBuilders(config, builderName, profileName, timeout) { [authType]: authValue } }, - JSON.stringify({ profile_name: profile , request_metadata: config.getRequestContext(), unique_external_id: builderName}) + JSON.stringify({ profile_name: profile , request_metadata: config.getRequestContext(), external_unique_id: idempotencyKey}) ); const responseData = JSON.parse(response.data); @@ -26523,7 +26523,7 @@ async function getBuilderDetails(config, builderId) { * @param {WarpBuildConfig} config - WarpBuild configuration * @param {string} builderId - Builder ID to teardown */ -async function teardownBuilder(config, builder) { +async function teardownBuilder(config, idempotencyKey, builder) { const [authType, authValue] = config.authHeader.split(':').map(s => s.trim()); try { @@ -28593,14 +28593,15 @@ async function run() { // Example output: lq1cr8p2n5x7d3fy const timestamp = Date.now().toString(36); const random = Math.random().toString(36).substring(2, 10); - const builderName = `${timestamp}${random}`.substring(0, 16); - //const builderName = `builder-${uuidv4()}`; + const idempotencyKey = `${timestamp}${random}`.substring(0, 16); + const builderName = `builder-${idempotencyKey}`; // Assign builders - const responseData = await assignBuilders(config, builderName, profileName, timeout); + const responseData = await assignBuilders(config, idempotencyKey, profileName, timeout); // Save builder information for cleanup const buildersState = { builderName, + idempotencyKey, builders: responseData.builder_instances.map(b => ({ id: b.id, request_id: b.request_id, diff --git a/main.js b/main.js index 40b289f..af7c305 100644 --- a/main.js +++ b/main.js @@ -112,14 +112,15 @@ async function run() { // Example output: lq1cr8p2n5x7d3fy const timestamp = Date.now().toString(36); const random = Math.random().toString(36).substring(2, 10); - const builderName = `${timestamp}${random}`.substring(0, 16); - //const builderName = `builder-${uuidv4()}`; + const idempotencyKey = `${timestamp}${random}`.substring(0, 16); + const builderName = `builder-${idempotencyKey}`; // Assign builders - const responseData = await assignBuilders(config, builderName, profileName, timeout); + const responseData = await assignBuilders(config, idempotencyKey, profileName, timeout); // Save builder information for cleanup const buildersState = { builderName, + idempotencyKey, builders: responseData.builder_instances.map(b => ({ id: b.id, request_id: b.request_id, diff --git a/utils/warpbuild.js b/utils/warpbuild.js index 88cadae..414ec4b 100644 --- a/utils/warpbuild.js +++ b/utils/warpbuild.js @@ -112,7 +112,7 @@ async function makeWarpBuildRequest(url, options, data = null) { * @param {string} profileName - Profile name to assign builders for * @returns {Promise} - Parsed response with builder instances */ -async function assignBuilders(config, builderName, profileName, timeout) { +async function assignBuilders(config, idempotencyKey, profileName, timeout) { const [authType, authValue] = config.authHeader.split(':').map(s => s.trim()); let profileNameList = profileName.split(','); @@ -139,7 +139,7 @@ async function assignBuilders(config, builderName, profileName, timeout) { [authType]: authValue } }, - JSON.stringify({ profile_name: profile , request_metadata: config.getRequestContext(), unique_external_id: builderName}) + JSON.stringify({ profile_name: profile , request_metadata: config.getRequestContext(), external_unique_id: idempotencyKey}) ); const responseData = JSON.parse(response.data); @@ -194,7 +194,7 @@ async function getBuilderDetails(config, builderId) { * @param {WarpBuildConfig} config - WarpBuild configuration * @param {string} builderId - Builder ID to teardown */ -async function teardownBuilder(config, builder) { +async function teardownBuilder(config, idempotencyKey, builder) { const [authType, authValue] = config.authHeader.split(':').map(s => s.trim()); try { From cba2b4ed6a59289dc38fb872d4c05e351dbd0472 Mon Sep 17 00:00:00 2001 From: Ankit Gupta Date: Thu, 19 Jun 2025 13:47:52 +0530 Subject: [PATCH 3/4] pass externalId in teardown --- dist/cleanup.js | 2 +- dist/main.js | 2 +- utils/warpbuild.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dist/cleanup.js b/dist/cleanup.js index 77a495f..bf0f1b8 100644 --- a/dist/cleanup.js +++ b/dist/cleanup.js @@ -25853,7 +25853,7 @@ async function teardownBuilder(config, idempotencyKey, builder) { headers: { [authType]: authValue }, timeout: 10000 }, - JSON.stringify({ request_id: builder.request_id }) + JSON.stringify({ request_id: builder.request_id, external_unique_id: idempotencyKey }) ); let parsedData; diff --git a/dist/main.js b/dist/main.js index dcd6b98..02dec21 100644 --- a/dist/main.js +++ b/dist/main.js @@ -26534,7 +26534,7 @@ async function teardownBuilder(config, idempotencyKey, builder) { headers: { [authType]: authValue }, timeout: 10000 }, - JSON.stringify({ request_id: builder.request_id }) + JSON.stringify({ request_id: builder.request_id, external_unique_id: idempotencyKey }) ); let parsedData; diff --git a/utils/warpbuild.js b/utils/warpbuild.js index 414ec4b..fb677e0 100644 --- a/utils/warpbuild.js +++ b/utils/warpbuild.js @@ -205,7 +205,7 @@ async function teardownBuilder(config, idempotencyKey, builder) { headers: { [authType]: authValue }, timeout: 10000 }, - JSON.stringify({ request_id: builder.request_id }) + JSON.stringify({ request_id: builder.request_id, external_unique_id: idempotencyKey }) ); let parsedData; From 284e468e4e85e05b476b38c325fab1ab8898b990 Mon Sep 17 00:00:00 2001 From: Ankit Gupta Date: Thu, 19 Jun 2025 15:30:13 +0530 Subject: [PATCH 4/4] key generation changed --- dist/main.js | 4 +--- main.js | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/dist/main.js b/dist/main.js index 02dec21..df38a72 100644 --- a/dist/main.js +++ b/dist/main.js @@ -28591,9 +28591,7 @@ async function run() { const config = new WarpBuildConfig(); // Example output: lq1cr8p2n5x7d3fy - const timestamp = Date.now().toString(36); - const random = Math.random().toString(36).substring(2, 10); - const idempotencyKey = `${timestamp}${random}`.substring(0, 16); + const idempotencyKey = uuidv4().replace(/-/g, '').substring(0, 16); const builderName = `builder-${idempotencyKey}`; // Assign builders const responseData = await assignBuilders(config, idempotencyKey, profileName, timeout); diff --git a/main.js b/main.js index af7c305..76457b4 100644 --- a/main.js +++ b/main.js @@ -110,9 +110,7 @@ async function run() { const config = new WarpBuildConfig(); // Example output: lq1cr8p2n5x7d3fy - const timestamp = Date.now().toString(36); - const random = Math.random().toString(36).substring(2, 10); - const idempotencyKey = `${timestamp}${random}`.substring(0, 16); + const idempotencyKey = uuidv4().replace(/-/g, '').substring(0, 16); const builderName = `builder-${idempotencyKey}`; // Assign builders const responseData = await assignBuilders(config, idempotencyKey, profileName, timeout);