
In the previous repo build process, we had global constraints which override upper constraints and anything set in the roles. This was essential for two purposes: 1. To enable us to pin things that were not in upper constraints. eg: pip, setuptools, wheel 2. To enable us to pin things which were in upper constraints, but broken. This would usually be a temporary measure until upper constraints was fixed. This patch implements a new variable 'venv_build_global_constraints' which is a list of constraints to be applied globally for all venvs. This list will be used to produce a file in the venv suffixed with '-global-constraints.txt' and will be used on the pip command line when building the wheels and when installing packages. We also ensure that all constraints are used when both building and installing pip, setuptools and wheel into the venv. Change-Id: I9ae3ef19c863b9237a51d2fcd6f4ebce1a9ebad7
177 lines
7.4 KiB
YAML
177 lines
7.4 KiB
YAML
---
|
|
# Copyright 2018, Rackspace US, Inc.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
- name: gather build target facts
|
|
setup:
|
|
gather_subset: '!all:hardware'
|
|
delegate_to: "{{ item }}"
|
|
delegate_facts: true
|
|
with_items: "{{ groups['repo_all'] | default([inventory_hostname]) }}"
|
|
|
|
- name: Build the wheels on the build host
|
|
delegate_to: "{{ venv_build_host }}"
|
|
become: "{{ venv_build_host == 'localhost' }}"
|
|
when:
|
|
- venv_wheel_build_enable | bool
|
|
block:
|
|
- name: Install distro packages for wheel build
|
|
package:
|
|
name: "{{ venv_build_base_distro_package_list | union(venv_build_distro_package_list) }}"
|
|
state: "{{ venv_distro_package_state }}"
|
|
update_cache: "{{ (ansible_pkg_mgr in ['apt', 'zypper']) | ternary('yes', omit) }}"
|
|
cache_valid_time: "{{ (ansible_pkg_mgr == 'apt') | ternary(venv_distro_cache_valid_time, omit) }}"
|
|
when:
|
|
- (venv_build_distro_package_list | length > 0) or
|
|
(venv_install_distro_package_list | length > 0)
|
|
register: _install_build_distro_packages
|
|
until: _install_build_distro_packages is success
|
|
retries: 5
|
|
delay: 2
|
|
|
|
- name: Clean up paths and files if venv_rebuild is enabled
|
|
file:
|
|
path: "{{ item }}"
|
|
state: absent
|
|
with_items:
|
|
- "{{ venv_build_host_wheel_path }}"
|
|
- "{{ venv_build_host_requirements_path }}/{{ venv_install_destination_path | basename }}-requirements.txt"
|
|
- "{{ venv_build_host_requirements_path }}/{{ venv_install_destination_path | basename }}-global-constraints.txt"
|
|
- "{{ venv_build_host_requirements_path }}/{{ venv_install_destination_path | basename }}-source-constraints.txt"
|
|
- "{{ venv_build_host_requirements_path }}/{{ venv_install_destination_path | basename }}-constraints.txt"
|
|
when:
|
|
- venv_rebuild | bool
|
|
|
|
- name: Create wheel directory on the build host
|
|
file:
|
|
path: "{{ venv_build_host_wheel_path }}"
|
|
state: directory
|
|
|
|
- name: Create requirements/constraints file directory on the build host
|
|
file:
|
|
path: "{{ venv_build_host_requirements_path }}"
|
|
state: directory
|
|
|
|
# NOTE(odyssey4me):
|
|
# Not using --always-copy for CentOS/SuSE due to
|
|
# https://github.com/pypa/virtualenv/issues/565
|
|
- name: Create the wheel build virtualenv (if it does not exist)
|
|
command: >-
|
|
virtualenv
|
|
{{ _venv_create_extra_options }}
|
|
--python={{ venv_python_executable }}
|
|
{{ (ansible_pkg_mgr == 'apt') | ternary('--always-copy', '') }}
|
|
{{ venv_build_host_venv_path }}
|
|
args:
|
|
creates: "{{ venv_build_host_venv_path }}/bin/activate"
|
|
|
|
- name: Build requirements file for the venv
|
|
copy:
|
|
dest: "{{ venv_build_host_requirements_path }}/{{ venv_install_destination_path | basename }}-requirements.txt"
|
|
content: |
|
|
{% for item in (venv_default_pip_packages | union(venv_pip_packages)) | sort %}
|
|
{{ item }}
|
|
{% endfor %}
|
|
register: _requirement_file
|
|
|
|
- name: Build global constraints file for the venv
|
|
copy:
|
|
dest: "{{ venv_build_host_requirements_path }}/{{ venv_install_destination_path | basename }}-global-constraints.txt"
|
|
content: |
|
|
{% for item in venv_build_global_constraints %}
|
|
{{ item }}
|
|
{% endfor %}
|
|
register: _global_constraint_file
|
|
|
|
- name: Build constraints file for the venv
|
|
copy:
|
|
dest: "{{ venv_build_host_requirements_path }}/{{ venv_install_destination_path | basename }}-source-constraints.txt"
|
|
content: |
|
|
{% for item in venv_build_constraints %}
|
|
{{ item }}
|
|
{% endfor %}
|
|
register: _constraint_file
|
|
|
|
- name: Upgrade the wheel build virtualenv pip/setuptools/wheel to the versions we want
|
|
pip:
|
|
name:
|
|
- pip
|
|
- setuptools
|
|
- wheel
|
|
state: "{{ venv_pip_package_state }}"
|
|
virtualenv: "{{ venv_build_host_venv_path }}"
|
|
extra_args: >-
|
|
--constraint {{ venv_build_host_requirements_path }}/{{ venv_install_destination_path | basename }}-global-constraints.txt
|
|
--constraint {{ venv_build_host_requirements_path }}/{{ venv_install_destination_path | basename }}-source-constraints.txt
|
|
--find-links {{ venv_build_host_wheel_path }}/
|
|
--log /var/log/python_venv_build.log
|
|
{{ venv_pip_build_args }}
|
|
environment:
|
|
PIP_CONFIG_FILE: "{{ (venv_pip_upgrade_noconf | bool) | ternary('/dev/null', '') }}"
|
|
register: _update_virtualenv_packages
|
|
until: _update_virtualenv_packages is success
|
|
retries: 5
|
|
delay: 2
|
|
|
|
- name: Build wheels and constraints file
|
|
when: (_requirement_file is changed) or (_global_constraint_file is changed) or (_constraint_file is changed)
|
|
block:
|
|
- name: Clean up temporary wheel build path
|
|
file:
|
|
path: "/tmp/{{ venv_install_destination_path | basename }}"
|
|
state: absent
|
|
|
|
- name: Build wheels for the packages to be installed into the venv
|
|
command: >-
|
|
{{ venv_build_host_venv_path }}/bin/pip wheel
|
|
--requirement {{ venv_build_host_requirements_path }}/{{ venv_install_destination_path | basename }}-requirements.txt
|
|
--constraint {{ venv_build_host_requirements_path }}/{{ venv_install_destination_path | basename }}-global-constraints.txt
|
|
--constraint {{ venv_build_host_requirements_path }}/{{ venv_install_destination_path | basename }}-source-constraints.txt
|
|
--wheel-dir /tmp/{{ venv_install_destination_path | basename }}/
|
|
--find-links {{ venv_build_host_wheel_path }}/
|
|
--log /var/log/python_wheel_build.log
|
|
{{ venv_pip_build_args }}
|
|
register: _build_python_wheels
|
|
until: _build_python_wheels is success
|
|
retries: 5
|
|
delay: 2
|
|
|
|
- name: Index built wheels
|
|
find:
|
|
paths: "/tmp/{{ venv_install_destination_path | basename }}"
|
|
file_type: file
|
|
register: _built_wheels
|
|
|
|
- name: Move built wheels to common wheel path
|
|
shell: >-
|
|
mv /tmp/{{ venv_install_destination_path | basename }}/* {{ venv_build_host_wheel_path }}/
|
|
args:
|
|
executable: /bin/bash
|
|
|
|
- name: Build constraints file for installation purposes
|
|
copy:
|
|
content: |
|
|
{% for file_data in _built_wheels['files'] %}
|
|
{% set file_name = file_data['path'] | basename %}
|
|
{{ file_name.split('-')[0] | lower }}=={{ (file_name.split('-')[1].split('_')) | join('.post') | lower }}
|
|
{% endfor %}
|
|
dest: "{{ venv_build_host_requirements_path }}/{{ venv_install_destination_path | basename }}-constraints.txt"
|
|
|
|
- name: Slurp up the constraints file for later re-deployment
|
|
slurp:
|
|
src: "{{ venv_build_host_requirements_path }}/{{ venv_install_destination_path | basename }}-constraints.txt"
|
|
register: _constraints_file_slurp
|
|
tags:
|
|
- install
|