diff --git a/packages/builder/src/components/deploy/DeploymentHistory.svelte b/packages/builder/src/components/deploy/DeploymentHistory.svelte index 05a2e40fa6..8068215969 100644 --- a/packages/builder/src/components/deploy/DeploymentHistory.svelte +++ b/packages/builder/src/components/deploy/DeploymentHistory.svelte @@ -2,11 +2,17 @@ import { onMount, onDestroy } from "svelte" import Spinner from "components/common/Spinner.svelte" import { slide } from "svelte/transition" - import { Heading, Body, Button, Modal } from "@budibase/bbui" + import { Heading, Body, Button, Modal, ModalContent } from "@budibase/bbui" import api from "builderStore/api" import { notifier } from "builderStore/store/notifications" import CreateWebhookDeploymentModal from "./CreateWebhookDeploymentModal.svelte" + const DeploymentStatus = { + SUCCESS: "SUCCESS", + PENDING: "PENDING", + FAILURE: "FAILURE", + } + const DATE_OPTIONS = { fullDate: { weekday: "long", @@ -25,6 +31,8 @@ export let appId let modal + let errorReasonModal + let errorReason let poll let deployments = [] let deploymentUrl = `https://${appId}.app.budi.live/${appId}` @@ -32,10 +40,35 @@ const formatDate = (date, format) => Intl.DateTimeFormat("en-GB", DATE_OPTIONS[format]).format(date) + // Required to check any updated deployment statuses between polls + function checkIncomingDeploymentStatus(current, incoming) { + for (let incomingDeployment of incoming) { + if (incomingDeployment.status === DeploymentStatus.FAILURE) { + const currentDeployment = current.find( + deployment => deployment._id === incomingDeployment._id + ) + + // We have just been notified of an ongoing deployments failure + if ( + !currentDeployment || + currentDeployment.status === DeploymentStatus.PENDING + ) { + showErrorReasonModal(incomingDeployment.err) + } + } + } + } + async function fetchDeployments() { try { const response = await api.get(`/api/deployments`) - deployments = await response.json() + const json = await response.json() + + if (deployments.length > 0) { + checkIncomingDeploymentStatus(deployments, json) + } + + deployments = json } catch (err) { console.error(err) clearInterval(poll) @@ -43,6 +76,11 @@ } } + function showErrorReasonModal(err) { + errorReason = err + errorReasonModal.show() + } + onMount(() => { fetchDeployments() poll = setInterval(fetchDeployments, POLL_INTERVAL) @@ -56,7 +94,7 @@

Deployment History

- {#if deployments.some(deployment => deployment.status === 'SUCCESS')} + {#if deployments.some(deployment => deployment.status === DeploymentStatus.SUCCESS)} View Your Deployed App → @@ -80,7 +118,14 @@ {/if}
- {deployment.status} + + {deployment.status} + {#if deployment.status === DeploymentStatus.FAILURE} + showErrorReasonModal(deployment.err)} /> + {/if} +
@@ -91,6 +136,14 @@ + + + {errorReason} + + diff --git a/packages/server/src/api/controllers/deploy/aws.js b/packages/server/src/api/controllers/deploy/aws.js index 9e62f135a1..d478c4efde 100644 --- a/packages/server/src/api/controllers/deploy/aws.js +++ b/packages/server/src/api/controllers/deploy/aws.js @@ -55,17 +55,17 @@ exports.verifyDeployment = async function({ appId, quota }) { }), }) + const json = await response.json() + if (json.errors) { + throw new Error(json.errors) + } + if (response.status !== 200) { throw new Error( `Error fetching temporary credentials for api key: ${env.BUDIBASE_API_KEY}` ) } - const json = await response.json() - if (json.errors) { - throw new Error(json.errors) - } - // set credentials here, means any time we're verified we're ready to go if (json.credentials) { AWS.config.update({ diff --git a/packages/server/src/api/controllers/deploy/index.js b/packages/server/src/api/controllers/deploy/index.js index c3919ebbae..03f91430db 100644 --- a/packages/server/src/api/controllers/deploy/index.js +++ b/packages/server/src/api/controllers/deploy/index.js @@ -21,18 +21,15 @@ const DeploymentStatus = { // checks that deployments are in a good state, any pending will be updated async function checkAllDeployments(deployments) { let updated = false - function update(deployment, status) { - deployment.status = status - updated = true - } - for (let deployment of Object.values(deployments.history)) { // check that no deployments have crashed etc and are now stuck if ( deployment.status === DeploymentStatus.PENDING && Date.now() - deployment.updatedAt > MAX_PENDING_TIME_MS ) { - update(deployment, DeploymentStatus.FAILURE) + deployment.status = status + deployment.err = "Timed out" + updated = true } } return { updated, deployments } diff --git a/packages/standard-components/src/RichText.svelte b/packages/standard-components/src/RichText.svelte index a033d3cc1d..af0c190578 100644 --- a/packages/standard-components/src/RichText.svelte +++ b/packages/standard-components/src/RichText.svelte @@ -1,5 +1,5 @@ - - \ No newline at end of file + +