From 5f3f3937c05f68e1a6d5e97bb25b817cd113b897 Mon Sep 17 00:00:00 2001 From: marcialfps Date: Mon, 19 Sep 2022 16:11:36 +0200 Subject: [PATCH 1/3] Deploy website in next and release --- .github/workflows/publish-next.yml | 92 +++++++-------- .github/workflows/publish-release.yml | 101 +++++++++-------- scripts/release-website.js | 154 ++++++++++++++++++++++++++ 3 files changed, 250 insertions(+), 97 deletions(-) create mode 100644 scripts/release-website.js diff --git a/.github/workflows/publish-next.yml b/.github/workflows/publish-next.yml index 6f7fc9ec3..dc365adf4 100644 --- a/.github/workflows/publish-next.yml +++ b/.github/workflows/publish-next.yml @@ -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 + + - 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/tools/react/next/ --recursive + aws s3 cp ./website/out/ s3://design-system-react-cdk-site/tools/react/next/ --recursive diff --git a/.github/workflows/publish-release.yml b/.github/workflows/publish-release.yml index 557119a1a..e6bb5bd53 100644 --- a/.github/workflows/publish-release.yml +++ b/.github/workflows/publish-release.yml @@ -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 + + - 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 }} diff --git a/scripts/release-website.js b/scripts/release-website.js new file mode 100644 index 000000000..4ca630736 --- /dev/null +++ b/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(); From ddf7c84d3104c74e945e583ed5d987adfd9eef0c Mon Sep 17 00:00:00 2001 From: marcialfps Date: Tue, 20 Sep 2022 11:44:09 +0200 Subject: [PATCH 2/3] Move NEXT to halstack directory --- .github/workflows/publish-next.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish-next.yml b/.github/workflows/publish-next.yml index dc365adf4..de55e8467 100644 --- a/.github/workflows/publish-next.yml +++ b/.github/workflows/publish-next.yml @@ -56,5 +56,5 @@ jobs: - name: Move NEXT website to S3 run: | - aws s3 rm s3://design-system-react-cdk-site/tools/react/next/ --recursive - aws s3 cp ./website/out/ s3://design-system-react-cdk-site/tools/react/next/ --recursive + 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 From ea7bf759a541ee207fb83055a81e269c080564c2 Mon Sep 17 00:00:00 2001 From: marcialfps Date: Tue, 20 Sep 2022 12:20:50 +0200 Subject: [PATCH 3/3] Avoid install devDependencies from lib --- .github/workflows/publish-next.yml | 2 +- .github/workflows/publish-release.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish-next.yml b/.github/workflows/publish-next.yml index de55e8467..9d35c5f6a 100644 --- a/.github/workflows/publish-next.yml +++ b/.github/workflows/publish-next.yml @@ -32,7 +32,7 @@ jobs: role-skip-session-tagging: true - name: Install lib dependencies - run: cd lib && npm install + run: cd lib && npm install --omit=dev - name: Build library run: cd lib && npm run build diff --git a/.github/workflows/publish-release.yml b/.github/workflows/publish-release.yml index e6bb5bd53..118bcb011 100644 --- a/.github/workflows/publish-release.yml +++ b/.github/workflows/publish-release.yml @@ -29,7 +29,7 @@ jobs: role-skip-session-tagging: true - name: Install lib dependencies - run: cd lib && npm install + run: cd lib && npm install --omit=dev - name: Build library run: cd lib && npm run build