80 lines
2.8 KiB
Django/Jinja
80 lines
2.8 KiB
Django/Jinja
#!/usr/local/env bash
|
|
|
|
set -ev
|
|
|
|
function venv_create {
|
|
VENV_PATH="$1"
|
|
VENV_FILE="$2"
|
|
|
|
# If the venv working directory already exists remove it
|
|
[[ -d "/tmp/${VENV_PATH}" ]] && rm -rf "/tmp/${VENV_PATH}"
|
|
|
|
# If the pip build directory already exists remove it
|
|
[[ -d "/tmp/${VENV_FILE}" ]] && rm -rf "/tmp/${VENV_FILE}"
|
|
|
|
# Create the virtualenv shell
|
|
{{ repo_build_venv_command_options }} "${VENV_PATH}"
|
|
|
|
# Create the pip build directory
|
|
mkdir -p "/tmp/${VENV_FILE}"
|
|
|
|
# Activate the python virtual environment for good measure
|
|
source "${VENV_PATH}/bin/activate"
|
|
|
|
# Run the pip install within the venv and specify a specific build directory which
|
|
# resolves pip locking issues when run in parallel.
|
|
${VENV_PATH}/bin/pip install --build "/tmp/${VENV_FILE}" {{ repo_build_venv_pip_install_options }} $3
|
|
|
|
# Deactivate the venv for good measure
|
|
deactivate
|
|
|
|
# Find and remove all of the python pyc files
|
|
find "${VENV_PATH}" -type f -name '*.pyc' -delete
|
|
|
|
# Create the archive
|
|
tar czf "${VENV_FILE}.tgz" -C "${VENV_PATH}" .
|
|
|
|
# Create a checksum file for the archive
|
|
sha1sum "${VENV_FILE}.tgz" | awk '{print $1}' > "${VENV_FILE}.checksum"
|
|
|
|
# Remove the working directories
|
|
rm -rf "${VENV_PATH}"
|
|
rm -rf "/tmp/${VENV_FILE}"
|
|
}
|
|
|
|
# First operation is to sort and set the known os_* roles and create a unique dict.
|
|
# NOTE: this is a Jinja loop and will not be rendered within the script. For debugging
|
|
# purposes the group data will be rendered as a comment.
|
|
{% set os_group = {} %}
|
|
{% for key, value in local_packages.results.0.item.role_packages.items() %}
|
|
{% if "os_" in key %}
|
|
# venv to build {{ key }}
|
|
# * packages within the {{ key }} venv: {{ value }}
|
|
{% set _ = os_group.update({key: value}) %}
|
|
{% endif %}
|
|
{% endfor %}
|
|
|
|
PID=()
|
|
# Run the venv create. This will loop over all of the os_group role packages and create a python virtual env.
|
|
# Venv creation is done parallel at a count of the known "ansible_processor_count" or using a default of 5.
|
|
# This loop will enter the venv build directory and craete tagged venvs in a distrobution directory
|
|
# If the venv archive already exists the creation process will be skipped
|
|
pushd "{{ repo_build_venv_dir }}/{{ repo_build_release_tag }}/{{ ansible_distribution | lower }}"
|
|
{% for key, value in os_group.items() %}
|
|
ROLE_VENV_PATH="{{ repo_build_venv_build_dir }}/venvs/{{ key | replace('os_', '') }}"
|
|
ROLE_VENV_FILE="{{ key | replace('os_', '') }}-{{ repo_build_release_tag }}"
|
|
if [ ! -f "${ROLE_VENV_FILE}.tgz" ];then
|
|
venv_create "${ROLE_VENV_PATH}" "${ROLE_VENV_FILE}" "{{ value | join(' ') }}" &
|
|
pid[{{ loop.index }}]=$!
|
|
fi
|
|
unset ROLE_VENV_PATH
|
|
unset ROLE_VENV_FILE
|
|
{% if loop.index is divisibleby(repo_build_concurrency | int) or loop.last %}
|
|
for job_pid in ${!pid[@]}; do
|
|
wait ${pid[$job_pid]} || exit 99
|
|
done
|
|
|
|
{% endif %}
|
|
{% endfor %}
|
|
popd
|