Skip to content

Commit

Permalink
Merge pull request #1282 from dxc-technology/marcialfps-workflow
Browse files Browse the repository at this point in the history
New website deployment
  • Loading branch information
kukoc committed Sep 20, 2022
2 parents e2a3793 + ea7bf75 commit 06b35e5
Show file tree
Hide file tree
Showing 3 changed files with 250 additions and 97 deletions.
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();

0 comments on commit 06b35e5

Please sign in to comment.