Compare commits
9
Commits
10bd747a7b
...
v2026.9.23
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
697f647f8b | ||
|
|
14250cee03 | ||
|
|
cea3d53eb0 | ||
|
|
335281f1de | ||
|
|
7f14992e81 | ||
|
|
1f963a9a1c | ||
|
|
b353f4ad2a | ||
|
|
d7a428a4ce | ||
|
|
367bb2c641 |
@@ -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
@@ -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
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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(),
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
@@ -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"), ")")
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user