Compare commits

...
33 Commits
Author SHA1 Message Date
dboreham 2937a07cd8 Merge pull request #207 from cerc-io/dboreham/run-cli-in-cluster
Run laconic registry cli in cluster

Former-commit-id: d80fb5dd16
2023-03-07 10:10:26 -07:00
dboreham 6ae3c252ea Very basic key export/import implementation
Former-commit-id: 8a8fef6845
2023-03-07 10:08:04 -07:00
dboreham 178de8f496 Add simple export/import scheme
Former-commit-id: 277be07dcd
2023-03-07 09:07:15 -07:00
dboreham 05cdd2ed01 Merge pull request #205 from cerc-io/dboreham/eth-tooling
Add foundry cli to fixturenet-eth

Former-commit-id: 99fcdf9d40
2023-03-06 15:20:07 -07:00
dboreham e801c28f60 Add foundry cli to fixturenet-eth
Former-commit-id: b43886a1a9
2023-03-06 15:19:19 -07:00
dboreham eb70f2526e Initial commit
Former-commit-id: 49c524e8ed
2023-03-04 18:45:57 -07:00
dboreham 199a4036a8 Merge pull request #203 from cerc-io/dboreham/pass-uid-to-compose-up
Pass environment variables for both exec and up

Former-commit-id: f7285be425
2023-03-02 10:56:53 -07:00
dboreham f0b711912a Pass environment variables for both exec and up
Former-commit-id: be6a473772
2023-03-02 10:53:48 -07:00
dboreham d3d3f92953 Merge pull request #202 from cerc-io/dboreham/remove-debug-output
Remove debug output

Former-commit-id: c0b4cefdce
2023-03-02 10:35:26 -07:00
dboreham c3101bc25a Remove debug output
Former-commit-id: f99dbfbdf5
2023-03-02 10:32:18 -07:00
dboreham 6c49520e69 Merge pull request #197 from cerc-io/dboreham/uid-gid-to-deploy
Pass uid and gid to compose

Former-commit-id: 900917b548
2023-02-28 10:23:34 -07:00
dboreham 70d34e6751 Pass uid and gid to compose
Former-commit-id: cea4e5a51f
2023-02-28 10:22:27 -07:00
dboreham c6de6d6067 Merge pull request #196 from cerc-io/dboreham/fix-project-name
Make cluster/docker-compose project name unique

Former-commit-id: 4353418fa6
2023-02-28 08:47:52 -07:00
dboreham 69b6b9a873 Make cluster/docker-compose project name unique
Former-commit-id: a1fdeac3b7
2023-02-28 08:47:02 -07:00
dboreham 430b884d72 Update version
Former-commit-id: 2f29e283de
2023-02-28 08:01:36 -07:00
dboreham 5d456f5600 Merge pull request #193 from cerc-io/dboreham/disable-docker-buildkit
Revert move to BuildKit in new Docker releases

Former-commit-id: 4fdb442263
2023-02-24 23:34:48 -07:00
dboreham ca40ffb012 Revert move to BuildKit in new Docker releases
Former-commit-id: ced6925e02
2023-02-24 23:31:17 -07:00
dboreham 6a73d3adee Merge pull request #191 from cerc-io/dboreham/builder-js-uid
Support docker containers with non-root users and host user uid not equal to 1000

Former-commit-id: 10548beedf
2023-02-24 23:06:13 -07:00
dboreham 9480b4082e usermod does not change group ownership of home dir
Former-commit-id: 17355c9e42
2023-02-24 22:44:50 -07:00
dboreham 467ff235ba Propagate build env vars
Former-commit-id: 5022e355ed
2023-02-24 22:26:02 -07:00
dboreham 25a755982e Implement new approach: build a uid-specific container
Former-commit-id: 6704cd7527
2023-02-24 22:14:28 -07:00
dboreham e3e96fa75e Work around docker uid/gid insanity
Former-commit-id: b84a28592d
2023-02-23 20:50:20 -07:00
dboreham 42696f8165 Add build stack doc
Former-commit-id: 187c06ef5a
2023-02-23 07:22:46 -07:00
dboreham c26f8552e1 Merge pull request #187 from cerc-io/dboreham/document-build-stack
Add some doc for build stack

Former-commit-id: c52f9e655d
2023-02-21 11:26:43 -07:00
dboreham 8352893d92 Add some doc
Former-commit-id: 1f57ec5326
2023-02-21 11:25:49 -07:00
RickM a92cabcb39 Merge pull request #186 from cerc-io/erc721-stack-syntax
Stack syntax for ERC721.

Former-commit-id: 9ccf3ca1af
2023-02-21 09:38:09 -06:00
RickM f841f8a2de Stack syntax for ERC721.
Former-commit-id: 463b11bb23
2023-02-21 09:30:07 -06:00
dboreham 7f652708bb Merge pull request #185 from cerc-io/dboreham/immutable-js-build
Copy build tree

Former-commit-id: b1e618142d
2023-02-21 06:59:38 -07:00
dboreham c769fce491 Copy build tree
Former-commit-id: 3b55d012be
2023-02-21 06:56:33 -07:00
dboreham 02335795fb Merge pull request #184 from cerc-io/dboreham/kubo
Add a kubo pod

Former-commit-id: 25ae0cac7d
2023-02-21 06:17:41 -07:00
dboreham c717fd8a59 Add ipfs pod
Former-commit-id: 6dddceec27
2023-02-21 06:16:59 -07:00
dboreham 0de2db7e90 Add kubo pod
Former-commit-id: 9c00aba8f3
2023-02-21 05:59:28 -07:00
dboreham 92f325a09b Update version
Former-commit-id: c4fa7fee30
2023-02-21 05:40:57 -07:00
21 changed files with 181 additions and 41 deletions
-6
View File
@@ -69,9 +69,3 @@ class package_registry_stack(base_stack):
def get_url(self):
return self.url
# Temporary helper functions while we figure out a good interface to the stack deploy code
def _get_stack_mapped_port(stack, service, exposed_port):
return 3000
+5 -2
View File
@@ -83,7 +83,10 @@ def command(ctx, include, exclude):
container_build_env = {
"CERC_NPM_URL": "http://gitea.local:3000/api/packages/cerc-io/npm/",
"CERC_NPM_AUTH_TOKEN": config("CERC_NPM_AUTH_TOKEN", default="<token-not-supplied>"),
"CERC_REPO_BASE_DIR": dev_root_path
"CERC_REPO_BASE_DIR": dev_root_path,
"CERC_HOST_UID": f"{os.getuid()}",
"CERC_HOST_GID": f"{os.getgid()}",
"DOCKER_BUILDKIT": "0"
}
def process_container(container):
@@ -106,7 +109,7 @@ def command(ctx, include, exclude):
build_command = os.path.join(container_build_dir, "default-build.sh") + f" {container}:local {repo_dir_or_build_dir}"
if not dry_run:
if verbose:
print(f"Executing: {build_command}")
print(f"Executing: {build_command} with environment: {container_build_env}")
build_result = subprocess.run(build_command, shell=True, env=container_build_env)
if verbose:
print(f"Return code is: {build_result.returncode}")
+27 -4
View File
@@ -20,6 +20,7 @@
import os
import sys
from shutil import rmtree, copytree
from decouple import config
import click
import importlib.resources
@@ -65,11 +66,17 @@ def command(ctx, include, exclude):
else:
dev_root_path = os.path.expanduser(config("CERC_REPO_BASE_DIR", default="~/cerc"))
if not quiet:
build_root_path = os.path.join(dev_root_path, "build-trees")
if verbose:
print(f'Dev Root is: {dev_root_path}')
if not os.path.isdir(dev_root_path):
print('Dev root directory doesn\'t exist, creating')
os.makedirs(dev_root_path)
if not os.path.isdir(dev_root_path):
print('Build root directory doesn\'t exist, creating')
os.makedirs(build_root_path)
# See: https://stackoverflow.com/a/20885799/1701505
from . import data
@@ -92,12 +99,28 @@ def command(ctx, include, exclude):
print(f"Building npm package: {package}")
repo_dir = package
repo_full_path = os.path.join(dev_root_path, repo_dir)
# TODO: make the npm registry url configurable.
# Copy the repo and build that to avoid propagating JS tooling file changes back into the cloned repo
repo_copy_path = os.path.join(build_root_path, repo_dir)
# First delete any old build tree
if os.path.isdir(repo_copy_path):
if verbose:
print(f"Deleting old build tree: {repo_copy_path}")
if not dry_run:
rmtree(repo_copy_path)
# Now copy the repo into the build tree location
if verbose:
print(f"Copying build tree from: {repo_full_path} to: {repo_copy_path}")
if not dry_run:
copytree(repo_full_path, repo_copy_path)
build_command = ["sh", "-c", f"cd /workspace && build-npm-package-local-dependencies.sh {npm_registry_url}"]
if not dry_run:
if verbose:
print(f"Executing: {build_command}")
envs = {"CERC_NPM_AUTH_TOKEN": npm_registry_url_token} | ({"CERC_SCRIPT_DEBUG": "true"} if debug else {})
# Originally we used the PEP 584 merge operator:
# envs = {"CERC_NPM_AUTH_TOKEN": npm_registry_url_token} | ({"CERC_SCRIPT_DEBUG": "true"} if debug else {})
# but that isn't available in Python 3.8 (default in Ubuntu 20) so for now we use dict.update:
envs = {"CERC_NPM_AUTH_TOKEN": npm_registry_url_token}
envs.update({"CERC_SCRIPT_DEBUG": "true"} if debug else {})
try:
docker.run(builder_js_image_name,
remove=True,
@@ -107,7 +130,7 @@ def command(ctx, include, exclude):
envs=envs,
# TODO: detect this host name in npm_registry_url rather than hard-wiring it
add_hosts=[("gitea.local", "host-gateway")],
volumes=[(repo_full_path, "/workspace")],
volumes=[(repo_copy_path, "/workspace")],
command=build_command
)
# Note that although the docs say that build_result should contain
@@ -5,8 +5,9 @@ services:
image: cerc/laconicd:local
command: ["sh", "/docker-entrypoint-scripts.d/create-fixturenet.sh"]
volumes:
# TODO: look at folding this script into the container
# TODO: look at folding these scripts into the container
- ../config/fixturenet-laconicd/create-fixturenet.sh:/docker-entrypoint-scripts.d/create-fixturenet.sh
- ../config/fixturenet-laconicd/export-mykey.sh:/docker-entrypoint-scripts.d/export-mykey.sh
# TODO: determine which of the ports below is really needed
ports:
- "6060"
@@ -18,4 +19,7 @@ services:
- "9090"
- "9091"
- "1317"
cli:
image: cerc/laconic-registry-cli:local
volumes:
- ../config/fixturenet-laconicd/registry-cli-config-template.yml:/registry-cli-config-template.yml
@@ -0,0 +1,5 @@
# Add-on pod to include foundry tooling within a fixturenet
services:
foundry:
image: ghcr.io/foundry-rs/foundry:latest
command: ["while :; do sleep 600; done"]
+13
View File
@@ -0,0 +1,13 @@
version: "3.2"
# See: https://docs.ipfs.tech/install/run-ipfs-inside-docker/#set-up
services:
ipfs:
image: ipfs/kubo:master-2023-02-20-714a968
restart: always
volumes:
- ./ipfs/import:/import
- ./ipfs/data:/data/ipfs
ports:
- "8080"
- "4001"
- "5001"
@@ -0,0 +1,2 @@
#!/bin/sh
echo y | laconicd keys export mykey --unarmored-hex --unsafe
@@ -0,0 +1,7 @@
services:
cns:
restEndpoint: 'http://laconicd:1317'
gqlEndpoint: 'http://laconicd:9473/api'
userKey: REPLACE_WITH_MYKEY
bondId:
chainId: laconic_9000-1
@@ -1,14 +1,30 @@
# Originally from: https://github.com/devcontainers/images/blob/main/src/javascript-node/.devcontainer/Dockerfile
# Which depends on: https://github.com/nodejs/docker-node/blob/main/Dockerfile-debian.template
# [Choice] Node.js version (use -bullseye variants on local arm64/Apple Silicon): 18, 16, 14, 18-bullseye, 16-bullseye, 14-bullseye, 18-buster, 16-buster, 14-buster
ARG VARIANT=16-bullseye
FROM node:${VARIANT}
# Set these args to change the uid/gid for the base container's "node" user to match that of the host user (so bind mounts work as expected).
ARG CERC_HOST_UID=1000
ARG CERC_HOST_GID=1000
# Make these values available at runtime to allow a consistency check.
ENV HOST_UID=${CERC_HOST_UID}
ENV HOST_GID=${CERC_HOST_GID}
ARG USERNAME=node
ARG NPM_GLOBAL=/usr/local/share/npm-global
# Add NPM global to PATH.
ENV PATH=${NPM_GLOBAL}/bin:${PATH}
RUN \
if [ ${CERC_HOST_GID} -ne 1000 ] ; then \
groupmod -g ${CERC_HOST_GID} ${USERNAME} ; \
fi \
&& if [ ${CERC_HOST_UID} -ne 1000 ] ; then \
usermod -u ${CERC_HOST_UID} -g ${CERC_HOST_GID} ${USERNAME} && chown ${CERC_HOST_UID}:${CERC_HOST_GID} /home/${USERNAME} ; \
fi
RUN \
# Configure global npm install location, use group to adapt to UID/GID changes
if ! cat /etc/group | grep -e "^npm:" > /dev/null 2>&1; then groupadd -r npm; fi \
@@ -39,6 +55,7 @@ RUN mkdir /scripts
COPY build-npm-package.sh /scripts
COPY yarn-local-registry-fixup.sh /scripts
COPY build-npm-package-local-dependencies.sh /scripts
COPY check-uid.sh /scripts
ENV PATH="${PATH}:/scripts"
COPY entrypoint.sh .
+21
View File
@@ -0,0 +1,21 @@
#!/bin/bash
# Make the container usable for uid/gid != 1000
if [[ -n "$CERC_SCRIPT_DEBUG" ]]; then
set -x
fi
current_uid=$(id -u)
current_gid=$(id -g)
# Don't check if running as root
if [[ ${current_uid} == 0 ]]; then
exit 0
fi
# Check the current uid/gid vs the uid/gid used to build the container.
# We do this because both bind mounts and npm tooling require the uid/gid to match.
if [[ ${current_gid} != ${HOST_GID} ]]; then
echo "Warning: running with gid: ${current_gid} which is not the gid for which this container was built (${HOST_GID})"
exit 0
fi
if [[ ${current_uid} != ${HOST_UID} ]]; then
echo "Warning: running with gid: ${current_uid} which is not the uid for which this container was built (${HOST_UID})"
exit 0
fi
@@ -1,2 +1,3 @@
#!/bin/sh
/scripts/check-uid.sh
exec "$@"
@@ -48,10 +48,13 @@ RUN npm config set @lirewine:registry ${CERC_NPM_URL} \
# TODO: the image at this point could be made a base image for several different CLI images
# that install different Node-based CLI commands
# DEBUG, remove
RUN yarn info @cerc-io/laconic-registry-cli
# Globally install the cli package
RUN yarn global add @cerc-io/laconic-registry-cli
ENTRYPOINT ["laconic"]
# Add scripts
RUN mkdir /scripts
ENV PATH="${PATH}:/scripts"
COPY ./import-key.sh /scripts
# Default command sleeps forever so docker doesn't kill it
CMD ["sh", "-c", "while :; do sleep 600; done"]
@@ -0,0 +1,2 @@
#!/bin/sh
sed 's/REPLACE_WITH_MYKEY/'${1}'/' registry-cli-config-template.yml > config.yml
+1 -1
View File
@@ -11,4 +11,4 @@ fi
image_tag=$1
build_dir=$2
echo "Building ${image_tag} in ${build_dir}"
docker build -t ${image_tag} ${build_dir}
docker build -t ${image_tag} --build-arg CERC_HOST_UID=${CERC_HOST_UID} --build-arg CERC_HOST_GID=${CERC_HOST_GID} ${build_dir}
+2
View File
@@ -18,3 +18,5 @@ test
eth-probe
keycloak
tx-spammer
kubo
foundry
+30
View File
@@ -0,0 +1,30 @@
# Build Support Stack
## Instructions
JS/TS/NPM builds need an npm registry to store intermediate package artifacts.
This can be supplied by the user (e.g. using a hosted registry or even npmjs.com), or a local registry using gitea can be deployed by stack orchestrator.
To use a user-supplied registry set these environment variables:
`CERC_NPM_REGISTRY_URL` and
`CERC_NPM_AUTH_TOKEN`
Leave `CERC_NPM_REGISTRY_URL` un-set to use the local gitea registry.
### Build support containers
```
$ laconic-so --stack build-support build-containers
```
### Deploy Gitea Package Registry
```
$ laconic-so --stack package-registry setup-repositories
$ laconic-so --stack package-registry deploy-system up
This is your gitea access token: 84fe66a73698bf11edbdccd0a338236b7d1d5c45. Keep it safe and secure, it can not be fetched again from gitea.
$ export CERC_NPM_AUTH_TOKEN=84fe66a73698bf11edbdccd0a338236b7d1d5c45
```
Now npm packages can be built:
### Build npm Packages
```
$ laconic-so build-npms --include laconic-sdk
```
+12 -12
View File
@@ -6,23 +6,23 @@ Instructions to deploy a local ERC721 watcher stack (core + watcher) for demonst
* Clone / pull required repositories:
```bash
$ laconic-so setup-repositories --include cerc-io/go-ethereum,cerc-io/ipld-eth-db,cerc-io/ipld-eth-server,cerc-io/watcher-ts --pull
```
```bash
laconic-so --stack erc721 setup-repositories
```
* Build the core and watcher container images:
```bash
$ laconic-so build-containers --include cerc/go-ethereum,cerc/go-ethereum-foundry,cerc/ipld-eth-db,cerc/ipld-eth-server,cerc/watcher-erc721
```
```bash
laconic-so --stack erc721 build-containers
```
This should create the required docker images in the local image registry.
* Deploy the stack:
```bash
$ laconic-so deploy-system --include db,go-ethereum-foundry,ipld-eth-server,watcher-erc721 up
```
```bash
laconic-so --stack erc721 deploy-system up
```
## Demo
@@ -209,6 +209,6 @@ Instructions to deploy a local ERC721 watcher stack (core + watcher) for demonst
* To stop all the services running in background:
```bash
$ laconic-so deploy-system --include db,go-ethereum-foundry,ipld-eth-server,watcher-erc721 down
```
```bash
laconic-so --stack erc721 deploy-system down
```
+1
View File
@@ -11,3 +11,4 @@ containers:
- cerc/fixturenet-eth-lighthouse
pods:
- fixturenet-eth
- foundry
+1 -1
View File
@@ -1,2 +1,2 @@
# This file should be re-generated running: scripts/update-version-file.sh script
v1.0.19-10f2fba
v1.0.22-4fdb442
+20 -9
View File
@@ -56,10 +56,11 @@ def command(ctx, include, exclude, cluster, command, extra_args):
if not dry_run:
if command == "up":
if debug:
os.environ["CERC_SCRIPT_DEBUG"] = "true"
container_exec_env = _make_runtime_env(ctx.obj)
for attr, value in container_exec_env.items():
os.environ[attr] = value
if verbose:
print(f"Running compose up for extra_args: {extra_args_list}")
print(f"Running compose up with container_exec_env: {container_exec_env}, extra_args: {extra_args_list}")
for pre_start_command in cluster_context.pre_start_commands:
_run_command(ctx.obj, cluster_context.cluster, pre_start_command)
docker.compose.up(detach=True, services=extra_args_list)
@@ -74,10 +75,8 @@ def command(ctx, include, exclude, cluster, command, extra_args):
print("Usage: exec <service> <cmd>")
sys.exit(1)
service_name = extra_args_list[0]
command_to_exec = extra_args_list[1:]
container_exec_env = {
"CERC_SCRIPT_DEBUG": "true"
} if debug else {}
command_to_exec = ["sh", "-c"] + extra_args_list[1:]
container_exec_env = _make_runtime_env(ctx.obj)
if verbose:
print(f"Running compose exec {service_name} {command_to_exec}")
docker.compose.execute(service_name, command_to_exec, envs=container_exec_env)
@@ -139,6 +138,15 @@ def get_stack_status(ctx, stack):
False
def _make_runtime_env(ctx):
container_exec_env = {
"CERC_HOST_UID": f"{os.getuid()}",
"CERC_HOST_GID": f"{os.getgid()}"
}
container_exec_env.update({"CERC_SCRIPT_DEBUG": "true"} if ctx.debug else {})
return container_exec_env
def _make_cluster_context(ctx, include, exclude, cluster):
if ctx.local_stack:
@@ -151,10 +159,13 @@ def _make_cluster_context(ctx, include, exclude, cluster):
compose_dir = Path(__file__).absolute().parent.joinpath("data", "compose")
if cluster is None:
# Create default unique, stable cluster name from confile file path
# Create default unique, stable cluster name from confile file path and stack name if provided
# TODO: change this to the config file path
path = os.path.realpath(sys.argv[0])
hash = hashlib.md5(path.encode()).hexdigest()
unique_cluster_descriptor = f"{path},{ctx.stack},{include},{exclude}"
if ctx.debug:
print(f"pre-hash descriptor: {unique_cluster_descriptor}")
hash = hashlib.md5(unique_cluster_descriptor.encode()).hexdigest()
cluster = f"laconic-{hash}"
if ctx.verbose:
print(f"Using cluster name: {cluster}")
+1
View File
@@ -55,5 +55,6 @@ def cli(ctx, stack, quiet, verbose, dry_run, local_stack, debug, continue_on_err
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") # deploy is an alias for deploy-system
cli.add_command(deploy_system.command, "deploy-system")
cli.add_command(version.command, "version")