Skip to content

Commit

Permalink
chore(express): generate dockerfile
Browse files Browse the repository at this point in the history
- add script to generate COPY & yarn link commands for dependencies

Ticket: BG-50244
  • Loading branch information
bitgoAaron committed Jul 6, 2022
1 parent 1a368ad commit 5f7e71a
Show file tree
Hide file tree
Showing 4 changed files with 164 additions and 128 deletions.
15 changes: 14 additions & 1 deletion .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,20 @@ node_modules/
.drone.yml
.eslintrc
.prettierrc.yml
DEVELOPERS.md
**/karma.conf.js
**/*.md
**/*.png
**/.eslintignore
**/.eslintrc*
**/.gitignore
**/.mocharc*
**/.npmignore
**/.prettierignore
**/.prettierrc*
modules/**/scripts
modules/**/example*
lerna-debug.log
modules/**/webpack.config.js
modules/**/node_modules
modules/**/dist
modules/**/test
195 changes: 71 additions & 124 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -9,157 +9,104 @@ RUN \
# install with dev deps so we can run the prepare script
yarn install --frozen-lockfile && \
# install again to prune dev deps
yarn install --production --frozen-lockfile --non-interactive --ignore-scripts
yarn install --production --frozen-lockfile --non-interactive --ignore-scripts && \
# remove any src code leftover (we only want dist)
rm -r modules/*/src


FROM node:16-alpine@sha256:72a490e7ed8aed68e16b8dc8f37b5bcc35c5b5c56ee3256effcdee63e2546f93
RUN apk add --no-cache tini
COPY --from=builder \
/tmp/bitgo/modules/express/LICENSE \
/tmp/bitgo/modules/express/README.md \
/tmp/bitgo/modules/express/RELEASE_NOTES.md \
/tmp/bitgo/modules/express/package.json \
/var/bitgo-express/

# copy the root node_modules to the bitgo-express parent node_modules
COPY --from=builder /tmp/bitgo/node_modules /var/node_modules/
COPY --from=builder /tmp/bitgo/modules/express /var/bitgo-express/

# copy the express module node_modules to the final node_modules directory
COPY --from=builder /tmp/bitgo/modules/express/node_modules /var/bitgo-express/node_modules/

# copy individual directories that contain js executable files, and compiled js
COPY --from=builder /tmp/bitgo/modules/express/bin /var/bitgo-express/bin/
COPY --from=builder /tmp/bitgo/modules/express/dist /var/bitgo-express/dist/

# copy bitgo and yarn link it
COPY --from=builder /tmp/bitgo/modules/bitgo/package.json /var/modules/bitgo/
COPY --from=builder /tmp/bitgo/modules/bitgo/dist /var/modules/bitgo/dist/
COPY --from=builder /tmp/bitgo/modules/bitgo/node_modules /var/modules/bitgo/node_modules/
#COPY_START
COPY --from=builder /tmp/bitgo/modules/bitgo /var/modules/bitgo/
RUN cd /var/modules/bitgo && yarn link

# copy bitgo dependencies
# copy abstract-eth and yarn link it
COPY --from=builder /tmp/bitgo/modules/abstract-eth/package.json /var/modules/abstract-eth/
COPY --from=builder /tmp/bitgo/modules/abstract-eth/dist /var/modules/abstract-eth/dist/
COPY --from=builder /tmp/bitgo/modules/abstract-eth/node_modules /var/modules/abstract-eth/node_modules/
COPY --from=builder /tmp/bitgo/modules/abstract-eth /var/modules/abstract-eth/
RUN cd /var/modules/abstract-eth && yarn link

# copy abstract-utxo and yarn link it
COPY --from=builder /tmp/bitgo/modules/abstract-utxo/package.json /var/modules/abstract-utxo/
COPY --from=builder /tmp/bitgo/modules/abstract-utxo/dist /var/modules/abstract-utxo/dist/
RUN cd /var/modules/abstract-utxo && yarn link

# copy account-lib and yarn link it
COPY --from=builder /tmp/bitgo/modules/account-lib/package.json /var/modules/account-lib/
COPY --from=builder /tmp/bitgo/modules/account-lib/dist /var/modules/account-lib/dist/
COPY --from=builder /tmp/bitgo/modules/account-lib/node_modules /var/modules/account-lib/node_modules/
COPY --from=builder /tmp/bitgo/modules/account-lib /var/modules/account-lib/
RUN cd /var/modules/account-lib && yarn link

# copy blake2b and yarn link it
COPY --from=builder /tmp/bitgo/modules/blake2b/package.json /var/modules/blake2b/
COPY --from=builder /tmp/bitgo/modules/blake2b/index.js /var/modules/blake2b/
COPY --from=builder /tmp/bitgo/modules/blake2b/node_modules /var/modules/blake2b/node_modules/
COPY --from=builder /tmp/bitgo/modules/blake2b /var/modules/blake2b/
RUN cd /var/modules/blake2b && yarn link

# copy blake2b-wasm and yarn link it
COPY --from=builder /tmp/bitgo/modules/blake2b-wasm/package.json /var/modules/blake2b-wasm/
COPY --from=builder /tmp/bitgo/modules/blake2b-wasm/blake2b.js /var/modules/blake2b-wasm/
COPY --from=builder /tmp/bitgo/modules/blake2b-wasm/blake2b.wasm /var/modules/blake2b-wasm/
COPY --from=builder /tmp/bitgo/modules/blake2b-wasm/blake2b.wat /var/modules/blake2b-wasm/
COPY --from=builder /tmp/bitgo/modules/blake2b-wasm/generate-rounds.js /var/modules/blake2b-wasm/
COPY --from=builder /tmp/bitgo/modules/blake2b-wasm/index.js /var/modules/blake2b-wasm/
COPY --from=builder /tmp/bitgo/modules/blake2b-wasm/node_modules /var/modules/blake2b-wasm/node_modules
COPY --from=builder /tmp/bitgo/modules/blake2b-wasm /var/modules/blake2b-wasm/
RUN cd /var/modules/blake2b-wasm && yarn link

# copy blockapis and yarn link it
COPY --from=builder /tmp/bitgo/modules/blockapis/package.json /var/modules/blockapis/
COPY --from=builder /tmp/bitgo/modules/blockapis/dist /var/modules/blockapis/dist/
COPY --from=builder /tmp/bitgo/modules/blockapis/node_modules /var/modules/blockapis/node_modules/
RUN cd /var/modules/blockapis && yarn link

# copy bls-dkg and yarn link it
COPY --from=builder /tmp/bitgo/modules/bls-dkg/package.json /var/modules/bls-dkg/
COPY --from=builder /tmp/bitgo/modules/bls-dkg/index.js /var/modules/bls-dkg/
COPY --from=builder /tmp/bitgo/modules/bls-dkg /var/modules/bls-dkg/
RUN cd /var/modules/bls-dkg && yarn link

# copy sdk-api and yarn link it
COPY --from=builder /tmp/bitgo/modules/sdk-api/package.json /var/modules/sdk-api/
COPY --from=builder /tmp/bitgo/modules/sdk-api/dist /var/modules/sdk-api/dist/
COPY --from=builder /tmp/bitgo/modules/sdk-api/node_modules /var/modules/sdk-api/node_modules/
RUN cd /var/modules/sdk-api && yarn link

# copy sdk-coin-algo and yarn link it
COPY --from=builder /tmp/bitgo/modules/sdk-coin-algo/package.json /var/modules/sdk-coin-algo/
COPY --from=builder /tmp/bitgo/modules/sdk-coin-algo/dist /var/modules/sdk-coin-algo/dist/
COPY --from=builder /tmp/bitgo/modules/sdk-coin-algo /var/modules/sdk-coin-algo/
RUN cd /var/modules/sdk-coin-algo && yarn link

# copy sdk-coin-avaxp and yarn link it
COPY --from=builder /tmp/bitgo/modules/sdk-coin-avaxp/package.json /var/modules/sdk-coin-avaxp/
COPY --from=builder /tmp/bitgo/modules/sdk-coin-avaxp/dist /var/modules/sdk-coin-avaxp/dist/
COPY --from=builder /tmp/bitgo/modules/sdk-coin-avaxp/node_modules /var/modules/sdk-coin-avaxp/node_modules/
RUN cd /var/modules/sdk-coin-avaxp && yarn link

# copy sdk-coin-cspr and yarn link it
COPY --from=builder /tmp/bitgo/modules/sdk-coin-cspr/package.json /var/modules/sdk-coin-cspr/
COPY --from=builder /tmp/bitgo/modules/sdk-coin-cspr/dist /var/modules/sdk-coin-cspr/dist/
COPY --from=builder /tmp/bitgo/modules/sdk-coin-cspr/node_modules /var/modules/sdk-coin-cspr/node_modules/
RUN cd /var/modules/sdk-coin-cspr && yarn link

# copy sdk-coin-xrp and yarn link it
COPY --from=builder /tmp/bitgo/modules/sdk-coin-xrp/package.json /var/modules/sdk-coin-xrp/
COPY --from=builder /tmp/bitgo/modules/sdk-coin-xrp/dist /var/modules/sdk-coin-xrp/dist/
COPY --from=builder /tmp/bitgo/modules/sdk-coin-xrp/node_modules /var/modules/sdk-coin-xrp/node_modules/
RUN cd /var/modules/sdk-coin-xrp && yarn link

# copy sdk-core and yarn link it
COPY --from=builder /tmp/bitgo/modules/sdk-core/package.json /var/modules/sdk-core/
COPY --from=builder /tmp/bitgo/modules/sdk-core/dist /var/modules/sdk-core/dist/
COPY --from=builder /tmp/bitgo/modules/sdk-core/node_modules /var/modules/sdk-core/node_modules/
COPY --from=builder /tmp/bitgo/modules/sdk-api /var/modules/sdk-api/
RUN cd /var/modules/sdk-api && yarn link
COPY --from=builder /tmp/bitgo/modules/sdk-core /var/modules/sdk-core/
RUN cd /var/modules/sdk-core && yarn link

# copy sjcl and yarn link it
COPY --from=builder /tmp/bitgo/modules/sjcl/package.json /var/modules/sjcl/
COPY --from=builder /tmp/bitgo/modules/sjcl/sjcl.min.js /var/modules/sjcl/
RUN cd /var/modules/sjcl && yarn link

# copy statics and yarn link it
COPY --from=builder /tmp/bitgo/modules/statics/package.json /var/modules/statics/
COPY --from=builder /tmp/bitgo/modules/statics/dist /var/modules/statics/dist/
COPY --from=builder /tmp/bitgo/modules/statics/node_modules /var/modules/statics/node_modules/
COPY --from=builder /tmp/bitgo/modules/statics /var/modules/statics/
RUN cd /var/modules/statics && yarn link

# copy unspents and yarn link it
COPY --from=builder /tmp/bitgo/modules/unspents/package.json /var/modules/unspents/
COPY --from=builder /tmp/bitgo/modules/unspents/dist /var/modules/unspents/dist/
COPY --from=builder /tmp/bitgo/modules/unspents/node_modules /var/modules/unspents/node_modules/
RUN cd /var/modules/unspents && yarn link

# copy utxo-lib and yarn link it
COPY --from=builder /tmp/bitgo/modules/utxo-lib/package.json /var/modules/utxo-lib/
COPY --from=builder /tmp/bitgo/modules/utxo-lib/dist /var/modules/utxo-lib/dist/
COPY --from=builder /tmp/bitgo/modules/utxo-lib/node_modules /var/modules/utxo-lib/node_modules/
COPY --from=builder /tmp/bitgo/modules/utxo-lib /var/modules/utxo-lib/
RUN cd /var/modules/utxo-lib && yarn link
COPY --from=builder /tmp/bitgo/modules/sjcl /var/modules/sjcl/
RUN cd /var/modules/sjcl && yarn link
COPY --from=builder /tmp/bitgo/modules/unspents /var/modules/unspents/
RUN cd /var/modules/unspents && yarn link
COPY --from=builder /tmp/bitgo/modules/sdk-coin-avaxp /var/modules/sdk-coin-avaxp/
RUN cd /var/modules/sdk-coin-avaxp && yarn link
COPY --from=builder /tmp/bitgo/modules/sdk-coin-cspr /var/modules/sdk-coin-cspr/
RUN cd /var/modules/sdk-coin-cspr && yarn link
COPY --from=builder /tmp/bitgo/modules/sdk-coin-eth /var/modules/sdk-coin-eth/
RUN cd /var/modules/sdk-coin-eth && yarn link
COPY --from=builder /tmp/bitgo/modules/abstract-utxo /var/modules/abstract-utxo/
RUN cd /var/modules/abstract-utxo && yarn link
COPY --from=builder /tmp/bitgo/modules/blockapis /var/modules/blockapis/
RUN cd /var/modules/blockapis && yarn link
COPY --from=builder /tmp/bitgo/modules/sdk-coin-bch /var/modules/sdk-coin-bch/
RUN cd /var/modules/sdk-coin-bch && yarn link
COPY --from=builder /tmp/bitgo/modules/sdk-coin-bcha /var/modules/sdk-coin-bcha/
RUN cd /var/modules/sdk-coin-bcha && yarn link
COPY --from=builder /tmp/bitgo/modules/sdk-coin-bsv /var/modules/sdk-coin-bsv/
RUN cd /var/modules/sdk-coin-bsv && yarn link
COPY --from=builder /tmp/bitgo/modules/sdk-coin-btc /var/modules/sdk-coin-btc/
RUN cd /var/modules/sdk-coin-btc && yarn link
COPY --from=builder /tmp/bitgo/modules/sdk-coin-btg /var/modules/sdk-coin-btg/
RUN cd /var/modules/sdk-coin-btg && yarn link
COPY --from=builder /tmp/bitgo/modules/sdk-coin-dash /var/modules/sdk-coin-dash/
RUN cd /var/modules/sdk-coin-dash && yarn link
COPY --from=builder /tmp/bitgo/modules/sdk-coin-ltc /var/modules/sdk-coin-ltc/
RUN cd /var/modules/sdk-coin-ltc && yarn link
COPY --from=builder /tmp/bitgo/modules/sdk-coin-xrp /var/modules/sdk-coin-xrp/
RUN cd /var/modules/sdk-coin-xrp && yarn link
COPY --from=builder /tmp/bitgo/modules/sdk-coin-zec /var/modules/sdk-coin-zec/
RUN cd /var/modules/sdk-coin-zec && yarn link
#COPY_END

# yarn link all required packages in bitgo-express
RUN \
cd /var/bitgo-express && \
#LINK_START
RUN cd /var/bitgo-express && \
yarn link bitgo && \
yarn link @bitgo/abstract-eth && \
yarn link @bitgo/abstract-utxo && \
yarn link @bitgo/account-lib && \
yarn link @bitgo/blake2b && \
yarn link @bitgo/blake2b-wasm && \
yarn link @bitgo/blockapis && \
yarn link @bitgo/bls-dkg && \
yarn link @bitgo/sdk-api && \
yarn link @bitgo/sdk-coin-algo && \
yarn link @bitgo/sdk-coin-avaxp && \
yarn link @bitgo/sdk-coin-cspr && \
yarn link @bitgo/sdk-coin-xrp && \
yarn link @bitgo/sdk-api && \
yarn link @bitgo/sdk-core && \
yarn link @bitgo/sjcl && \
yarn link @bitgo/statics && \
yarn link @bitgo/utxo-lib && \
yarn link @bitgo/sjcl && \
yarn link @bitgo/unspents && \
yarn link @bitgo/utxo-lib
yarn link @bitgo/sdk-coin-avaxp && \
yarn link @bitgo/sdk-coin-cspr && \
yarn link @bitgo/sdk-coin-eth && \
yarn link @bitgo/abstract-utxo && \
yarn link @bitgo/blockapis && \
yarn link @bitgo/sdk-coin-bch && \
yarn link @bitgo/sdk-coin-bcha && \
yarn link @bitgo/sdk-coin-bsv && \
yarn link @bitgo/sdk-coin-btc && \
yarn link @bitgo/sdk-coin-btg && \
yarn link @bitgo/sdk-coin-dash && \
yarn link @bitgo/sdk-coin-ltc && \
yarn link @bitgo/sdk-coin-xrp && \
yarn link @bitgo/sdk-coin-zec
#LINK_END

USER node
ENV NODE_ENV production
Expand Down
7 changes: 4 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -88,9 +88,10 @@
"check-versions": "node ./check-package-versions.js",
"dev": "tsc -b ./tsconfig.packages.json -w",
"prepare": "husky install",
"sdk-coin:new": "yo ./scripts/sdk-coin-generator",
"build-docker-express": "docker build -t bitgosdk/express:latest -t bitgosdk/express:$(jq -r .version < modules/express/package.json) .",
"push-docker-express": "docker push bitgosdk/express:latest bitgosdk/express:$(jq -r .version < modules/express/package.json)"
"sdk-coin:new": "yo ./scripts/sdk-coin-generator && yarn update-dockerfile",
"build-docker-express": "yarn update-dockerfile && docker build -t bitgosdk/express:latest -t bitgosdk/express:$(jq -r .version < modules/express/package.json) .",
"push-docker-express": "docker push bitgosdk/express:latest bitgosdk/express:$(jq -r .version < modules/express/package.json)",
"update-dockerfile": "ts-node scripts/update-dockerfile.ts"
},
"dependencies": {}
}
75 changes: 75 additions & 0 deletions scripts/update-dockerfile.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
import * as execa from 'execa';
import * as fs from 'fs';

type ManagedModule = {
name: string;
location: string;
version: string;
private: boolean;
};

/**
* Create a function which can run lerna commands
* @param lernaPath {string} path to lerna binary
* @returns {function(string, string[], Object.<string, string>): Promise<string>}
*/
function getLernaRunner(lernaPath) {
return async (command, args = [], options = {}) => {
const { stdout } = await execa(
lernaPath,
[command, ...args],
options,
);
return stdout;
};
}

const walkDependencies = (packageName: string, setDeps: Set<ManagedModule>, graph: Record<string, string[]>, managedModules: ManagedModule[]) => {
const managedDeps = graph[packageName].filter((dep) => graph[dep]).map((name) => managedModules.find((mod) => mod.name === name));
managedDeps.forEach((module) => {
if (module && !module.private && !setDeps.has(module)) {
setDeps.add(module);
walkDependencies(module.name, setDeps, graph, managedModules);
}
});
};

/**
* Get information on the modules in this repo that are managed by lerna.
* @param lerna {function}
* @returns {Promise<{path: *, name: *, deps: *, version: *}[]>}
*/
async function updateDockerFile(lerna) {
const depGraph: Record<string, string[]> = JSON.parse(await lerna('list', ['--loglevel', 'silent', '--graph', '--all']));
const managedModules: ManagedModule[] = JSON.parse(await lerna('list', ['--loglevel', 'silent', '--json', '--all']));


const setDeps = new Set<ManagedModule>();
walkDependencies('@bitgo/express', setDeps, depGraph, managedModules);
let dockerContents = fs.readFileSync('Dockerfile', { encoding: 'utf-8' });
let copyContent = ``;
setDeps.forEach((module) => {
const modPath = module.location.substring(module.location.indexOf('/modules/'));
copyContent += `COPY --from=builder /tmp/bitgo${modPath} /var${modPath}/\n`;
copyContent += `RUN cd /var${modPath} && yarn link\n`;
});

const linkers = Array.from(setDeps).map((dep) => ` yarn link ${dep.name}`).join(' && \\\n');
const linkContent = `RUN cd /var/bitgo-express && \\\n${linkers}\n`;
dockerContents = dockerContents
.replace(/#COPY_START((.|\n)*)#COPY_END/, `#COPY_START\n${copyContent}#COPY_END`)
.replace(/#LINK_START((.|\n)*)#LINK_END/, `#LINK_START\n${linkContent}#LINK_END`);


fs.writeFileSync('Dockerfile', dockerContents);
}

const main = async () => {
const { stdout: lernaBinary } = await execa('yarn', ['bin', 'lerna'], { cwd: process.cwd() });

const lerna = getLernaRunner(lernaBinary);

await updateDockerFile(lerna);
};

main();

0 comments on commit 5f7e71a

Please sign in to comment.