variable "GITHUB_ACTOR" {} variable "GITHUB_REPOSITORY" {} variable "GITHUB_REF" {} variable "GITHUB_REF_NAME" {} variable "GITHUB_REF_SHA" { default = "HEAD" } variable "acct" { default = "${GITHUB_ACTOR}" } variable "repo" { default = "${GITHUB_REPOSITORY}" } variable "docker_repo" { default = "${repo}" } variable "git_ref" { default = "${GITHUB_REF}" } variable "git_ref_sha" { default = "${GITHUB_REF_SHA}" } variable "git_ref_name" { default = "${GITHUB_REF_NAME}" } cargo_feat_sets = { none = "" # Default features default = "brotli_compression,element_hacks,gzip_compression,io_uring,jemalloc,jemalloc_conf,media_thumbnail,release_max_log_level,systemd,url_preview,zstd_compression" # All features sans release_max_log_level logging = "blurhashing,brotli_compression,bzip2_compression,console,direct_tls,element_hacks,gzip_compression,io_uring,jemalloc,jemalloc_conf,jemalloc_prof,jemalloc_stats,ldap,lz4_compression,media_thumbnail,perf_measurements,sentry_telemetry,systemd,tokio_console,tuwunel_mods,url_preview,zstd_compression" # All features all = "blurhashing,brotli_compression,bzip2_compression,console,direct_tls,element_hacks,gzip_compression,io_uring,jemalloc,jemalloc_conf,jemalloc_prof,jemalloc_stats,ldap,lz4_compression,media_thumbnail,perf_measurements,release_max_log_level,sentry_telemetry,systemd,tokio_console,tuwunel_mods,url_preview,zstd_compression" } variable "cargo_features_always" { default = "direct_tls" } variable "feat_sets" { default = "[\"none\", \"default\", \"all\"]" } variable "cargo_profiles" { default = "[\"test\", \"release\"]" } variable "install_prefix" { default = "/usr" } variable "rust_msrv" { default = "stable" } variable "rust_toolchains" { default = "[\"nightly\", \"stable\"]" } variable "rust_targets" { default = "[\"x86_64-unknown-linux-gnu\"]" } variable "sys_names" { default = "[\"debian\"]" } variable "sys_versions" { default = "[\"testing-slim\"]" } variable "sys_targets" { default = "[\"x86_64-v1-linux-gnu\"]" } # RocksDB options variable "rocksdb_portable" { default = "1" } variable "rocksdb_opt_level" { default = "3" } variable "rocksdb_build_type" { default = "Release" } variable "rocksdb_make_verbose" { default = "ON" } variable "rocksdb_numa" { default = "0" } # Complement options variable "complement_count" { default = 1 } variable "complement_debug" { default = 0 } variable "complement_run" { default = ".*" } variable "complement_skip" { default = "" } # Package metadata inputs variable "package_name" { default = "tuwunel" } variable "package_authors" { default = "Jason Volk " } variable "package_version" { default = "1.0" } variable "package_revision" { default = "" } variable "package_last_modified" { default = "" } # Compression options variable "zstd_image_compress_level" { default = 11 } variable "gz_image_compress_level" { default = 7 } variable "cache_compress_level" { default = 7 } # Use the cargo-chef layering strategy to separate and pre-build dependencies # in a lower-layer image; only workspace crates will rebuild unless # dependencies themselves change (default). This option can be set to false for # bypassing chef, building within a single layer. variable "use_chef" { default = "true" } # Options for output verbosity variable "BUILDKIT_PROGRESS" {} variable "CARGO_TERM_VERBOSE" { default = false } variable "docker_dir" { default = "." } # Override the project checkout variable "git_checkout" { default = "HEAD" } # # Rustflags # rustflags = [ "-C link-arg=--verbose", "-C link-arg=-Wl,--gc-sections", ] static_rustflags = [ "-C relocation-model=static", "-C target-feature=+crt-static", ] static_libs = [ "-C link-arg=-l:libstdc++.a", "-C link-arg=-l:libc.a", "-C link-arg=-l:libm.a", ] dynamic_rustflags = [ "-C relocation-model=pic", "-C target-feature=-crt-static", "-C link-arg=-Wl,--as-needed", ] dynamic_libs = [ "-C link-arg=-lstdc++", "-C link-arg=-lc", "-C link-arg=-lm", ] nightly_rustflags = [ "--cfg tokio_unstable", "--allow=unstable-features", "-Z crate-attr=feature(test)", "-Z enforce-type-length-limit", #"-Z time-passes", #"-Z time-llvm-passes", ] static_nightly_rustflags = [ "-Z tls-model=local-exec", ] native_rustflags = [ "-C target-cpu=native", "-Z tune-cpu=native", "-Z inline-mir=true", "-Z mir-opt-level=3", ] override_rustflags = [ "-C relocation-model=pic", "-C target-feature=-crt-static", "-C link-arg=-Wl,--no-gc-sections", ] macro_rustflags = [ "-C relocation-model=pic", "-C target-feature=-crt-static", ] # # Default # group "default" { targets = [ "lints", "tests", ] } group "lints" { targets = [ "audit", "check", "clippy", "fmt", "lychee", ] } group "tests" { targets = [ "docs", "unit", "smoke", "integration", "matrix-compliance", ] } group "matrix-compliance" { targets = [ "complement", "rust-sdk-integ", ] } # # Common matrices # cargo_rust_feat_sys = { cargo_profile = jsondecode(cargo_profiles) rust_toolchain = jsondecode(rust_toolchains) rust_target = jsondecode(rust_targets) feat_set = jsondecode(feat_sets) sys_name = jsondecode(sys_names) sys_version = jsondecode(sys_versions) sys_target = jsondecode(sys_targets) } rust_feat_sys = { rust_toolchain = jsondecode(rust_toolchains) rust_target = jsondecode(rust_targets) feat_set = jsondecode(feat_sets) sys_name = jsondecode(sys_names) sys_version = jsondecode(sys_versions) sys_target = jsondecode(sys_targets) } # # Publish # group "publish" { targets = [ "dockerhub", "github", ] } target "ghcr_io" { name = elem("github", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]) tags = [ "ghcr.io/${repo}:${git_ref_name}-${cargo_profile}-${feat_set}-${sys_target}", ] output = ["type=registry,oci-mediatypes=true,compression=zstd,compression-level=${zstd_image_compress_level},force-compression=true,mode=min"] matrix = cargo_rust_feat_sys inherits = [ elem("docker", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]), ] } target "docker_io" { name = elem("dockerhub", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]) tags = [ "docker.io/${docker_repo}:${git_ref_name}-${cargo_profile}-${feat_set}-${sys_target}", ] output = ["type=registry,oci-mediatypes=true,compression=zstd,compression-level=${zstd_image_compress_level},force-compression=true,mode=min"] matrix = cargo_rust_feat_sys inherits = [ elem("docker", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]), ] } # # Complement tests # group "complement" { targets = [ "complement-tester", "complement-testee", #"complement-tester-valgrind", #"complement-testee-valgrind", ] } complement_args = { complement_count = "${complement_count}" complement_debug = "${complement_debug}" complement_run = "${complement_run}" complement_skip = "${complement_skip}" } target "complement-testee-valgrind" { name = elem("complement-testee-valgrind", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]) tags = [ elem_tag("complement-testee-valgrind", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target], "latest"), ] target = "complement-testee-valgrind" entitlements = ["network.host"] dockerfile = "${docker_dir}/Dockerfile.complement" matrix = cargo_rust_feat_sys inherits = [ elem("smoke-valgrind", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]), elem("complement-testee", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]) ] contexts = { input = elem("target:smoke-valgrind", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]) complement-tester = elem("target:complement-tester-valgrind", [sys_name, sys_version, sys_target]) } } target "complement-testee" { name = elem("complement-testee", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]) tags = [ elem_tag("complement-testee", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target], "latest"), ] target = "complement-testee" output = ["type=docker,compression=zstd,mode=min"] entitlements = ["network.host"] dockerfile = "${docker_dir}/Dockerfile.complement" matrix = cargo_rust_feat_sys inherits = [ elem("install", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]) ] contexts = { input = elem("target:install", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]) complement-tester = elem("target:complement-tester", [sys_name, sys_version, sys_target]) complement-config = elem("target:complement-config", [sys_name, sys_version, sys_target]) } args = { RUST_BACKTRACE = "full" } } target "complement-tester-valgrind" { name = elem("complement-tester-valgrind", [sys_name, sys_version, sys_target]) tags = [ elem_tag("complement-tester-valgrind", [sys_name, sys_version, sys_target], "latest"), ] entitlements = ["network.host"] matrix = sys inherits = [ elem("complement-tester", [sys_name, sys_version, sys_target]), ] contexts = { input = elem("target:complement-tester", [sys_name, sys_version, sys_target]) } } target "complement-tester" { name = elem("complement-tester", [sys_name, sys_version, sys_target]) tags = [ elem_tag("complement-tester", [sys_name, sys_version, sys_target], "latest"), ] target = "complement-tester" output = ["type=docker,compression=zstd,mode=min,compression-level=${zstd_image_compress_level}"] entitlements = ["network.host"] matrix = sys inherits = [ elem("complement-base", [sys_name, sys_version, sys_target]), ] contexts = { complement-config = elem("target:complement-config", [sys_name, sys_version, sys_target]) input = elem("target:complement-base", [sys_name, sys_version, sys_target]) } } target "complement-base" { name = elem("complement-base", [sys_name, sys_version, sys_target]) tags = [ elem_tag("complement-base", [sys_name, sys_version, sys_target], "latest") ] target = "complement-base" matrix = sys inherits = [ elem("complement-config", [sys_name, sys_version, sys_target]) ] contexts = { input = elem("target:builder", [sys_name, sys_version, sys_target]) } args = complement_args } target "complement-config" { name = elem("complement-config", [sys_name, sys_version, sys_target]) tags = [ elem_tag("complement-config", [sys_name, sys_version, sys_target], "latest") ] target = "complement-config" dockerfile = "${docker_dir}/Dockerfile.complement" matrix = sys inherits = [ elem("source", [sys_name, sys_version, sys_target]) ] contexts = { source = elem("target:source", [sys_name, sys_version, sys_target]) } } # # Integration tests # group "integration" { targets = [ "integ", "rust-sdk-integ", ] } variable "valgrind_max_workers" { default = 128 } variable "valgrind_flags" { default = "--error-exitcode=1 --exit-on-first-error=yes --undef-value-errors=no --leak-check=no" } variable "valgrind_testee_args" { default = "-Odb_pool_max_workers=${valgrind_max_workers}" } target "rust-sdk-valgrind" { name = elem("rust-sdk-valgrind", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]) tags = [ elem_tag("rust-sdk-valgrind", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target], "latest"), ] matrix = cargo_rust_feat_sys inherits = [ elem("rust-sdk-integ", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]) ] contexts = { input = elem("target:rust", [rust_toolchain, rust_target, sys_name, sys_version, sys_target]) install = elem("target:install", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]) } args = { VALGRINDFLAGS = "${valgrind_flags}" mrsdk_testee = "valgrind ${valgrind_flags} /usr/bin/tuwunel ${valgrind_testee_args}" mrsdk_test_args = "" mrsdk_startup_delay = "30s" mrsdk_skip_list =<