jmri: version-aware install/upgrade via marker file

Replace binary-exists check with .jmri_installed_version marker pattern.
- Reads marker on each run; skips install if version matches
- On version mismatch: stops JMRI, wipes /opt/JMRI, downloads new archive
- Separates build hash into jmri_build_hash var (templated into download URL)
- Config is preserved — lives in git-managed .jmri symlink
To upgrade: bump jmri_version + jmri_build_hash, re-run playbook.
This commit is contained in:
Hermes Agent service account
2026-07-29 21:34:26 -05:00
parent d974c75d7c
commit 11d8796764
2 changed files with 58 additions and 7 deletions

View File

@@ -1,8 +1,12 @@
--- ---
# JMRI version to install # JMRI version to install
# Update both jmri_version AND jmri_build_hash together when upgrading.
# Find the build hash in the release asset filename on:
# https://github.com/JMRI/JMRI/releases
jmri_version: "5.10" jmri_version: "5.10"
jmri_build_hash: "ca461bd266"
jmri_install_dir: /opt/JMRI jmri_install_dir: /opt/JMRI
jmri_download_url: "https://github.com/JMRI/JMRI/releases/download/v{{ jmri_version }}/JMRI.{{ jmri_version }}+Rca461bd266.tgz" jmri_download_url: "https://github.com/JMRI/JMRI/releases/download/v{{ jmri_version }}/JMRI.{{ jmri_version }}+R{{ jmri_build_hash }}.tgz"
# Service user # Service user
jmri_user: jmri jmri_user: jmri

View File

@@ -159,17 +159,55 @@
when: jmri_lcrr_repo | length > 0 when: jmri_lcrr_repo | length > 0
notify: Restart jmri notify: Restart jmri
- name: Check if JMRI is already installed at correct version # ---------------------------------------------------------------------------
ansible.builtin.stat: # JMRI install / upgrade — version-marker pattern
path: "{{ jmri_install_dir }}/JmriFaceless" # Writes {{ jmri_install_dir }}/.jmri_installed_version after each install.
register: jmri_binary # On subsequent runs: read the marker, skip everything if it matches
# jmri_version. If it differs (or is absent), stop JMRI cleanly, wipe the
# old install, download the new archive, extract, and write the new marker.
# To upgrade: bump jmri_version + jmri_build_hash in defaults/main.yml (or
# host_vars) and re-run the playbook.
# ---------------------------------------------------------------------------
- name: Read installed JMRI version marker (if present)
ansible.builtin.slurp:
src: "{{ jmri_install_dir }}/.jmri_installed_version"
register: jmri_version_marker
ignore_errors: true
- name: Determine whether JMRI install/upgrade is needed
ansible.builtin.set_fact:
jmri_needs_install: >-
{{
jmri_version_marker is failed or
(jmri_version_marker.content | b64decode | trim) != jmri_version
}}
- name: Stop JMRI service before upgrade (if running)
ansible.builtin.systemd:
name: jmri
state: stopped
failed_when: false # service may not exist yet on first install
when: jmri_needs_install
- name: Remove existing JMRI install directory (upgrade path)
ansible.builtin.file:
path: "{{ jmri_install_dir }}"
state: absent
when: jmri_needs_install
- name: Remove stale JMRI archive from /tmp (if version changed)
ansible.builtin.file:
path: "/tmp/JMRI-{{ jmri_version }}.tgz"
state: absent
when: jmri_needs_install
- name: Download JMRI release archive - name: Download JMRI release archive
ansible.builtin.get_url: ansible.builtin.get_url:
url: "{{ jmri_download_url }}" url: "{{ jmri_download_url }}"
dest: /tmp/JMRI-{{ jmri_version }}.tgz dest: /tmp/JMRI-{{ jmri_version }}.tgz
mode: '0644' mode: '0644'
when: not jmri_binary.stat.exists when: jmri_needs_install
- name: Create JMRI install directory - name: Create JMRI install directory
ansible.builtin.file: ansible.builtin.file:
@@ -187,7 +225,16 @@
owner: "{{ jmri_user }}" owner: "{{ jmri_user }}"
group: "{{ jmri_group }}" group: "{{ jmri_group }}"
extra_opts: ['--strip-components=1'] extra_opts: ['--strip-components=1']
when: not jmri_binary.stat.exists when: jmri_needs_install
- name: Write installed version marker
ansible.builtin.copy:
content: "{{ jmri_version }}\n"
dest: "{{ jmri_install_dir }}/.jmri_installed_version"
owner: "{{ jmri_user }}"
group: "{{ jmri_group }}"
mode: '0644'
when: jmri_needs_install
- name: Restore JMRI config from backup - name: Restore JMRI config from backup
ansible.builtin.copy: ansible.builtin.copy: