Remove current deployment and publish ApplicationDeploymentRemovalRequest for project DNS deployment
This commit is contained in:
parent
b53e12b94b
commit
5f4be30799
@ -232,6 +232,19 @@ export class Registry {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch ApplicationDeploymentRecords by filter
|
||||||
|
*/
|
||||||
|
async getDeploymentRecordsByFilter (filter: { [key: string]: any }): Promise<AppDeploymentRecord[]> {
|
||||||
|
return this.registry.queryRecords(
|
||||||
|
{
|
||||||
|
type: APP_DEPLOYMENT_RECORD_TYPE,
|
||||||
|
...filter
|
||||||
|
},
|
||||||
|
true
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetch ApplicationDeploymentRemovalRecords for deployments
|
* Fetch ApplicationDeploymentRemovalRecords for deployments
|
||||||
*/
|
*/
|
||||||
|
@ -553,17 +553,10 @@ export class Service {
|
|||||||
return acc;
|
return acc;
|
||||||
}, {} as { [key: string]: string });
|
}, {} as { [key: string]: string });
|
||||||
|
|
||||||
const { applicationDeploymentRequestId, applicationDeploymentRequestData } = await this.registry.createApplicationDeploymentRequest(
|
|
||||||
{
|
|
||||||
deployment: newDeployment,
|
|
||||||
appName: repo,
|
|
||||||
repository: repoUrl,
|
|
||||||
environmentVariables: environmentVariablesObj,
|
|
||||||
dns: `${newDeployment.project.name}-${newDeployment.id}`
|
|
||||||
});
|
|
||||||
|
|
||||||
// To set project DNS
|
// To set project DNS
|
||||||
if (data.environment === Environment.Production) {
|
if (data.environment === Environment.Production) {
|
||||||
|
// On deleting deployment later, project DNS deployment is also deleted
|
||||||
|
// So publish project DNS deployment first so that ApplicationDeploymentRecord for the same is available when deleting deployment later
|
||||||
await this.registry.createApplicationDeploymentRequest(
|
await this.registry.createApplicationDeploymentRequest(
|
||||||
{
|
{
|
||||||
deployment: newDeployment,
|
deployment: newDeployment,
|
||||||
@ -574,6 +567,15 @@ export class Service {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const { applicationDeploymentRequestId, applicationDeploymentRequestData } = await this.registry.createApplicationDeploymentRequest(
|
||||||
|
{
|
||||||
|
deployment: newDeployment,
|
||||||
|
appName: repo,
|
||||||
|
repository: repoUrl,
|
||||||
|
environmentVariables: environmentVariablesObj,
|
||||||
|
dns: `${newDeployment.project.name}-${newDeployment.id}`
|
||||||
|
});
|
||||||
|
|
||||||
await this.db.updateDeploymentById(newDeployment.id, { applicationDeploymentRequestId, applicationDeploymentRequestData });
|
await this.db.updateDeploymentById(newDeployment.id, { applicationDeploymentRequestId, applicationDeploymentRequestData });
|
||||||
|
|
||||||
return newDeployment;
|
return newDeployment;
|
||||||
@ -795,10 +797,30 @@ export class Service {
|
|||||||
const deployment = await this.db.getDeployment({
|
const deployment = await this.db.getDeployment({
|
||||||
where: {
|
where: {
|
||||||
id: deploymentId
|
id: deploymentId
|
||||||
|
},
|
||||||
|
relations: {
|
||||||
|
project: true
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
if (deployment && deployment.applicationDeploymentRecordId) {
|
if (deployment && deployment.applicationDeploymentRecordId) {
|
||||||
|
// If deployment is current, remove deployment for project subdomain as well
|
||||||
|
if (deployment.isCurrent) {
|
||||||
|
const currentDeploymentURL = `https://${deployment.project.subDomain}`;
|
||||||
|
|
||||||
|
const deploymentRecords = await this.registry.getDeploymentRecordsByFilter({
|
||||||
|
application: deployment.applicationRecordId,
|
||||||
|
url: currentDeploymentURL
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!deploymentRecords.length) {
|
||||||
|
log(`No ApplicationDeploymentRecord found for URL ${currentDeploymentURL} and ApplicationDeploymentRecord id ${deployment.applicationDeploymentRecordId}`);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
await this.registry.createApplicationDeploymentRemovalRequest({ deploymentId: deploymentRecords[0].id });
|
||||||
|
}
|
||||||
|
|
||||||
const result = await this.registry.createApplicationDeploymentRemovalRequest({ deploymentId: deployment.applicationDeploymentRecordId });
|
const result = await this.registry.createApplicationDeploymentRemovalRequest({ deploymentId: deployment.applicationDeploymentRecordId });
|
||||||
|
|
||||||
await this.db.updateDeploymentById(
|
await this.db.updateDeploymentById(
|
||||||
|
@ -7,7 +7,7 @@ import { Registry } from '@cerc-io/laconic-sdk';
|
|||||||
import { Config } from '../src/config';
|
import { Config } from '../src/config';
|
||||||
import { DEFAULT_CONFIG_FILE_PATH } from '../src/constants';
|
import { DEFAULT_CONFIG_FILE_PATH } from '../src/constants';
|
||||||
import { getConfig } from '../src/utils';
|
import { getConfig } from '../src/utils';
|
||||||
import { Deployment, DeploymentStatus } from '../src/entity/Deployment';
|
import { Deployment, DeploymentStatus, Environment } from '../src/entity/Deployment';
|
||||||
|
|
||||||
const log = debug('snowball:publish-deploy-records');
|
const log = debug('snowball:publish-deploy-records');
|
||||||
|
|
||||||
@ -40,7 +40,7 @@ async function main () {
|
|||||||
});
|
});
|
||||||
|
|
||||||
for await (const deployment of deployments) {
|
for await (const deployment of deployments) {
|
||||||
const url = `${deployment.project.name}-${deployment.id}.${misc.projectDomain}`;
|
const url = `https://${deployment.project.name}-${deployment.id}.${misc.projectDomain}`;
|
||||||
|
|
||||||
const applicationDeploymentRecord = {
|
const applicationDeploymentRecord = {
|
||||||
type: 'ApplicationDeploymentRecord',
|
type: 'ApplicationDeploymentRecord',
|
||||||
@ -71,6 +71,21 @@ async function main () {
|
|||||||
registryConfig.fee
|
registryConfig.fee
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Remove deployment for project subdomain if deployment is for production environment
|
||||||
|
if (deployment.environment === Environment.Production) {
|
||||||
|
applicationDeploymentRecord.url = `https://${deployment.project.subDomain}`
|
||||||
|
|
||||||
|
await registry.setRecord(
|
||||||
|
{
|
||||||
|
privateKey: registryConfig.privateKey,
|
||||||
|
record: applicationDeploymentRecord,
|
||||||
|
bondId: registryConfig.bondId
|
||||||
|
},
|
||||||
|
'',
|
||||||
|
registryConfig.fee
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
log('Application deployment record data:', applicationDeploymentRecord);
|
log('Application deployment record data:', applicationDeploymentRecord);
|
||||||
log(`Application deployment record published: ${result.data.id}`);
|
log(`Application deployment record published: ${result.data.id}`);
|
||||||
}
|
}
|
||||||
|
@ -38,6 +38,7 @@ const STATUS_COLORS: {
|
|||||||
[DeploymentStatus.Building]: 'emphasized',
|
[DeploymentStatus.Building]: 'emphasized',
|
||||||
[DeploymentStatus.Ready]: 'positive',
|
[DeploymentStatus.Ready]: 'positive',
|
||||||
[DeploymentStatus.Error]: 'negative',
|
[DeploymentStatus.Error]: 'negative',
|
||||||
|
[DeploymentStatus.Deleting]: 'neutral',
|
||||||
};
|
};
|
||||||
|
|
||||||
const DeploymentDetailsCard = ({
|
const DeploymentDetailsCard = ({
|
||||||
@ -48,7 +49,7 @@ const DeploymentDetailsCard = ({
|
|||||||
prodBranchDomains,
|
prodBranchDomains,
|
||||||
}: DeployDetailsCardProps) => {
|
}: DeployDetailsCardProps) => {
|
||||||
const getIconByDeploymentStatus = (status: DeploymentStatus) => {
|
const getIconByDeploymentStatus = (status: DeploymentStatus) => {
|
||||||
if (status === DeploymentStatus.Building) {
|
if (status === DeploymentStatus.Building || status === DeploymentStatus.Deleting) {
|
||||||
return <LoadingIcon className="animate-spin" />;
|
return <LoadingIcon className="animate-spin" />;
|
||||||
}
|
}
|
||||||
if (status === DeploymentStatus.Ready) {
|
if (status === DeploymentStatus.Ready) {
|
||||||
|
@ -161,11 +161,6 @@ export const DeploymentMenu = ({
|
|||||||
<MenuItem
|
<MenuItem
|
||||||
className="hover:bg-base-bg-emphasized flex items-center gap-3"
|
className="hover:bg-base-bg-emphasized flex items-center gap-3"
|
||||||
onClick={() => deleteDeployment()}
|
onClick={() => deleteDeployment()}
|
||||||
disabled={
|
|
||||||
deployment.isCurrent ||
|
|
||||||
deployment.environment !== Environment.Production ||
|
|
||||||
!Boolean(currentDeployment)
|
|
||||||
}
|
|
||||||
>
|
>
|
||||||
<CrossCircleIcon /> Delete deployment
|
<CrossCircleIcon /> Delete deployment
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
|
@ -21,6 +21,7 @@ export enum DeploymentStatus {
|
|||||||
Building = 'Building',
|
Building = 'Building',
|
||||||
Ready = 'Ready',
|
Ready = 'Ready',
|
||||||
Error = 'Error',
|
Error = 'Error',
|
||||||
|
Deleting = 'Deleting'
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum DomainStatus {
|
export enum DomainStatus {
|
||||||
|
Loading…
Reference in New Issue
Block a user