Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #1282 from dxc-technology/marcialfps-workflow
New website deployment
- Loading branch information
Showing
3 changed files
with
250 additions
and
97 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,154 @@ | ||
const { exec } = require("child_process"); | ||
const AWS = require("aws-sdk"); | ||
|
||
const BUCKET_NAME = "design-system-react-cdk-site"; | ||
const DIRECTORY = "halstack/"; | ||
const PREVDIRECTORY = "tools/react/"; | ||
|
||
const processListObjectsResponse = (response, directory) => { | ||
return response.CommonPrefixes.map((commonPrefix) => { | ||
const prefix = commonPrefix.Prefix; | ||
return prefix.substring( | ||
prefix.lastIndexOf(directory) + directory.length, | ||
prefix.length - 1 | ||
); | ||
}) | ||
.filter((version) => version !== "latest") | ||
.map((version) => Number(version)); | ||
}; | ||
|
||
const getVersionsInS3Bucket = async () => { | ||
const params = { | ||
Bucket: BUCKET_NAME, | ||
Delimiter: "/", | ||
}; | ||
|
||
const versionsFromPrevDirectory = await new Promise((resolve, reject) => { | ||
new AWS.S3().listObjectsV2( | ||
{ ...params, Prefix: PREVDIRECTORY }, | ||
(error, data) => { | ||
if (error) { | ||
reject(new Error(error)); | ||
} else { | ||
resolve(processListObjectsResponse(data, PREVDIRECTORY)); | ||
} | ||
} | ||
); | ||
}); | ||
|
||
const versions = await new Promise((resolve, reject) => { | ||
new AWS.S3().listObjectsV2( | ||
{ ...params, Prefix: DIRECTORY }, | ||
(error, data) => { | ||
if (error) { | ||
reject(new Error(error)); | ||
} else { | ||
resolve(processListObjectsResponse(data, DIRECTORY)); | ||
} | ||
} | ||
); | ||
}); | ||
|
||
return versionsFromPrevDirectory.concat(versions); | ||
}; | ||
|
||
const removeBucket = (version) => { | ||
return new Promise((resolve, reject) => { | ||
console.log(`Removing s3://${BUCKET_NAME}/${DIRECTORY}${version}/`); | ||
exec( | ||
`aws s3 rm s3://${BUCKET_NAME}/${DIRECTORY}${version}/ --recursive`, | ||
(error, stdout, stderr) => { | ||
if (error) { | ||
throw new Error(error.message); | ||
} | ||
if (stderr) { | ||
throw new Error(stderr); | ||
} | ||
resolve(stdout); | ||
} | ||
); | ||
}); | ||
}; | ||
|
||
const moveToBucket = (version) => { | ||
return new Promise((resolve, reject) => { | ||
exec( | ||
`aws s3 rm s3://${BUCKET_NAME}/${DIRECTORY}${version}/ --recursive && | ||
aws s3 cp ./website/out/ s3://${BUCKET_NAME}/${DIRECTORY}${version}/ --recursive`, | ||
(error, stdout, stderr) => { | ||
if (error) { | ||
throw new Error(error.message); | ||
} | ||
if (stderr) { | ||
throw new Error(stderr); | ||
} | ||
resolve(stdout); | ||
} | ||
); | ||
}); | ||
}; | ||
|
||
const updateRedirectionToLatest = (version) => { | ||
const redirection = `window.location.replace("https://developer.dxc.com/halstack/${version}/");`; | ||
return new Promise((resolve, reject) => { | ||
exec( | ||
`echo '${redirection}' | aws s3 cp - s3://${BUCKET_NAME}/${DIRECTORY}redirect.js`, | ||
(error, stdout, stderr) => { | ||
if (error) { | ||
throw new Error(error.message); | ||
} | ||
if (stderr) { | ||
throw new Error(stderr); | ||
} | ||
resolve(stdout); | ||
} | ||
); | ||
}); | ||
}; | ||
|
||
const deploy = async () => { | ||
const versionToDeploy = process.argv[2]; | ||
const majorVersionToDeploy = Number( | ||
versionToDeploy.substring(0, versionToDeploy.indexOf(".")) | ||
); | ||
const existingVersionsInBucket = await getVersionsInS3Bucket(); | ||
const isNewLatest = !existingVersionsInBucket.includes(majorVersionToDeploy); | ||
await removeBucket(majorVersionToDeploy); | ||
await moveToBucket(majorVersionToDeploy); | ||
const listAvailableVersions = await getVersionsInS3Bucket(); | ||
await updateAvailableVersions(listAvailableVersions, majorVersionToDeploy); | ||
if (isNewLatest) { | ||
await updateRedirectionToLatest(majorVersionToDeploy); | ||
} | ||
}; | ||
|
||
const updateAvailableVersions = async (versions, currentVersion) => { | ||
const versionItems = versions.map((version) => { | ||
const currentItem = isNaN(version) ? "next" : version; | ||
return { | ||
versionNumber: currentItem, | ||
versionURL: `https://developer.dxc.com/${ | ||
isNaN(currentItem) && currentItem <= 5 ? "tools/react" : "halstack" | ||
}/${currentItem}/`, | ||
current: currentItem === currentVersion, | ||
}; | ||
}); | ||
return new Promise((resolve, reject) => { | ||
exec( | ||
`echo '${JSON.stringify( | ||
versionItems | ||
)}' | aws s3 cp - s3://${BUCKET_NAME}/${DIRECTORY}versions.json`, | ||
(error, stdout, stderr) => { | ||
if (error) { | ||
throw new Error(error.message); | ||
} | ||
if (stderr) { | ||
throw new Error(stderr); | ||
} | ||
resolve(stdout); | ||
} | ||
); | ||
}); | ||
}; | ||
|
||
deploy(); |