diff --git a/.changeset/curly-wombats-suffer.md b/.changeset/curly-wombats-suffer.md new file mode 100644 index 000000000000..5876824c1e20 --- /dev/null +++ b/.changeset/curly-wombats-suffer.md @@ -0,0 +1,8 @@ +--- +"wrangler": minor +--- + +secret:bulk exit 1 on failure +Previously `secret"bulk` would only log an error on failure of any of the upload requests. +Now when 'secret:bulk' has an upload request fail it throws an Error which sends an `process.exit(1)` at the root `.catch()` signal. +This will enable error handling in programmatic uses of `secret:bulk`. diff --git a/packages/wrangler/src/__tests__/secret.test.ts b/packages/wrangler/src/__tests__/secret.test.ts index 9d5d3814c447..e084376c0a46 100644 --- a/packages/wrangler/src/__tests__/secret.test.ts +++ b/packages/wrangler/src/__tests__/secret.test.ts @@ -658,46 +658,54 @@ describe("wrangler secret", () => { ) ); - await runWrangler("secret:bulk ./secret.json --name script-name"); + await expect(async () => { + await runWrangler("secret:bulk ./secret.json --name script-name"); + }).rejects.toThrowErrorMatchingInlineSnapshot( + `"🚨 4 secrets failed to upload"` + ); expect(std.out).toMatchInlineSnapshot(` - "🌀 Creating the secrets for the Worker \\"script-name\\" - ✨ Successfully created secret for key: secret-name-2 - ✨ Successfully created secret for key: secret-name-4 - ✨ Successfully created secret for key: secret-name-6 + "🌀 Creating the secrets for the Worker \\"script-name\\" + ✨ Successfully created secret for key: secret-name-2 + ✨ Successfully created secret for key: secret-name-4 + ✨ Successfully created secret for key: secret-name-6 - Finished processing secrets JSON file: - ✨ 3 secrets successfully uploaded - 🚨 4 secrets failed to upload" - `); + Finished processing secrets JSON file: + ✨ 3 secrets successfully uploaded + + If you think this is a bug then please create an issue at https://github.com/cloudflare/workers-sdk/issues/new/choose" + `); expect(std.err).toMatchInlineSnapshot(` - "X [ERROR] 🚨 Error uploading secret for key: secret-name-1: + "X [ERROR] uploading secret for key: secret-name-1: request to https://api.cloudflare.com/client/v4/accounts/some-account-id/workers/scripts/script-name/secrets failed, reason: Failed to create secret 1 - X [ERROR] 🚨 Error uploading secret for key: secret-name-3: + X [ERROR] uploading secret for key: secret-name-3: request to https://api.cloudflare.com/client/v4/accounts/some-account-id/workers/scripts/script-name/secrets failed, reason: Failed to create secret 3 - X [ERROR] 🚨 Error uploading secret for key: secret-name-5: + X [ERROR] uploading secret for key: secret-name-5: request to https://api.cloudflare.com/client/v4/accounts/some-account-id/workers/scripts/script-name/secrets failed, reason: Failed to create secret 5 - X [ERROR] 🚨 Error uploading secret for key: secret-name-7: + X [ERROR] uploading secret for key: secret-name-7: request to https://api.cloudflare.com/client/v4/accounts/some-account-id/workers/scripts/script-name/secrets failed, reason: Failed to create secret 7 + + X [ERROR] 🚨 4 secrets failed to upload + " `); }); @@ -725,29 +733,37 @@ describe("wrangler secret", () => { ) ); - await runWrangler("secret:bulk ./secret.json --name script-name"); + await expect(async () => { + await runWrangler("secret:bulk ./secret.json --name script-name"); + }).rejects.toThrowErrorMatchingInlineSnapshot( + `"🚨 2 secrets failed to upload"` + ); expect(std.out).toMatchInlineSnapshot(` - "🌀 Creating the secrets for the Worker \\"script-name\\" + "🌀 Creating the secrets for the Worker \\"script-name\\" - Finished processing secrets JSON file: - ✨ 0 secrets successfully uploaded - 🚨 2 secrets failed to upload" - `); + Finished processing secrets JSON file: + ✨ 0 secrets successfully uploaded + + If you think this is a bug then please create an issue at https://github.com/cloudflare/workers-sdk/issues/new/choose" + `); expect(std.err).toMatchInlineSnapshot(` - "X [ERROR] 🚨 Error uploading secret for key: secret-name-1: + "X [ERROR] uploading secret for key: secret-name-1: request to https://api.cloudflare.com/client/v4/accounts/some-account-id/workers/scripts/script-name/secrets failed, reason: Failed to create secret 1 - X [ERROR] 🚨 Error uploading secret for key: secret-name-2: + X [ERROR] uploading secret for key: secret-name-2: request to https://api.cloudflare.com/client/v4/accounts/some-account-id/workers/scripts/script-name/secrets failed, reason: Failed to create secret 2 + + X [ERROR] 🚨 2 secrets failed to upload + " `); }); diff --git a/packages/wrangler/src/secret/index.ts b/packages/wrangler/src/secret/index.ts index 817e56868c70..145d2f7ae149 100644 --- a/packages/wrangler/src/secret/index.ts +++ b/packages/wrangler/src/secret/index.ts @@ -382,19 +382,20 @@ export const secretBulkHandler = async (secretBulkArgs: SecretBulkArgs) => { }) .catch((e) => { logger.error( - `🚨 Error uploading secret for key: ${key}: + `uploading secret for key: ${key}: ${e.message}` ); return false; }); }) ); + const successes = bulkOutcomes.filter((outcome) => outcome).length; const failures = bulkOutcomes.length - successes; logger.log(""); logger.log("Finished processing secrets JSON file:"); logger.log(`✨ ${successes} secrets successfully uploaded`); if (failures > 0) { - logger.log(`🚨 ${failures} secrets failed to upload`); + throw new Error(`🚨 ${failures} secrets failed to upload`); } };