diff --git a/app/build_npms.py b/app/build_npms.py
new file mode 100644
index 00000000..81b215ab
--- /dev/null
+++ b/app/build_npms.py
@@ -0,0 +1,93 @@
+# Copyright © 2022 Cerc
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+
+# Builds or pulls containers for the system components
+
+# env vars:
+# CERC_REPO_BASE_DIR defaults to ~/cerc
+
+import os
+from decouple import config
+import subprocess
+import click
+import pkg_resources
+from python_on_whales import docker
+from .util import include_exclude_check
+
+@click.command()
+@click.option('--include', help="only build these packages")
+@click.option('--exclude', help="don\'t build these packages")
+@click.pass_context
+def command(ctx, include, exclude):
+ '''build the set of npm packages required for a complete stack'''
+
+ quiet = ctx.obj.quiet
+ verbose = ctx.obj.verbose
+ dry_run = ctx.obj.dry_run
+ local_stack = ctx.obj.local_stack
+
+ if local_stack:
+ dev_root_path = os.getcwd()[0:os.getcwd().rindex("stack-orchestrator")]
+ print(f'Local stack dev_root_path (CERC_REPO_BASE_DIR) overridden to: {dev_root_path}')
+ else:
+ dev_root_path = os.path.expanduser(config("CERC_REPO_BASE_DIR", default="~/cerc"))
+
+ if not quiet:
+ print(f'Dev Root is: {dev_root_path}')
+
+ if not os.path.isdir(dev_root_path):
+ print('Dev root directory doesn\'t exist, creating')
+
+ with pkg_resources.resource_stream(__name__, "data/npm-package-list.txt") as package_list_file:
+ packages = package_list_file.read().decode().splitlines()
+
+ if verbose:
+ print(f'Packages: {packages}')
+
+ # To build a package we need to run the cerc/build-js container with a bind mount from the project directory
+ # and use docker run to execute the build script inside that container
+ # docker.run("cerc/builder-js", ["ls", "/host"], volumes=[("", "/workspace")])
+ # sh -c 'cd /workspace && NPM_AUTH_TOKEN=6613572a28ebebaee20ccd90064251fa8c2b94f6 \
+ # build-npm-package.sh http://host.docker.internal:3000/api/packages/cerc-io/npm/ 1.0.0-beta.1'
+ # NPM_AUTH_TOKEN=6613572a28ebebaee20ccd90064251fa8c2b94f6
+ # Set uid/gid
+
+ def build_package(package):
+ if not quiet:
+ print(f"Building: {package}")
+ repo_dir = package
+ repo_full_path = os.path.join(dev_root_path, repo_dir)
+ build_command = ["sh", "-c", "'cd /workspace && build-npm-package.sh http://host.docker.internal:3000/api/packages/cerc-io/npm/ 1.0.0-beta.1'"]
+ if not dry_run:
+ if verbose:
+ print(f"Executing: {build_command}")
+ build_result = docker.run("cerc/builder-js",
+ remove=True,
+ interactive=True,
+ tty=True,
+ envs={"NPM_AUTH_TOKEN": "6613572a28ebebaee20ccd90064251fa8c2b94f6"},
+ add_hosts=[("host.docker.internal", "host-gateway")],
+ volumes=[(repo_full_path, "/workspace")])
+ # TODO: check result in build_result.returncode
+ print(f"Result is: {build_result}")
+ else:
+ print("Skipped")
+
+ for package in packages:
+ if include_exclude_check(package, include, exclude):
+ build_package(package)
+ else:
+ if verbose:
+ print(f"Excluding: {package}")
diff --git a/app/data/npm-package-list.txt b/app/data/npm-package-list.txt
new file mode 100644
index 00000000..6e0ead2d
--- /dev/null
+++ b/app/data/npm-package-list.txt
@@ -0,0 +1 @@
+gem
diff --git a/cli.py b/cli.py
index 87de406d..b3890dd6 100644
--- a/cli.py
+++ b/cli.py
@@ -17,6 +17,7 @@ import click
from app import setup_repositories
from app import build_containers
+from app import build_npms
from app import deploy_system
CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help'])
@@ -44,4 +45,5 @@ def cli(ctx, quiet, verbose, dry_run, local_stack):
cli.add_command(setup_repositories.command, "setup-repositories")
cli.add_command(build_containers.command, "build-containers")
+cli.add_command(build_npms.command, "build-npms")
cli.add_command(deploy_system.command, "deploy-system")