mirror of
https://github.com/spantaleev/matrix-docker-ansible-deploy.git
synced 2026-04-02 21:04:50 +03:00
Compare commits
8 Commits
b3a0f52824
...
migration-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
08e2b5d618 | ||
|
|
9f52db133b | ||
|
|
4991ce3c90 | ||
|
|
36d0c5d8c3 | ||
|
|
4174eafd6b | ||
|
|
09221fd611 | ||
|
|
b3153fcc49 | ||
|
|
312cfe9b41 |
51
.github/workflows/matrix.yml
vendored
51
.github/workflows/matrix.yml
vendored
@@ -9,34 +9,37 @@ name: Matrix CI
|
|||||||
|
|
||||||
on: [push, pull_request] # yamllint disable-line rule:truthy
|
on: [push, pull_request] # yamllint disable-line rule:truthy
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
yamllint:
|
prek:
|
||||||
name: yamllint
|
name: Run prek hooks
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Check out
|
|
||||||
uses: actions/checkout@v6
|
|
||||||
- name: Run yamllint
|
|
||||||
uses: frenck/action-yamllint@v1.5.0
|
|
||||||
ansible-lint:
|
|
||||||
name: ansible-lint
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
container:
|
||||||
|
image: docker.io/archlinux:base-devel
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
# git must be installed before checkout so it does a proper clone
|
||||||
|
# (with .git directory) instead of a tarball download.
|
||||||
|
- name: Install git
|
||||||
|
run: pacman -Sy --noconfirm git
|
||||||
|
|
||||||
- name: Check out
|
- name: Check out
|
||||||
uses: actions/checkout@v6
|
uses: actions/checkout@v6
|
||||||
|
|
||||||
- name: Run ansible-lint
|
- name: Restore prek cache
|
||||||
uses: ansible/ansible-lint@v26.3.0
|
uses: actions/cache@v5
|
||||||
with:
|
with:
|
||||||
args: "roles/custom"
|
path: var/prek
|
||||||
setup_python: "true"
|
key: arch-prek-v1-${{ hashFiles('.pre-commit-config.yaml') }}
|
||||||
working_directory: ""
|
|
||||||
requirements_file: requirements.yml
|
- name: Install dependencies
|
||||||
precommit:
|
run: pacman -S --noconfirm --needed just mise python
|
||||||
name: Run pre-commit
|
|
||||||
runs-on: ubuntu-latest
|
- name: Run prek hooks
|
||||||
steps:
|
run: |
|
||||||
- name: Checkout code
|
# The checkout action sets safe.directory using its own bundled
|
||||||
uses: actions/checkout@v6
|
# git, which is separate from the pacman-installed git that prek uses.
|
||||||
- name: Run pre-commit
|
git config --global --add safe.directory "$GITHUB_WORKSPACE"
|
||||||
uses: pre-commit/action@v3.0.1
|
just prek-run-on-all
|
||||||
|
|||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -4,6 +4,7 @@
|
|||||||
.python-version
|
.python-version
|
||||||
.idea/
|
.idea/
|
||||||
.direnv/
|
.direnv/
|
||||||
|
/var/
|
||||||
|
|
||||||
# ignore roles pulled by ansible-galaxy
|
# ignore roles pulled by ansible-galaxy
|
||||||
/roles/galaxy/*
|
/roles/galaxy/*
|
||||||
|
|||||||
@@ -1,17 +1,16 @@
|
|||||||
---
|
---
|
||||||
default_install_hook_types: [pre-push]
|
|
||||||
|
|
||||||
exclude: "LICENSES/"
|
exclude: "^(LICENSES/|var/)"
|
||||||
|
|
||||||
# See: https://pre-commit.com/hooks.html
|
# See: https://pre-commit.com/hooks.html
|
||||||
repos:
|
repos:
|
||||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||||
rev: v6.0.0
|
rev: v6.0.0
|
||||||
hooks:
|
hooks:
|
||||||
# - id: check-executables-have-shebangs
|
|
||||||
- id: check-added-large-files
|
- id: check-added-large-files
|
||||||
- id: check-case-conflict
|
- id: check-case-conflict
|
||||||
- id: check-json
|
- id: check-json
|
||||||
|
- id: check-shebang-scripts-are-executable
|
||||||
- id: check-toml
|
- id: check-toml
|
||||||
- id: trailing-whitespace
|
- id: trailing-whitespace
|
||||||
- id: end-of-file-fixer
|
- id: end-of-file-fixer
|
||||||
@@ -24,3 +23,18 @@ repos:
|
|||||||
rev: v6.2.0
|
rev: v6.2.0
|
||||||
hooks:
|
hooks:
|
||||||
- id: reuse
|
- id: reuse
|
||||||
|
- repo: https://github.com/ansible/ansible-lint
|
||||||
|
rev: v26.3.0
|
||||||
|
hooks:
|
||||||
|
- id: ansible-lint
|
||||||
|
files: '^roles/custom/'
|
||||||
|
args: ['roles/custom']
|
||||||
|
pass_filenames: false
|
||||||
|
- repo: local
|
||||||
|
hooks:
|
||||||
|
- id: check-examples-vars-migration-version
|
||||||
|
name: Check examples/vars.yml migration version matches expected
|
||||||
|
entry: bin/check-examples-vars-migration-version.sh
|
||||||
|
language: script
|
||||||
|
files: '(examples/vars\.yml|roles/custom/matrix_playbook_migration/defaults/main\.yml)'
|
||||||
|
pass_filenames: false
|
||||||
|
|||||||
33
CHANGELOG.md
33
CHANGELOG.md
@@ -1,3 +1,36 @@
|
|||||||
|
# 2026-03-23
|
||||||
|
|
||||||
|
## Migration validation system introduced
|
||||||
|
|
||||||
|
Previously, when updating your setup, you had to remember to read the [CHANGELOG](CHANGELOG.md) file or risk breakage.
|
||||||
|
|
||||||
|
Now, the playbook includes a migration validation system that ensures you're aware of breaking changes before they affect your deployment.
|
||||||
|
You're now forced to acknowledge each breaking change, unless you wish to live dangerously (see below).
|
||||||
|
|
||||||
|
A new `matrix_playbook_migration_validated_version` variable has been introduced.
|
||||||
|
|
||||||
|
**New users** who started from the [example `vars.yml`](examples/vars.yml) file already have this variable set and do not need to do anything.
|
||||||
|
|
||||||
|
**Existing users** will need to add the following to their `vars.yml` file after reviewing all changelog entries up to now:
|
||||||
|
|
||||||
|
```yml
|
||||||
|
matrix_playbook_migration_validated_version: v2026.03.23.0
|
||||||
|
```
|
||||||
|
|
||||||
|
Going forward, whenever a breaking change is introduced the playbook will:
|
||||||
|
|
||||||
|
- bump its expected version value (`matrix_playbook_migration_expected_version`), causing a discrepancy with what you validated (`matrix_playbook_migration_validated_version`)
|
||||||
|
|
||||||
|
- fail when you run it with a helpful message listing what changed and linking to the relevant changelog entries
|
||||||
|
|
||||||
|
After reviewing and adapting your setup, you simply update the variable to the new version.
|
||||||
|
|
||||||
|
If you'd like to live dangerously and skip these checks (not recommended), you can set this once and be done with it:
|
||||||
|
|
||||||
|
```yml
|
||||||
|
matrix_playbook_migration_validated_version: "{{ matrix_playbook_migration_expected_version }}"
|
||||||
|
```
|
||||||
|
|
||||||
# 2026-03-19
|
# 2026-03-19
|
||||||
|
|
||||||
## Matrix Authentication Service now prefers UNIX sockets for playbook-managed Postgres
|
## Matrix Authentication Service now prefers UNIX sockets for playbook-managed Postgres
|
||||||
|
|||||||
35
bin/check-examples-vars-migration-version.sh
Executable file
35
bin/check-examples-vars-migration-version.sh
Executable file
@@ -0,0 +1,35 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# SPDX-FileCopyrightText: 2026 Slavi Pantaleev
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
# Ensures that the migration validated version in examples/vars.yml
|
||||||
|
# matches the expected version in the matrix_playbook_migration role defaults.
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
defaults_file="roles/custom/matrix_playbook_migration/defaults/main.yml"
|
||||||
|
examples_file="examples/vars.yml"
|
||||||
|
|
||||||
|
expected_version=$(grep -oP '^matrix_playbook_migration_expected_version:\s*"?\K[^"]+' "$defaults_file")
|
||||||
|
examples_version=$(grep -oP '^matrix_playbook_migration_validated_version:\s*"?\K[^"]+' "$examples_file")
|
||||||
|
|
||||||
|
if [ -z "$expected_version" ]; then
|
||||||
|
echo "ERROR: Could not extract matrix_playbook_migration_expected_version from $defaults_file"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$examples_version" ]; then
|
||||||
|
echo "ERROR: Could not extract matrix_playbook_migration_validated_version from $examples_file"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$expected_version" != "$examples_version" ]; then
|
||||||
|
echo "ERROR: Migration version mismatch!"
|
||||||
|
echo " $defaults_file has expected version: $expected_version"
|
||||||
|
echo " $examples_file has validated version: $examples_version"
|
||||||
|
echo ""
|
||||||
|
echo "Please update $examples_file to match."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
0
bin/rebuild-mautrix-meta-instagram.sh
Normal file → Executable file
0
bin/rebuild-mautrix-meta-instagram.sh
Normal file → Executable file
@@ -1,4 +1,9 @@
|
|||||||
---
|
---
|
||||||
|
# This variable acknowledges that you've reviewed breaking changes up to this version.
|
||||||
|
# The playbook will fail if this is outdated, guiding you through what changed.
|
||||||
|
# See the changelog: https://github.com/spantaleev/matrix-docker-ansible-deploy/blob/master/CHANGELOG.md
|
||||||
|
matrix_playbook_migration_validated_version: v2026.03.23.0
|
||||||
|
|
||||||
# The bare domain name which represents your Matrix identity.
|
# The bare domain name which represents your Matrix identity.
|
||||||
# Matrix user IDs for your server will be of the form (`@alice:example.com`).
|
# Matrix user IDs for your server will be of the form (`@alice:example.com`).
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
devShells.default = mkShell {
|
devShells.default = mkShell {
|
||||||
buildInputs = [
|
buildInputs = [
|
||||||
just
|
just
|
||||||
|
mise
|
||||||
ansible
|
ansible
|
||||||
];
|
];
|
||||||
shellHook = ''
|
shellHook = ''
|
||||||
|
|||||||
50
justfile
50
justfile
@@ -4,6 +4,11 @@
|
|||||||
#
|
#
|
||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
# mise (dev tool version manager)
|
||||||
|
mise_data_dir := env("MISE_DATA_DIR", justfile_directory() / "var/mise")
|
||||||
|
mise_trusted_config_paths := justfile_directory() / "mise.toml"
|
||||||
|
prek_home := env("PREK_HOME", justfile_directory() / "var/prek")
|
||||||
|
|
||||||
# Shows help
|
# Shows help
|
||||||
default:
|
default:
|
||||||
@{{ just_executable() }} --list --justfile "{{ justfile() }}"
|
@{{ just_executable() }} --list --justfile "{{ justfile() }}"
|
||||||
@@ -39,9 +44,39 @@ update-playbook-only:
|
|||||||
@git pull -q
|
@git pull -q
|
||||||
@-git stash pop -q
|
@-git stash pop -q
|
||||||
|
|
||||||
# Runs ansible-lint against all roles in the playbook
|
# Invokes mise with the project-local data directory
|
||||||
lint:
|
mise *args: _ensure_mise_data_directory
|
||||||
ansible-lint
|
#!/bin/sh
|
||||||
|
export MISE_DATA_DIR="{{ mise_data_dir }}"
|
||||||
|
export MISE_TRUSTED_CONFIG_PATHS="{{ mise_trusted_config_paths }}"
|
||||||
|
export MISE_YES=1
|
||||||
|
export PREK_HOME="{{ prek_home }}"
|
||||||
|
mise {{ args }}
|
||||||
|
|
||||||
|
# Runs prek (pre-commit hooks manager) with the given arguments
|
||||||
|
prek *args: _ensure_mise_tools_installed
|
||||||
|
@{{ just_executable() }} --justfile "{{ justfile() }}" mise exec -- prek {{ args }}
|
||||||
|
|
||||||
|
# Runs pre-commit hooks on staged files
|
||||||
|
prek-run-on-staged *args: _ensure_mise_tools_installed
|
||||||
|
@{{ just_executable() }} --justfile "{{ justfile() }}" prek run {{ args }}
|
||||||
|
|
||||||
|
# Runs pre-commit hooks on all files
|
||||||
|
prek-run-on-all *args: _ensure_mise_tools_installed
|
||||||
|
@{{ just_executable() }} --justfile "{{ justfile() }}" prek run --all-files {{ args }}
|
||||||
|
|
||||||
|
# Installs the git pre-commit hook
|
||||||
|
prek-install-git-pre-commit-hook: _ensure_mise_tools_installed
|
||||||
|
#!/usr/bin/env sh
|
||||||
|
set -eu
|
||||||
|
{{ just_executable() }} --justfile "{{ justfile() }}" mise exec -- prek install
|
||||||
|
hook="{{ justfile_directory() }}/.git/hooks/pre-commit"
|
||||||
|
# The installed git hook runs later under Git, outside this just/mise environment.
|
||||||
|
# Injecting PREK_HOME keeps prek's cache under var/prek instead of a global home dir,
|
||||||
|
# which is more predictable and works better in sandboxed tools like Codex/OpenCode.
|
||||||
|
if [ -f "$hook" ] && ! grep -q '^export PREK_HOME=' "$hook"; then
|
||||||
|
sed -i '2iexport PREK_HOME="{{ prek_home }}"' "$hook"
|
||||||
|
fi
|
||||||
|
|
||||||
# Runs the playbook with --tags=install-all,ensure-matrix-users-created,start and optional arguments
|
# Runs the playbook with --tags=install-all,ensure-matrix-users-created,start and optional arguments
|
||||||
install-all *extra_args: (run-tags "install-all,ensure-matrix-users-created,start" extra_args)
|
install-all *extra_args: (run-tags "install-all,ensure-matrix-users-created,start" extra_args)
|
||||||
@@ -84,3 +119,12 @@ stop-group group *extra_args:
|
|||||||
# Rebuilds the mautrix-meta-instagram Ansible role using the mautrix-meta-messenger role as a source
|
# Rebuilds the mautrix-meta-instagram Ansible role using the mautrix-meta-messenger role as a source
|
||||||
rebuild-mautrix-meta-instagram:
|
rebuild-mautrix-meta-instagram:
|
||||||
/bin/bash "{{ justfile_directory() }}/bin/rebuild-mautrix-meta-instagram.sh" "{{ justfile_directory() }}/roles/custom"
|
/bin/bash "{{ justfile_directory() }}/bin/rebuild-mautrix-meta-instagram.sh" "{{ justfile_directory() }}/roles/custom"
|
||||||
|
|
||||||
|
# Internal - ensures var/mise and var/prek directories exist
|
||||||
|
_ensure_mise_data_directory:
|
||||||
|
@mkdir -p "{{ mise_data_dir }}"
|
||||||
|
@mkdir -p "{{ prek_home }}"
|
||||||
|
|
||||||
|
# Internal - ensures mise tools are installed
|
||||||
|
_ensure_mise_tools_installed: _ensure_mise_data_directory
|
||||||
|
@{{ just_executable() }} --justfile "{{ justfile() }}" mise install --quiet
|
||||||
|
|||||||
9
mise.toml
Normal file
9
mise.toml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
# SPDX-FileCopyrightText: 2026 Slavi Pantaleev
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
[tools]
|
||||||
|
prek = "0.3.2"
|
||||||
|
|
||||||
|
[settings]
|
||||||
|
yes = true
|
||||||
@@ -1,9 +1,27 @@
|
|||||||
# SPDX-FileCopyrightText: 2023 - 2025 Slavi Pantaleev
|
# SPDX-FileCopyrightText: 2023 - 2026 Slavi Pantaleev
|
||||||
# SPDX-FileCopyrightText: 2024 Suguru Hirahara
|
# SPDX-FileCopyrightText: 2024 Suguru Hirahara
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
# The version that the user has validated their setup against.
|
||||||
|
# When empty, the user will be prompted to set this variable.
|
||||||
|
# New users should set this to the current expected version (see below).
|
||||||
|
# See `examples/vars.yml` and `matrix_playbook_migration_expected_version` for the recommended value.
|
||||||
|
matrix_playbook_migration_validated_version: ''
|
||||||
|
|
||||||
|
# The version that the playbook expects the user to have validated against.
|
||||||
|
# This is bumped whenever a breaking change is introduced.
|
||||||
|
# The value configured here needs to exist in `matrix_playbook_migration_breaking_changes` as well.
|
||||||
|
matrix_playbook_migration_expected_version: "v2026.03.23.0"
|
||||||
|
|
||||||
|
# A list of breaking changes, used to inform users what changed between their validated version and the expected version.
|
||||||
|
matrix_playbook_migration_breaking_changes:
|
||||||
|
- version: "v2026.03.23.0"
|
||||||
|
summary: "Initial migration validation system"
|
||||||
|
changelog_url: "https://github.com/spantaleev/matrix-docker-ansible-deploy/blob/master/CHANGELOG.md#2026-03-22"
|
||||||
|
|
||||||
# Controls if (`matrix_prometheus_nginxlog_exporter` -> `prometheus_nginxlog_exporter`) validation will run.
|
# Controls if (`matrix_prometheus_nginxlog_exporter` -> `prometheus_nginxlog_exporter`) validation will run.
|
||||||
matrix_playbook_migration_matrix_prometheus_nginxlog_exporter_migration_validation_enabled: true
|
matrix_playbook_migration_matrix_prometheus_nginxlog_exporter_migration_validation_enabled: true
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,14 @@
|
|||||||
# SPDX-FileCopyrightText: 2022 - 2024 Slavi Pantaleev
|
# SPDX-FileCopyrightText: 2022 - 2026 Slavi Pantaleev
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
- tags:
|
||||||
|
- always
|
||||||
|
block:
|
||||||
|
- ansible.builtin.include_tasks: "{{ role_path }}/tasks/validate_migration_version.yml"
|
||||||
|
|
||||||
- tags:
|
- tags:
|
||||||
- setup-all
|
- setup-all
|
||||||
- install-all
|
- install-all
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
# SPDX-FileCopyrightText: 2026 Slavi Pantaleev
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
- name: Fail if migration version is not validated (first-time onboarding)
|
||||||
|
ansible.builtin.fail:
|
||||||
|
msg: >-
|
||||||
|
This playbook now uses a migration validation system to help you stay aware of breaking changes.
|
||||||
|
|
||||||
|
It appears that you haven't configured the `matrix_playbook_migration_validated_version` variable yet.
|
||||||
|
|
||||||
|
Please review the changelog (https://github.com/spantaleev/matrix-docker-ansible-deploy/blob/master/CHANGELOG.md)
|
||||||
|
and then add the following to your vars.yml file:
|
||||||
|
|
||||||
|
matrix_playbook_migration_validated_version: {{ matrix_playbook_migration_expected_version }}
|
||||||
|
when: "matrix_playbook_migration_validated_version == ''"
|
||||||
|
|
||||||
|
- name: Fail if migration version is outdated
|
||||||
|
ansible.builtin.fail:
|
||||||
|
msg: |-
|
||||||
|
Your validated migration version ({{ matrix_playbook_migration_validated_version }}) is behind the expected version ({{ matrix_playbook_migration_expected_version }}).
|
||||||
|
|
||||||
|
The following breaking changes have been introduced since your last validation:
|
||||||
|
|
||||||
|
{% for item in matrix_playbook_migration_breaking_changes | selectattr('version', '>', matrix_playbook_migration_validated_version) | sort(attribute='version') %}
|
||||||
|
- {{ item.version }}: {{ item.summary }} ({{ item.changelog_url }})
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
After reviewing the above changes and adapting your setup, update your vars.yml:
|
||||||
|
|
||||||
|
matrix_playbook_migration_validated_version: "{{ matrix_playbook_migration_expected_version }}"
|
||||||
|
when: "matrix_playbook_migration_validated_version != '' and matrix_playbook_migration_validated_version < matrix_playbook_migration_expected_version"
|
||||||
Reference in New Issue
Block a user