apiVersion: tekton.dev/v1beta1 kind: Task metadata: name: pybuild spec: params: - name: subdirectory type: string description: Subdirectory within the repo where the source code is located default: "" - name: python-version type: string description: Python version to use (e.g., 3.9, 3.11) default: "3.9" - name: pypi-username type: string description: PyPI username (fallback) default: "" - name: pypi-password type: string description: PyPI password or token (fallback) default: "" - name: pypi-group-url type: string description: PyPI repository URL (install endpoint) default: https://upload.pypi.org/legacy/ workspaces: - name: source description: Workspace containing the cloned Git repository from git-clone-checkout - name: pypi-auth optional: true description: | A workspace containing authentication credentials for a private PyPI repository. Should include: - username - password results: - name: build-artifact-path description: Path to the built artifact directory (e.g., dist/) steps: - name: install-dependencies image: python:$(params.python-version)-slim workingDir: /workspace/source script: | #!/usr/bin/env bash set -e if [ -n "$(params.subdirectory)" ]; then cd "$(params.subdirectory)" fi pip install --upgrade pip PYPI_USER="$(params.pypi-username)" PYPI_PASS="$(params.pypi-password)" PYPI_URL="$(params.pypi-group-url)" if [ -f /workspace/pypi-auth/username ]; then PYPI_USER=$(cat /workspace/pypi-auth/username) fi if [ -f /workspace/pypi-auth/password ]; then PYPI_PASS=$(cat /workspace/pypi-auth/password) fi if [ -f pyproject.toml ]; then echo "[INFO] Poetry project detected" pip install poetry poetry config virtualenvs.in-project true if [ -n "$PYPI_URL" ]; then REPO_NAME=$(echo "$PYPI_URL" | sed -E 's#https?://([^/]+)/repository/([^/]+)/?.*#\1_\2#' | tr -cd '[:alnum:]_') echo "[INFO] Configuring poetry source '$REPO_NAME' → $PYPI_URL" poetry config repositories."$REPO_NAME" "$PYPI_URL" poetry config http-basic."$REPO_NAME" "$PYPI_USER" "$PYPI_PASS" fi poetry install --no-root elif [ -f requirements.txt ] && [ -f setup.py ]; then echo "[INFO] Pip + setup.py project detected" pip install -r requirements.txt pip install build else echo "[ERROR] No valid build configuration found (pyproject.toml or setup.py required)" exit 1 fi - name: build-package image: python:$(params.python-version)-slim workingDir: /workspace/source script: | #!/usr/bin/env bash set -e if [ -n "$(params.subdirectory)" ]; then cd "$(params.subdirectory)" fi if [ -f pyproject.toml ]; then poetry build elif [ -f setup.py ]; then python -m build else echo "[ERROR] No build tool available" exit 1 fi echo "Built artifacts located in dist/" ls -l dist/ # Save result path echo -n "/workspace/source/$(params.subdirectory)/dist" > /tekton/results/build-artifact-path - name: verify-build image: ubuntu workingDir: /workspace/source script: | #!/usr/bin/env bash set -e DIST_PATH=$(cat /tekton/results/build-artifact-path) if [ -d "$DIST_PATH" ] && [ -n "$(ls -A $DIST_PATH)" ]; then echo "✅ Build artifacts successfully created in $DIST_PATH:" ls -l $DIST_PATH else echo "❌ No build artifacts found in $DIST_PATH" exit 1 fi