diff --git a/roles/ensure-tox/README.rst b/roles/ensure-tox/README.rst index 937c0f847..b81aef3d1 100644 --- a/roles/ensure-tox/README.rst +++ b/roles/ensure-tox/README.rst @@ -1,7 +1,7 @@ Ensure tox is installed -Look for ``tox``, and if not found, install it via ``pip`` into a -virtual environment for the current user. +Look for ``tox``, and if not found, install it via ``pip`` in the user +install directory (i.e., ``pip install --user``). **Role Variables** diff --git a/roles/ensure-tox/defaults/main.yaml b/roles/ensure-tox/defaults/main.yaml index 7479455e6..2e2266d2b 100644 --- a/roles/ensure-tox/defaults/main.yaml +++ b/roles/ensure-tox/defaults/main.yaml @@ -1,3 +1,2 @@ tox_executable: tox -tox_venv_path: '{{ ansible_user_dir }}/.local/tox' tox_prefer_python2: false diff --git a/roles/ensure-tox/tasks/main.yaml b/roles/ensure-tox/tasks/main.yaml index 8c8fa68e4..39b8402bb 100644 --- a/roles/ensure-tox/tasks/main.yaml +++ b/roles/ensure-tox/tasks/main.yaml @@ -4,33 +4,41 @@ vars: ensure_pip_from_packages_with_python2: '{{ tox_prefer_python2 }}' -- name: Check if tox is installed +- name: Ensure tox is installed shell: | - command -v {{ tox_executable }} || exit 1 + set -euo pipefail + + {% if tox_prefer_python2 %} + if command -v pip; then + PIP=pip + elif command -v pip3; then + PIP=pip3 + fi + {% else %} + if command -v pip3; then + PIP=pip3 + elif command -v pip; then + PIP=pip + fi + {% endif %} + + type {{ tox_executable }} || $PIP install --user tox args: executable: /bin/bash - register: tox_preinstalled - failed_when: false + register: result + changed_when: "'Successfully installed' in result.stdout" -- name: Export preinstalled tox_exectuable +- name: Set tox_executable fact to pip installed set_fact: - tox_executable: '{{ tox_executable }}' + tox_executable: "{{ ansible_user_dir }}/.local/bin/tox" cacheable: true - when: tox_preinstalled.rc == 0 + when: result is changed -- name: Install tox to local env - when: tox_preinstalled.rc != 0 - block: - - name: Install tox to local venv - pip: - name: tox - virtualenv_command: '{{ ensure_pip_virtualenv_command }}' - virtualenv: '{{ tox_venv_path }}' - - - name: Export installed tox_executable path - set_fact: - tox_executable: '{{ tox_venv_path }}/bin/tox' - cacheable: true +- name: Set tox_exectuable fact to found tox + set_fact: + tox_executable: "{{ tox_executable }}" + cacheable: true + when: result is not changed - name: Output tox version command: "{{ tox_executable }} --version" diff --git a/test-playbooks/ensure-tox.yaml b/test-playbooks/ensure-tox.yaml index 854b37b39..67a0001c1 100644 --- a/test-playbooks/ensure-tox.yaml +++ b/test-playbooks/ensure-tox.yaml @@ -27,7 +27,7 @@ - name: Verify tox_executable is set assert: that: - - tox_executable == "{{ ansible_user_dir }}/.local/tox/bin/tox" + - tox_executable == "{{ ansible_user_dir }}/.local/bin/tox" - name: Verify tox is installed command: "{{ tox_executable }} --version" register: result