From fe5c6a772723913bf1b91661fb1acfc95ddc7ea2 Mon Sep 17 00:00:00 2001 From: Fabian Chong Date: Thu, 26 Nov 2020 18:28:50 +0800 Subject: [PATCH 1/7] Optional .npmrc to support private NPM registry --- packages/cli/src/commands/backend/buildImage.ts | 4 ++++ packages/create-app/templates/default-app/package.json.hbs | 2 +- .../templates/default-app/packages/backend/Dockerfile | 3 ++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/cli/src/commands/backend/buildImage.ts b/packages/cli/src/commands/backend/buildImage.ts index b6ae0dd579..6439b37ca1 100644 --- a/packages/cli/src/commands/backend/buildImage.ts +++ b/packages/cli/src/commands/backend/buildImage.ts @@ -34,11 +34,15 @@ export default async (cmd: Command) => { const pkgPath = paths.resolveTarget(PKG_PATH); const pkg = await fs.readJson(pkgPath); const appConfigs = await findAppConfigs(); + const npmrc = fs.existsSync(paths.resolveTargetRoot('.npmrc')) + ? ['.npmrc'] + : []; const tempDistWorkspace = await createDistWorkspace([pkg.name], { buildDependencies: Boolean(cmd.build), files: [ 'package.json', 'yarn.lock', + ...npmrc, ...appConfigs, { src: paths.resolveTarget('Dockerfile'), dest: 'Dockerfile' }, ], diff --git a/packages/create-app/templates/default-app/package.json.hbs b/packages/create-app/templates/default-app/package.json.hbs index 975a5a2ed2..e3d287c75c 100644 --- a/packages/create-app/templates/default-app/package.json.hbs +++ b/packages/create-app/templates/default-app/package.json.hbs @@ -8,7 +8,7 @@ "scripts": { "start": "yarn workspace app start", "build": "lerna run build", - "build-image": "yarn workspace backend build-image", + "build-image": "yarn workspace backend build-image --build-arg NPM_TOKEN", "tsc": "tsc", "tsc:full": "tsc --skipLibCheck false --incremental false", "clean": "backstage-cli clean && lerna run clean", diff --git a/packages/create-app/templates/default-app/packages/backend/Dockerfile b/packages/create-app/templates/default-app/packages/backend/Dockerfile index 50514713d3..b0c2d4a6e5 100644 --- a/packages/create-app/templates/default-app/packages/backend/Dockerfile +++ b/packages/create-app/templates/default-app/packages/backend/Dockerfile @@ -1,11 +1,12 @@ FROM node:12-buster +ARG NPM_TOKEN WORKDIR /usr/src/app # Copy repo skeleton first, to avoid unnecessary docker cache invalidation. # The skeleton contains the package.json of each package in the monorepo, # and along with yarn.lock and the root package.json, that's enough to run yarn install. -ADD yarn.lock package.json skeleton.tar ./ +ADD .npmrc* yarn.lock package.json skeleton.tar ./ RUN yarn install --frozen-lockfile --production --network-timeout 300000 && rm -rf "$(yarn cache dir)" From 433aa52a1701a693b151982c6607526c9bcccbc4 Mon Sep 17 00:00:00 2001 From: Fabian Chong Date: Tue, 1 Dec 2020 14:27:37 +0800 Subject: [PATCH 2/7] Pass NPM_TOKEN through docker --secret --- packages/create-app/templates/default-app/package.json.hbs | 2 +- .../templates/default-app/packages/backend/Dockerfile | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/create-app/templates/default-app/package.json.hbs b/packages/create-app/templates/default-app/package.json.hbs index e3d287c75c..8ee5666033 100644 --- a/packages/create-app/templates/default-app/package.json.hbs +++ b/packages/create-app/templates/default-app/package.json.hbs @@ -8,7 +8,7 @@ "scripts": { "start": "yarn workspace app start", "build": "lerna run build", - "build-image": "yarn workspace backend build-image --build-arg NPM_TOKEN", + "build-image": "DOCKER_BUILDKIT=1 yarn workspace backend build-image", "tsc": "tsc", "tsc:full": "tsc --skipLibCheck false --incremental false", "clean": "backstage-cli clean && lerna run clean", diff --git a/packages/create-app/templates/default-app/packages/backend/Dockerfile b/packages/create-app/templates/default-app/packages/backend/Dockerfile index b0c2d4a6e5..aeed5054f0 100644 --- a/packages/create-app/templates/default-app/packages/backend/Dockerfile +++ b/packages/create-app/templates/default-app/packages/backend/Dockerfile @@ -1,5 +1,5 @@ +# syntax = docker/dockerfile:1.0-experimental FROM node:12-buster -ARG NPM_TOKEN WORKDIR /usr/src/app @@ -8,7 +8,7 @@ WORKDIR /usr/src/app # and along with yarn.lock and the root package.json, that's enough to run yarn install. ADD .npmrc* yarn.lock package.json skeleton.tar ./ -RUN yarn install --frozen-lockfile --production --network-timeout 300000 && rm -rf "$(yarn cache dir)" +RUN --mount=type=secret,id=NPM_TOKEN NPM_TOKEN=$(cat /run/secrets/NPM_TOKEN) yarn install --frozen-lockfile --production --network-timeout 300000 && rm -rf "$(yarn cache dir)" # This will copy the contents of the dist-workspace when running the build-image command. # Do not use this Dockerfile outside of that command, as it will copy in the source code instead. From a42205b3e84c8986f5421f48c73f3c16d3f80266 Mon Sep 17 00:00:00 2001 From: Fabian Chong Date: Tue, 1 Dec 2020 14:35:20 +0800 Subject: [PATCH 3/7] Uses pathExists --- packages/cli/src/commands/backend/buildImage.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/src/commands/backend/buildImage.ts b/packages/cli/src/commands/backend/buildImage.ts index 6439b37ca1..654f51cd10 100644 --- a/packages/cli/src/commands/backend/buildImage.ts +++ b/packages/cli/src/commands/backend/buildImage.ts @@ -34,7 +34,7 @@ export default async (cmd: Command) => { const pkgPath = paths.resolveTarget(PKG_PATH); const pkg = await fs.readJson(pkgPath); const appConfigs = await findAppConfigs(); - const npmrc = fs.existsSync(paths.resolveTargetRoot('.npmrc')) + const npmrc = (await fs.pathExists(paths.resolveTargetRoot('.npmrc'))) ? ['.npmrc'] : []; const tempDistWorkspace = await createDistWorkspace([pkg.name], { From 8a16e8af82398bcda4fc55cb9718cada22caa57f Mon Sep 17 00:00:00 2001 From: Joel Low Date: Thu, 3 Dec 2020 10:06:15 +0800 Subject: [PATCH 4/7] Add missing changelog entry --- .changeset/spotty-paws-think.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/spotty-paws-think.md diff --git a/.changeset/spotty-paws-think.md b/.changeset/spotty-paws-think.md new file mode 100644 index 0000000000..7e59a0f641 --- /dev/null +++ b/.changeset/spotty-paws-think.md @@ -0,0 +1,6 @@ +--- +'@backstage/cli': patch +'@backstage/create-app': patch +--- + +Support `.npmrc` when building with private NPM registries From 6b7c44d32ded9ce33a3157023d52a60e42abcc25 Mon Sep 17 00:00:00 2001 From: Joel Low Date: Thu, 3 Dec 2020 16:10:36 +0800 Subject: [PATCH 5/7] Add simple instructions to providing an NPM Token to backend:build-image --- packages/cli/src/commands/index.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/cli/src/commands/index.ts b/packages/cli/src/commands/index.ts index 2b0e3e25b9..975df97f41 100644 --- a/packages/cli/src/commands/index.ts +++ b/packages/cli/src/commands/index.ts @@ -55,7 +55,9 @@ export function registerCommands(program: CommanderStatic) { .helpOption(', --backstage-cli-help') // Let docker handle --help .option('--build', 'Build packages before packing them into the image') .description( - 'Bundles the package into a docker image. All extra args are forwarded to docker image build', + 'Bundles the package into a docker image. All extra args are forwarded to ' + + '`docker image build`. For example, if a $NPM_TOKEN needs to be exposed, run ' + + '`backend:build-image --secret id=NPM_TOKEN,src=/NPM_TOKEN.txt`', ) .action(lazy(() => import('./backend/buildImage').then(m => m.default))); From a6e9708adabdddde4923fefa806af84849871e7b Mon Sep 17 00:00:00 2001 From: Joel Low Date: Thu, 3 Dec 2020 17:27:46 +0800 Subject: [PATCH 6/7] Revert changes to template app --- .changeset/spotty-paws-think.md | 1 - packages/create-app/templates/default-app/package.json.hbs | 2 +- .../templates/default-app/packages/backend/Dockerfile | 5 ++--- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/.changeset/spotty-paws-think.md b/.changeset/spotty-paws-think.md index 7e59a0f641..552b65d7e6 100644 --- a/.changeset/spotty-paws-think.md +++ b/.changeset/spotty-paws-think.md @@ -1,6 +1,5 @@ --- '@backstage/cli': patch -'@backstage/create-app': patch --- Support `.npmrc` when building with private NPM registries diff --git a/packages/create-app/templates/default-app/package.json.hbs b/packages/create-app/templates/default-app/package.json.hbs index 8ee5666033..975a5a2ed2 100644 --- a/packages/create-app/templates/default-app/package.json.hbs +++ b/packages/create-app/templates/default-app/package.json.hbs @@ -8,7 +8,7 @@ "scripts": { "start": "yarn workspace app start", "build": "lerna run build", - "build-image": "DOCKER_BUILDKIT=1 yarn workspace backend build-image", + "build-image": "yarn workspace backend build-image", "tsc": "tsc", "tsc:full": "tsc --skipLibCheck false --incremental false", "clean": "backstage-cli clean && lerna run clean", diff --git a/packages/create-app/templates/default-app/packages/backend/Dockerfile b/packages/create-app/templates/default-app/packages/backend/Dockerfile index aeed5054f0..50514713d3 100644 --- a/packages/create-app/templates/default-app/packages/backend/Dockerfile +++ b/packages/create-app/templates/default-app/packages/backend/Dockerfile @@ -1,4 +1,3 @@ -# syntax = docker/dockerfile:1.0-experimental FROM node:12-buster WORKDIR /usr/src/app @@ -6,9 +5,9 @@ WORKDIR /usr/src/app # Copy repo skeleton first, to avoid unnecessary docker cache invalidation. # The skeleton contains the package.json of each package in the monorepo, # and along with yarn.lock and the root package.json, that's enough to run yarn install. -ADD .npmrc* yarn.lock package.json skeleton.tar ./ +ADD yarn.lock package.json skeleton.tar ./ -RUN --mount=type=secret,id=NPM_TOKEN NPM_TOKEN=$(cat /run/secrets/NPM_TOKEN) yarn install --frozen-lockfile --production --network-timeout 300000 && rm -rf "$(yarn cache dir)" +RUN yarn install --frozen-lockfile --production --network-timeout 300000 && rm -rf "$(yarn cache dir)" # This will copy the contents of the dist-workspace when running the build-image command. # Do not use this Dockerfile outside of that command, as it will copy in the source code instead. From e0cd3aa7aab35adfd75b906de989b7fda4919df1 Mon Sep 17 00:00:00 2001 From: Joel Low Date: Thu, 3 Dec 2020 17:47:22 +0800 Subject: [PATCH 7/7] Shorten help message for `backend:build-image` --- packages/cli/src/commands/index.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/cli/src/commands/index.ts b/packages/cli/src/commands/index.ts index 975df97f41..db88c57fb1 100644 --- a/packages/cli/src/commands/index.ts +++ b/packages/cli/src/commands/index.ts @@ -55,9 +55,11 @@ export function registerCommands(program: CommanderStatic) { .helpOption(', --backstage-cli-help') // Let docker handle --help .option('--build', 'Build packages before packing them into the image') .description( + // TODO: Add example use cases in Backstage documentation. + // For example, if a $NPM_TOKEN needs to be exposed, run `backend:build-image --secret + // id=NPM_TOKEN,src=/NPM_TOKEN.txt`. 'Bundles the package into a docker image. All extra args are forwarded to ' + - '`docker image build`. For example, if a $NPM_TOKEN needs to be exposed, run ' + - '`backend:build-image --secret id=NPM_TOKEN,src=/NPM_TOKEN.txt`', + '`docker image build`.', ) .action(lazy(() => import('./backend/buildImage').then(m => m.default)));