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:
@@ -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
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user