Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
e52add2
add Docker support with multi-stage build
Oct 3, 2025
608f5cc
Merge remote-tracking branch 'origin/master' into ci/docker
Oct 26, 2025
eeb4e96
Add multi-stage Docker build support
Oct 26, 2025
d6e1d45
Update Docker build process and documentation
Oct 26, 2025
e2b6b6e
Enhance Docker build process and documentation
Oct 26, 2025
9a270c6
Enhance Docker build documentation and Makefile configurations
Oct 26, 2025
c8eda9b
build multi-arch support
Nov 3, 2025
c2ad255
add ci support - first iteration
Nov 3, 2025
e31cc4d
Update CI documentation and configurations for multi-arch Docker builds
Nov 3, 2025
6c14937
ci yaml fix
Nov 3, 2025
0a48ce1
Refactor config and validator handling
kamilsa Nov 18, 2025
736eeb7
Replace vote jargon with attestation leanSpec#91
kamilsa Nov 18, 2025
3ed1ef5
Enhance attestation processing and comments leanSpec#108
kamilsa Nov 19, 2025
af8d532
Rename advanceTime to onTick leanSpec#134
kamilsa Nov 19, 2025
76ad04b
Introduce JUSTIFICATION_LOOKBACK_SLOTS leanSpec#131
kamilsa Nov 19, 2025
c769b19
Add early return for empty justifications in getJustifications function
kamilsa Nov 19, 2025
e3ee432
Rename latest_new_votes to latest_new_attestations in fork_choice.cpp
kamilsa Nov 20, 2025
6e916b2
Add qdrvm-crates dependency and update CMake configuration
kamilsa Nov 17, 2025
f7d15e7
Implement XMSS provider with key generation, signing, and verification
kamilsa Nov 18, 2025
218a8a5
Update to poseidon2
kamilsa Nov 18, 2025
a680716
Add KeyStore implementation for XMSS key management
kamilsa Nov 18, 2025
60bbaf3
Implement XMSS keypair loading and configuration management
kamilsa Nov 18, 2025
ece13c5
Update max secret key size buffer to 200 MB in XMSS provider implemen…
kamilsa Nov 18, 2025
b19c3dc
Add ValidatorKeysManifest implementation for managing validator keys
kamilsa Nov 20, 2025
5b9f0bf
52 bytes XMSS public key
kamilsa Nov 20, 2025
d354350
Add mock implementations for ValidatorKeysManifest and XmssProvider
kamilsa Nov 20, 2025
1dc7aff
Rename vote-related methods to attestation for clarity and update moc…
kamilsa Nov 20, 2025
fd96f9e
Refactor XMSS signature: remove epoch, 3116 bytes
kamilsa Nov 24, 2025
9f9acca
Integrate hash-sig into fork-choice
kamilsa Nov 25, 2025
dce2b29
Cleanup and more doc leanSpec#146
kamilsa Nov 25, 2025
999d8cc
Refactor processBlockBodyAttestations leanSpec#153
kamilsa Nov 25, 2025
35d2987
Refactor block header processing leanSpec#154
kamilsa Nov 25, 2025
0776305
Remove processProposerAttestation leanSpec#155
kamilsa Nov 25, 2025
1290df7
remove processSlot leanSpec#163
kamilsa Nov 25, 2025
0230596
Remove getLatestJustified leanSpec#162
kamilsa Nov 25, 2025
8d8796e
More docs and small refactoring leanSpec#177
kamilsa Nov 25, 2025
e3881d2
Align process attestations with intended specs leanSpec#160
kamilsa Nov 25, 2025
8cb10a9
Refactor leanSpec#178
kamilsa Nov 25, 2025
7b53484
rm useless getJustifications leanSpec#179
kamilsa Nov 25, 2025
c1f519b
Enhance documentation and comments leanSpec#183
kamilsa Nov 25, 2025
164c095
Fix tests
kamilsa Nov 25, 2025
8b1f5d0
refactor xmss
turuslan Nov 26, 2025
005ec27
Make jsons with keys single line
kamilsa Nov 26, 2025
e8d2d16
fix test
turuslan Nov 26, 2025
edac019
Merge remote-tracking branch 'origin/ci/docker' into feature/c-hash-s…
kamilsa Nov 26, 2025
ddd65ba
optimize dependency img size
Nov 26, 2025
3575a3f
update github action ui
Nov 26, 2025
e816b03
update dependency image tag logic
Nov 26, 2025
96b9dc8
Dependency image optimization
Nov 26, 2025
6944fe8
Dependency image optimization, additional cleanup
Nov 26, 2025
a3c292b
Add helper function to create state with a single validator
kamilsa Nov 27, 2025
867dcee
Add produceAttestationData helper leanSpec#188
kamilsa Nov 27, 2025
4199689
Add break leanSpec#188
kamilsa Nov 27, 2025
e70ecda
Implement LMD GHOST algorithm leanSpec#190
kamilsa Nov 27, 2025
df2b524
validator index
turuslan Nov 27, 2025
dc7cc1b
remove unused vote
turuslan Nov 27, 2025
7bc61e8
println fix
Nov 27, 2025
ae7ef62
lmd ghost documentation and simplify leanSpec#192
kamilsa Nov 28, 2025
f5da763
Refactor updateHead leanSpec#194
kamilsa Nov 28, 2025
3fb5723
Merge branch 'feature/c-hash-sig-rebased' into feature/c-hash-sig-reb…
kamilsa Nov 28, 2025
a4d4b9a
ci build - manifest fix
Nov 28, 2025
8a3b730
Debug for manifest
Nov 28, 2025
fae4523
fix grep in manifest
Nov 28, 2025
18063ff
Merge branch 'master' into feature/c-hash-sig-rebased-docker
Dec 2, 2025
ad4e357
docker tag push fix
Dec 2, 2025
584b431
master - add auto build of docker image
Dec 2, 2025
7bd142d
Merge branch 'master' into ci/tag-fix
Dec 2, 2025
9c5304f
remove testing branch from github action
Dec 2, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
119 changes: 96 additions & 23 deletions .github/workflows/docker-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,30 @@
# ☐ Also push 'latest' tag
#
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# Usage Examples:
# Automatic Triggers:
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
#
# 1. Push to master (regular commit):
# → Auto-build + push
# → Tags: commit_sha only (e.g., qdrvm/qlean-mini:59b2c37)
# → Latest: NOT pushed
#
# 2. Git tag push (release, e.g., v1.0.0):
# → Auto-build + push
# → Tags: commit_sha + tag_name + latest
# → Example: 59b2c37, v1.0.0, latest
#
# 3. Pull request:
# → Build only, no push
#
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# Manual Trigger Examples (workflow_dispatch):
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
#
# Scenario 1: Daily development (test build only)
# ☑ amd64 ☑ arm64 ☐ push ☐ build_deps → Uses deps:latest from registry
#
# Scenario 2: Production release (with new deps)
# Scenario 2: Production release (manual)
# ☑ build_deps deps_tag: v2 ☑ push custom_tag: v1.0.0 ☑ push_latest
#
# Scenario 3: Hotfix (ARM64 only, no deps rebuild)
Expand All @@ -45,12 +62,12 @@ name: "Docker Build"
on:
push:
branches:
- ci/docker # TODO: Add master after testing
- master # Auto-build on master push
tags:
- '*'
- '*' # Auto-build on any git tag (release)
pull_request:
branches:
- ci/docker # TODO: Add master after testing
- master

workflow_dispatch:
inputs:
Expand Down Expand Up @@ -105,13 +122,37 @@ env:
DOCKER_REGISTRY: qdrvm
DOCKER_IMAGE_NAME: qlean-mini
DOCKER_DEPS_TAG: ${{ inputs.deps_tag || 'latest' }}
DOCKER_PUSH_TAG: ${{ inputs.custom_tag != '' && 'true' || 'false' }}
DOCKER_IMAGE_TAG: ${{ inputs.custom_tag || 'localBuild' }}
DOCKER_PUSH_LATEST: ${{ inputs.push_to_registry && inputs.push_latest && 'true' || 'false' }}
GIT_COMMIT: ${{ github.sha }}

# Auto-push configuration based on event type
AUTO_PUSH: ${{ github.event_name == 'push' && (github.ref == 'refs/heads/ci/docker' || startsWith(github.ref, 'refs/tags/')) }}
# Tagging logic:
# - Manual trigger: use inputs.custom_tag
# - Git tag (release): use tag name (e.g., v1.0.0)
# - Master/other: no custom tag
DOCKER_PUSH_TAG: ${{
github.event_name == 'workflow_dispatch' && inputs.custom_tag != '' && 'true' ||
startsWith(github.ref, 'refs/tags/') && 'true' ||
'false' }}
DOCKER_IMAGE_TAG: ${{
github.event_name == 'workflow_dispatch' && inputs.custom_tag ||
startsWith(github.ref, 'refs/tags/') && github.ref_name ||
'localBuild' }}

# Latest tag: only for git releases OR manual with push_latest enabled
DOCKER_PUSH_LATEST: ${{
startsWith(github.ref, 'refs/tags/') && 'true' ||
github.event_name == 'workflow_dispatch' && inputs.push_to_registry && inputs.push_latest && 'true' ||
'false' }}

# Auto-push configuration:
# - master branch: push (no latest)
# - git tags: push (with latest)
# - ci/docker: push (testing)
# - pull requests: no push
AUTO_PUSH: ${{
github.event_name == 'push' &&
(github.ref == 'refs/heads/master' ||
github.ref == 'refs/heads/ci/docker' ||
startsWith(github.ref, 'refs/tags/')) }}
IS_TAG: ${{ startsWith(github.ref, 'refs/tags/') }}

jobs:
Expand Down Expand Up @@ -174,7 +215,25 @@ jobs:

- name: "Debug outputs"
run: |
echo "=== Setup Matrix Outputs ==="
echo "=== Build Configuration ==="
echo "Event: ${{ github.event_name }}"
echo "Ref: ${{ github.ref }}"
echo "Ref name: ${{ github.ref_name }}"
echo ""
echo "=== Docker Tags ==="
echo "Commit tag: ${GIT_COMMIT:0:7} (always pushed)"
if [[ "${DOCKER_PUSH_TAG}" == "true" ]]; then
echo "Custom tag: ${DOCKER_IMAGE_TAG} ✅"
else
echo "Custom tag: (none)"
fi
if [[ "${DOCKER_PUSH_LATEST}" == "true" ]]; then
echo "Latest tag: ✅ (will be pushed)"
else
echo "Latest tag: ❌ (not pushed)"
fi
echo ""
echo "=== Matrix Outputs ==="
echo "is_multi_arch: ${{ steps.matrix.outputs.is_multi_arch }}"
echo "should_push: ${{ steps.config.outputs.should_push }}"
echo "should_build_deps: ${{ steps.config.outputs.should_build_deps }}"
Expand Down Expand Up @@ -353,43 +412,57 @@ jobs:
SHORT_COMMIT=$(git rev-parse --short HEAD)

echo ""
echo "Runtime manifest (${DOCKER_REGISTRY}/${DOCKER_IMAGE_NAME}:${SHORT_COMMIT}):"

# Get manifest and extract platforms
echo "[1/N] Commit tag manifest (${DOCKER_REGISTRY}/${DOCKER_IMAGE_NAME}:${SHORT_COMMIT}):"
MANIFEST=$(docker manifest inspect ${DOCKER_REGISTRY}/${DOCKER_IMAGE_NAME}:${SHORT_COMMIT})
echo "$MANIFEST" | jq -r '.manifests[] | " • \(.platform.os)/\(.platform.architecture)"' || echo "$MANIFEST"

if [[ "${DOCKER_PUSH_TAG}" == "true" ]]; then
echo ""
echo "[2/N] Custom tag manifest (${DOCKER_REGISTRY}/${DOCKER_IMAGE_NAME}:${DOCKER_IMAGE_TAG}):"
MANIFEST=$(docker manifest inspect ${DOCKER_REGISTRY}/${DOCKER_IMAGE_NAME}:${DOCKER_IMAGE_TAG})
echo "$MANIFEST" | jq -r '.manifests[] | " • \(.platform.os)/\(.platform.architecture)"' || echo "$MANIFEST"
fi

if [[ "${DOCKER_PUSH_LATEST}" == "true" ]]; then
echo ""
echo "[3/N] Latest tag manifest (${DOCKER_REGISTRY}/${DOCKER_IMAGE_NAME}:latest):"
MANIFEST=$(docker manifest inspect ${DOCKER_REGISTRY}/${DOCKER_IMAGE_NAME}:latest)
echo "$MANIFEST" | jq -r '.manifests[] | " • \(.platform.os)/\(.platform.architecture)"' || echo "$MANIFEST"
fi

echo ""
echo "NOTE: Builder image is NOT pushed to registry (intermediate build stage only)"
echo ""
echo "✅ Runtime multi-arch manifest created successfully!"
echo "✅ All multi-arch manifests created successfully!"

- name: "Display final image tags"
run: |
SHORT_COMMIT=$(git rev-parse --short HEAD)

echo "=== Successfully pushed Docker images ==="
echo ""
echo "🐳 Runtime image:"
echo " ${DOCKER_REGISTRY}/${DOCKER_IMAGE_NAME}:${SHORT_COMMIT}"
echo "🐳 Runtime multi-arch images:"
echo " ${DOCKER_REGISTRY}/${DOCKER_IMAGE_NAME}:${SHORT_COMMIT} (commit)"

if [[ "${DOCKER_PUSH_TAG}" == "true" ]]; then
echo " ${DOCKER_REGISTRY}/${DOCKER_IMAGE_NAME}:${DOCKER_IMAGE_TAG}"
echo " ${DOCKER_REGISTRY}/${DOCKER_IMAGE_NAME}:${DOCKER_IMAGE_TAG} (custom tag)"
fi

if [[ "${DOCKER_PUSH_LATEST}" == "true" ]]; then
echo " ${DOCKER_REGISTRY}/${DOCKER_IMAGE_NAME}:latest"
echo " ${DOCKER_REGISTRY}/${DOCKER_IMAGE_NAME}:latest"
fi

if [[ "${{ needs.setup_matrix.outputs.should_build_deps }}" == "true" ]]; then
echo ""
echo "📦 Dependencies images (platform-specific):"
echo " ${DOCKER_REGISTRY}/${DOCKER_IMAGE_NAME}-dependencies:${DOCKER_DEPS_TAG}-arm64"
echo " ${DOCKER_REGISTRY}/${DOCKER_IMAGE_NAME}-dependencies:${DOCKER_DEPS_TAG}-amd64"
echo " ${DOCKER_REGISTRY}/${DOCKER_IMAGE_NAME}-dependencies:${DOCKER_DEPS_TAG}-arm64"
echo " ${DOCKER_REGISTRY}/${DOCKER_IMAGE_NAME}-dependencies:${DOCKER_DEPS_TAG}-amd64"
echo " (Note: dependencies are NOT multi-arch, each platform uses its own)"
fi

echo ""
echo "Pull with: docker pull ${DOCKER_REGISTRY}/${DOCKER_IMAGE_NAME}:${SHORT_COMMIT}"
echo "Run with: docker run --rm ${DOCKER_REGISTRY}/${DOCKER_IMAGE_NAME}:${SHORT_COMMIT} --help"
echo "📋 Quick commands:"
echo " Pull: docker pull ${DOCKER_REGISTRY}/${DOCKER_IMAGE_NAME}:${SHORT_COMMIT}"
echo " Run: docker run --rm ${DOCKER_REGISTRY}/${DOCKER_IMAGE_NAME}:${SHORT_COMMIT} --help"


55 changes: 48 additions & 7 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -433,36 +433,77 @@ docker_push_platform:
echo "ERROR: Unknown platform $(DOCKER_PLATFORM)"; \
exit 1; \
fi; \
echo "Pushing runtime..."; \
echo "[1/N] Pushing commit tag ($(GIT_COMMIT)$$ARCH_SUFFIX)..."; \
docker tag $(DOCKER_IMAGE_RUNTIME) $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_RUNTIME)$$ARCH_SUFFIX; \
docker push $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_RUNTIME)$$ARCH_SUFFIX; \
echo "✓ Pushed: $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_RUNTIME)$$ARCH_SUFFIX"; \
echo ""; \
if [ "$(DOCKER_PUSH_TAG)" = "true" ]; then \
echo "[2/N] Pushing custom tag ($(DOCKER_IMAGE_TAG)$$ARCH_SUFFIX)..."; \
docker tag $(DOCKER_IMAGE_RUNTIME) $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG)$$ARCH_SUFFIX; \
docker push $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG)$$ARCH_SUFFIX; \
echo "✓ Pushed: $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG)$$ARCH_SUFFIX"; \
echo ""; \
fi; \
if [ "$(DOCKER_PUSH_LATEST)" = "true" ]; then \
echo "[3/N] Pushing latest tag (latest$$ARCH_SUFFIX)..."; \
docker tag $(DOCKER_IMAGE_RUNTIME) $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_NAME):latest$$ARCH_SUFFIX; \
docker push $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_NAME):latest$$ARCH_SUFFIX; \
echo "✓ Pushed: $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_NAME):latest$$ARCH_SUFFIX"; \
echo ""; \
fi; \
echo "✓ Platform images pushed to $(DOCKER_REGISTRY)!"

# NOTE: Dependencies are platform-specific and do NOT have a multi-arch manifest.
# Each platform pulls its own image: deps:latest-arm64 or deps:latest-amd64
# This is intentional to simplify CI/CD and avoid unnecessary manifest overhead.

docker_manifest_create:
@echo "=== Creating multi-arch manifest for runtime image ==="
@echo "=== Creating multi-arch manifests for runtime image ==="
@echo "Registry: $(DOCKER_REGISTRY)"
@echo ""
@echo "NOTE: Builder image is NOT pushed to registry (intermediate build stage only)"
@echo "NOTE: Dependencies are platform-specific (deps:latest-arm64, deps:latest-amd64)"
@echo ""
@echo "[1/2] Creating runtime manifest..."
@echo "[1/N] Creating commit tag manifest ($(GIT_COMMIT))..."
@docker manifest rm $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_RUNTIME) 2>/dev/null || true
@docker manifest create $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_RUNTIME) \
--amend $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_RUNTIME)-arm64 \
--amend $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_RUNTIME)-amd64
@echo ""
@echo "[2/2] Pushing runtime manifest..."
@docker manifest push $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_RUNTIME)
@echo "✓ Pushed manifest: $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_RUNTIME)"
@echo ""
@if [ "$(DOCKER_PUSH_TAG)" = "true" ]; then \
echo "[2/N] Creating custom tag manifest ($(DOCKER_IMAGE_TAG))..."; \
docker manifest rm $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG) 2>/dev/null || true; \
docker manifest create $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG) \
--amend $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG)-arm64 \
--amend $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG)-amd64; \
docker manifest push $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG); \
echo "✓ Pushed manifest: $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG)"; \
echo ""; \
fi
@if [ "$(DOCKER_PUSH_LATEST)" = "true" ]; then \
echo "[3/N] Creating latest tag manifest..."; \
docker manifest rm $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_NAME):latest 2>/dev/null || true; \
docker manifest create $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_NAME):latest \
--amend $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_NAME):latest-arm64 \
--amend $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_NAME):latest-amd64; \
docker manifest push $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_NAME):latest; \
echo "✓ Pushed manifest: $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_NAME):latest"; \
echo ""; \
fi
@echo "✓ Multi-arch runtime manifests created successfully!"
@echo ""
@echo "✓ Multi-arch runtime manifest created successfully!"
@echo "Images pushed:"
@echo " • $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_RUNTIME)"
@if [ "$(DOCKER_PUSH_TAG)" = "true" ]; then \
echo " • $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG)"; \
fi
@if [ "$(DOCKER_PUSH_LATEST)" = "true" ]; then \
echo " • $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_NAME):latest"; \
fi
@echo ""
@echo "Image: $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_RUNTIME)"
@echo "Platforms: linux/amd64, linux/arm64"
@echo ""
@echo "Verify with:"
Expand Down
Loading