From 5bea2dd8e9e4e50cdf6f0c7c6ef882e82b97c7d6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?C=C3=A9dric=20OLIVIER?= <cedric3.olivier@orange.com>
Date: Sun, 11 Sep 2022 13:08:41 +0000
Subject: [PATCH] feat: add ability to setup build tool version in
 PYTHON_BUILD_SYSTEM

---
 README.md                      |  2 ++
 templates/gitlab-ci-python.yml | 33 +++++++++++++++++----------------
 2 files changed, 19 insertions(+), 16 deletions(-)

diff --git a/README.md b/README.md
index 1232e38..8c19f6d 100644
--- a/README.md
+++ b/README.md
@@ -48,6 +48,8 @@ and/or `setup.py` and/or `requirements.txt`), but the build system might also be
 | `pipenv`         | [Pipenv](https://pipenv.pypa.io/) (dependencies only) |
 | `reqfile`        | [Requirements Files](https://pip.pypa.io/en/stable/user_guide/#requirements-files) (dependencies only) |
 
+:warning: You can explicitly set the build tool version by setting `$PYTHON_BUILD_SYSTEM` variable including a [version identification](https://peps.python.org/pep-0440/). For example `PYTHON_BUILD_SYSTEM="poetry==1.1.15"`
+
 ## Jobs
 
 ### `py-package` job
diff --git a/templates/gitlab-ci-python.yml b/templates/gitlab-ci-python.yml
index 706f589..58ab4bc 100644
--- a/templates/gitlab-ci-python.yml
+++ b/templates/gitlab-ci-python.yml
@@ -247,16 +247,16 @@ variables:
     case "${PYTHON_BUILD_SYSTEM:-auto}" in
     auto)
       ;;
-    poetry)
-      log_info "--- Build system explictly declared: Poetry"
+    poetry*)
+      log_info "--- Build system explictly declared: ${PYTHON_BUILD_SYSTEM}"
       return
       ;;
-    setuptools)
-      log_info "--- Build system explictly declared: Setuptools"
+    setuptools*)
+      log_info "--- Build system explictly declared: ${PYTHON_BUILD_SYSTEM}"
       return
       ;;
-    pipenv)
-      log_info "--- Build system explictly declared: Pipenv"
+    pipenv*)
+      log_info "--- Build system explictly declared: ${PYTHON_BUILD_SYSTEM}"
       return
       ;;
     reqfile)
@@ -280,15 +280,16 @@ variables:
       # that might be PEP 517 if a build-backend is specified
       # otherwise it might be only used as configuration file for development tools...
       build_backend=$(sed -rn 's/^build-backend *= *"([^"]*)".*/\1/p' pyproject.toml)
+
       if [[ "$build_backend" ]]
       then
         case "$build_backend" in
-        poetry.core.masonry.api)
+        poetry.core.masonry.api)          
           log_info "--- Build system auto-detected: PEP 517 with Poetry backend"
           export PYTHON_BUILD_SYSTEM="poetry"
           return
           ;;
-        setuptools.build_meta)
+        setuptools.build_meta)          
           log_info "--- Build system auto-detected: PEP 517 with Setuptools backend"
           export PYTHON_BUILD_SYSTEM="setuptools"
           return
@@ -318,23 +319,23 @@ variables:
   # install requirements
   function install_requirements() {
     case "$PYTHON_BUILD_SYSTEM" in
-    poetry)
+    poetry*)
       if  [[ ! -f "poetry.lock" ]]; then
         log_warn "Using Poetry but \\e[33;1mpoetry.lock\\e[0m file not found: you shall commit it with your project files"
       fi
       # shellcheck disable=SC2086
-      pip install ${PIP_OPTS} poetry
+      pip install ${PIP_OPTS} "$PYTHON_BUILD_SYSTEM"
       poetry install ${PYTHON_EXTRA_DEPS:+--extras "$PYTHON_EXTRA_DEPS"}
       ;;
-    setuptools)
+    setuptools*)
       # shellcheck disable=SC2086
-      pip install ${PIP_OPTS} setuptools
+      pip install ${PIP_OPTS} "$PYTHON_BUILD_SYSTEM"
       # shellcheck disable=SC2086
       pip install ${PIP_OPTS} ".${PYTHON_EXTRA_DEPS:+[$PYTHON_EXTRA_DEPS]}"
       ;;
-    pipenv)
+    pipenv*)
       # shellcheck disable=SC2086
-      pip install ${PIP_OPTS} pipenv
+      pip install ${PIP_OPTS} "$PYTHON_BUILD_SYSTEM"
       if  [[ ! -f "Pipfile.lock" ]]; then
         log_warn "Using Pipenv but \\e[33;1mPipfile.lock\\e[0m file not found: you shall commit it with your project files"
         pipenv install --dev --system
@@ -363,7 +364,7 @@ variables:
   }
 
   function _run() {
-    if [[ "${PYTHON_BUILD_SYSTEM}" == "poetry" ]]
+    if [[ "${PYTHON_BUILD_SYSTEM}" =~ poetry.* ]]
     then
       # shellcheck disable=SC2086
       if ! command -v poetry > /dev/null; then pip install ${PIP_OPTS} poetry; fi
@@ -831,7 +832,7 @@ py-trivy:
     - apt-get update
     - apt-get install trivy
     - |
-      if [[ $PYTHON_BUILD_SYSTEM == "poetry" ]]
+      if [[ "$PYTHON_BUILD_SYSTEM" =~ poetry.* ]]
       then
         # When using Poetry, `pip freeze` outputs a requirements.txt with @file URLs for each wheel
         # These @file URLs in requirements.txt are not supported by Trivy
-- 
GitLab