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 31386d7..bf0f1b8 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, idempotencyKey, 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(), external_unique_id: idempotencyKey}) ); const responseData = JSON.parse(response.data); @@ -25827,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 { @@ -25838,7 +25853,7 @@ async function teardownBuilder(config, 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; @@ -27797,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...`); @@ -27815,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 98205bb..df38a72 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, idempotencyKey, 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(), external_unique_id: idempotencyKey}) ); const responseData = JSON.parse(response.data); @@ -26508,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 { @@ -26519,7 +26534,7 @@ async function teardownBuilder(config, 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; @@ -28575,13 +28590,16 @@ async function run() { // Initialize WarpBuild configuration const config = new WarpBuildConfig(); + // Example output: lq1cr8p2n5x7d3fy + const idempotencyKey = uuidv4().replace(/-/g, '').substring(0, 16); + const builderName = `builder-${idempotencyKey}`; // Assign builders - const responseData = await assignBuilders(config, profileName, timeout); - const builderName = `builder-${uuidv4()}`; + 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 bd578f1..76457b4 100644 --- a/main.js +++ b/main.js @@ -109,13 +109,16 @@ async function run() { // Initialize WarpBuild configuration const config = new WarpBuildConfig(); + // Example output: lq1cr8p2n5x7d3fy + const idempotencyKey = uuidv4().replace(/-/g, '').substring(0, 16); + const builderName = `builder-${idempotencyKey}`; // Assign builders - const responseData = await assignBuilders(config, profileName, timeout); - const builderName = `builder-${uuidv4()}`; + 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 62b1f6f..fb677e0 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, idempotencyKey, 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(), external_unique_id: idempotencyKey}) ); const responseData = JSON.parse(response.data); @@ -179,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 { @@ -190,7 +205,7 @@ async function teardownBuilder(config, 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;