• Русский
  • Сборка Java pipeline с использованием шаблона

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

    Ключевые возможности:

    • ✅ Гибкий источник кода
    • ⚙️ Настраиваемые параметры Maven
    • 🚀 Поддержка кэширования локального репозитория Maven
    • 🔌 Подключаемые задачи через params
    • 🛠️ Динамическая сборка и push образов
    • ☁️ Обновление образа workload через kubectl

    Указание через hub resolvers

    В следующем примере PipelineRun ссылается на pipeline из catalog:

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

    Параметры

    Клонирование Git

    • git-url

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

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

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

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

    Maven

    • maven-subdirectory

      • type: string
      • default: .
      • description: Каталог контекста для Maven-проекта.
    • maven-goals

      • type: array
      • default: ["package"]
      • description: Цели Maven, которые нужно выполнить.
    • maven-mirror-url

      • type: string
      • default: ""
      • description: URL зеркала репозитория Maven.

    Сканер SonarQube

    • 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=.", "sonar.java.binaries=target/classes"]
      • description: Дополнительные свойства, передаваемые в SonarQube. Дополнительные сведения см. в разделе Конфигурация свойств SonarQube.

    Сборка образов

    • 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 при сборке образов. ВНИМАНИЕ — их необходимо санитизировать, чтобы избежать внедрения команд (например, --build-arg key=value --label key=value).
    • build-args

      • type: array
      • default: [""]
      • description: Указывает build argument и его значение, которые будут интерполироваться в инструкциях, прочитанных из 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

    • 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, чтобы пропустить обновление базы уязвимостей.

    Развертывание или обновление 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".

    Workspace

    • source: Workspace для обмена информацией между задачами.
    • git-basic-auth: Необязательный workspace, содержащий файлы .gitconfig и .git-credentials. Они будут скопированы в домашний каталог пользователя до выполнения любых git-команд. Любые другие файлы в этом workspace игнорируются. По возможности настоятельно рекомендуется использовать ssh-directory вместо basic-auth и привязывать Secret к этому workspace вместо других типов volume.
    • git-ssh-directory: Необязательный workspace с private key, known_hosts, config и т. д. Копируется в домашний каталог пользователя перед выполнением git-команд. Используется для аутентификации на git remote при выполнении clone. Настоятельно рекомендуется привязывать Secret к этому workspace вместо других типов volume.
    • git-ssl-ca-directory: Необязательный workspace, содержащий CA certificates; он будет использоваться Git для проверки peer при fetch или push через HTTPS.
    • maven-settings: Необязательный workspace, содержащий пользовательские настройки Maven.
    • maven-local-repo: Необязательный workspace для локального репозитория Maven.
    • maven-server-secret: Необязательный workspace, содержащий server credentials.
    • maven-trust-store: Необязательный workspace, содержащий JKS truststore для private CA, используемых Maven.
    • sonar-settings: Необязательный workspace, в который можно смонтировать свойства SonarQube.
    • sonar-credentials: Необязательный workspace, содержащий учетные данные для использования в SonarQube.
    • registryconfig: Необязательный workspace для файлов конфигурации distribution registry, таких как config.json или .dockerconfigjson. Он необязателен и используется для аутентификации при push образов в registry.
    • kubeconfig: Необязательный workspace, содержащий файл kubeconfig. Имя kubeconfig должно быть kubeconfig. Если в этом workspace нет kubeconfig, workspace будет проигнорирован.

    Платформы

    Эту Task можно запускать на платформах linux/amd64 и linux/arm64.

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

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

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

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

    Использование Maven Settings.xml

    Вы можете смонтировать workspace maven-settings, чтобы применить settings.xml для сборок Maven.

    workspaces:
      - name: maven-settings
        configMap:
          name: maven-settings
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: maven-settings
    data:
      settings.xml: |
        <!--# your maven settings.xml ...-->

    Также можно использовать параметр maven-mirror-url для задания зеркала репозитория Maven. Он будет использован как <mirror> в settings.xml.

    <mirror>
      <id>mirror.default</id>
      <url>$(params.maven-mirror-url)</url>
      <mirrorOf>central</mirrorOf>
    </mirror>

    Использование build cache для ускорения CI

    Подключите постоянный workspace maven-local-repo, чтобы кэшировать содержимое .m2/repository между запусками pipeline. Повторное использование зависимостей может значительно сократить время разрешения зависимостей Maven и существенно уменьшить время сборки между запусками.

    workspaces:
      - name: maven-local-repo
        persistentVolumeClaim:
          claimName: maven-repo-cache

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

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

    Свойства по умолчанию: sonar.sources=., sonar.java.binaries=target/classes.

    Подробнее об использовании свойств SonarQube см. в analysis parameters и в свойствах для Java

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

    PropertiesDescription
    sonar.java.binaries (required)Пути, разделенные запятыми, к каталогам, содержащим скомпилированные файлы bytecode, соответствующие вашим исходным файлам.
    sonar.java.librariesПути, разделенные запятыми, к файлам со сторонними библиотеками (JAR или Zip), используемыми вашим проектом. Можно использовать шаблоны: sonar.java.libraries=path/to/Library.jar,directory/**/*.jar
    sonar.java.test.binariesПути, разделенные запятыми, к каталогам, содержащим скомпилированные файлы bytecode, соответствующие вашим test files
    sonar.java.test.librariesПути, разделенные запятыми, к файлам со сторонними библиотеками (JAR или Zip), используемыми вашими tests. (Например, сюда должен входить junit jar). Можно использовать шаблоны: sonar.java.test.libraries=directory/**/*.jar
    sonar.qualitygate.waitПринудительно заставляет шаг анализа опрашивать экземпляр server и ожидать статус Quality Gate.
    sonar.qualitygate.timeoutКоличество секунд, в течение которых scanner должен ждать обработки отчета.
    sonar.projectVersionВерсия проекта. Ее следует задать для branch analysis, если вы используете новую code definition на основе предыдущей версии.
    sonar.sourcesПути, разделенные запятыми, к каталогам, содержащим основные source files
    sonar.organizationОрганизация в SonarQube, в которой существует проект

    Развертывание или обновление workload

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

    Задав параметр 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. Если новый образ размещен в другом registry, убедитесь, что создали и настроили соответствующий pull secret для workload.

    Пропуск задач с помощью Params

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

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

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

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

    • Клонирование исходного кода
    • Сборка кода с помощью Maven
    • Сборка образа и push образа в registry
    • Сканирование образа с помощью Trivy
    • Сканирование кода с помощью SonarQube
    • Развертывание или обновление workload
    apiVersion: tekton.dev/v1
    kind: PipelineRun
    metadata:
      generateName: java-build-run-
    spec:
      pipelineRef:
        name: java-image-build-scan-deploy
      params:
        - name: git-url
          value: https://github.com/example/java-app
        - name: git-revision
          value: refs/heads/main
        - name: sonar-url
          value: https://sonar.example.com
        - name: sonar-project-key
          value: java-pipeline-example-key
        - name: images
          value: ["registry.example.com/java-app:latest"]
        - name: workload-name
          value: java-app
        - name: workload-namespace
          value: default
      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