change(log): Report compiler version and Zebra features when starting Zebra (#6606)

* Add extra vergen metadata to startup and panic reports

* Upgrade to vergen 8.1.3

* Update build script docs

* Upgrade env var names for vergen 8.1.3

* Switch to `git2` dependency feature

* Use renamed environmental variable for `git describe`

* Ignore vergen errors if `.git` doesn't exist

* Update Cargo.lock

* Remove unused deny.toml exceptions with --all-features

Some of these might be from this PR, or the missed dependency updates.
This commit is contained in:
teor 2023-05-15 01:05:22 +10:00 committed by GitHub
parent c76d1f5219
commit df949a2365
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 44 additions and 98 deletions

View File

@ -1305,26 +1305,6 @@ dependencies = [
"cfg-if 1.0.0",
]
[[package]]
name = "enum-iterator"
version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7add3873b5dd076766ee79c8e406ad1a472c385476b9e38849f8eec24f1be689"
dependencies = [
"enum-iterator-derive",
]
[[package]]
name = "enum-iterator-derive"
version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eecf8589574ce9b895052fa12d69af7a233f99e6107f5cb8dd1044f2a17bfdcb"
dependencies = [
"proc-macro2 1.0.56",
"quote 1.0.27",
"syn 2.0.15",
]
[[package]]
name = "env_logger"
version = "0.7.1"
@ -1634,18 +1614,6 @@ dependencies = [
"wasm-bindgen",
]
[[package]]
name = "getset"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e45727250e75cc04ff2846a66397da8ef2b3db8e40e0cef4df67950a07621eb9"
dependencies = [
"proc-macro-error",
"proc-macro2 1.0.56",
"quote 1.0.27",
"syn 1.0.109",
]
[[package]]
name = "gimli"
version = "0.27.2"
@ -1654,9 +1622,9 @@ checksum = "ad0a93d233ebf96623465aad4046a8d3aa4da22d4f4beba5388838c8a434bbb4"
[[package]]
name = "git2"
version = "0.16.1"
version = "0.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ccf7f68c2995f392c49fffb4f95ae2c873297830eb25c6bc4c114ce8f4562acc"
checksum = "8b7905cdfe33d31a88bb2e8419ddd054451f5432d1da9eaf2ac7804ee1ea12d5"
dependencies = [
"bitflags 1.3.2",
"libc",
@ -2325,9 +2293,9 @@ checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1"
[[package]]
name = "libgit2-sys"
version = "0.14.2+1.5.1"
version = "0.15.1+1.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f3d95f6b51075fe9810a7ae22c7095f12b98005ab364d8544797a825ce946a4"
checksum = "fb4577bde8cdfc7d6a2a4bcb7b049598597de33ffd337276e9c7db6cd4a2cee7"
dependencies = [
"cc",
"libc",
@ -5211,17 +5179,14 @@ checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
[[package]]
name = "vergen"
version = "7.5.1"
version = "8.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f21b881cd6636ece9735721cf03c1fe1e774fe258683d084bb2812ab67435749"
checksum = "6e03272e388fb78fc79481a493424f78d77be1d55f21bcd314b5a6716e195afe"
dependencies = [
"anyhow",
"cfg-if 1.0.0",
"enum-iterator",
"getset",
"git2",
"rustc_version 0.4.0",
"rustversion",
"thiserror",
"time 0.3.21",
]

View File

@ -74,9 +74,6 @@ skip-tree = [
# Test-only dependencies
# wait for console-api -> console-subscriber to upgrade
{ name = "tonic", version = "=0.8.3" },
# wait for tokio-test -> tokio-stream to upgrade
{ name = "tokio-util", version = "=0.6.10" },
@ -102,11 +99,6 @@ skip-tree = [
# wait for elasticsearch to update base64, darling, rustc_version, serde_with
{ name = "elasticsearch", version = "=8.5.0-alpha.1" },
# Progress bar dependencies
# wait for indicatif to update
{ name = "portable-atomic", version = "=0.3.19" },
# Unused dependencies
# we don't support Windows at the moment (#3801)

View File

@ -185,7 +185,7 @@ proptest-derive = { version = "0.3.0", optional = true }
console-subscriber = { version = "0.1.8", optional = true }
[build-dependencies]
vergen = { version = "7.5.1", default-features = false, features = ["cargo", "git"] }
vergen = { version = "8.1.3", default-features = false, features = ["cargo", "git", "git2", "rustc"] }
# test feature lightwalletd-grpc-tests
tonic-build = { version = "0.9.2", optional = true }

View File

@ -2,55 +2,40 @@
//!
//! Turns Zebra version information into build-time environmental variables,
//! so that it can be compiled into `zebrad`, and used in diagnostics.
//!
//! When compiling the `lightwalletd` gRPC tests, also builds a gRPC client
//! Rust API for `lightwalletd`.
use vergen::{vergen, Config, SemverKind, ShaKind};
use vergen::EmitBuilder;
/// Disable vergen env vars that could cause spurious reproducible build
/// failures
fn disable_non_reproducible(_config: &mut Config) {
/*
Currently, these features are disabled in `Cargo.toml`
/// Returns a new `vergen` builder, configured for everything except for `git` env vars.
/// This builder fails the build on error.
fn base_vergen_builder() -> EmitBuilder {
let mut vergen = EmitBuilder::builder();
// We don't use build or host-specific env vars, because they can break
// reproducible builds.
*config.build_mut().enabled_mut() = false;
*config.rustc mut().host_triple_mut() = false;
vergen.all_cargo().all_rustc();
// It's ok for reproducible builds to depend on the build OS. But most other
// sysinfo should not change reproducible builds, so we disable it.
*config.sysinfo mut().user_mut() = false;
*config.sysinfo mut().memory_mut() = false;
*config.sysinfo mut().cpu_vendor_mut() = false;
*config.sysinfo mut().cpu_core_count_mut() = false;
*config.sysinfo mut().cpu_name_mut() = false;
*config.sysinfo mut().cpu_brand_mut() = false;
*config.sysinfo mut().cpu_frequency_mut() = false;
*/
vergen
}
/// Process entry point for `zebrad`'s build script
#[allow(clippy::print_stderr)]
fn main() {
let mut config = Config::default();
disable_non_reproducible(&mut config);
let mut vergen = base_vergen_builder();
*config.git_mut().sha_kind_mut() = ShaKind::Short;
*config.git_mut().semver_kind_mut() = SemverKind::Lightweight;
// git typically uses "-dirty", but we change that so:
// - we're explicit and direct about source code state
// - it matches the SemVer 2.0 format, using dot separators
*config.git_mut().semver_dirty_mut() = Some(".modified");
// Disable env vars we aren't using right now
*config.cargo_mut().features_mut() = false;
vergen.all_git().git_sha(true);
// git adds a "-dirty" flag if there are uncommitted changes.
// This doesn't quite match the SemVer 2.0 format, which uses dot separators.
vergen.git_describe(true, true, Some("v*.*.*"));
// Disable git if we're building with an invalid `zebra/.git`
match vergen(config.clone()) {
match vergen.fail_on_error().emit() {
Ok(_) => {}
Err(e) => {
eprintln!("git error in vergen build script: skipping git env vars: {e:?}",);
*config.git_mut().enabled_mut() = false;
vergen(config).expect("non-git vergen should succeed");
base_vergen_builder()
.emit()
.expect("non-git vergen should succeed");
}
}

View File

@ -59,32 +59,32 @@ pub fn app_config() -> config::Reader<ZebradApp> {
/// For details, see <https://semver.org/>
pub fn app_version() -> Version {
const CARGO_PKG_VERSION: &str = env!("CARGO_PKG_VERSION");
let vergen_git_semver: Option<&str> = option_env!("VERGEN_GIT_SEMVER_LIGHTWEIGHT");
let vergen_git_describe: Option<&str> = option_env!("VERGEN_GIT_DESCRIBE");
match vergen_git_semver {
// change the git semver format to the semver 2.0 format
Some(mut vergen_git_semver) if !vergen_git_semver.is_empty() => {
match vergen_git_describe {
// change the git describe format to the semver 2.0 format
Some(mut vergen_git_describe) if !vergen_git_describe.is_empty() => {
// strip the leading "v", if present
if &vergen_git_semver[0..1] == "v" {
vergen_git_semver = &vergen_git_semver[1..];
if &vergen_git_describe[0..1] == "v" {
vergen_git_describe = &vergen_git_describe[1..];
}
// split into tag, commit count, hash
let rparts: Vec<_> = vergen_git_semver.rsplitn(3, '-').collect();
let rparts: Vec<_> = vergen_git_describe.rsplitn(3, '-').collect();
match rparts.as_slice() {
// assume it's a cargo package version or a git tag with no hash
[_] | [_, _] => vergen_git_semver.parse().unwrap_or_else(|_| {
[_] | [_, _] => vergen_git_describe.parse().unwrap_or_else(|_| {
panic!(
"VERGEN_GIT_SEMVER without a hash {vergen_git_semver:?} must be valid semver 2.0"
"VERGEN_GIT_DESCRIBE without a hash {vergen_git_describe:?} must be valid semver 2.0"
)
}),
// it's the "git semver" format, which doesn't quite match SemVer 2.0
// it's the "git describe" format, which doesn't quite match SemVer 2.0
[hash, commit_count, tag] => {
let semver_fix = format!("{tag}+{commit_count}.{hash}");
semver_fix.parse().unwrap_or_else(|_|
panic!("Modified VERGEN_GIT_SEMVER {vergen_git_semver:?} -> {rparts:?} -> {semver_fix:?} must be valid. Note: CARGO_PKG_VERSION was {CARGO_PKG_VERSION:?}."))
panic!("Modified VERGEN_GIT_DESCRIBE {vergen_git_describe:?} -> {rparts:?} -> {semver_fix:?} must be valid. Note: CARGO_PKG_VERSION was {CARGO_PKG_VERSION:?}."))
}
_ => unreachable!("split is limited to 3 parts"),
@ -141,7 +141,7 @@ impl ZebradApp {
/// not match the compiled source code.
pub fn git_commit() -> Option<&'static str> {
const GIT_COMMIT_GCLOUD: Option<&str> = option_env!("SHORT_SHA");
const GIT_COMMIT_VERGEN: Option<&str> = option_env!("VERGEN_GIT_SHA_SHORT");
const GIT_COMMIT_VERGEN: Option<&str> = option_env!("VERGEN_GIT_SHA");
GIT_COMMIT_GCLOUD.or(GIT_COMMIT_VERGEN)
}
@ -259,6 +259,7 @@ impl Application for ZebradApp {
("Zcash network", config.network.network.to_string()),
// constants
("state version", DATABASE_FORMAT_VERSION.to_string()),
("features", env!("VERGEN_CARGO_FEATURES").to_string()),
];
// git env vars can be skipped if there is no `.git` during the
@ -280,7 +281,10 @@ impl Application for ZebradApp {
let build_metadata: Vec<_> = [
("target triple", env!("VERGEN_CARGO_TARGET_TRIPLE")),
("build profile", env!("VERGEN_CARGO_PROFILE")),
("rust compiler", env!("VERGEN_RUSTC_SEMVER")),
("rust release date", env!("VERGEN_RUSTC_COMMIT_DATE")),
("optimization level", env!("VERGEN_CARGO_OPT_LEVEL")),
("debug checks", env!("VERGEN_CARGO_DEBUG")),
]
.iter()
.map(|(k, v)| (*k, v.to_string()))