MAM append использует один sync вместо четырёх, SM checkpoint — один вместо двух. Checksummed redo journals сохраняют commit-before-ACK и восстанавливают native archive/SM JSON exports после аварии. - Ограничены рост журналов, ротация и tombstone GC. Старый `.rappend` и legacy JSON импортируются. Retain/save/purge не возвращают удалённые записи. - Recovery синхронизирует валидный journal перед публикацией состояния; проверка checksum не заменяет durability barrier. EIO при adoption блокирует startup или offline handoff. Новые fault fixtures проверяют сохранность журнала и retry. - Replay SM проверяет checksum/JSON всех frames, но создаёт и валидирует полный Record только для последнего snapshot, сокращая работу с superseded queues. - `message-processing-slow` содержит времена MAM отправителя/получателя, доставки, carbons, offline/push и handled, а также число ресурсов/копий. Payload и секреты не добавляются в логи. - Добавлена offline команда `storage-checkpoint CONFIG`: durable экспорт и передача archive writer/подготовка отката на legacy Rust. Не запускайте другого writer и не удаляйте journals до успешного завершения команды. - Новые crash, partial-write, corruption, EIO, recovery, handoff и latency регрессии включены в GitHub Actions через verify-local.sh; отчёты сохраняются. Измерения, ограничения и эксплуатация: [docs/DURABLE-MESSAGE-IO.md](docs/DURABLE-MESSAGE-IO.md), [docs/VALIDATION-0.8.3.md](docs/VALIDATION-0.8.3.md).
159 lines
5.8 KiB
YAML
159 lines
5.8 KiB
YAML
name: Test, build and publish
|
|
|
|
on:
|
|
push:
|
|
pull_request:
|
|
workflow_dispatch:
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
concurrency:
|
|
group: ci-${{ github.workflow }}-${{ github.ref }}
|
|
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
|
|
|
env:
|
|
CARGO_INCREMENTAL: '0'
|
|
CARGO_PROFILE_DEV_DEBUG: '0'
|
|
CARGO_PROFILE_TEST_DEBUG: '0'
|
|
RUST_BACKTRACE: '1'
|
|
|
|
jobs:
|
|
verify:
|
|
name: All tests and Linux binary
|
|
runs-on: ubuntu-24.04
|
|
timeout-minutes: 90
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
with:
|
|
persist-credentials: false
|
|
- name: Install native test dependencies and make room for 10 GiB tests
|
|
run: |
|
|
sudo rm -rf /usr/share/dotnet /usr/local/lib/android /opt/ghc
|
|
sudo apt-get update
|
|
sudo apt-get install -y --no-install-recommends build-essential pkg-config libssl-dev libicu-dev lua5.4 liblua5.4-dev lua-filesystem lua-expat lua-socket lua-sec openssl
|
|
rust_version=$(python3 -c 'import tomllib; print(tomllib.load(open("rust-toolchain.toml", "rb"))["toolchain"]["channel"])')
|
|
rustup toolchain install "$rust_version" --profile minimal --component rustfmt --component clippy
|
|
- uses: actions/setup-python@v5
|
|
with:
|
|
python-version: '3.12'
|
|
- uses: actions/setup-go@v5
|
|
with:
|
|
go-version: '1.24.3'
|
|
cache: false
|
|
- name: Build exact native Prosody reference
|
|
run: bash scripts/ci/prepare-reference.sh "$RUNNER_TEMP/reference"
|
|
- name: Build genuine MinIO
|
|
run: |
|
|
bash scripts/ci/prepare-minio.sh "$RUNNER_TEMP/minio"
|
|
go clean -cache -modcache
|
|
df -h . "$RUNNER_TEMP"
|
|
python3 -c 'import shutil; assert shutil.disk_usage(".").free >= 20 * 2**30, "Need 20 GiB free for actual upload tests"'
|
|
- name: Run every test, native oracle, load and real 10 GiB uploads
|
|
env:
|
|
PROSODY_REFERENCE_SOURCE: ${{ runner.temp }}/reference/prosody-cafd74b9c5ea
|
|
PROSODY_REFERENCE_LUA: lua5.4
|
|
MINIO_BINARY: ${{ runner.temp }}/minio
|
|
run: |
|
|
mkdir -p ci-results
|
|
set -o pipefail
|
|
bash scripts/ci/verify-all.sh 2>&1 | tee ci-results/verify.log
|
|
- name: Package tested binary
|
|
run: |
|
|
mkdir -p dist
|
|
cp target/release/rust-xmpp dist/rust-xmpp
|
|
chmod 0755 dist/rust-xmpp
|
|
dist/rust-xmpp --version
|
|
(cd dist && sha256sum rust-xmpp > SHA256SUMS)
|
|
- name: Save binary
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: rust-xmpp-linux-amd64
|
|
path: dist/
|
|
if-no-files-found: error
|
|
retention-days: 30
|
|
- name: Save test reports even on failure
|
|
if: always()
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: test-results
|
|
path: |
|
|
ci-results/
|
|
/tmp/muc-sm-load.json
|
|
/tmp/xmpp-message-latency.json
|
|
/tmp/personal-message-latency.json
|
|
/tmp/push-latency.json
|
|
/tmp/push-offline-latency.json
|
|
/tmp/bind2-archive-latency.json
|
|
/tmp/slow-storage-latency.json
|
|
/tmp/slow-storage-crash.json
|
|
/tmp/journal-recovery-sync.json
|
|
if-no-files-found: warn
|
|
retention-days: 14
|
|
|
|
image:
|
|
name: Container smoke test and Gitea publish
|
|
needs: verify
|
|
runs-on: ubuntu-24.04
|
|
timeout-minutes: 20
|
|
# Only the publication job needs registry credentials. PRs still build and test images.
|
|
env:
|
|
GITEA_REGISTRY: ${{ vars.GITEA_REGISTRY }}
|
|
GITEA_IMAGE: ${{ vars.GITEA_IMAGE }}
|
|
DEFAULT_BRANCH: ${{ github.event.repository.default_branch }}
|
|
PUBLISH: ${{ github.event_name != 'pull_request' && (github.ref == format('refs/heads/{0}', github.event.repository.default_branch) || startsWith(github.ref, 'refs/tags/v')) }}
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
with:
|
|
persist-credentials: false
|
|
- uses: actions/download-artifact@v4
|
|
with:
|
|
name: rust-xmpp-linux-amd64
|
|
path: dist
|
|
- name: Verify downloaded executable
|
|
run: |
|
|
(cd dist && sha256sum --check SHA256SUMS)
|
|
chmod 0755 dist/rust-xmpp
|
|
- uses: docker/setup-buildx-action@v3
|
|
- name: Build exact tested binary into runtime image
|
|
uses: docker/build-push-action@v6
|
|
with:
|
|
context: .
|
|
target: ci-runtime
|
|
platforms: linux/amd64
|
|
load: true
|
|
push: false
|
|
tags: rust-xmpp:ci
|
|
- name: Smoke-test runtime image
|
|
run: |
|
|
docker run --rm rust-xmpp:ci --version
|
|
docker run --rm --entrypoint /usr/local/bin/prosodyctl rust-xmpp:ci --version
|
|
id=$(docker create rust-xmpp:ci)
|
|
trap 'docker rm "$id" >/dev/null' EXIT
|
|
docker cp "$id:/usr/local/bin/rust-xmpp" /tmp/container-rust-xmpp
|
|
cmp dist/rust-xmpp /tmp/container-rust-xmpp
|
|
- name: Validate publication configuration
|
|
if: env.PUBLISH == 'true'
|
|
env:
|
|
REGISTRY_USER: ${{ secrets.GITEA_REGISTRY_USERNAME }}
|
|
REGISTRY_TOKEN: ${{ secrets.GITEA_REGISTRY_TOKEN }}
|
|
run: python3 scripts/ci/image-tags.py
|
|
id: image
|
|
- name: Login to private Gitea registry
|
|
if: env.PUBLISH == 'true'
|
|
uses: docker/login-action@v3
|
|
with:
|
|
registry: ${{ vars.GITEA_REGISTRY }}
|
|
username: ${{ secrets.GITEA_REGISTRY_USERNAME }}
|
|
password: ${{ secrets.GITEA_REGISTRY_TOKEN }}
|
|
- name: Push the smoke-tested image
|
|
if: env.PUBLISH == 'true'
|
|
env:
|
|
IMAGE_TAGS: ${{ steps.image.outputs.tags }}
|
|
run: |
|
|
while IFS= read -r tag; do
|
|
docker tag rust-xmpp:ci "$tag"
|
|
docker push "$tag"
|
|
printf 'Published `%s`\n' "$tag" >> "$GITHUB_STEP_SUMMARY"
|
|
done <<< "$IMAGE_TAGS"
|