mirror of
https://github.com/rustfs/rustfs.git
synced 2026-10-29 23:37:04 +00:00
c7848df9a0
* fix(build): pin gnu glibc baseline to 2.31 and report compile target in version metadata gnu release binaries were built natively on Ubuntu 24.04, embedding GLIBC_2.38/2.39 symbol references while the RPM/DEB metadata promised glibc >= 2.31, so Rocky/RHEL 9 (glibc 2.34) could not run them (#8062). The two linux-gnu legs now build through cargo-zigbuild pinned to the 2.31 baseline (same-arch; zig acts as the linker), with post-build guards asserting both the embedded version metadata and the highest referenced GLIBC symbol version, keeping the package declarations honest. Version metadata itself now comes from cargo's TARGET cfg instead of shadow-rs' host stamping, so builds whose host differs from their target (cross compilation, musl targets on a glibc-hosted toolchain) report the platform they were compiled for (#8048 follow-up). The cross toolchain (zig 0.14.x, cargo-zigbuild 0.23.4) is pinned in the setup action now that it is load-bearing for releases, the build job gets an explicit matrix-independent name so the connect-* acceptance workflows keep matching it when matrix fields change, and the preview-release workflow contract is updated for the TARGET_ARG build commands. Fixes #8062 Follow-up on #8048 * fix(build): enforce GNU ABI floor and canonical target metadata Pin Zig 0.17.0 and cargo-zigbuild, isolate cross-toolchain caches, and build GNU releases against the declared glibc 2.31 floor. Validate both release ELF binaries using their loader version requirements. Generate target metadata once through shadow-rs and check the actual release version output without adding a parallel metadata facade. Refs: rustfs/backlog#2824 Co-Authored-By: heihutu <heihutu@gmail.com> Co-Authored-By: zhi22915 <qiuzgang@gmail.com> * perf(build): reuse GNU release profile across binaries Switching the CLI back to the default strip profile restarted 419 compilation units after the server build. Keep the profiling build profile for both binaries, then strip only the CLI artifact. Retain serial links, server profiling symbols, and post-strip ABI gates. Co-Authored-By: heihutu <heihutu@gmail.com> Co-Authored-By: zhi22915 <qiuzgang@gmail.com> * perf(build): limit release artifacts to the rustfs server Build only rustfs in the release workflow and remove the CLI build, strip, and packaging paths. Preserve GNU profiling symbols and catalog sidecars, and align strict acceptance archive readers with the new set. Exercise all six build targets, Linux package checks, and all four strict acceptance extractors using their actual workflow scripts. Co-Authored-By: heihutu <heihutu@gmail.com> Co-Authored-By: zhi22915 <qiuzgang@gmail.com> --------- Co-authored-by: majinghe <42570491+majinghe@users.noreply.github.com> Co-authored-by: heihutu <heihutu@gmail.com> Co-authored-by: zhi22915 <qiuzgang@gmail.com>
145 lines
5.6 KiB
YAML
145 lines
5.6 KiB
YAML
# Copyright 2024 RustFS Team
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
name: "Setup Rust Environment"
|
|
description: "Setup Rust development environment with caching for RustFS"
|
|
|
|
inputs:
|
|
rust-version:
|
|
description: "Rust version to install"
|
|
required: false
|
|
default: "stable"
|
|
cache-shared-key:
|
|
description: "Shared cache key for Rust dependencies"
|
|
required: false
|
|
default: "rustfs-deps"
|
|
cache-save-if:
|
|
description: >-
|
|
Whether to save the cache. The fail-safe default is 'false': a caller that
|
|
wants to populate a cache must opt in explicitly, so a forgotten input
|
|
costs a cold cache (minutes) rather than silently consuming the
|
|
repository-wide 10GB Actions cache quota and evicting other lanes.
|
|
required: false
|
|
default: "false"
|
|
install-cross-tools:
|
|
description: "Install cross-compilation tools"
|
|
required: false
|
|
default: "false"
|
|
zig-version:
|
|
description: >-
|
|
Zig version for cargo-zigbuild builds. Pinned so the `<target>.<glibc>`
|
|
baseline semantics cannot drift with an untested zig release.
|
|
required: false
|
|
default: "0.17.0"
|
|
cargo-zigbuild-version:
|
|
description: "cargo-zigbuild version installed for cross builds."
|
|
required: false
|
|
default: "0.23.4"
|
|
target:
|
|
description: "Target architecture to add"
|
|
required: false
|
|
default: ""
|
|
install-build-packaging-tools:
|
|
description: >-
|
|
Install musl-tools/zip/unzip, needed for musl linking and release
|
|
packaging. Off for CI test lanes, which use none of them.
|
|
required: false
|
|
default: "true"
|
|
install-test-tools:
|
|
description: >-
|
|
Install cargo-nextest and the rustfmt/clippy components. Off for release
|
|
and audit lanes, which run no tests and no lints.
|
|
required: false
|
|
default: "true"
|
|
|
|
runs:
|
|
using: "composite"
|
|
steps:
|
|
# protobuf-compiler is deliberately absent: the setup-protoc step below
|
|
# installs 35.1 into the tool cache and prepends it to PATH, so the apt
|
|
# build (older, and never version-matched) was shadowed on every run and
|
|
# simply never used.
|
|
- name: Install system dependencies (Ubuntu)
|
|
if: runner.os == 'Linux'
|
|
shell: bash
|
|
run: |
|
|
sudo apt-get update
|
|
sudo apt-get install -y \
|
|
build-essential \
|
|
pkg-config \
|
|
libssl-dev \
|
|
ripgrep
|
|
|
|
# musl-gcc is needed by the native musl release leg, and zip/unzip by the
|
|
# release packaging steps. No CI test lane touches any of them.
|
|
- name: Install packaging and cross-linking dependencies (Ubuntu)
|
|
if: runner.os == 'Linux' && inputs.install-build-packaging-tools == 'true'
|
|
shell: bash
|
|
run: sudo apt-get install -y musl-tools zip unzip
|
|
|
|
- name: Install protoc
|
|
uses: rustfs/setup-protoc@a3705324d8f9bf5b6c3573fb6cf8ae421db55dd6 # v3.0.1
|
|
with:
|
|
version: "35.1"
|
|
repo-token: ${{ github.token }}
|
|
|
|
- name: Install flatc
|
|
uses: Nugine/setup-flatc@698800de72a96bfb22cf60431dc21a2ff9a7e07b # v1
|
|
with:
|
|
version: "25.12.19"
|
|
|
|
- name: Install Rust toolchain
|
|
uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable
|
|
with:
|
|
toolchain: ${{ inputs.rust-version }}
|
|
targets: ${{ inputs.target }}
|
|
components: ${{ inputs.install-test-tools == 'true' && 'rustfmt, clippy' || '' }}
|
|
|
|
- name: Install Zig
|
|
if: inputs.install-cross-tools == 'true'
|
|
uses: mlugg/setup-zig@d1434d08867e3ee9daa34448df10607b98908d29 # v2
|
|
with:
|
|
version: ${{ inputs.zig-version }}
|
|
|
|
- name: Install cargo-zigbuild
|
|
if: inputs.install-cross-tools == 'true'
|
|
uses: taiki-e/install-action@a21ae4029b089b9ddc45704028756f51ab8abe48 # cargo-zigbuild
|
|
with:
|
|
tool: cargo-zigbuild@${{ inputs.cargo-zigbuild-version }}
|
|
|
|
- name: Install cargo-nextest
|
|
if: inputs.install-test-tools == 'true'
|
|
uses: taiki-e/install-action@96c7780c1d8a2b8723e12031def873a434d39d8d # nextest
|
|
with:
|
|
tool: cargo-nextest@0.9.138
|
|
|
|
- name: Setup Rust cache
|
|
uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2
|
|
with:
|
|
# false is rust-cache's own default. With true, cleanup.ts returns
|
|
# *before* pruning ~/.cargo/registry/src, and config.ts archives the
|
|
# whole registry — so every cache carried the unpacked source tree of
|
|
# every dependency, not just "a few extra crates".
|
|
#
|
|
# No coverage is lost: getPackages runs `cargo metadata --all-features`,
|
|
# a strict superset of any single lane's feature closure, and -sys crates
|
|
# are explicitly exempted from pruning (their src timestamps would
|
|
# otherwise trigger rebuilds). Anything pruned is re-unpacked from the
|
|
# .crate files still in registry/cache, whose mtimes crates.io
|
|
# normalises, so cargo fingerprints stay valid.
|
|
cache-all-crates: false
|
|
cache-on-failure: true
|
|
shared-key: ${{ inputs.cache-shared-key }}${{ inputs.install-cross-tools == 'true' && format('-zig-{0}-zigbuild-{1}', inputs.zig-version, inputs.cargo-zigbuild-version) || '' }}
|
|
save-if: ${{ inputs.cache-save-if }}
|