Skip to content

Commit

Permalink
test: build rs-tenderdash-abci in Docker (#14)
Browse files Browse the repository at this point in the history
* build: sample Dockerfile image

* chore: fix dockerfile

* chore: try to fix caching

* chore: dockerfile improvements

* build: disable arm64 build

* build: simplify Dockerfile

* build(docker): silence apt-get

* build(github): docer image only for arm

* chore(Dockerfile): trying to get arm to build

* build(docker): trying to fix arm build

* build(docker): fixed image for arm

* build(docker): refer to correct branch

* build(github): on PR, build only amd64 image

* chore: typo

* chore: typo

* chore: typo

* chore: typo

* build(proto-compiler): use vendored-openssl

* build(docker): add Alpine docker image to be built

* build(docker): typo

* build(github): build only amd64 on non-master branch

* build(github): enable sccache

* build(github): enable Github cache for sccache in Docker images

* build(docker): minor caching fix

* build(docker): avoid sccache port conflicts on parallel build in github

* build(github): allow manual run of docker job

* build(docker): add missing dependency for arm64

* chore: remove unused dependencies

* chore: display some stats

* chore(proto-compiler): use vendored openssl

* chore: fix comments

* build(github): don't cache /target to use less space

* build(github): don't precompile protobuf definitions

* chore(proto-compiler): replace openssl with openssl-sys

* Revert "build(github): don't precompile protobuf definitions"

This reverts commit 8a49d5d.

* chore(proto-compiler): optimize dependencies

* refactor(proto-compiler): use ureq instead of reqwest to improve performance
  • Loading branch information
lklimek authored Apr 7, 2023
1 parent 313c683 commit d61717a
Show file tree
Hide file tree
Showing 8 changed files with 214 additions and 19 deletions.
2 changes: 1 addition & 1 deletion .dockerignore
Original file line number Diff line number Diff line change
@@ -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
Expand Down
15 changes: 12 additions & 3 deletions .github/actions/deps/action.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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/[email protected]
- 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
65 changes: 65 additions & 0 deletions .github/workflows/docker.yml
Original file line number Diff line number Diff line change
@@ -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/[email protected]

- name: Set up QEMU
uses: docker/setup-qemu-action@master
with:
platforms: amd64

- name: Set up Docker Build
uses: docker/[email protected]

# 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/[email protected]
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 }}
68 changes: 68 additions & 0 deletions Dockerfile-alpine
Original file line number Diff line number Diff line change
@@ -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

62 changes: 62 additions & 0 deletions Dockerfile-debian
Original file line number Diff line number Diff line change
@@ -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
4 changes: 2 additions & 2 deletions proto-compiler/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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" }
13 changes: 4 additions & 9 deletions proto-compiler/src/functions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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");
}

Expand Down
4 changes: 0 additions & 4 deletions proto/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down

0 comments on commit d61717a

Please sign in to comment.