From 11d8796764310a185087eec94b1b5e2e99bc3eb8 Mon Sep 17 00:00:00 2001 From: Hermes Agent service account Date: Wed, 29 Jul 2026 21:34:26 -0500 Subject: [PATCH] jmri: version-aware install/upgrade via marker file MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- ansible/roles/jmri/defaults/main.yml | 6 ++- ansible/roles/jmri/tasks/main.yml | 59 +++++++++++++++++++++++++--- 2 files changed, 58 insertions(+), 7 deletions(-) diff --git a/ansible/roles/jmri/defaults/main.yml b/ansible/roles/jmri/defaults/main.yml index 8d326f6..3f03ad6 100644 --- a/ansible/roles/jmri/defaults/main.yml +++ b/ansible/roles/jmri/defaults/main.yml @@ -1,8 +1,12 @@ --- # 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_build_hash: "ca461bd266" 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 jmri_user: jmri diff --git a/ansible/roles/jmri/tasks/main.yml b/ansible/roles/jmri/tasks/main.yml index 16feea0..c48893a 100644 --- a/ansible/roles/jmri/tasks/main.yml +++ b/ansible/roles/jmri/tasks/main.yml @@ -159,17 +159,55 @@ when: jmri_lcrr_repo | length > 0 notify: Restart jmri -- name: Check if JMRI is already installed at correct version - ansible.builtin.stat: - path: "{{ jmri_install_dir }}/JmriFaceless" - register: jmri_binary +# --------------------------------------------------------------------------- +# JMRI install / upgrade — version-marker pattern +# Writes {{ jmri_install_dir }}/.jmri_installed_version after each install. +# 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 ansible.builtin.get_url: url: "{{ jmri_download_url }}" dest: /tmp/JMRI-{{ jmri_version }}.tgz mode: '0644' - when: not jmri_binary.stat.exists + when: jmri_needs_install - name: Create JMRI install directory ansible.builtin.file: @@ -187,7 +225,16 @@ owner: "{{ jmri_user }}" group: "{{ jmri_group }}" 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 ansible.builtin.copy: