--- # Install pyenv for the perforce user, build the latest Python, and install # p4python into that environment. - name: "Install pyenv" # noqa: command-instead-of-module become: true become_user: "{{ perforce_user }}" ansible.builtin.shell: "set -o pipefail; curl -fsSL https://pyenv.run | bash" args: executable: "/bin/bash" creates: "/p4/.pyenv/bin/pyenv" register: curl_pyenv_output - name: "Add Pyenv to perforce user bashrc" become: true become_user: "{{ perforce_user }}" ansible.builtin.blockinfile: path: "/p4/.bashrc" owner: "{{ perforce_user }}" group: "{{ perforce_group }}" insertafter: EOF create: true mode: '0644' block: | export PATH="${HOME}/.pyenv/bin:$PATH" eval "$(pyenv init -)" eval "$(pyenv virtualenv-init -)" - name: "Add Pyenv to perforce user profile" become: true become_user: "{{ perforce_user }}" ansible.builtin.blockinfile: path: "/p4/.profile" owner: "{{ perforce_user }}" group: "{{ perforce_group }}" insertafter: EOF create: true mode: '0644' block: | export PATH="${HOME}/.pyenv/bin:$PATH" eval "$(pyenv init -)" eval "$(pyenv virtualenv-init -)" - name: "Get latest Python version available in pyenv" become: true become_user: "{{ perforce_user }}" ansible.builtin.shell: "set -o pipefail; /p4/.pyenv/bin/pyenv install --list | grep -E '^\\s+3\\.[0-9]+\\.[0-9]+$' | tail -1 | tr -d ' '" args: executable: "bash" register: latest_python_version changed_when: false - name: "Install the latest Python and set it as the pyenv global version" become: true become_user: "{{ perforce_user }}" ansible.builtin.shell: >- set -o pipefail; echo N | /p4/.pyenv/bin/pyenv install {{ latest_python_version.stdout }}; /p4/.pyenv/bin/pyenv global {{ latest_python_version.stdout }} args: executable: "bash" # The built version directory is the marker; skip the (slow) rebuild once it # exists so the task is idempotent. creates: "/p4/.pyenv/versions/{{ latest_python_version.stdout }}" register: pyenv_python_output - name: "Check whether p4python is already installed" become: true become_user: "{{ perforce_user }}" ansible.builtin.shell: "source /p4/.profile; source /p4/.bashrc; pip3 show p4python" args: executable: "bash" register: p4python_check changed_when: false failed_when: false - name: "Install p4python" become: true become_user: "{{ perforce_user }}" ansible.builtin.shell: "source /p4/.profile;source /p4/.bashrc;pip3 install --upgrade pip;pip3 install p4python" args: executable: "bash" when: p4python_check.rc != 0 register: pyenv_p4python_output changed_when: true - name: "Create the p4python/bin directory" ansible.builtin.file: path: /p4/p4python/bin state: directory mode: '0755' owner: "{{ perforce_user }}" group: "{{ perforce_group }}" - name: "Link python3 to old venv python3 location to avoid trigger breaks" ansible.builtin.file: src: /p4/.pyenv/shims/python3 dest: /p4/p4python/bin/python3 state: link force: true owner: "{{ perforce_user }}" group: "{{ perforce_group }}" failed_when: false