Merge pull request #86 from cerc-io/dboreham/build-laconic-cli
Allow building of npm packages using locally published dependencies
This commit is contained in:
commit
db4899229d
@ -25,8 +25,8 @@ RUN \
|
|||||||
&& npm cache clean --force > /dev/null 2>&1
|
&& npm cache clean --force > /dev/null 2>&1
|
||||||
|
|
||||||
# [Optional] Uncomment this section to install additional OS packages.
|
# [Optional] Uncomment this section to install additional OS packages.
|
||||||
# RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
|
RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
|
||||||
# && apt-get -y install --no-install-recommends <your-package-list-here>
|
&& apt-get -y install --no-install-recommends jq
|
||||||
|
|
||||||
# [Optional] Uncomment if you want to install an additional version of node using nvm
|
# [Optional] Uncomment if you want to install an additional version of node using nvm
|
||||||
# ARG EXTRA_NODE_VERSION=10
|
# ARG EXTRA_NODE_VERSION=10
|
||||||
@ -35,7 +35,11 @@ RUN \
|
|||||||
# [Optional] Uncomment if you want to install more global node modules
|
# [Optional] Uncomment if you want to install more global node modules
|
||||||
# RUN su node -c "npm install -g <your-package-list-here>"
|
# RUN su node -c "npm install -g <your-package-list-here>"
|
||||||
|
|
||||||
COPY build-npm-package.sh .
|
RUN mkdir /scripts
|
||||||
|
COPY build-npm-package.sh /scripts
|
||||||
|
COPY yarn-local-registry-fixup.sh /scripts
|
||||||
|
COPY build-npm-package-local-dependencies.sh /scripts
|
||||||
|
ENV PATH="${PATH}:/scripts"
|
||||||
|
|
||||||
COPY entrypoint.sh .
|
COPY entrypoint.sh .
|
||||||
ENTRYPOINT ["./entrypoint.sh"]
|
ENTRYPOINT ["./entrypoint.sh"]
|
||||||
|
@ -8,9 +8,10 @@ using `yarn`.
|
|||||||
As a temporary measure while the necessary functionality is being added to Stack Orchestrator,
|
As a temporary measure while the necessary functionality is being added to Stack Orchestrator,
|
||||||
it is possible to build packages manually by invoking `docker run` , for example as follows:
|
it is possible to build packages manually by invoking `docker run` , for example as follows:
|
||||||
|
|
||||||
|
|
||||||
```
|
```
|
||||||
$ docker run -it --add-host host.docker.internal:host-gateway \
|
$ docker run --rm -it --add-host host.docker.internal:host-gateway \
|
||||||
-v ${HOME}/cerc/laconic-sdk:/workspace cerc/builder-js \
|
-v ${HOME}/cerc/laconic-registry-cli:/workspace cerc/builder-js \
|
||||||
sh -c 'cd /workspace && NPM_AUTH_TOKEN=6613572a28ebebaee20ccd90064251fa8c2b94f6 \
|
sh -c 'cd /workspace && NPM_AUTH_TOKEN=6613572a28ebebaee20ccd90064251fa8c2b94f6 \
|
||||||
/build-npm-package.sh http://host.docker.internal:3000/api/packages/cerc-io/npm/ 1.2.3-test'
|
build-npm-package-local-dependencies.sh http://host.docker.internal:3000/api/packages/cerc-io/npm/ 0.1.8'
|
||||||
```
|
```
|
||||||
|
32
container-build/cerc-builder-js/build-npm-package-local-dependencies.sh
Executable file
32
container-build/cerc-builder-js/build-npm-package-local-dependencies.sh
Executable file
@ -0,0 +1,32 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Usage: build-npm-package-local-dependencies.sh <registry-url> <publish-with-this-version>
|
||||||
|
# Runs build-npm-package.sh after first fixing up yarn.lock to use a local
|
||||||
|
# npm registry for all packages in a spcific scope (currently @cerc-io)
|
||||||
|
if [ -n "$CERC_SCRIPT_DEBUG" ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
if [[ $# -ne 2 ]]; then
|
||||||
|
echo "Illegal number of parameters" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if [[ -z "${NPM_AUTH_TOKEN}" ]]; then
|
||||||
|
echo "NPM_AUTH_TOKEN is not set" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
local_npm_registry_url=$1
|
||||||
|
package_publish_version=$2
|
||||||
|
# TODO: make this a paramater and allow a list of scopes
|
||||||
|
npm_scope_for_local="@cerc-io"
|
||||||
|
# We need to configure the local registry
|
||||||
|
npm config set ${npm_scope_for_local}:registry ${local_npm_registry_url}
|
||||||
|
npm config set -- ${local_npm_registry_url}:_authToken ${NPM_AUTH_TOKEN}
|
||||||
|
# Find the set of dependencies from the specified scope
|
||||||
|
mapfile -t dependencies_from_scope < <(cat package.json | jq -r '.dependencies | with_entries(if (.key|test("^'${npm_scope_for_local}'/.*$")) then ( {key: .key, value: .value } ) else empty end ) | keys[]')
|
||||||
|
echo "Fixing up dependencies"
|
||||||
|
for package in "${dependencies_from_scope[@]}"
|
||||||
|
do
|
||||||
|
echo "Fixing up package ${package}"
|
||||||
|
yarn-local-registry-fixup.sh $package ${local_npm_registry_url}
|
||||||
|
done
|
||||||
|
echo "Running build"
|
||||||
|
build-npm-package.sh ${local_npm_registry_url} ${package_publish_version}
|
@ -1,7 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# Usage: build-npm-package.sh <registry-url> <publish-with-this-version>
|
# Usage: build-npm-package.sh <registry-url> <publish-with-this-version>
|
||||||
# Note: supply the registry auth token in NPM_AUTH_TOKEN
|
# Note: supply the registry auth token in NPM_AUTH_TOKEN
|
||||||
if [ -n "$CERC_ENABLE_SCRIPT_DEBUG" ]; then
|
if [ -n "$CERC_SCRIPT_DEBUG" ]; then
|
||||||
set -x
|
set -x
|
||||||
fi
|
fi
|
||||||
if [[ $# -ne 2 ]]; then
|
if [[ $# -ne 2 ]]; then
|
||||||
|
46
container-build/cerc-builder-js/yarn-local-registry-fixup.sh
Executable file
46
container-build/cerc-builder-js/yarn-local-registry-fixup.sh
Executable file
@ -0,0 +1,46 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Usage: yarn-local-registry-fixup.sh <package-to-fix> <registry-url>
|
||||||
|
# Assumes package.json and yarn.lock are in the cwd
|
||||||
|
# The purpose of this script is to take a project cloned from git
|
||||||
|
# and "fixup" its yarn.lock file such that specified dependency
|
||||||
|
# will be fetched from a registry other than the one used when
|
||||||
|
# yarn.lock was generated. It updates all checksums using data
|
||||||
|
# from the "new" registry (because due to embedded timestamps etc
|
||||||
|
# the same source code re-built later will not have the same checksum).
|
||||||
|
if [ -n "$CERC_SCRIPT_DEBUG" ]; then
|
||||||
|
set -x
|
||||||
|
fi
|
||||||
|
if [[ $# -ne 2 ]]; then
|
||||||
|
echo "Illegal number of parameters" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
target_package=$1
|
||||||
|
local_npm_registry_url=$2
|
||||||
|
# TODO: use jq rather than sed here:
|
||||||
|
versioned_target_package=$(grep ${target_package} package.json | sed -e 's#[[:space:]]\{1,\}\"\('${target_package}'\)\":[[:space:]]\{1,\}\"\(.*\)\",#\1@\2#' )
|
||||||
|
# Use yarn info to get URL checksums etc from the new registry
|
||||||
|
yarn_info_output=$(yarn info --json $versioned_target_package 2>/dev/null)
|
||||||
|
# Code below parses out the values we need
|
||||||
|
package_tarball=$(echo $yarn_info_output | jq -r .data.dist.tarball)
|
||||||
|
# When running inside a container, the registry can return a URL with the wrong host name due to proxying
|
||||||
|
# so we need to check if that has happened and fix the URL if so.
|
||||||
|
if ! [[ "${package_tarball}" =~ ^${local_npm_registry_url}.* ]]; then
|
||||||
|
# HACK: I've hard-wired the host names below. Replace with proper implementation
|
||||||
|
package_tarball=$( echo ${package_tarball} | sed -e 's/localhost/host.docker.internal/g' )
|
||||||
|
fi
|
||||||
|
package_integrity=$(echo $yarn_info_output | jq -r .data.dist.integrity)
|
||||||
|
package_shasum=$(echo $yarn_info_output | jq -r .data.dist.shasum)
|
||||||
|
package_resolved=${package_tarball}#${package_shasum}
|
||||||
|
# Some strings need to be escaped so they work when passed to sed later
|
||||||
|
escaped_package_resolved=$(printf '%s\n' "$package_resolved" | sed -e 's/[\/&]/\\&/g')
|
||||||
|
escaped_target_package=$(printf '%s\n' "$target_package" | sed -e 's/[\/&]/\\&/g')
|
||||||
|
if [ -n "$CERC_SCRIPT_VERBOSE" ]; then
|
||||||
|
echo "Tarball: ${package_tarball}"
|
||||||
|
echo "Integrity: ${package_integrity}"
|
||||||
|
echo "Shasum: ${package_shasum}"
|
||||||
|
echo "Resolved: ${package_resolved}"
|
||||||
|
fi
|
||||||
|
# Use magic sed regex to replace the values in yarn.lock
|
||||||
|
# Note: yarn.lock is not json so we can not use jq for this
|
||||||
|
sed -i -e '/^\"'${escaped_target_package}'.*\":$/ , /^\".*$/ s/^\([[:space:]]\{1,\}resolved \).*$/\1'\"${escaped_package_resolved}\"'/' yarn.lock
|
||||||
|
sed -i -e '/^\"'${escaped_target_package}'.*\":$/ , /^\".*$/ s/^\([[:space:]]\{1,\}integrity \).*$/\1'${package_integrity}'/' yarn.lock
|
Loading…
Reference in New Issue
Block a user