variable "CI" {} 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 "docker_tag_preview" { default = false } variable "docker_tag_latest" { default = false } 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 = "brotli_compression,element_hacks,gzip_compression,io_uring,jemalloc,jemalloc_conf,media_thumbnail,release_max_log_level,systemd,url_preview,zstd_compression" all = "blurhashing,brotli_compression,tuwunel_mods,console,default,direct_tls,element_hacks,gzip_compression,hardened_malloc,io_uring,jemalloc,jemalloc_conf,jemalloc_prof,jemalloc_stats,ldap,media_thumbnail,perf_measurements,release_max_log_level,sentry_telemetry,systemd,tokio_console,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_toolchains" { default = "[\"nightly\", \"stable\"]" } variable "rust_targets" { default = "[\"x86_64-unknown-linux-gnu\"]" } variable "sys_targets" { default = "[\"x86_64-linux-gnu\"]" } variable "sys_versions" { default = "[\"testing-slim\"]" } variable "sys_names" { default = "[\"debian\"]" } # 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" } # 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 = [] nightly_rustflags = [ "--cfg tokio_unstable", "--cfg tuwunel_bench", "--allow=unstable-features", "-Z crate-attr=feature(test)", "-Z enforce-type-length-limit", #"-Z time-passes", #"-Z time-llvm-passes", ] static_rustflags = [ "-C relocation-model=static", "-C target-feature=+crt-static", "-C link-arg=--verbose", "-C link-arg=-Wl,--gc-sections", "-C link-arg=-L/usr/lib/gcc/x86_64-linux-gnu/14", # FIXME "-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=--verbose", "-C link-arg=-Wl,--gc-sections", "-C link-arg=-Wl,--as-needed", "-C link-arg=-lstdc++", "-C link-arg=-lc", "-C link-arg=-lm", ] static_nightly_rustflags = [ "-Z tls-model=local-exec", ] rmp_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 = [ "unit", "smoke", "complement", ] } # # 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 "github" { 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}", docker_tag_preview? "ghcr.io/${repo}:preview": "", docker_tag_latest? "ghcr.io/${repo}:latest": "", ] output = ["type=registry,compression=zstd,mode=min,compression-level=${zstd_image_compress_level}"] matrix = cargo_rust_feat_sys inherits = [ elem("docker", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]), ] } target "dockerhub" { name = elem("dockerhub", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]) tags = [ "${docker_repo}:${git_ref_name}-${cargo_profile}-${feat_set}-${sys_target}", docker_tag_preview? "${docker_repo}:preview": "", docker_tag_latest? "${docker_repo}:latest": "", ] output = ["type=registry,compression=zstd,mode=min,compression-level=${zstd_image_compress_level}"] 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:base", [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]) } } # # Smoke tests # group "smoke" { targets = [ "smoke-version", "smoke-startup", #"smoke-valgrind", #"smoke-perf", ] } target "smoke-valgrind" { name = elem("smoke-valgrind", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]) tags = [ elem_tag("smoke-valgrind", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target], "latest"), ] target = "smoke-valgrind" matrix = cargo_rust_feat_sys inherits = [ elem("install-valgrind", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]), elem("tests-smoke", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]) ] contexts = { input = elem("target:install-valgrind", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]) } } target "smoke-perf" { name = elem("smoke-perf", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]) tags = [ elem_tag("smoke-perf", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target], "latest"), ] target = "smoke-perf" matrix = cargo_rust_feat_sys inherits = [ elem("install-perf", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]), elem("tests-smoke", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]) ] contexts = { input = elem("target:install-perf", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]) } } target "smoke-startup" { name = elem("smoke-startup", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]) tags = [ elem_tag("smoke-startup", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target], "latest") ] target = "smoke-startup" matrix = cargo_rust_feat_sys inherits = [ elem("tests-smoke", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]) ] } target "smoke-version" { name = elem("smoke-version", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]) tags = [ elem_tag("smoke-version", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target], "latest"), ] target = "smoke-version" matrix = cargo_rust_feat_sys inherits = [ elem("tests-smoke", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]) ] } target "tests-smoke" { name = elem("tests-smoke", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]) tags = [ elem_tag("tests-smoke", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target], "latest"), ] output = ["type=cacheonly,compression=zstd,mode=min,compression-level=${cache_compress_level}"] dockerfile = "${docker_dir}/Dockerfile.smoketest" 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]) } } # # Installation # group "installs" { targets = [ "install", "static", "docker", "oci", ] } install_labels = { "org.opencontainers.image.authors" = "${package_authors}" "org.opencontainers.image.created" ="${package_last_modified}" "org.opencontainers.image.description" = "Matrix Chat Server in Rust" "org.opencontainers.image.documentation" = "https://github.com/matrix-construct/tuwunel/tree/main/docs/" "org.opencontainers.image.licenses" = "Apache-2.0" "org.opencontainers.image.revision" = "${package_revision}" "org.opencontainers.image.source" = "https://github.com/matrix-construct/tuwunel" "org.opencontainers.image.title" = "${package_name}" "org.opencontainers.image.url" = "https://github.com/matrix-construct/tuwunel" "org.opencontainers.image.vendor" = "matrix-construct" "org.opencontainers.image.version" = "${package_version}" } target "oci" { name = elem("oci", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]) tags = [ elem_tag("oci", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target], "latest"), ] output = ["type=oci,dest=tuwunel-oci.tar.zst,mode=min,compression=zstd,compression-level=${zstd_image_compress_level}"] matrix = cargo_rust_feat_sys inherits = [ elem("docker", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]), ] } target "docker" { name = elem("docker", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]) tags = [ elem_tag("docker", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target], "latest"), ] output = ["type=docker,compression=gzip,mode=min,compression-level=${gz_image_compress_level}"] matrix = cargo_rust_feat_sys inherits = [ elem("static", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]), elem("install", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]), ] contexts = { input = ( rust_toolchain == "stable" || cargo_profile == "release" || cargo_profile == "release-debuginfo" || cargo_profile == "release-native"? elem("target:static", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]): elem("target:install", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]) ) } dockerfile-inline =<