zuul-jobs/roles/ensure-pip/tasks/main.yaml
Ian Wienand b6b6e36368 ensure-pip: use full python3 path
As seen by Iaa3ecd05b64af6dd9b2ee17a39bcbe6cde8686ba "python3 -m venv
--help" doesn't actually tell you if the command will work, so it's
really not helpful.  Modify this to run the venv from the python in
the path.  This also expands the comments around why a full path is
necessary.

Change-Id: I03bded0345ff734fd6c5d02fdd44ed1cc14360d2
2020-05-11 13:40:18 +10:00

100 lines
3.1 KiB
YAML

- name: Check if pip is installed
shell: |
PYTHON2=0
PYTHON3=1
{% if ensure_pip_from_packages and ensure_pip_from_packages_with_python2 %}
PYTHON2=1
{% elif ensure_pip_from_upstream and 'python2' in ensure_pip_from_upstream_interpreters %}
PYTHON2=1
{% endif %}
{% if ensure_pip_from_upstream and 'python3' not in ensure_pip_from_upstream_interpreters %}
PYTHON3=0
{% endif %}
# Not all platforms install a `pip` when installing python
# specific pip packages. We first check if pip$VERSION is
# available and if not fallback to checking if just `pip`
# is present.
if [ "$PYTHON2" -eq "1" ] ; then
command -v pip2 || command -v pip || exit 1
fi
if [ "$PYTHON3" -eq "1" ] ; then
command -v pip3 || command -v pip || exit 1
fi
args:
executable: /bin/bash
register: pip_preinstalled
failed_when: false
- name: Install pip from packages
include: "{{ zj_distro_os }}"
with_first_found:
- "{{ ansible_distribution_release }}.yaml"
- "{{ ansible_distribution }}.yaml"
- "{{ ansible_os_family }}.yaml"
- "default.yaml"
when:
- ensure_pip_from_packages
- pip_preinstalled.rc != 0
loop_control:
loop_var: zj_distro_os
- name: Include workarounds
include: workarounds.yaml
- name: Install pip from source
include: source.yaml
when:
- ensure_pip_from_upstream
- pip_preinstalled.rc != 0
#
# Export a working virtualenv_command
#
# Ansible's "pip:" module looks at the virtualenv_command and, if it
# isn't fully qualified, tries to find the command and add the leading
# path for you. However, it doesn't split it up; it will actually
# look for a command "python3 -m venv" (not, as you'd want, just
# "python") and everything fails. Thus we find the full path to
# python3 and build our default command for output.
- name: Probe for venv python full path
shell: |
command -v python3
args:
executable: /bin/bash
tags:
- skip_ansible_lint # command is a bash built-in
failed_when: false
register: _venv_probe
- name: Set host default
set_fact:
_host_virtualenv: '{{ (_venv_probe.rc == 0) | ternary(_venv_probe.stdout + " -m venv", "virtualenv") }}'
- name: Set ensure_pip_virtualenv_cmd
set_fact:
ensure_pip_virtualenv_command: '{{ ensure_pip_virtualenv_command | default(_host_virtualenv) }}'
cacheable: true
# NOTE(ianw): "python3 -m venv" is broken on Xenial images with
# pip-and-virtualenv because the pip is too old to handle our mirrors.
# We can't easily install our backport version because that element
# has put all the packages on hold. In this case, export
# ensure_pip_virtualenv_command as virtualenv until we have got rid of
# this element.
- name: Xenial override
when: ansible_distribution_release == 'xenial'
block:
- name: Check if we have pip-and-virtualenv
command: grep -q 'pip-and-virtualenv' /etc/dib-manifests/dib_environment
failed_when: false
register: _pip_check
become: yes
- name: Override virtualenv
set_fact:
ensure_pip_virtualenv_command: '/usr/local/bin/virtualenv -p python3'
when: _pip_check.rc == 0