Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

New website deployment #1282

Merged
merged 4 commits into from Sep 20, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
92 changes: 46 additions & 46 deletions .github/workflows/publish-next.yml
Expand Up @@ -5,56 +5,56 @@ on:
branches:
- master
paths:
- 'lib/**'
- "lib/**"

jobs:
build:
runs-on: ubuntu-latest

steps:
- name: Checkout repository
uses: actions/checkout@v2

- name: Install Node.js 14.x
uses: actions/setup-node@v1
with:
node-version: 14.x
registry-url: https://registry.npmjs.org/
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: us-west-2
role-to-assume: ${{ secrets.AWS_ROLE_SANDBOX }}
role-duration-seconds: 3600
role-skip-session-tagging: true
- name: Install lib dependencies
run: cd lib && npm install

- name: Build library
run: cd lib && npm run build
- name: Install docs dependencies
run: cd docs && npm install
- name: Test library
run: cd lib && npm run test

- name: Build docs
run: cd docs && npm run build
- name: Publish NEXT version to npm
run: |
sed -i "s#\"version\": \"0.0.0\"#\"version\": \"0.0.0-${GITHUB_SHA:0:7}\"#" ./dist/package.json
cd dist
npm publish --tag next --access public
env:
- name: Checkout repository
uses: actions/checkout@v2

- name: Install Node.js 14.x
uses: actions/setup-node@v1
with:
node-version: 14.x
registry-url: https://registry.npmjs.org/

- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: us-west-2
role-to-assume: ${{ secrets.AWS_ROLE_SANDBOX }}
role-duration-seconds: 3600
role-skip-session-tagging: true

- name: Install lib dependencies
run: cd lib && npm install --omit=dev

- name: Build library
run: cd lib && npm run build

- name: Install website dependencies
run: cd website && yarn

- name: Test library
run: cd lib && npm run test

- name: Build website
run: cd website && yarn build

- name: Publish NEXT version to npm
run: |
sed -i "s#\"version\": \"0.0.0\"#\"version\": \"0.0.0-${GITHUB_SHA:0:7}\"#" ./dist/package.json
cd dist
npm publish --tag next --access public
env:
NODE_AUTH_TOKEN: ${{ secrets.NODE_AUTH_TOKEN }}
- name: Move NEXT docs to S3
run: |
aws s3 rm s3://design-system-react-cdk-site/tools/react/next/ --recursive
aws s3 cp ./docs/build/ s3://design-system-react-cdk-site/tools/react/next/ --recursive

- name: Move NEXT website to S3
run: |
aws s3 rm s3://design-system-react-cdk-site/halstack/next/ --recursive
aws s3 cp ./website/out/ s3://design-system-react-cdk-site/halstack/next/ --recursive
101 changes: 50 additions & 51 deletions .github/workflows/publish-release.yml
Expand Up @@ -9,54 +9,53 @@ jobs:
runs-on: ubuntu-latest

steps:
- name: Checkout repository
uses: actions/checkout@v2

- name: Install Node.js 14.x
uses: actions/setup-node@v1
with:
node-version: 14.x
registry-url: https://registry.npmjs.org/

- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: us-west-2
role-to-assume: ${{ secrets.AWS_ROLE_SANDBOX }}
role-duration-seconds: 3600
role-skip-session-tagging: true

- name: Install lib dependencies
run: cd lib && npm install

- name: Build library
run: cd lib && npm run build

- name: Install docs dependencies
run: cd docs && npm install

- name: Test library
run: cd lib && npm run test

- name: Build docs
run: cd docs && npm run build

- name: Publish RELEASE to npm
run: |
sed -i "s#\"version\": \"0.0.0\"#\"version\": \"${TAG_NAME}\"#" ./dist/package.json
cd dist
npm publish --access public
env:
NODE_AUTH_TOKEN: ${{ secrets.NODE_AUTH_TOKEN }}
TAG_NAME: ${{ github.event.release.tag_name }}

- name: Install scripts dependencies
run: cd scripts && npm install

- name: Move RELEASE docs to S3
run: node scripts/release-docs.js $TAG_NAME
env:
TAG_NAME: ${{ github.event.release.tag_name }}

- name: Checkout repository
uses: actions/checkout@v2

- name: Install Node.js 14.x
uses: actions/setup-node@v1
with:
node-version: 14.x
registry-url: https://registry.npmjs.org/

- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: us-west-2
role-to-assume: ${{ secrets.AWS_ROLE_SANDBOX }}
role-duration-seconds: 3600
role-skip-session-tagging: true

- name: Install lib dependencies
run: cd lib && npm install --omit=dev

- name: Build library
run: cd lib && npm run build

- name: Install website dependencies
run: cd website && yarn

- name: Test library
run: cd lib && npm run test

- name: Build website
run: cd website && yarn build

- name: Publish RELEASE to npm
run: |
sed -i "s#\"version\": \"0.0.0\"#\"version\": \"${TAG_NAME}\"#" ./dist/package.json
cd dist
npm publish --access public
env:
NODE_AUTH_TOKEN: ${{ secrets.NODE_AUTH_TOKEN }}
TAG_NAME: ${{ github.event.release.tag_name }}

- name: Install scripts dependencies
run: cd scripts && npm install

- name: Move RELEASE website to S3
run: node scripts/release-website.js $TAG_NAME
env:
TAG_NAME: ${{ github.event.release.tag_name }}
154 changes: 154 additions & 0 deletions scripts/release-website.js
@@ -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();