|
1 | | -CHAIN_SIMULATOR_IMAGE_NAME=chainsimulator |
2 | | -CHAIN_SIMULATOR_IMAGE_TAG=latest |
3 | | -DOCKER_FILE=Dockerfile |
4 | | -IMAGE_NAME=simulator_image |
| 1 | +IMAGE_NAME ?= chainsimulator |
| 2 | +IMAGE_TAG ?= latest |
| 3 | +REGISTRY ?= multiversx |
| 4 | +DOCKER_FILE ?= Dockerfile |
| 5 | +PLATFORMS ?= linux/amd64,linux/arm64 |
| 6 | +CONTAINER_NAME ?= simulator_instance |
| 7 | +FULL_IMAGE = $(REGISTRY)/$(IMAGE_NAME):$(IMAGE_TAG) |
5 | 8 |
|
| 9 | +## Build the Go binary locally |
| 10 | +.PHONY: build |
| 11 | +build: |
| 12 | + cd cmd/chainsimulator && go build -ldflags="-s -w" -trimpath -o chainsimulator |
| 13 | + |
| 14 | +## Fetch configs locally |
| 15 | +.PHONY: fetch-configs |
| 16 | +fetch-configs: build |
| 17 | + cd cmd/chainsimulator && ./chainsimulator --fetch-configs-and-close |
| 18 | + |
| 19 | +## Build Docker image (single arch, current platform) |
| 20 | +.PHONY: docker-build |
6 | 21 | docker-build: |
7 | | - docker build \ |
8 | | - -t ${CHAIN_SIMULATOR_IMAGE_NAME}:${CHAIN_SIMULATOR_IMAGE_TAG} \ |
9 | | - -f ${DOCKER_FILE} \ |
10 | | - . |
| 22 | + DOCKER_BUILDKIT=1 docker build \ |
| 23 | + -t $(FULL_IMAGE) \ |
| 24 | + -f $(DOCKER_FILE) \ |
| 25 | + . |
11 | 26 |
|
12 | | -run-faucet-test: |
13 | | - $(MAKE) docker-build |
14 | | - docker run -d --name "${IMAGE_NAME}" -p 8085:8085 ${CHAIN_SIMULATOR_IMAGE_NAME}:${CHAIN_SIMULATOR_IMAGE_TAG} |
| 27 | +## Build multi-arch image and push to registry (requires login) |
| 28 | +## This is the correct way to produce a multi-platform manifest. |
| 29 | +.PHONY: docker-build-push |
| 30 | +docker-build-push: |
| 31 | + docker buildx build \ |
| 32 | + --platform $(PLATFORMS) \ |
| 33 | + -t $(FULL_IMAGE) \ |
| 34 | + -f $(DOCKER_FILE) \ |
| 35 | + --push \ |
| 36 | + . |
| 37 | + |
| 38 | +## Register QEMU for cross-platform builds (run once per boot) |
| 39 | +.PHONY: qemu-setup |
| 40 | +qemu-setup: |
| 41 | + docker run --rm --privileged multiarch/qemu-user-static --reset -p yes |
| 42 | + |
| 43 | +## Run the simulator container |
| 44 | +.PHONY: docker-run |
| 45 | +docker-run: |
| 46 | + docker run -d \ |
| 47 | + --name "$(CONTAINER_NAME)" \ |
| 48 | + --read-only \ |
| 49 | + --tmpfs /tmp \ |
| 50 | + -p 8085:8085 \ |
| 51 | + $(FULL_IMAGE) |
| 52 | + |
| 53 | +## Stop and remove the simulator container |
| 54 | +.PHONY: docker-stop |
| 55 | +docker-stop: |
| 56 | + docker stop "$(CONTAINER_NAME)" 2>/dev/null || true |
| 57 | + docker rm "$(CONTAINER_NAME)" 2>/dev/null || true |
| 58 | + |
| 59 | +## Run faucet example test |
| 60 | +.PHONY: run-faucet-test |
| 61 | +run-faucet-test: docker-build |
| 62 | + docker run -d --name "$(CONTAINER_NAME)" -p 8085:8085 $(FULL_IMAGE) |
15 | 63 | sleep 2s |
16 | 64 | cd examples/faucet && /bin/bash faucet.sh |
17 | | - docker stop "${IMAGE_NAME}" |
18 | | - docker rm ${IMAGE_NAME} 2> /dev/null |
| 65 | + $(MAKE) docker-stop |
19 | 66 |
|
| 67 | +## Run all examples |
| 68 | +.PHONY: run-examples |
20 | 69 | run-examples: |
21 | 70 | printf '%s\n' '{ File = "enableEpochs.toml", Path = "EnableEpochs.StakeLimitsEnableEpoch", Value = 1000000 },' > temp.txt |
22 | 71 | sed -i '4r temp.txt' cmd/chainsimulator/config/nodeOverrideDefault.toml |
23 | 72 | rm temp.txt |
24 | | - |
25 | 73 | $(MAKE) docker-build |
26 | | - docker run -d --name "${IMAGE_NAME}" -p 8085:8085 ${CHAIN_SIMULATOR_IMAGE_NAME}:${CHAIN_SIMULATOR_IMAGE_TAG} |
| 74 | + docker run -d --name "$(CONTAINER_NAME)" -p 8085:8085 $(FULL_IMAGE) |
27 | 75 | cd scripts/run-examples && /bin/bash install-python-deps.sh && /bin/bash script.sh |
28 | | - docker stop "${IMAGE_NAME}" |
29 | | - docker rm ${IMAGE_NAME} |
| 76 | + $(MAKE) docker-stop |
30 | 77 |
|
| 78 | +## Install golint if not already present |
| 79 | +.PHONY: lint-install |
31 | 80 | lint-install: |
32 | 81 | ifeq (,$(wildcard test -f bin/golangci-lint)) |
33 | 82 | @echo "Installing golint" |
34 | 83 | curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s |
35 | 84 | endif |
36 | 85 |
|
| 86 | +## Run golint on the codebase |
| 87 | +.PHONY: run-lint |
37 | 88 | run-lint: |
38 | 89 | @echo "Running golint" |
39 | 90 | bin/golangci-lint run --max-issues-per-linter 0 --max-same-issues 0 --timeout=2m |
40 | 91 |
|
| 92 | +## Run lint installation and then the linter |
| 93 | +.PHONY: lint |
41 | 94 | lint: lint-install run-lint |
| 95 | + |
| 96 | +## Show image details |
| 97 | +.PHONY: docker-info |
| 98 | +docker-info: |
| 99 | + @echo "Image: $(FULL_IMAGE)" |
| 100 | + @echo "Dockerfile: $(DOCKER_FILE)" |
| 101 | + @echo "Platforms: $(PLATFORMS)" |
| 102 | + @docker images $(FULL_IMAGE) --format "Size: {{.Size}}" |
| 103 | + |
| 104 | +## Run security scan with trivy (if installed) |
| 105 | +.PHONY: docker-scan |
| 106 | +docker-scan: |
| 107 | + trivy image --severity HIGH,CRITICAL $(FULL_IMAGE) |
| 108 | + |
| 109 | +## Show available targets |
| 110 | +.PHONY: help |
| 111 | +help: |
| 112 | + @echo "Available targets:" |
| 113 | + @echo " build Build Go binary locally" |
| 114 | + @echo " fetch-configs Fetch configs from GitHub repos" |
| 115 | + @echo " docker-build Build Docker image (current platform, docker build)" |
| 116 | + @echo " docker-build-push Build & push multi-arch image to registry" |
| 117 | + @echo " qemu-setup Register QEMU for cross-arch builds" |
| 118 | + @echo " docker-run Run the simulator container (read-only)" |
| 119 | + @echo " docker-stop Stop and remove container" |
| 120 | + @echo " docker-info Show image details" |
| 121 | + @echo " docker-scan Trivy security scan" |
| 122 | + @echo " lint Run linter" |
| 123 | + @echo " help Show this help" |
0 commit comments