9 Commits
Author SHA1 Message Date
jcoffey-dev 697f647f8b Merge pull request 'Release 2026.9.23' (#14) from release/2026.9.23 into main
publish / version (push) Successful in 14s
ci / build (push) Successful in 7m8s
publish / publish (push) Successful in 47m16s
publish / release (push) Successful in 2s
2026-09-22 20:34:46 +00:00
jcoffey-dev 14250cee03 Release 2026.9.23
ci / build (pull_request) Successful in 7m10s
Carries the version string and user-visible string fixes: nothing a user or
operator sees names the upstream project any more.
2026-09-22 13:27:05 -07:00
jcoffey-dev cea3d53eb0 Delete .gitlab-ci.yml
ci / build (push) Successful in 4m18s
2026-09-22 20:26:17 +00:00
jcoffey-dev 335281f1de Merge pull request 'Keep the upstream name out of user-visible strings' (#13) from fix/user-visible-name-strings into main
ci / build (push) Canceled after 45s
2026-09-22 20:25:30 +00:00
jcoffey-dev 7f14992e81 Keep the upstream project's name out of user-visible strings
ci / build (pull_request) Successful in 3m46s
The first-party application descriptions and the telemetry service name and
instrumentation scope are shown to operators, and the unpacked-application
temp directory carried the name too.

Left alone deliberately: the OAuth key-derivation contexts (renaming them
would invalidate every sealed token and client id), the migration defaults
that read an upstream installation, links to upstream's upgrade guide, the
wire-protocol identifiers, and upstream's own license and templates.
2026-09-22 13:21:15 -07:00
jcoffey-dev 1f963a9a1c Merge pull request 'Keep the upstream name out of the version string' (#12) from fix/version-string-name into main
ci / build (push) Successful in 4m7s
2026-09-22 20:07:52 +00:00
jcoffey-dev b353f4ad2a Keep the upstream project's name out of the version string
ci / build (pull_request) Successful in 7m9s
brand_version_full! is user-visible -- --version, the startup banner, the
console, telemetry and the JMAP session's implementation field -- and the
name belongs only in copyright notices and the lineage line.
2026-09-22 13:00:13 -07:00
jcoffey-dev d7a428a4ce Merge pull request 'Release 2026.9.22, and pin the cargo-chef base image' (#11) from release/2026.9.22 into main
publish / version (push) Successful in 35s
ci / build (push) Successful in 7m10s
publish / publish (push) Successful in 48m26s
publish / release (push) Successful in 5s
2026-09-22 19:00:36 +00:00
jcoffey-dev 367bb2c641 Release 2026.9.22, and pin the cargo-chef base image
ci / build (pull_request) Successful in 4m42s
The version macro drives the release tag and what the server reports. The
builder's base image was the one image reference still floating on a tag.
2026-09-22 11:55:25 -07:00
7 changed files with 14 additions and 60 deletions
-50
View File
@@ -1,50 +0,0 @@
# CI on the self-hosted GitLab, ported from .github/workflows/ci.yml when the
# GitHub account was suspended on 2026-09-20. The Actions file stays in the
# tree: it is the reference this was written from and works unchanged if the
# appeal succeeds.
#
# The image is pinned by digest, with its tag in the trailing comment. That
# replaces the SHA-pinned `uses:` in the workflow -- GitLab has no action
# allowlist, so the digest is the only thing fixing what actually runs.
#
# Not ported here:
# * cleanup.yml pruned GHCR with dataaxiom/ghcr-cleanup-action. GitLab has
# no equivalent action because it does not need one: the container
# registry has a cleanup policy on the project itself, which is where that
# job's settings now live.
# * publish.yml and release.yml still need doing; they are larger and are
# being handled separately.
stages: [build]
default:
interruptible: true
build:
stage: build
image: rust:1-bookworm@sha256:93ce27a88655056a51dbdd8f5f2d7ddc071c7b0070fb288a37b5a285fc83971e # 1-bookworm
# This is a big workspace and a cold build is expensive, so the registry and
# the target directory are cached between runs. Both are kept inside the
# project directory because that is the only path the runner will cache --
# and deliberately not on /tmp, which on this host is a tmpfs that a Rust
# build of this size has filled before.
variables:
CARGO_HOME: "$CI_PROJECT_DIR/.cargo"
CARGO_TARGET_DIR: "$CI_PROJECT_DIR/target"
CARGO_INCREMENTAL: "0"
cache:
key:
files: [Cargo.lock]
paths:
- .cargo/registry/
- target/
before_script:
- apt-get update -qq && apt-get install -y -qq --no-install-recommends clang >/dev/null
script:
- cargo build -p inbuxa --locked
# --no-run: the workflow compiled every test target without running them,
# which catches a test that no longer builds without paying for the suite.
- cargo test --workspace --locked --no-run
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+1 -1
View File
@@ -1,4 +1,4 @@
FROM --platform=$BUILDPLATFORM docker.io/lukemathwalker/cargo-chef:latest-rust-slim-trixie AS chef FROM --platform=$BUILDPLATFORM docker.io/lukemathwalker/cargo-chef:latest-rust-slim-trixie@sha256:38dfdbf4fda95c516f873f33032e490baa988b75f7d83c7d12f788f770785b36 AS chef
WORKDIR /build WORKDIR /build
FROM --platform=$BUILDPLATFORM chef AS planner FROM --platform=$BUILDPLATFORM chef AS planner
+2 -2
View File
@@ -583,10 +583,10 @@ impl Metrics {
pub async fn parse(bp: &mut Bootstrap) -> Self { pub async fn parse(bp: &mut Bootstrap) -> Self {
let metrics = bp.setting_infallible::<structs::Metrics>().await; let metrics = bp.setting_infallible::<structs::Metrics>().await;
let resource = Resource::builder() let resource = Resource::builder()
.with_service_name("stalwart") .with_service_name("inbuxa")
.with_attribute(KeyValue::new(SERVICE_VERSION, types::brand_version_full!())) .with_attribute(KeyValue::new(SERVICE_VERSION, types::brand_version_full!()))
.build(); .build();
let instrumentation = InstrumentationScope::builder("stalwart") let instrumentation = InstrumentationScope::builder("inbuxa")
.with_version(types::brand_version_full!()) .with_version(types::brand_version_full!())
.build(); .build();
+1 -1
View File
@@ -522,7 +522,7 @@ mod tests {
} }
async fn fixture(name: &str, client_id: Option<&str>) -> (WebApplications, TempDir) { async fn fixture(name: &str, client_id: Option<&str>) -> (WebApplications, TempDir) {
let dir = TempDir::new(std::env::temp_dir().join(format!("stalwart-app-{name}"))); let dir = TempDir::new(std::env::temp_dir().join(format!("inbuxa-app-{name}")));
dir.clean().await.unwrap(); dir.clean().await.unwrap();
tokio::fs::write(dir.path.join("index.html"), INDEX) tokio::fs::write(dir.path.join("index.html"), INDEX)
.await .await
+2 -2
View File
@@ -298,7 +298,7 @@ mod tests {
fn web_interface() -> Application { fn web_interface() -> Application {
Application { Application {
description: "Stalwart Web Interface".to_string(), description: "INBUXA Web Interface".to_string(),
enabled: true, enabled: true,
url_prefix: Map::new(vec!["/admin".into(), "/account".into()]), url_prefix: Map::new(vec!["/admin".into(), "/account".into()]),
..Default::default() ..Default::default()
@@ -312,7 +312,7 @@ mod tests {
clients, clients,
vec![FirstPartyClient { vec![FirstPartyClient {
client_id: WEB_INTERFACE_CLIENT_ID.to_string(), client_id: WEB_INTERFACE_CLIENT_ID.to_string(),
description: "Stalwart Web Interface (served by this server)".to_string(), description: "INBUXA Web Interface (served by this server)".to_string(),
redirect_uris: vec![ redirect_uris: vec![
"https://mail.example.org/admin/oauth/callback".to_string(), "https://mail.example.org/admin/oauth/callback".to_string(),
"https://mail.example.org/account/oauth/callback".to_string(), "https://mail.example.org/account/oauth/callback".to_string(),
+2 -2
View File
@@ -29,11 +29,11 @@ pub(crate) fn spawn_otel_tracer(builder: SubscriberBuilder, mut otel: OtelTracer
let (_, mut rx) = builder.register(); let (_, mut rx) = builder.register();
tokio::spawn(async move { tokio::spawn(async move {
let resource = Resource::builder() let resource = Resource::builder()
.with_service_name("stalwart") .with_service_name("inbuxa")
.with_attribute(KeyValue::new(SERVICE_VERSION, types::brand_version_full!())) .with_attribute(KeyValue::new(SERVICE_VERSION, types::brand_version_full!()))
.build(); .build();
let instrumentation = InstrumentationScope::builder("stalwart") let instrumentation = InstrumentationScope::builder("inbuxa")
.with_version(types::brand_version_full!()) .with_version(types::brand_version_full!())
.build(); .build();
+6 -2
View File
@@ -71,7 +71,7 @@ pub fn env_var(name: &str) -> Result<String, std::env::VarError> {
#[macro_export] #[macro_export]
macro_rules! brand_version { macro_rules! brand_version {
() => { () => {
"2026.9.20" "2026.9.23"
}; };
} }
@@ -82,7 +82,11 @@ macro_rules! brand_version {
/// this becomes just the version. /// this becomes just the version.
#[macro_export] #[macro_export]
macro_rules! brand_version_full { macro_rules! brand_version_full {
// The upstream crate version, without naming the upstream project: this
// string is user-visible (--version, the startup banner, the console,
// telemetry and the JMAP session's "implementation" field), and the name
// belongs only in copyright notices and the lineage line.
() => { () => {
concat!($crate::brand_version!(), " (Stalwart ", env!("CARGO_PKG_VERSION"), ")") concat!($crate::brand_version!(), " (upstream ", env!("CARGO_PKG_VERSION"), ")")
}; };
} }