diff options
author | Fabio Berger <me@fabioberger.com> | 2019-01-14 22:24:00 +0800 |
---|---|---|
committer | Fabio Berger <me@fabioberger.com> | 2019-01-14 22:24:00 +0800 |
commit | 84163517c600ff64e0d6ece4ecba40a8aeb52d73 (patch) | |
tree | a906b6f1d2d137a7175e54bb09da6796a7d4dfb6 | |
parent | 96ff5eef644b8c4d3f8fc4ec53270991fb51f121 (diff) | |
download | dexon-sol-tools-84163517c600ff64e0d6ece4ecba40a8aeb52d73.tar dexon-sol-tools-84163517c600ff64e0d6ece4ecba40a8aeb52d73.tar.gz dexon-sol-tools-84163517c600ff64e0d6ece4ecba40a8aeb52d73.tar.bz2 dexon-sol-tools-84163517c600ff64e0d6ece4ecba40a8aeb52d73.tar.lz dexon-sol-tools-84163517c600ff64e0d6ece4ecba40a8aeb52d73.tar.xz dexon-sol-tools-84163517c600ff64e0d6ece4ecba40a8aeb52d73.tar.zst dexon-sol-tools-84163517c600ff64e0d6ece4ecba40a8aeb52d73.zip |
Add additional check to make sure user was added to our DockerHub org
-rw-r--r-- | packages/monorepo-scripts/src/prepublish_checks.ts | 24 | ||||
-rw-r--r-- | packages/monorepo-scripts/src/publish.ts | 9 | ||||
-rw-r--r-- | packages/monorepo-scripts/src/utils/configs.ts | 1 | ||||
-rw-r--r-- | packages/monorepo-scripts/src/utils/docker_hub_utils.ts | 65 |
4 files changed, 79 insertions, 20 deletions
diff --git a/packages/monorepo-scripts/src/prepublish_checks.ts b/packages/monorepo-scripts/src/prepublish_checks.ts index 75a8935c8..fdb2c5e57 100644 --- a/packages/monorepo-scripts/src/prepublish_checks.ts +++ b/packages/monorepo-scripts/src/prepublish_checks.ts @@ -6,31 +6,25 @@ import semverSort = require('semver-sort'); import { constants } from './constants'; import { Package } from './types'; import { changelogUtils } from './utils/changelog_utils'; +import { configs } from './utils/configs'; +import { dockerHubUtils } from './utils/docker_hub_utils'; import { npmUtils } from './utils/npm_utils'; import { utils } from './utils/utils'; async function prepublishChecksAsync(): Promise<void> { const shouldIncludePrivate = false; - const updatedPublicPackages = await utils.getPackagesToPublishAsync(shouldIncludePrivate); + // const updatedPublicPackages = await utils.getPackagesToPublishAsync(shouldIncludePrivate); - await checkCurrentVersionMatchesLatestPublishedNPMPackageAsync(updatedPublicPackages); - await checkChangelogFormatAsync(updatedPublicPackages); - await checkGitTagsForNextVersionAndDeleteIfExistAsync(updatedPublicPackages); - await checkPublishRequiredSetupAsync(); + // await checkCurrentVersionMatchesLatestPublishedNPMPackageAsync(updatedPublicPackages); + // await checkChangelogFormatAsync(updatedPublicPackages); + // await checkGitTagsForNextVersionAndDeleteIfExistAsync(updatedPublicPackages); + // await checkPublishRequiredSetupAsync(); await checkDockerHubSetupAsync(); } async function checkDockerHubSetupAsync(): Promise<void> { - try { - utils.log('Checking that the user is logged in to docker command...'); - await execAsync(`echo "$DOCKER_PASS" | docker login -u $DOCKER_USERNAME --password-stdin`); - } catch (err) { - throw new Error( - `Failed to log you into the 'docker' commandline tool. Make sure you have environment variables 'DOCKER_USERNAME; and 'DOCKER_PASS' set. Full error: ${ - err.message - }`, - ); - } + await dockerHubUtils.checkUserAddedToOrganizationOrThrowAsync(configs.DOCKER_HUB_ORG); + await dockerHubUtils.loginUserToDockerCommandlineOrThrowAsync(); } async function checkGitTagsForNextVersionAndDeleteIfExistAsync(updatedPublicPackages: Package[]): Promise<void> { diff --git a/packages/monorepo-scripts/src/publish.ts b/packages/monorepo-scripts/src/publish.ts index 4a22df544..105d87dcd 100644 --- a/packages/monorepo-scripts/src/publish.ts +++ b/packages/monorepo-scripts/src/publish.ts @@ -22,7 +22,6 @@ import { utils } from './utils/utils'; const NPM_NAMESPACE = '@0x/'; const TODAYS_TIMESTAMP = moment().unix(); -const DOCKER_ORG = '0xorg'; async function confirmAsync(message: string): Promise<void> { prompt.start(); @@ -130,13 +129,13 @@ async function publishImagesToDockerHubAsync(allUpdatedPackages: Package[]): Pro // Tag the docker image with the latest version const version = pkg.packageJson.version; logUtils.log(`Tagging '${dockerHubRepo}' docker image with version ${version}...`); - await execAsync(`docker tag ${dockerHubRepo} ${DOCKER_ORG}/${dockerHubRepo}:${version}`); - await execAsync(`docker tag ${dockerHubRepo} ${DOCKER_ORG}/${dockerHubRepo}:latest`); + await execAsync(`docker tag ${dockerHubRepo} ${configs.DOCKER_HUB_ORG}/${dockerHubRepo}:${version}`); + await execAsync(`docker tag ${dockerHubRepo} ${configs.DOCKER_HUB_ORG}/${dockerHubRepo}:latest`); // Publish to DockerHub logUtils.log(`Pushing '${dockerHubRepo}' docker image to DockerHub...`); - await execAsync(`docker push ${DOCKER_ORG}/${dockerHubRepo}:${version}`); - await execAsync(`docker push ${DOCKER_ORG}/${dockerHubRepo}:latest`); + await execAsync(`docker push ${configs.DOCKER_HUB_ORG}/${dockerHubRepo}:${version}`); + await execAsync(`docker push ${configs.DOCKER_HUB_ORG}/${dockerHubRepo}:latest`); } } diff --git a/packages/monorepo-scripts/src/utils/configs.ts b/packages/monorepo-scripts/src/utils/configs.ts index e579bdb7c..b6b6e2c5e 100644 --- a/packages/monorepo-scripts/src/utils/configs.ts +++ b/packages/monorepo-scripts/src/utils/configs.ts @@ -5,4 +5,5 @@ const REMOTE_NPM_REGISTRY_URL = 'https://registry.npmjs.org'; export const configs = { IS_LOCAL_PUBLISH, NPM_REGISTRY_URL: IS_LOCAL_PUBLISH ? LOCAL_NPM_REGISTRY_URL : REMOTE_NPM_REGISTRY_URL, + DOCKER_HUB_ORG: '0xorg', }; diff --git a/packages/monorepo-scripts/src/utils/docker_hub_utils.ts b/packages/monorepo-scripts/src/utils/docker_hub_utils.ts new file mode 100644 index 000000000..62215a579 --- /dev/null +++ b/packages/monorepo-scripts/src/utils/docker_hub_utils.ts @@ -0,0 +1,65 @@ +import { fetchAsync } from '@0x/utils'; +import { exec as execAsync } from 'promisify-child-process'; + +import { utils } from './utils'; + +const API_ENDPOINT = 'https://hub.docker.com/v2'; +const HTTP_OK_STATUS = 200; + +export const dockerHubUtils = { + async getTokenAsync(): Promise<string> { + const payload = { + username: process.env.DOCKER_USERNAME, + password: process.env.DOCKER_PASS, + }; + const response = await fetchAsync(`${API_ENDPOINT}/users/login`, { + method: 'POST', + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json', + }, + body: JSON.stringify(payload), + }); + if (response.status !== HTTP_OK_STATUS) { + throw new Error( + `DockerHub user login failed (status code: ${ + response.status + }). Make sure you have environment variables 'DOCKER_USERNAME; and 'DOCKER_PASS' set`, + ); + } + const respPayload = await response.json(); + const token = respPayload.token; + return token; + }, + async checkUserAddedToOrganizationOrThrowAsync(organization: string): Promise<void> { + utils.log('Checking that the user was added to the 0xorg DockerHub organization...'); + const token = await dockerHubUtils.getTokenAsync(); + const response = await fetchAsync(`${API_ENDPOINT}/repositories/${organization}/?page_size=10`, { + method: 'GET', + headers: { + Accept: 'application/json', + Authorization: `JWT ${token}`, + }, + }); + const respPayload = await response.json(); + if (response.status !== HTTP_OK_STATUS || respPayload.count === 0) { + throw new Error( + `Failed to fetch org: ${organization}'s list of repos (status code: ${ + response.status + }). Make sure your account has been added to the '${organization}' org on DockerHub`, + ); + } + }, + async loginUserToDockerCommandlineOrThrowAsync(): Promise<void> { + try { + utils.log('Checking that the user is logged in to docker command...'); + await execAsync(`echo "$DOCKER_PASS" | docker login -u $DOCKER_USERNAME --password-stdin`); + } catch (err) { + throw new Error( + `Failed to log you into the 'docker' commandline tool. Make sure you have the 'docker' commandline tool installed. Full error: ${ + err.message + }`, + ); + } + }, +}; |