diff --git a/.dockerignore b/.dockerignore index 46c3ebed..dbc99a6b 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,6 +1,6 @@ # Generated by Cargo # will have compiled files and executables -/target/ +target/ # Remove Cargo.lock from gitignore if creating an executable, leave it for libraries # More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html diff --git a/.github/actions/deps/action.yaml b/.github/actions/deps/action.yaml index aff79b69..8bd69a1c 100644 --- a/.github/actions/deps/action.yaml +++ b/.github/actions/deps/action.yaml @@ -22,11 +22,20 @@ runs: unzip /tmp/protoc.zip -d ${HOME}/.local echo "PROTOC=${HOME}/.local/bin/protoc" >> $GITHUB_ENV export PATH="${PATH}:${HOME}/.local/bin" + - name: Setup sccache + uses: mozilla-actions/sccache-action@v0.0.3 + - name: Set sccache variables + shell: bash + run: | + echo SCCACHE_GHA_ENABLED=true >> $GITHUB_ENV + echo RUSTC_WRAPPER=sccache >> $GITHUB_ENV - name: Rust cache uses: Swatinem/rust-cache@v2 with: - cache-directories: | - proto/src/prost - - name: Compile Protobuf definitions + # Don't cache ./target, as it takes tons of space, use sccache instead. + cache-targets: false + # We set a shared key, as our cache is reusable between jobs + shared-key: rust-cargo + - name: "Compile Protobuf definitions (needed by fmt, doc, etc.)" shell: bash run: cargo build -p tenderdash-proto diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml new file mode 100644 index 00000000..23d03fab --- /dev/null +++ b/.github/workflows/docker.yml @@ -0,0 +1,65 @@ +--- +name: Docker + +on: + workflow_dispatch: + pull_request: + paths-ignore: + - "docs/**" + push: + paths-ignore: + - "docs/**" + branches: + - master + - "v*.*.*" + +jobs: + build: + strategy: + matrix: + os: [alpine, debian] + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v3 + + - name: Setup sccache + uses: mozilla-actions/sccache-action@v0.0.3 + + - name: Set up QEMU + uses: docker/setup-qemu-action@master + with: + platforms: amd64 + + - name: Set up Docker Build + uses: docker/setup-buildx-action@v2.4.1 + + # ARM build takes very long time, so we build PRs for AMD64 only + - name: Select target platform + id: select_platforms + run: | + if [[ "${GITHUB_EVENT_NAME}" == "pull_request" ]] ; then + echo "build_platforms=linux/amd64" >> $GITHUB_ENV + else + echo "build_platforms=linux/amd64,linux/arm64" >> $GITHUB_ENV + fi + + - name: Build Docker sample image + id: docker_build + uses: docker/build-push-action@v4.0.0 + with: + context: . + file: ./Dockerfile-${{ matrix.os }} + build-args: | + REVISION=${{ github.ref }} + SCCACHE_GHA_ENABLED=true + ACTIONS_CACHE_URL=${{ env.ACTIONS_CACHE_URL }} + ACTIONS_RUNTIME_TOKEN=${{ env.ACTIONS_RUNTIME_TOKEN }} + platforms: ${{ env.build_platforms }} + push: false + cache-from: | + type=gha + cache-to: | + type=gha,mode=max + + - name: Show Docker image digest + run: echo ${{ steps.docker_build.outputs.digest }} diff --git a/Dockerfile-alpine b/Dockerfile-alpine new file mode 100644 index 00000000..c05b353a --- /dev/null +++ b/Dockerfile-alpine @@ -0,0 +1,68 @@ +# This is an example Dockerfile, demonstrating build process of rs-tenderdash-abci + +# rust:alpine3.17, published Mar 24, 2023 at 2:55 am +FROM rust:alpine3.17 + +RUN apk add --no-cache \ + git \ + wget \ + alpine-sdk \ + openssl-dev \ + libc6-compat \ + perl \ + unzip \ + sccache \ + bash + +SHELL ["/bin/bash", "-c"] + +# one of: aarch_64, x86_64 +# ARG PROTOC_ARCH=x86_64 +ARG TARGETPLATFORM +ARG BUILDPLATFORM + +# Install protoc - protobuf compiler +# The one shipped with Alpine does not work +RUN if [[ "$BUILDPLATFORM" == "linux/arm64" ]] ; then export PROTOC_ARCH=aarch_64; else export PROTOC_ARCH=x86_64 ; fi; \ + wget -q -O /tmp/protoc.zip https://github.com/protocolbuffers/protobuf/releases/download/v22.2/protoc-22.2-linux-${PROTOC_ARCH}.zip && \ + unzip -qd /opt/protoc /tmp/protoc.zip && \ + rm /tmp/protoc.zip && \ + ln -s /opt/protoc/bin/protoc /usr/bin/ + +# Set RUSTC_WRAPPER=/usr/bin/sccache to enable `sccache` caching. +ARG RUSTC_WRAPPER=/usr/bin/sccache +# These should be set for Github Actions caching +ARG SCCACHE_GHA_ENABLED +ARG ACTIONS_CACHE_URL +ARG ACTIONS_RUNTIME_TOKEN + +# Create a dummy package +RUN cargo init /usr/src/abci-app +WORKDIR /usr/src/abci-app + +# Let's display ABCI version instead of "hello world" +RUN sed -i'' -e 's/println!("Hello, world!");/println!("ABCI version: {}",tenderdash_abci::proto::ABCI_VERSION);/' src/main.rs + +# revspec or SHA of commit/branch/tag to use +ARG REVISION="refs/heads/master" + +# Add tenderdash-abci as a dependency and build the package +# +# Some notes here: +# 1. All these --mount... are to cache reusable info between runs. +# See https://doc.rust-lang.org/cargo/guide/cargo-home.html#caching-the-cargo-home-in-ci +# 2. We add `--config net.git-fetch-with-cli=true` to address ARM build issue, +# see https://github.com/rust-lang/cargo/issues/10781#issuecomment-1441071052 +# 3. To preserve space on github cache, we call `cargo clean`. +# 4. We set SCCACHE_SERVER_PORT to avoid conflicts during parallel builds +RUN --mount=type=cache,sharing=shared,target=/root/.cache/sccache \ + --mount=type=cache,sharing=shared,target=${CARGO_HOME}/registry/index \ + --mount=type=cache,sharing=shared,target=${CARGO_HOME}/registry/cache \ + --mount=type=cache,sharing=shared,target=${CARGO_HOME}/git/db \ + SCCACHE_SERVER_PORT=$((RANDOM+1025)) cargo add --config net.git-fetch-with-cli=true \ + --git https://github.com/dashpay/rs-tenderdash-abci --rev "${REVISION}" tenderdash-abci && \ + cargo build --config net.git-fetch-with-cli=true && \ + cargo run --config net.git-fetch-with-cli=true && \ + cargo clean && \ + sccache --show-stats + diff --git a/Dockerfile-debian b/Dockerfile-debian new file mode 100644 index 00000000..d758fd19 --- /dev/null +++ b/Dockerfile-debian @@ -0,0 +1,62 @@ +# This is an example Dockerfile, demonstrating build process of rs-tenderdash-abci + +# We use Debian base image, as Alpine has some segmentation fault issue +FROM rust:bullseye + +RUN --mount=type=cache,sharing=locked,target=/var/lib/apt/lists \ + --mount=type=cache,sharing=locked,target=/var/cache/apt \ + rm -f /etc/apt/apt.conf.d/docker-clean && \ + apt-get update -qq && \ + apt-get install -qq --yes \ + protobuf-compiler \ + git \ + wget \ + bash + + +# +# Install sccache - build cache for Rust. +# This is optional, but it will speed up the build process +# +ARG SCCACHE_URL="https://github.com/mozilla/sccache/releases/download/v0.4.0/sccache-v0.4.0-x86_64-unknown-linux-musl.tar.gz" +RUN wget -q -O /tmp/sccache.tar.gz ${SCCACHE_URL} \ + && mkdir -p /tmp/sccache \ + && tar -z -C /tmp/sccache -xf /tmp/sccache.tar.gz \ + && mv /tmp/sccache/sccache*/sccache /usr/bin/sccache \ + && rm -r /tmp/sccache.tar.gz /tmp/sccache + +# Set RUSTC_WRAPPER=/usr/bin/sccache to enable `sccache` caching. +ARG RUSTC_WRAPPER=/usr/bin/sccache +# These should be set for Github Actions caching +ARG SCCACHE_GHA_ENABLED +ARG ACTIONS_CACHE_URL +ARG ACTIONS_RUNTIME_TOKEN + +# Create a dummy package +RUN cargo init /usr/src/abci-app +WORKDIR /usr/src/abci-app + + +# revspec or SHA of commit/branch/tag to use +ARG REVISION="refs/heads/master" + +SHELL ["/bin/bash", "-c"] + +# Add tenderdash-abci as a dependency and build the package +# +# Some notes here: +# 1. All these --mount... are to cache reusable info between runs. +# See https://doc.rust-lang.org/cargo/guide/cargo-home.html#caching-the-cargo-home-in-ci +# 2. We add `--config net.git-fetch-with-cli=true` to address ARM build issue, +# see https://github.com/rust-lang/cargo/issues/10781#issuecomment-1441071052 +# 3. To preserve space on github cache, we call `cargo clean`. +# 4. We set SCCACHE_SERVER_PORT to avoid conflicts during parallel builds +RUN --mount=type=cache,sharing=shared,target=/root/.cache/sccache \ + --mount=type=cache,sharing=shared,target=${CARGO_HOME}/registry/index \ + --mount=type=cache,sharing=shared,target=${CARGO_HOME}/registry/cache \ + --mount=type=cache,sharing=shared,target=${CARGO_HOME}/git/db \ + SCCACHE_SERVER_PORT=$((RANDOM+1025)) cargo add --config net.git-fetch-with-cli=true \ + --git https://github.com/dashpay/rs-tenderdash-abci --rev "${REVISION}" tenderdash-abci && \ + cargo build --config net.git-fetch-with-cli=true && \ + cargo clean && \ + sccache --show-stats diff --git a/proto-compiler/Cargo.toml b/proto-compiler/Cargo.toml index 2af58944..b034cae6 100644 --- a/proto-compiler/Cargo.toml +++ b/proto-compiler/Cargo.toml @@ -12,8 +12,8 @@ publish = false walkdir = { version = "2.3" } prost-build = { version = "0.11" } tempfile = { version = "3.2.0" } -subtle-encoding = { version = "0.5" } regex = { "version" = "1.7.1" } -reqwest = { "version" = "0.11.16", features = ["blocking"] } +# Use of native-tls-vendored should build vendored openssl, which is required for Alpine build +ureq = { "version" = "2.6.2" } zip = { version = "0.6.4", default-features = false, features = ["deflate"] } fs_extra = { version = "1.3.0" } diff --git a/proto-compiler/src/functions.rs b/proto-compiler/src/functions.rs index 658b5c2e..72e64481 100644 --- a/proto-compiler/src/functions.rs +++ b/proto-compiler/src/functions.rs @@ -51,15 +51,10 @@ fn download_and_unzip(url: &str, archive_file: &Path, dest_dir: &Path) { // We download only if the file does not exist if !archive_file.is_file() { let mut file = File::create(archive_file).expect("cannot create file"); - - let mut rb = reqwest::blocking::get(url).expect("cannot download archive"); - if !rb.status().is_success() { - panic!( - "cannot download tenderdash sources from {url}: {:?}", - rb.status() - ) - } - rb.copy_to(&mut file).expect("cannot save downloaded data"); + let rb = ureq::get(url).call().expect("cannot download archive"); + // let mut rb = reqwest::blocking::get(url).expect("cannot download archive"); + let mut reader = rb.into_reader(); + std::io::copy(&mut reader, &mut file).expect("cannot save downloaded data"); file.flush().expect("flush of archive file failed"); } diff --git a/proto/Cargo.toml b/proto/Cargo.toml index a12d799d..a4b5bd7d 100644 --- a/proto/Cargo.toml +++ b/proto/Cargo.toml @@ -17,12 +17,8 @@ all-features = true [dependencies] prost = { version = "0.11", default-features = false } -prost-types = { version = "0.11", default-features = false } bytes = { version = "1.0", default-features = false, features = ["serde"] } serde = { version = "1.0", default-features = false, features = ["derive"] } -serde_bytes = { version = "0.11", default-features = false, features = [ - "alloc", -] } subtle-encoding = { version = "0.5", default-features = false, features = [ "hex", "base64",