diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 0a88fab3..f4a49c27 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -1,6 +1,7 @@ name: Docker permissions: contents: read + packages: write on: workflow_call: secrets: @@ -19,6 +20,23 @@ jobs: build: name: "lthn/chain:${{ inputs.chain-network == 'testnet' && 'testnet' || 'latest' }}" runs-on: ubuntu-22.04 + strategy: + matrix: + platform: [ linux/amd64, linux/arm64, linux/arm/v7, linux/ppc64le, linux/riscv64, linux/s390x ] + include: + - platform: linux/amd64 + arch_tag: amd64 + - platform: linux/arm64 + arch_tag: arm64 + - platform: linux/arm/v7 + arch_tag: armv7 + - platform: linux/ppc64le + arch_tag: ppc64le + - platform: linux/riscv64 + arch_tag: riscv64 + - platform: linux/s390x + arch_tag: s390x + steps: - name: Checkout Project uses: actions/checkout@v4.2.2 @@ -35,18 +53,55 @@ jobs: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Build and push + - name: Build ${{ matrix.platform }} id: docker_build + continue-on-error: true uses: docker/build-push-action@v6 with: file: utils/docker/images/lthn-chain/Dockerfile context: ${{ github.workspace }} + platforms: ${{ matrix.platform }} push: true build-args: | BUILD_TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} THREADS=2 - BUILD_TARGET=gcc-linux-x86_64 BUILD_LOCAL=1 - tags: lthn/chain:${{ inputs.chain-network == 'testnet' && 'testnet' || 'latest' }} + USE_CUSTOM_PROFILE=0 + tags: lthn/chain:${{ inputs.chain-network == 'testnet' && 'testnet-' || '' }}${{ matrix.arch_tag }} + cache-from: type=gha + cache-to: type=gha,mode=max + finalize_manifest: + needs: build + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + submodules: recursive + + - name: Set up Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to DockerHub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Build + id: docker_final + uses: docker/build-push-action@v6 + with: + file: utils/docker/images/lthn-chain/Dockerfile + context: ${{ github.workspace }} + platforms: "linux/amd64, linux/arm64, linux/arm/v7, linux/ppc64le, linux/riscv64, linux/s390x" + push: true + build-args: | + BUILD_TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} + THREADS=2 + BUILD_LOCAL=1 + USE_CUSTOM_PROFILE=0 + tags: lthn/chain:${{ inputs.chain-network == 'testnet' && 'testnet' || 'latest' }} + cache-from: type=gha + cache-to: type=gha,mode=max diff --git a/Makefile b/Makefile index d6367a04..53b0f495 100644 --- a/Makefile +++ b/Makefile @@ -75,6 +75,7 @@ PROFILES := $(patsubst cmake/profiles/%,%,$(wildcard cmake/profiles/*)) SORTED_PROFILES := $(sort $(PROFILES)) CONAN_CACHE := $(CURDIR)/build/sdk DEFAULT_CONAN_PROFILE := $(CONAN_CACHE)/profiles/default +CC_DOCKER_FILE?=utils/docker/images/lthn-chain/Dockerfile all: help @@ -159,7 +160,27 @@ docs-dev: configure docker-chain-node: @echo "Building docker image: lthn/chain" - docker build utils/docker/images/lthn-chain -t lthn/chain $(CURDIR) + docker buildx build -f $(CC_DOCKER_FILE) -t lthn/chain $(CURDIR) + +docker-cc-linux-amd64: + docker buildx build -f $(CC_DOCKER_FILE) --target build-artifacts --output type=local,dest=build/cc-linux-amd64 --platform linux/amd64 $(CURDIR) + +docker-cc-linux-armv7: + docker buildx build -f $(CC_DOCKER_FILE) --target build-artifacts --output type=local,dest=build/cc-linux-armv7 --platform linux/arm/v7 $(CURDIR) + +docker-cc-linux-arm64v8: + docker buildx build -f $(CC_DOCKER_FILE) --target build-artifacts --output type=local,dest=build/cc-linux-arm64v8 --platform linux/arm64/v8 $(CURDIR) + +docker-cc-linux-ppc64le: + docker buildx build -f $(CC_DOCKER_FILE) --target build-artifacts --output type=local,dest=build/cc-linux-ppc64le --platform linux/ppc64le $(CURDIR) + +docker-cc-linux-riscv64: + docker buildx build -f $(CC_DOCKER_FILE) --target build-artifacts --output type=local,dest=build/cc-linux-riscv64 --platform linux/riscv64 $(CURDIR) + +docker-cc-linux-s390x: + docker buildx build -f $(CC_DOCKER_FILE) --target build-artifacts --output type=local,dest=build/cc-linux-s390x --platform linux/s390x $(CURDIR) + + clean: rm -rf build diff --git a/utils/docker/images/lthn-chain/Dockerfile b/utils/docker/images/lthn-chain/Dockerfile index cc730097..1c737e24 100644 --- a/utils/docker/images/lthn-chain/Dockerfile +++ b/utils/docker/images/lthn-chain/Dockerfile @@ -10,6 +10,7 @@ ARG BUILD_TARGET=gcc-linux-x86_64 ARG BUILD_FOLDER=build/release ARG BUILD_TYPE=Release ARG BUILD_TESTNET=1 +ARG USE_CUSTOM_PROFILE=0 ENV CONAN_HOME=/root/sdk @@ -41,7 +42,18 @@ WORKDIR /code RUN conan profile detect --name=default --force -RUN conan install . --output-folder=${BUILD_FOLDER} --build=missing -s build_type=${BUILD_TYPE} -pr:h=/code/cmake/profiles/$BUILD_TARGET +#RUN conan install . --output-folder=${BUILD_FOLDER} --build=missing -s build_type=${BUILD_TYPE} -pr:h=/code/cmake/profiles/$BUILD_TARGET + +RUN set -eux; \ + BCMD="conan install . \ + --output-folder=${BUILD_FOLDER} \ + --build=missing \ + -s build_type=${BUILD_TYPE}"; \ + if [ "${USE_CUSTOM_PROFILE}" = "1" ]; then \ + BCMD="$BCMD -pr:h=/code/cmake/profiles/${BUILD_TARGET}"; \ + fi; \ + echo "Running: $BCMD"; \ + eval $BCMD; RUN cmake -S /code -B ${BUILD_FOLDER} -DCMAKE_TOOLCHAIN_FILE=${BUILD_FOLDER}/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DTESTNET=${BUILD_TESTNET}