diff --git a/.github/workflows/Rust-Cross-Compile-Dockerfile b/.github/workflows/Rust-Cross-Compile-Dockerfile new file mode 100644 index 00000000000..bd5dceeca02 --- /dev/null +++ b/.github/workflows/Rust-Cross-Compile-Dockerfile @@ -0,0 +1,38 @@ +FROM ubuntu:latest + +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt-get update && apt-get install -y \ + software-properties-common \ + build-essential \ + curl \ + git \ + libssl-dev \ + pkg-config \ + cmake \ + gcc-riscv64-linux-gnu \ + g++-riscv64-linux-gnu \ + && rm -rf /var/lib/apt/lists/* + +RUN add-apt-repository ppa:ubuntu-toolchain-r/test \ + && apt-get update && apt-get install -y \ + gcc-14 \ + g++-14 \ + gcc-14-riscv64-linux-gnu \ + g++-14-riscv64-linux-gnu \ + && rm -rf /var/lib/apt/lists/* + +WORKDIR /root + +RUN curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain stable + +ENV PATH="/root/.cargo/bin:${PATH}" + +RUN rustup target add \ + riscv64gc-unknown-linux-gnu + +RUN mkdir -p ~/.cargo && echo '\ +[target.riscv64gc-unknown-linux-gnu]\n\ +linker = "riscv64-linux-gnu-gcc-14"' > ~/.cargo/config.toml + +CMD ["/bin/bash"] diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f18bd49a399..a391ab46f51 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -26,17 +26,40 @@ jobs: cache-on-failure: true shared-key: ${{ runner.os }}-cargo-${{ matrix.arch }} - uses: dsherret/rust-toolchain-file@v1 - - name: Build nydus-rs + - name: Set up Docker Buildx + if: matrix.arch == 'riscv64' + uses: docker/setup-buildx-action@v3 + - name: Build and push Docker image + if: matrix.arch == 'riscv64' + uses: docker/build-push-action@v6 + with: + context: . + file: ./.github/workflows/Rust-Cross-Compile-Dockerfile + push: false + load: true + tags: rust-cross-compile-riscv64:latest + - name: Build nydus-rs Non-RISC-V + if: matrix.arch != 'riscv64' run: | - declare -A rust_target_map=( ["amd64"]="x86_64-unknown-linux-musl" ["arm64"]="aarch64-unknown-linux-musl" ["ppc64le"]="powerpc64le-unknown-linux-gnu" ["riscv64"]="riscv64gc-unknown-linux-gnu") + declare -A rust_target_map=( ["amd64"]="x86_64-unknown-linux-musl" ["arm64"]="aarch64-unknown-linux-musl" ["ppc64le"]="powerpc64le-unknown-linux-gnu") RUST_TARGET=${rust_target_map[${{ matrix.arch }}]} cargo install --locked --version 0.2.5 cross make -e RUST_TARGET_STATIC=$RUST_TARGET -e CARGO=cross static-release + - name : Build Nydus-rs RISC-V + if: matrix.arch == 'riscv64' + run: | + RUST_TARGET=riscv64gc-unknown-linux-gnu + docker run --rm -v ${{ github.workspace }}:/root/src rust-cross-compile-riscv64:latest \ + sh -c "cd /root/src && make -e RUST_TARGET_STATIC=$RUST_TARGET static-release" + - name: Prepare to upload artifacts + run: | + declare -A rust_target_map=( ["amd64"]="x86_64-unknown-linux-musl" ["arm64"]="aarch64-unknown-linux-musl" ["ppc64le"]="powerpc64le-unknown-linux-gnu" ["riscv64"]="riscv64gc-unknown-linux-gnu") + RUST_TARGET=${rust_target_map[${{ matrix.arch }}]} sudo mv target/$RUST_TARGET/release/nydusd nydusd sudo mv target/$RUST_TARGET/release/nydus-image . sudo mv target/$RUST_TARGET/release/nydusctl . sudo cp -r misc/configs . - sudo chown -R $(id -un):$(id -gn) . ~/.cargo/ + sudo chown -R $(id -un):$(id -gn) . ~/.cargo/ - name: store-artifacts uses: actions/upload-artifact@v4 with: diff --git a/.github/workflows/smoke.yml b/.github/workflows/smoke.yml index d0db7bc4eae..ad0323af8f4 100644 --- a/.github/workflows/smoke.yml +++ b/.github/workflows/smoke.yml @@ -65,7 +65,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - arch: [amd64, arm64, ppc64le,riscv64] + arch: [amd64, arm64, ppc64le, riscv64] steps: - name: Checkout uses: actions/checkout@v4 @@ -76,14 +76,37 @@ jobs: shared-key: ${{ runner.os }}-cargo-${{ matrix.arch }} save-if: ${{ github.ref == 'refs/heads/master' }} - uses: dsherret/rust-toolchain-file@v1 - - name: Build Nydus + - name: Set up Docker Buildx + if: matrix.arch == 'riscv64' + uses: docker/setup-buildx-action@v3 + - name: Build and push Docker image + if: matrix.arch == 'riscv64' + uses: docker/build-push-action@v6 + with: + context: . + file: ./.github/workflows/Rust-Cross-Compile-Dockerfile + push: false + load: true + tags: rust-cross-compile-riscv64:latest + - name: Build Nydus Non-RISC-V + if: matrix.arch != 'riscv64' run: | - declare -A rust_target_map=( ["amd64"]="x86_64-unknown-linux-musl" ["arm64"]="aarch64-unknown-linux-musl" ["ppc64le"]="powerpc64le-unknown-linux-gnu" ["riscv64"]="riscv64gc-unknown-linux-gnu") + declare -A rust_target_map=( ["amd64"]="x86_64-unknown-linux-musl" ["arm64"]="aarch64-unknown-linux-musl" ["ppc64le"]="powerpc64le-unknown-linux-gnu") RUST_TARGET=${rust_target_map[${{ matrix.arch }}]} cargo install --locked --version 0.2.5 cross - make -e RUST_TARGET_STATIC=$RUST_TARGET -e CARGO=cross static-release + make -e RUST_TARGET_STATIC=$RUST_TARGET -e CARGO=cross static-release + - name: Build Nydus RISC-V + if: matrix.arch == 'riscv64' + run: | + RUST_TARGET=riscv64gc-unknown-linux-gnu + docker run --rm -v ${{ github.workspace }}:/root/src rust-cross-compile-riscv64:latest \ + sh -c "cd /root/src && make -e RUST_TARGET_STATIC=$RUST_TARGET static-release" + - name: Prepare to upload artifacts + run: | + declare -A rust_target_map=( ["amd64"]="x86_64-unknown-linux-musl" ["arm64"]="aarch64-unknown-linux-musl" ["ppc64le"]="powerpc64le-unknown-linux-gnu" ["riscv64"]="riscv64gc-unknown-linux-gnu") + RUST_TARGET=${rust_target_map[${{ matrix.arch }}]} sudo mv target/$RUST_TARGET/release/nydusd . - sudo mv target/$RUST_TARGET/release/nydus-image . + sudo mv target/$RUST_TARGET/release/nydus-image . - name: Upload Nydus Binaries if: matrix.arch == 'amd64' uses: actions/upload-artifact@v4 diff --git a/Cargo.toml b/Cargo.toml index 9656f5a92c3..bf5389dcee4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -53,9 +53,7 @@ tar = "0.4.40" tokio = { version = "1.35.1", features = ["macros"] } # Build static linked openssl library -openssl = { version = "0.10.55", features = ["vendored"] } -# pin openssl-src to bring in fix for https://rustsec.org/advisories/RUSTSEC-2022-0032 -#openssl-src = { version = "111.22" } +openssl = { version = '*', features = ["vendored"] } nydus-api = { version = "0.3.0", path = "api", features = [ "error-backtrace", @@ -82,6 +80,7 @@ vmm-sys-util = { version = "0.11.0", optional = true } [build-dependencies] time = { version = "0.3.14", features = ["formatting"] } +openssl = { version = '*', features = ["vendored"] } [dev-dependencies] xattr = "1.0.1" diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 58e76ec0321..73cb934de47 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,3 +1,3 @@ [toolchain] -channel = "1.84.0" +channel = "stable" components = ["rustfmt", "clippy"]