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 "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 "image_compress_level" { default = 11 } 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" } nightly_rustflags = [ "--cfg tokio_unstable", "--cfg tuwunel_bench", "--allow=unstable-features", "-Zcrate-attr=feature(test)", "-Zenforce-type-length-limit", #"-Ztime-passes", #"-Ztime-llvm-passes", ] static_rustflags = [ "-Crelocation-model=static", "-Ctarget-feature=+crt-static", "-Clink-arg=--verbose", "-Clink-arg=-Wl,--gc-sections", "-Clink-arg=-L/usr/lib/gcc/x86_64-linux-gnu/14", # FIXME "-Clink-arg=-l:libstdc++.a", "-Clink-arg=-l:libc.a", "-Clink-arg=-l:libm.a", ] dynamic_rustflags = [ "-Crelocation-model=pic", "-Ctarget-feature=-crt-static", "-Clink-arg=--verbose", "-Clink-arg=-Wl,--gc-sections", "-Clink-arg=-Wl,--as-needed", "-Clink-arg=-lstdc++", "-Clink-arg=-lc", "-Clink-arg=-lm", ] static_nightly_rustflags = [ "-Ztls-model=local-exec", ] rmp_rustflags = [ "-Ctarget-cpu=native", "-Ztune-cpu=native", "-Zinline-mir=true", "-Zmir-opt-level=3", ] override_rustflags = [ "-Crelocation-model=pic", "-Ctarget-feature=-crt-static", "-Clink-arg=-Wl,--no-gc-sections", ] macro_rustflags = [ "-Crelocation-model=pic", "-Ctarget-feature=-crt-static", ] # # Default # group "default" { targets = [ "lints", "tests", ] } group "lints" { targets = [ "audit", "check", "clippy", "fmt", "lychee", ] } group "tests" { targets = [ "tests-unit", "tests-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) } feat_sys = { feat_set = jsondecode(feat_sets) sys_name = jsondecode(sys_names) sys_version = jsondecode(sys_versions) sys_target = jsondecode(sys_targets) } sys = { 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}", (substr(git_ref, 0, 10) == "refs/tags/" && cargo_profile == "release" && feat_set == "all")? "ghcr.io/${repo}:latest": "", ] output = ["type=registry,compression=zstd,mode=min,compression-level=${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}", (substr(git_ref, 0, 10) == "refs/tags/" && cargo_profile == "release" && feat_set == "all")? "${docker_repo}:latest": "", ] output = ["type=registry,compression=zstd,mode=min,compression-level=${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("smoketest-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:smoketest-valgrind", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]) complement-tester = elem("target:complement-tester-valgrind", [feat_set, 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", [feat_set, sys_name, sys_version, sys_target]) complement-config = elem("target:complement-config", [feat_set, sys_name, sys_version, sys_target]) } args = { RUST_BACKTRACE = "full" } } target "complement-tester-valgrind" { name = elem("complement-tester-valgrind", [feat_set, sys_name, sys_version, sys_target]) tags = [ elem_tag("complement-tester-valgrind", [feat_set, sys_name, sys_version, sys_target], "latest"), ] target = "complement-tester-valgrind" entitlements = ["network.host"] matrix = feat_sys inherits = [ elem("complement-tester", [feat_set, sys_name, sys_version, sys_target]), ] contexts = { input = elem("target:complement-tester", [feat_set, sys_name, sys_version, sys_target]) } } target "complement-tester" { name = elem("complement-tester", [feat_set, sys_name, sys_version, sys_target]) tags = [ elem_tag("complement-tester", [feat_set, sys_name, sys_version, sys_target], "latest"), ] target = "complement-tester" output = ["type=docker,compression=zstd,mode=min,compression-level=${image_compress_level}"] entitlements = ["network.host"] matrix = feat_sys inherits = [ elem("complement-base", [feat_set, sys_name, sys_version, sys_target]) ] contexts = { input = elem("target:complement-base", [feat_set, sys_name, sys_version, sys_target]) complement-config = elem("target:complement-config", [feat_set, sys_name, sys_version, sys_target]) } } target "complement-base" { name = elem("complement-base", [feat_set, sys_name, sys_version, sys_target]) tags = [ elem_tag("complement-base", [feat_set, sys_name, sys_version, sys_target], "latest") ] target = "complement-base" matrix = feat_sys inherits = [ elem("complement-config", [feat_set, sys_name, sys_version, sys_target]) ] contexts = { input = elem("target:diner", [feat_set, sys_name, sys_version, sys_target]) } args = complement_args } target "complement-config" { name = elem("complement-config", [feat_set, sys_name, sys_version, sys_target]) tags = [ elem_tag("complement-config", [feat_set, sys_name, sys_version, sys_target], "latest") ] target = "complement-config" dockerfile = "${docker_dir}/Dockerfile.complement" matrix = feat_sys inherits = [ elem("source", [feat_set, sys_name, sys_version, sys_target]) ] contexts = { source = elem("target:source", [feat_set, sys_name, sys_version, sys_target]) } } # # Smoke tests # group "tests-smoke" { targets = [ "smoketest-version", "smoketest-startup", #"smoketest-valgrind", #"smoketest-perf", ] } target "smoketest-valgrind" { name = elem("smoketest-valgrind", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]) tags = [ elem_tag("smoketest-valgrind", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target], "latest"), ] target = "smoketest-valgrind" entitlements = ["security.insecure"] matrix = cargo_rust_feat_sys inherits = [ elem("valgrind", [feat_set, sys_name, sys_version, sys_target]), elem("smoketest", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]) ] contexts = { valgrind = elem("target:valgrind", [feat_set, sys_name, sys_version, sys_target]) } } target "smoketest-perf" { name = elem("smoketest-perf", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]) tags = [ elem_tag("smoketest-perf", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target], "latest"), ] target = "smoketest-perf" entitlements = ["security.insecure"] matrix = cargo_rust_feat_sys inherits = [ elem("perf", [feat_set, sys_name, sys_version, sys_target]), elem("smoketest", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]) ] contexts = { perf = elem("target:valgrind", [feat_set, sys_name, sys_version, sys_target]) } } target "smoketest-startup" { name = elem("smoketest-startup", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]) tags = [ elem_tag("smoketest-startup", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target], "latest") ] target = "smoketest-startup" matrix = cargo_rust_feat_sys inherits = [ elem("smoketest", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]) ] } target "smoketest-version" { name = elem("smoketest-version", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]) tags = [ elem_tag("smoketest-version", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target], "latest"), ] target = "smoketest-version" matrix = cargo_rust_feat_sys inherits = [ elem("smoketest", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]) ] } target "smoketest" { name = elem("smoketest", [cargo_profile, rust_toolchain, rust_target, feat_set, sys_name, sys_version, sys_target]) tags = [ elem_tag("smoketest", [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-level=${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"), ] 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-max-perf" || cargo_profile == "release" || cargo_profile == "release-debuginfo"? 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]) ) } target = "image" dockerfile-inline =<