From 43f47d0d31b5a8dfe9c50694a11970bbd5e06203 Mon Sep 17 00:00:00 2001 From: Liu-Cheng Xu Date: Sun, 7 Jul 2024 17:40:53 +0800 Subject: [PATCH] Introduce docker-base --- .github/workflows/docker-base.yml | 76 +++++++++++++++++++++ Dockerfile.aarch64.base | 49 +++++++++++++ crates/subcoin-node/Cargo.toml | 6 +- crates/subcoin-node/src/bin/dummy.rs | 1 + crates/subcoin-node/src/bin/subcoin.rs | 4 ++ crates/subcoin-node/src/{main.rs => lib.rs} | 7 +- 6 files changed, 136 insertions(+), 7 deletions(-) create mode 100644 .github/workflows/docker-base.yml create mode 100644 Dockerfile.aarch64.base create mode 100644 crates/subcoin-node/src/bin/dummy.rs create mode 100644 crates/subcoin-node/src/bin/subcoin.rs rename crates/subcoin-node/src/{main.rs => lib.rs} (87%) diff --git a/.github/workflows/docker-base.yml b/.github/workflows/docker-base.yml new file mode 100644 index 00000000..bdda10b1 --- /dev/null +++ b/.github/workflows/docker-base.yml @@ -0,0 +1,76 @@ +# This action enables building container images for subcoin node. +name: Docker base + +on: + workflow_dispatch: + push: + branches: + - main + - docker-base + - 'release/**' + tags: + - '**' + +jobs: + container-linux: + runs-on: ubuntu-22.04 + permissions: + contents: write + packages: write + strategy: + matrix: + platform: + # - arch: linux/amd64 + # profile: production + # suffix: ubuntu-x86_64-${{ github.ref_name }} + # image-suffix: '' + # dockerfile-suffix: '' + - arch: linux/arm64 + profile: production + suffix: ubuntu-aarch64-${{ github.ref_name }} + image-suffix: '-aarch64.base' + dockerfile-suffix: '.aarch64.base' + + steps: + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log into registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ github.token }} + + - name: Extract Docker metadata + id: meta + uses: docker/metadata-action@v3 + with: + images: | + ghcr.io/subcoin-project/subcoin-base + tags: | + type=ref,event=tag + type=ref,event=branch + type=sha + flavor: | + latest=false + suffix=${{ matrix.platform.image-suffix }} + + - name: Build and push image + id: build + uses: docker/build-push-action@v6 + with: + file: Dockerfile${{ matrix.platform.dockerfile-suffix }} + platforms: ${{ matrix.platform.arch }} + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + build-args: | + SUBSTRATE_CLI_GIT_COMMIT_HASH=${{ github.sha }} + PROFILE=${{ matrix.platform.profile }} + + - name: Image digest + run: echo ${{ steps.build.outputs.digest }} diff --git a/Dockerfile.aarch64.base b/Dockerfile.aarch64.base new file mode 100644 index 00000000..66380bbe --- /dev/null +++ b/Dockerfile.aarch64.base @@ -0,0 +1,49 @@ +# This is a base image to build Subcoin node +FROM ubuntu:22.04 AS builder + +# By default, we use the stable Rust. However, we encountered some network issues +# during the docker build processing in CI. Now we compile the binary using nightly +# so that the network issue in CI can be mitigated via the unstable flag `-Zgitoxide -Zgit`. +ARG RUSTC_VERSION=nightly-2024-06-29 + +ARG PROFILE=production +ARG SUBSTRATE_CLI_GIT_COMMIT_HASH +ARG TARGET=aarch64-unknown-linux-gnu + +# Incremental compilation here isn't helpful +ENV CARGO_INCREMENTAL=0 + +ENV RUSTFLAGS="-C linker=aarch64-linux-gnu-gcc" +ENV PKG_CONFIG_ALLOW_CROSS=true + +WORKDIR /src + +RUN apt-get update && \ + DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ + ca-certificates \ + clang \ + cmake \ + curl \ + git \ + llvm \ + protobuf-compiler \ + make && \ + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain $RUSTC_VERSION + +# Dependencies necessary for cross-compilation. +RUN DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ + g++-aarch64-linux-gnu \ + gcc-aarch64-linux-gnu \ + libc6-dev-arm64-cross && \ + /root/.cargo/bin/rustup target add $TARGET && \ + /root/.cargo/bin/rustup target add wasm32-unknown-unknown --toolchain $RUSTC_VERSION-$TARGET && \ + /root/.cargo/bin/rustup component add rust-src --toolchain $RUSTC_VERSION-$TARGET + +COPY . . + +# Create a dummy main.rs to trick Cargo into downloading the dependencies +RUN /root/.cargo/bin/cargo +$RUSTC_VERSION -Zgitoxide -Zgit build \ + --locked \ + --bin dummy \ + --profile=$PROFILE \ + --target aarch64-unknown-linux-gnu diff --git a/crates/subcoin-node/Cargo.toml b/crates/subcoin-node/Cargo.toml index 48d96b68..0cca5150 100644 --- a/crates/subcoin-node/Cargo.toml +++ b/crates/subcoin-node/Cargo.toml @@ -8,7 +8,11 @@ license.workspace = true [[bin]] name = "subcoin" -path = "src/main.rs" +path = "src/bin/subcoin.rs" + +[[bin]] +name = "dummy" +path = "src/bin/dummy.rs" [dependencies] async-trait = { workspace = true } diff --git a/crates/subcoin-node/src/bin/dummy.rs b/crates/subcoin-node/src/bin/dummy.rs new file mode 100644 index 00000000..f328e4d9 --- /dev/null +++ b/crates/subcoin-node/src/bin/dummy.rs @@ -0,0 +1 @@ +fn main() {} diff --git a/crates/subcoin-node/src/bin/subcoin.rs b/crates/subcoin-node/src/bin/subcoin.rs new file mode 100644 index 00000000..995d57b6 --- /dev/null +++ b/crates/subcoin-node/src/bin/subcoin.rs @@ -0,0 +1,4 @@ +fn main() -> sc_cli::Result<()> { + subcoin_node::cli::run()?; + Ok(()) +} diff --git a/crates/subcoin-node/src/main.rs b/crates/subcoin-node/src/lib.rs similarity index 87% rename from crates/subcoin-node/src/main.rs rename to crates/subcoin-node/src/lib.rs index 104dd33e..ed15f7c7 100644 --- a/crates/subcoin-node/src/main.rs +++ b/crates/subcoin-node/src/lib.rs @@ -1,12 +1,7 @@ -mod cli; +pub mod cli; mod commands; mod substrate_cli; -fn main() -> sc_cli::Result<()> { - cli::run()?; - Ok(()) -} - pub struct CoinStorageKey; impl subcoin_primitives::CoinStorageKey for CoinStorageKey {