From bdc4d9500d2d54fd1d354643ff47ce0196c8be47 Mon Sep 17 00:00:00 2001 From: Saurabh Chavan Date: Wed, 27 May 2026 13:15:45 +0530 Subject: [PATCH 1/6] fix: updated marketplace deployement contributor url endpoint --- scripts/release/marketplaceRelease.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/release/marketplaceRelease.js b/scripts/release/marketplaceRelease.js index d902b424b..9077d7050 100644 --- a/scripts/release/marketplaceRelease.js +++ b/scripts/release/marketplaceRelease.js @@ -3,7 +3,7 @@ const { join } = require("path"); const config = { appStoreUrl: "https://appstore.home.mendix.com/rest/packagesapi/v2", - contributorUrl: "https://contributor.mendixcloud.com/apis/v1", + contributorUrl: "https://contributor.mendix.com/apis/v1", // This one, for some reasons, needs to be added as OpenID header to contributor request. // The open id value (a39025a8-55b8-4532-bc5d-4e74901d11f9) is taken from widgets@mendix.com // account and could be found at Profile -> Advanced -> Personal Info -> View My Data -> Open id From 1ccb4374ff026648848d38e090176297dca6e5dd Mon Sep 17 00:00:00 2001 From: Saurabh Chavan Date: Wed, 27 May 2026 16:39:17 +0530 Subject: [PATCH 2/6] fix: slack notification fix on failure --- .github/actions/slack-notification/action.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/actions/slack-notification/action.yml b/.github/actions/slack-notification/action.yml index dc7d4af7b..f08bbfbb1 100644 --- a/.github/actions/slack-notification/action.yml +++ b/.github/actions/slack-notification/action.yml @@ -18,7 +18,8 @@ runs: - name: Send Slack notification uses: slackapi/slack-github-action@485a9d42d3a73031f12ec201c457e2162c45d02d # v2 with: - channel-id: ${{ inputs.channel-id }} - slack-message: ${{ inputs.message }} - env: - SLACK_BOT_TOKEN: ${{ inputs.bot-token }} + method: chat.postMessage + token: ${{ inputs.bot-token }} + payload: | + channel: ${{ inputs.channel-id }} + text: ${{ inputs.message }} From 7ce1130305268c2eafbb4553e67cf9cb0337a433 Mon Sep 17 00:00:00 2001 From: Saurabh Chavan Date: Wed, 27 May 2026 16:44:45 +0530 Subject: [PATCH 3/6] fix: added quotes to match the main branch --- .github/actions/slack-notification/action.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/slack-notification/action.yml b/.github/actions/slack-notification/action.yml index f08bbfbb1..8fe4fdd5b 100644 --- a/.github/actions/slack-notification/action.yml +++ b/.github/actions/slack-notification/action.yml @@ -21,5 +21,5 @@ runs: method: chat.postMessage token: ${{ inputs.bot-token }} payload: | - channel: ${{ inputs.channel-id }} - text: ${{ inputs.message }} + channel: "${{ inputs.channel-id }}" + text: "${{ inputs.message }}" From 255a6788aad4ac6e0063ef0e896528000da1d8bb Mon Sep 17 00:00:00 2001 From: Saurabh Chavan Date: Wed, 3 Jun 2026 17:08:12 +0530 Subject: [PATCH 4/6] fix: marketplace publish verification --- .github/workflows/MarketplaceRelease.yml | 1 + scripts/release/marketplaceRelease.js | 89 ++++++++++++++++++++++++ 2 files changed, 90 insertions(+) diff --git a/.github/workflows/MarketplaceRelease.yml b/.github/workflows/MarketplaceRelease.yml index d65ceee98..3b33cbbe2 100644 --- a/.github/workflows/MarketplaceRelease.yml +++ b/.github/workflows/MarketplaceRelease.yml @@ -49,6 +49,7 @@ jobs: CPAPI_PASS_PROD: ${{ secrets.CPAPI_PASS_PROD }} TAG: ${{ steps.variables.outputs.tag }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + MENDIX_PAT_TOKEN: ${{ secrets.MENDIX_PAT_TOKEN }} - name: "Send slack msg on failure" if: ${{ failure() }} uses: ./.github/actions/slack-notification diff --git a/scripts/release/marketplaceRelease.js b/scripts/release/marketplaceRelease.js index 9077d7050..e2e1442ca 100644 --- a/scripts/release/marketplaceRelease.js +++ b/scripts/release/marketplaceRelease.js @@ -44,6 +44,8 @@ async function uploadModuleToAppStore(pkgName, marketplaceId, version, minimumMX const postResponse = await createDraft(marketplaceId, version, minimumMXVersion); await publishDraft(postResponse.UUID); console.log(`Successfully uploaded ${pkgName} to the Mendix Marketplace.`); + + await verifyReleasePublished(marketplaceId, version, pkgName); } catch (error) { error.message = `Failed uploading ${pkgName} to appstore with error: ${error.message}`; throw error; @@ -176,3 +178,90 @@ function packageMetadata() { const { name, widgetName, version, marketplace } = require(pkgPath); return { name, widgetName, version, marketplace }; } + +async function verifyReleasePublished(contentId, expectedVersion, pkgName) { + const normalizedExpectedVersion = expectedVersion.startsWith("v") ? expectedVersion.substring(1) : expectedVersion; + + console.log(`Verifying release ${normalizedExpectedVersion} is published for content ID ${contentId}...`); + + const patToken = process.env.MENDIX_PAT_TOKEN; + if (!patToken) { + console.warn("WARNING: MENDIX_PAT_TOKEN environment variable is not set. Skipping release verification."); + return; + } + + const maxRetries = 5; + const retryDelayMs = 7000; + + for (let attempt = 1; attempt <= maxRetries; attempt++) { + console.log(`Verification attempt ${attempt}/${maxRetries}: Checking for version ${expectedVersion}`); + + try { + // Call the Mendix Content API to get all versions + const versionsResponse = await nodefetch( + `https://marketplace-api.mendix.com/v1/content/${contentId}/versions`, + { + method: "GET", + headers: { + Accept: "application/json", + Authorization: `MxToken ${patToken}` + } + } + ); + + if (!versionsResponse.ok) { + const errorText = await versionsResponse.text(); + throw new Error( + `Content API returned status ${versionsResponse.status}: ${versionsResponse.statusText}. Response: ${errorText}` + ); + } + + const responseData = await versionsResponse.json(); + + if (!responseData.items || !Array.isArray(responseData.items)) { + throw new Error(`Unexpected API response structure: ${JSON.stringify(responseData)}`); + } + + const versions = responseData.items; + + const versionFound = versions.some(v => v.versionNumber === normalizedExpectedVersion); + + if (versionFound) { + console.log( + `✓ Successfully verified: Version ${normalizedExpectedVersion} is published on Mendix Marketplace!` + ); + const matchedVersion = versions.find(v => v.versionNumber === normalizedExpectedVersion); + console.log(`Version ID: ${matchedVersion.versionId}`); + console.log(`Publication Date: ${matchedVersion.publicationDate}`); + return; + } + + if (attempt < maxRetries) { + console.log( + `Version ${normalizedExpectedVersion} not found yet. Waiting ${ + retryDelayMs / 1000 + }s before retry...` + ); + console.log( + `Available versions: ${versions + .map(v => v.versionNumber) + .slice(0, 5) + .join(", ")}...` + ); + await new Promise(resolve => setTimeout(resolve, retryDelayMs)); + } + } catch (error) { + console.error(`Error during verification attempt ${attempt}: ${error.message}`); + if (attempt < maxRetries) { + console.log(`Waiting ${retryDelayMs / 1000}s before retry...`); + await new Promise(resolve => setTimeout(resolve, retryDelayMs)); + } + } + } + + throw new Error( + `Release verification FAILED: Version ${normalizedExpectedVersion} for ${pkgName} (content ID: ${contentId}) ` + + `was not found on Mendix Marketplace after ${maxRetries} attempts. ` + + `The publish step reported success, but the version is not publicly available. ` + ); +} From c1336edb265b9f8d5f2421142eb623fd8ac0df93 Mon Sep 17 00:00:00 2001 From: Saurabh Chavan Date: Wed, 3 Jun 2026 17:11:27 +0530 Subject: [PATCH 5/6] fix: improve the script --- scripts/release/marketplaceRelease.js | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/scripts/release/marketplaceRelease.js b/scripts/release/marketplaceRelease.js index e2e1442ca..f83d58ecb 100644 --- a/scripts/release/marketplaceRelease.js +++ b/scripts/release/marketplaceRelease.js @@ -237,23 +237,11 @@ async function verifyReleasePublished(contentId, expectedVersion, pkgName) { } if (attempt < maxRetries) { - console.log( - `Version ${normalizedExpectedVersion} not found yet. Waiting ${ - retryDelayMs / 1000 - }s before retry...` - ); - console.log( - `Available versions: ${versions - .map(v => v.versionNumber) - .slice(0, 5) - .join(", ")}...` - ); await new Promise(resolve => setTimeout(resolve, retryDelayMs)); } } catch (error) { console.error(`Error during verification attempt ${attempt}: ${error.message}`); if (attempt < maxRetries) { - console.log(`Waiting ${retryDelayMs / 1000}s before retry...`); await new Promise(resolve => setTimeout(resolve, retryDelayMs)); } } From 5c9ad01a0916a4630803f8ddbbeb91bfa6092450 Mon Sep 17 00:00:00 2001 From: Saurabh Chavan Date: Wed, 3 Jun 2026 17:19:14 +0530 Subject: [PATCH 6/6] fix: updated retries and delay for safety --- scripts/release/marketplaceRelease.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/release/marketplaceRelease.js b/scripts/release/marketplaceRelease.js index f83d58ecb..4e1e03f65 100644 --- a/scripts/release/marketplaceRelease.js +++ b/scripts/release/marketplaceRelease.js @@ -190,8 +190,8 @@ async function verifyReleasePublished(contentId, expectedVersion, pkgName) { return; } - const maxRetries = 5; - const retryDelayMs = 7000; + const maxRetries = 10; + const retryDelayMs = 10000; for (let attempt = 1; attempt <= maxRetries; attempt++) { console.log(`Verification attempt ${attempt}/${maxRetries}: Checking for version ${expectedVersion}`);