From 7494cc7dbb251a7fe01d8b8aaa9d1e0da1240a55 Mon Sep 17 00:00:00 2001 From: Nguyen Nhu Viet Date: Mon, 24 Jul 2023 15:36:07 +0200 Subject: [PATCH] feat: make a txsim binary build from Makefile and dockerfile (#2052) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ReadMe for TL;DR](https://github.com/celestiaorg/celestia-app/blob/f1d9c1c52b7ccf16f999a9d87aacba9ff2fbbe06/docker/README.md) Closes https://github.com/celestiaorg/devops/issues/249 --------- Co-authored-by: Jose Ramon MaƱes <32740567+jrmanes@users.noreply.github.com> Co-authored-by: Rootul P --- .github/workflows/docker-build-publish.yml | 8 ++ Makefile | 20 ++++ docker/Dockerfile_txsim | 49 +++++++++ docker/README.md | 122 +++++++++++++++++++++ docker/txsim.sh | 98 +++++++++++++++++ 5 files changed, 297 insertions(+) create mode 100644 docker/Dockerfile_txsim create mode 100644 docker/README.md create mode 100644 docker/txsim.sh diff --git a/.github/workflows/docker-build-publish.yml b/.github/workflows/docker-build-publish.yml index 00565ffd0f..1c0abb9d18 100644 --- a/.github/workflows/docker-build-publish.yml +++ b/.github/workflows/docker-build-publish.yml @@ -20,3 +20,11 @@ jobs: uses: celestiaorg/.github/.github/workflows/reusable_dockerfile_pipeline.yml@v0.2.2 # yamllint disable-line rule:line-length with: dockerfile: Dockerfile + + docker-txsim-build: + permissions: + contents: write + packages: write + uses: celestiaorg/.github/.github/workflows/reusable_dockerfile_pipeline.yml@v0.2.2 + with: + dockerfile: docker/Dockerfile_txsim diff --git a/Makefile b/Makefile index 51cb798463..e2233bb280 100644 --- a/Makefile +++ b/Makefile @@ -171,6 +171,26 @@ test-coverage: @export VERSION=$(VERSION); bash -x scripts/test_cover.sh .PHONY: test-coverage +## txsim-install: Install the tx simulator. +txsim-install: + @echo "--> Installing tx simulator" + @go install -mod=readonly $(BUILD_FLAGS) ./test/cmd/txsim +.PHONY: txsim-install + +## txsim-build: Build the tx simulator binary into the ./build directory. +txsim-build: + @echo "--> Building tx simulator" + @cd ./test/cmd/txsim + @mkdir -p build/ + @go build $(BUILD_FLAGS) -o build/ ./test/cmd/txsim + @go mod tidy -compat=1.20 +.PHONY: txsim-build + +## docker-txsim-build: Build the Docker image tx simulator. +txsim-build-docker: + docker build -t ghcr.io/celestiaorg/txsim -f docker/Dockerfile_txsim . +.PHONY: txsim-build-docker + ## adr-gen: Download the ADR template from the celestiaorg/.github repo. Ex. `make adr-gen` adr-gen: @echo "--> Downloading ADR template" diff --git a/docker/Dockerfile_txsim b/docker/Dockerfile_txsim new file mode 100644 index 0000000000..e5c07ffcb2 --- /dev/null +++ b/docker/Dockerfile_txsim @@ -0,0 +1,49 @@ +# Stage 1: generate celestia-appd binary +FROM docker.io/golang:1.20.6-alpine3.17 as builder +# hadolint ignore=DL3018 +RUN apk update && apk add --no-cache \ + gcc \ + git \ + make \ + musl-dev +COPY . /celestia-app +WORKDIR /celestia-app +# we need the celestia-appd build as we might want to create an account +# internally for txsimulation +RUN make build && make txsim-build + +# Stage 2: create a minimal image with the binary +FROM docker.io/alpine:3.18.2 + +# Use UID 10,001 because UIDs below 10,000 are a security risk. +# Ref: https://github.com/hexops/dockerfile/blob/main/README.md#do-not-use-a-uid-below-10000 +ARG UID=10001 +ARG USER_NAME=celestia + +ENV CELESTIA_HOME=/home/${USER_NAME} + +# hadolint ignore=DL3018 +RUN apk update && apk add --no-cache \ + bash \ + curl \ + jq \ + # Creates a user with $UID and $GID=$UID + && adduser ${USER_NAME} \ + -D \ + -g ${USER_NAME} \ + -h ${CELESTIA_HOME} \ + -s /sbin/nologin \ + -u ${UID} + +# Copy in the celestia-appd binary +COPY --from=builder /celestia-app/build/celestia-appd /bin/celestia-appd +COPY --from=builder /celestia-app/build/txsim /bin/txsim + +COPY --chown=${USER_NAME}:${USER_NAME} docker/txsim.sh /opt/entrypoint.sh + +USER ${USER_NAME} + +# grpc, rpc, api ports +EXPOSE 26657 1317 9090 + +ENTRYPOINT [ "/bin/bash", "/opt/entrypoint.sh" ] diff --git a/docker/README.md b/docker/README.md new file mode 100644 index 0000000000..29b81db775 --- /dev/null +++ b/docker/README.md @@ -0,0 +1,122 @@ +# Celestia `txsim` Docker Image Usage Guide + +The `txsim` binary is a tool that can be used to simulate transactions on the Celestia network. It can be used to test the performance of the Celestia network. +This guide provides instructions on how to use the Celestia `txsim` Docker image. The `txsim` Docker image is designed to run the `txsim` binary with a variety of configurable options. + +## Table of Contents + +1. [Prerequisites](#prerequisites) +2. [Running the Docker Image](#running-the-docker-image) + - [Docker Run](#docker-run) + - [Docker Compose](#docker-compose) + - [Kubernetes Deployment](#kubernetes-deployment) +3. [Flag Breakdown](#flag-breakdown) + +## Prerequisites + +Before you can use the `txsim` Docker image, you must have a prefunded account set up. The `txsim` binary requires a prefunded account to function correctly. The keyring for this account should be stored in a file that can be accessed by the Docker container. + +## Running the Docker Image + +### Docker Run + +You can run the `txsim` Docker image using the `docker run` command. Here's an example: + +```bash +docker run -it -v ${HOME}/.celestia-app:/home/celestia ghcr.io/celestiaorg/txsim -k 0 -r http://consensus-validator-robusta-rc6.celestia-robusta.com:26657,http://consensus-full-robusta-rc6.celestia-robusta.com:26657 -g consensus-validator-robusta-rc6.celestia-robusta.com:9090 -t 10s -b 10 -d 100 -e 10 +``` + +In this command, the `-v` option is used to mount the `${HOME}/.celestia-app` directory from the host to the `/home/celestia` directory in the Docker container. This allows the `txsim` binary to access the keyring for the prefunded account. + +### Docker Compose + +You can also run the `txsim` Docker image using Docker Compose. Here's an example `docker-compose.yml` file: + +```yaml +version: '3' +services: + txsim: + image: ghcr.io/celestiaorg/txsim + command: > + -k 0 + -r http://consensus-validator-robusta-rc6.celestia-robusta.com:26657,http://consensus-full-robusta-rc6.celestia-robusta.com:26657 + -g consensus-validator-robusta-rc6.celestia-robusta.com:9090 + -t 10s + -b 10 + -d 100 + -e 10 + volumes: + - /Users/txsimp/.celestia-app:/home/celestia +``` + +In this file, the `volumes` key is used to mount the `/Users/txsimp/.celestia-app` directory from the host to the `/home/celestia` directory in the Docker container. + +### Kubernetes Deployment + +Finally, you can run the `txsim` Docker image in a Kubernetes cluster. Here's an example `deployment.yaml` file: + +```yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: txsim-deployment +spec: + replicas: 1 + selector: + matchLabels: + app: txsim + template: + metadata: + labels: + app: txsim + spec: + containers: + - name: txsim + image: ghcr.io/celestiaorg/txsim + args: + - "-k" + - "0" + - "-r" + - "http://consensus-validator-robusta-rc6.celestia-robusta.com:26657,http://consensus-full-robusta-rc6.celestia-robusta.com:26657" + - "-g" + - "consensus-validator-robusta-rc6.celestia-robusta.com:9090" + - "-t" + - "10s" + - "-b" + - "10" + - "-d" + - "100" + - "-e" + - "10" + volumeMounts: + - name: keyring-volume + mountPath: /home/celestia + volumes: + - name: keyring-volume + hostPath: + path: /Users/txsimp/.celestia-app +``` + +In this file, the `volumeMounts` and `volumes` keys are used to mount the `/Users/txsimp/.celestia-app` directory from the host to the `/home/celestia` directory in the Docker container. + +## Flag Breakdown + +Here's a breakdown of what each flag means: + +- `-k`: Whether a new key should be created (1 for yes, 0 for no) +- `-p`: The path to the keyring for the prefunded account +- `-r`: The RPC endpoints for the `txsim` binary +- `-g`: The gRPC endpoints for the `txsim` binary +- `-t`: The poll time for the `txsim` binary +- `-b`: The number of blob sequences to run +- `-a`: The range of blobs to send per PFB in a sequence +- `-s`: The range of blob sizes to send +- `-m`: The mnemonic for the keyring +- `-d`: The seed for the random number generator +- `-e`: The number of send sequences to run +- `-i`: The amount to send from one account to another +- `-v`: The number of send iterations to run per sequence +- `-u`: The number of stake sequences to run +- `-w`: The amount of initial stake per sequence + +Please replace the placeholders in the examples with the actual values you want to use. diff --git a/docker/txsim.sh b/docker/txsim.sh new file mode 100644 index 0000000000..37b681a7af --- /dev/null +++ b/docker/txsim.sh @@ -0,0 +1,98 @@ +#!/bin/bash + +CREATE_KEY=0 +KEY_PATH="/home/celestia" +RPC_ENDPOINTS="" +GRPC_ENDPOINTS="" +POLL_TIME="" +BLOB=0 +BLOB_AMOUNTS="1" +BLOB_SIZES="100-1000" +KEY_MNEMONIC="" +SEED=0 +SEND=0 +SEND_AMOUNT=1000 +SEND_ITERATIONS=1000 +STAKE=0 +STAKE_VALUE=1000 + +while getopts "k:p:r:g:t:b:a:s:m:d:e:i:v:u:w:" opt; do + case ${opt} in + k ) + CREATE_KEY=$OPTARG + ;; + p ) + KEY_PATH=$OPTARG + ;; + r ) + RPC_ENDPOINTS=$OPTARG + ;; + g ) + GRPC_ENDPOINTS=$OPTARG + ;; + t ) + POLL_TIME=$OPTARG + ;; + b ) + BLOB=$OPTARG + ;; + a ) + BLOB_AMOUNTS=$OPTARG + ;; + s ) + BLOB_SIZES=$OPTARG + ;; + m ) + KEY_MNEMONIC=$OPTARG + ;; + d ) + SEED=$OPTARG + ;; + e ) + SEND=$OPTARG + ;; + i ) + SEND_AMOUNT=$OPTARG + ;; + v ) + SEND_ITERATIONS=$OPTARG + ;; + u ) + STAKE=$OPTARG + ;; + w ) + STAKE_VALUE=$OPTARG + ;; + \? ) + echo "Invalid option: $OPTARG" 1>&2 + exit 1 + ;; + : ) + echo "Invalid option: $OPTARG requires an argument" 1>&2 + exit 1 + ;; + esac +done +shift $((OPTIND -1)) + +if [ "$CREATE_KEY" -eq 1 ]; then + echo "Creating a new keyring-test for the txsim" + /bin/celestia-appd keys add sim --keyring-backend test --home $KEY_PATH + sleep 5 +fi + +# Running a tx simulator +txsim --key-path $KEY_PATH \ + --rpc-endpoints $RPC_ENDPOINTS \ + --grpc-endpoints $GRPC_ENDPOINTS \ + --poll-time $POLL_TIME \ + --blob $BLOB \ + --blob-amounts $BLOB_AMOUNTS \ + --blob-sizes $BLOB_SIZES \ + --key-mnemonic "$KEY_MNEMONIC" \ + --seed $SEED \ + --send $SEND \ + --send-amount $SEND_AMOUNT \ + --send-iterations $SEND_ITERATIONS \ + --stake $STAKE \ + --stake-value $STAKE_VALUE