• Русский
  • Построение Python конвейера с использованием шаблона

    Этот конвейер предназначен для автоматизации полного CI/CD процесса для Python-приложений.
    Он многоразовый и гибкий, поддерживает пользовательские аргументы сборки, несколько рабочих областей и условное выполнение шагов.

    Основные возможности:

    • ✅ Гибкий источник кода
    • 🔌 Подключаемые задачи через параметры
    • 🛠️ Динамическая сборка и публикация образов
    • ☁️ Обновление образа workload через kubectl

    Указание с помощью hub resolvers

    Следующий пример запуска PipelineRun ссылается на pipeline из каталога:

    apiVersion: tekton.dev/v1
    kind: PipelineRun
    metadata:
      name: python-pipeline-run
    spec:
      pipelineRef:
        resolver: hub
        params:
        - name: catalog
          value: catalog
        - name: kind
          value: pipeline
        - name: name
          value: python-image-build-scan-deploy
        - name: version
          value: "0.1"

    Параметры

    Git Clone

    • git-url

      • type: string
      • default: ""
      • description: URL репозитория для клонирования.
    • git-revision

      • type: string
      • default: ""
      • description: Ревизия для checkout (ветка, тег, sha, ref и т.д.).
    • skip-git-clone

      • type: string
      • default: "false"
      • description: Пропустить выполнение задачи git clone. Может быть включено только если соответствующий репозиторий уже существует в рабочей области.
    • git-crt-file-name

      • type: string
      • default: "ca-bundle.crt"
      • description: Имя файла crt, смонтированного через workspace ssl-ca-directory. Значение по умолчанию — ca-bundle.crt.

    Pre build

    • pre-build-script

      • type: string
      • default: ""
      • description: Python-скрипт, который будет выполнен перед сборкой. Может использоваться для unit-тестов, lint, запуска скриптов перед сборкой и т.д. Задача pre-build будет пропущена, если этот параметр не задан.
    • pre-build-args

      • type: array
      • default: []
      • description: Аргументы, передаваемые в pre-build скрипт.
    • pre-build-requirements-file

      • type: string
      • default: "requirements.txt"
      • description: Имя файла с зависимостями внутри исходного кода, с fallback на файл requirements в корне.
    • pre-build-pip-conf-file

      • type: string
      • default: "pip.conf"
      • description: Имя пользовательского файла конфигурации pip.

    SonarQube Scanner

    • sonar-url

      • type: string
      • default: ""
      • description: URL вашего экземпляра SonarQube Server. Если не указан, задача sonarqube scanner будет пропущена.
    • sonar-project-key

      • type: string
      • default: ""
      • description: Уникальный ключ проекта SonarQube.
    • sonar-properties

      • type: array
      • default: ["sonar.sources=."]
      • description: Дополнительные свойства для передачи SonarQube. Подробнее см. Configuration of SonarQube properties.

    Build Images

    • images

      • type: array
      • description: Ссылки на образы, которые будет создавать buildah. Может содержать несколько адресов образов, разделённых запятыми. Например:
        • busybox:latest
        • busybox:v1 .30.1
    • containerfile-path

      • type: string
      • default: ./Containerfile
      • description: Путь к Containerfile для сборки.
    • build-extra-args

      • type: string
      • default: ""
      • description: Дополнительные параметры, передаваемые команде сборки при создании образов. ВНИМАНИЕ — необходимо фильтровать для предотвращения инъекций команд (например, --build-arg key=value --label key=value).
    • build-args

      • type: array
      • default: [""]
      • description: Указывает аргумент сборки и его значение, которые будут интерполированы в инструкциях из Containerfile так же, как переменные окружения, но не будут добавлены в список переменных окружения в конфигурации итогового образа. Например, HTTP_PROXY=http://10.10.10.10:8080
    • build-context

      • type: string
      • default: .
      • description: Путь к директории, используемой как контекст.
    • push-extra-args

      • type: string
      • default: ""
      • description: Дополнительные параметры, передаваемые команде push при публикации образов. ВНИМАНИЕ — необходимо фильтровать для предотвращения инъекций команд (например, --creds=username:password ).

    Trivy Scanner

    • skip-trivy-scan

      • type: string
      • default: "false"
      • description: Установите, чтобы пропустить сканирование образа trivy после сборки.
    • trivy-extra-args

      • type: string
      • default: ""
      • description: Дополнительные параметры, передаваемые команде trivy при сканировании образов. ВНИМАНИЕ — необходимо фильтровать для предотвращения инъекций команд (например, --insecure). Можно использовать --skip-db-update и --skip-java-db-update для пропуска обновления базы уязвимостей.

    Deploy or upgrade workload

    • workload-name

      • type: string
      • default: ""
      • description: Имя workload для деплоя или обновления. Если не указано, задача deploy-or-upgrade будет пропущена.
    • workload-kind

      • type: string
      • default: Deployment
      • description: Тип workload для деплоя или обновления, например Deployment, StatefulSet и т.д.
    • workload-namespace

      • type: string
      • default: ""
      • description: Namespace workload для деплоя или обновления. Если не указан, будет использоваться namespace текущего TaskRun.
    • workload-container

      • type: string
      • default: []
      • description: Параметр для указания контейнеров внутри workload, для которых нужно обновить образ. По умолчанию обновляются образы всех контейнеров workload.
    • workload-rollout-timeout

      • type: string
      • default: "0"
      • description: Время ожидания готовности workload перед завершением ожидания, 0 означает никогда не прерывать. Другие значения должны содержать единицу времени (например, 1s, 2m, 3h).
    • workload-manifests-dir

      • type: string
      • default: ""
      • description: Манифест workload для деплоя. Если не указан, будет обновлён только образ workload, уже существующего в кластере. Можно использовать относительный путь к директории с манифестами в workspace source. Например: "manifests".

    Workspaces

    • source: Рабочая область для обмена информацией между задачами.
    • git-basic-auth: опциональная рабочая область с файлами .gitconfig и .git-credentials. Они копируются в домашний каталог пользователя перед выполнением git-команд. Другие файлы в этой рабочей области игнорируются. Рекомендуется использовать ssh-directory вместо basic-auth и привязывать Secret к этой рабочей области вместо других типов томов.
    • git-ssh-directory: опциональная рабочая область с приватным ключом, known_hosts, config и т.д. Копируется в домашний каталог пользователя перед выполнением git-команд. Используется для аутентификации при клонировании. Рекомендуется привязывать Secret к этой рабочей области вместо других типов томов.
    • git-ssl-ca-directory: опциональная рабочая область с CA сертификатами, которые Git использует для проверки сервера при fetch или push по HTTPS.
    • pip-conf: опциональная рабочая область с пользовательскими настройками pip.
    • sonar-settings: опциональная рабочая область для монтирования свойств SonarQube.
    • sonar-credentials: опциональная рабочая область с учётными данными для SonarQube.
    • registryconfig: опциональная рабочая область с конфигурационными файлами реестра, такими как config.json или .dockerconfigjson. Используется для аутентификации при публикации образов.
    • kubeconfig: опциональная рабочая область с файлом kubeconfig. Имя файла должно быть kubeconfig. Если в этой рабочей области нет kubeconfig, она игнорируется.

    Платформы

    Задача может выполняться на платформах linux/amd64 и linux/arm64.

    Использование

    Минимальная настройка: запуск end-to-end с минимальными параметрами

    Опциональные задачи (sonarqube-scanner, deploy-or-upgrade и др.) будут корректно пропущены, если параметры не заданы или опущены.

    apiVersion: tekton.dev/v1
    kind: PipelineRun
    metadata:
      generateName: python-build-run-
    spec:
      pipelineRef:
        name: python-image-build-scan-deploy
      params:
        - name: git-url
          value: https://github.com/example/python-app
        - name: git-revision
          value: refs/heads/main
        - name: images
          value: ["registry.example.com/python-app:latest"]
      workspaces:
        - name: source
          persistentVolumeClaim:
            claimName: source
        - name: git-basic-auth
          secret:
            secretName: gitconfig
        - name: registryconfig
          secret:
            secretName: registryconfig

    Конфигурация свойств SonarQube

    Вы можете смонтировать рабочую область sonar-settings или использовать параметр sonar-properties для применения свойств в файле sonar-project.properties.

    Свойства по умолчанию: sonar.sources=..

    Использование свойств SonarQube можно найти в analysis parameters и свойствах для Python.

    Некоторые из свойств, которые можно задать:

    СвойствоОписание
    sonar.python.versionПо умолчанию Python-код анализируется как совместимый с python 2 и python 3. Для более точного анализа можно указать версии Python, которые поддерживает ваш код, через параметр sonar.python.version.
    sonar.qualitygate.waitЗаставляет этап анализа опрашивать сервер и ждать статуса Quality Gate.
    sonar.qualitygate.timeoutКоличество секунд, которое сканер должен ждать обработки отчёта.
    sonar.projectVersionВерсия проекта. Должна быть установлена для анализа веток, если используется определение нового кода на основе предыдущей версии.
    sonar.sourcesПути к директориям с основными исходными файлами, разделённые запятыми.
    sonar.organizationОрганизация в SonarQube, в которой существует проект.

    Деплой или обновление workload

    Вы можете задеплоить или обновить workload, используя образ, собранный задачей build-image в этом конвейере.

    Задав параметр workload-manifests-dir, вы можете применить Kubernetes-манифесты из указанной директории для создания или обновления workload.

    Поддерживаются форматы JSON и YAML. Все манифесты в указанной директории будут обработаны командой kubectl apply. Обратите внимание, что kubectl apply не обходит поддиректории.

    Если в директории есть файл конфигурации Kustomize (например, kustomization.yaml, kustomization.yml или Kustomization), он будет обработан с помощью kubectl kustomize.

    Пример структуры директории workload-manifests-dir:

    manifests
    ├── deployment.yaml
    ├── kustomization.yaml
    └── service.yaml

    Вы можете настроить следующие параметры:

    spec:
      params:
        # ...
        - name: images
          value:
            - foo/bar:latest
        - name: workload-name
          value: bar
        - name: workload-namespace
          value: default
        - name: workload-kind
          value: Deployment
        - name: workload-manifests-dir
          value: manifests
        # ...

    Если вы не хотите деплоить workload с помощью манифестов, просто оставьте параметр workload-manifests-dir пустым. В этом случае задача обновит только образ существующего workload в кластере.

    Необходимо самостоятельно управлять секретами для доступа к образам (image pull secrets) для workload. Если новый образ размещён в другом реестре, убедитесь, что создан и настроен соответствующий pull secret для workload.

    Запуск pytest

    Вы можете запустить pytest с помощью задачи pre-build в этом конвейере.

    Пример запуска pytest:

    apiVersion: tekton.dev/v1
    kind: PipelineRun
    metadata:
      generateName: python-build-run-
    spec:
      pipelineRef:
        name: python-image-build-scan-deploy
      params:
        - name: git-url
          value: https://github.com/example/python-app
        - name: git-revision
          value: refs/heads/main
        - name: images
          value: ["registry.example.com/python-app:latest"]
        - name: pre-build-script
          value: |
            pytest
      workspaces:
        - name: source
          persistentVolumeClaim:
            claimName: source
        - name: git-basic-auth
          secret:
            secretName: gitconfig
        - name: registryconfig
          secret:
            secretName: registryconfig

    Пропуск задач с помощью параметров

    Конвейер поддерживает пропуск задач с помощью параметров:

    ЗадачаПараметрЗначение по умолчаниюОписание
    git-cloneskip-git-clone"false"Если код уже существует в рабочей области source, можно установить "true" для пропуска клонирования.
    pre-buildpre-build-script""Задача pre-build будет пропущена, если параметр pre-build-script не задан.
    sonarqube-scannersonar-url""Сканирование будет пропущено, если параметр sonar-url не задан.
    trivy-scannerskip-trivy-scan"false"Сканирование будет пропущено, если skip-trivy-scan установлен в "true".
    deploy-or-upgradeworkload-name""Если не хотите деплоить или обновлять workload, оставьте параметр workload-name пустым.

    Полный пример со всеми задачами

    В этом примере показано использование всех задач конвейера. Включает следующие задачи:

    • Клонирование исходного кода
    • Запуск unit-тестов с помощью задачи pre-build
    • Сборка образа и публикация в реестр
    • Сканирование образа с помощью Trivy
    • Сканирование кода с помощью SonarQube
    • Деплой или обновление workload
    apiVersion: tekton.dev/v1
    kind: PipelineRun
    metadata:
      generateName: python-build-run-
    spec:
      pipelineRef:
        name: python-image-build-scan-deploy
      params:
        - name: git-url
          value: https://github.com/example/python-app
        - name: git-revision
          value: refs/heads/main
        - name: sonar-url
          value: https://sonar.example.com
        - name: sonar-project-key
          value: python-pipeline-example-key
        - name: images
          value: ["registry.example.com/python-app:latest"]
        - name: workload-name
          value: python-app
        - name: workload-namespace
          value: default
        - name: pre-build-script
          value: |
            pytest
      workspaces:
        - name: source
          persistentVolumeClaim:
            claimName: source
        - name: git-basic-auth
          secret:
            secretName: gitconfig
        - name: sonar-credentials
          secret:
            secretName: sonar-credentials
        - name: registryconfig
          secret:
            secretName: registry-creds
        - name: kubeconfig
          configMap:
            name: kubeconfig