• Русский
  • Быстрый старт

    Этот документ поможет вам быстро понять, как создать Nexus connector для подключения к Nexus репозиторию и выполнять операции mvn безопасно, без прямой работы с учетными данными.

    Мы создадим Nexus connector и используем его для выполнения mvn deploy без прямого обращения с учетными данными на стороне клиента.

    Оценочное время чтения

    15 минут

    Требования

    • Kubernetes кластер с установленной системой Connectors (компоненты Operator, ConnectorsCore и ConnectorsNexus). Подробнее об установке этих компонентов смотрите в Installation Guide.
    • Адрес Nexus репозитория и учетные данные
    • Базовые знания Kubernetes и Maven

    Обзор процесса

    ШагОперацияОписание
    1Создать NamespaceСоздать выделенный namespace для демонстрации
    2Настроить учетные данные Nexus и ConnectorСоздать секрет аутентификации и ресурс Nexus connector
    3Создать Maven Job для выполнения mvn deployСоздать job, выполняющий mvn deploy через connector
    4Проверить результатыПроверить успешное выполнение операций mvn deploy

    Пошаговое руководство

    Шаг 1: Создать Namespace

    Создайте выделенный namespace для этой демонстрации:

    kubectl create ns connectors-nexus-demo

    Шаг 2: Создать учетные данные Nexus и Connector

    Создайте одновременно Secret с учетными данными Nexus и ресурс Nexus connector. Ваш Nexus репозиторий должен быть репозиторием snapshots.

    Более подробную информацию о создании и настройке connectors смотрите в Connectors Quick Start Guide.

    cat <<EOF | kubectl apply -n connectors-nexus-demo -f -
    kind: Secret
    apiVersion: v1
    metadata:
      name: nexus-registry-secret
    type: kubernetes.io/basic-auth
    stringData:
      username: your-nexus-username # Замените на ваш логин Nexus
      password: your-nexus-password # Замените на ваш пароль Nexus
    ---
    apiVersion: connectors.alauda.io/v1alpha1
    kind: Connector
    metadata:
      name: nexus-connector
    spec:
      connectorClassName: nexus
      address: https://nexus.example.com # Замените на адрес вашего Nexus сервера
      auth:
        name: basicAuth
        secretRef:
          name: nexus-registry-secret
    EOF

    Проверьте, что connector находится в статусе "Ready":

    kubectl get connector nexus-connector -n connectors-nexus-demo

    Вывод должен быть следующим:

    NAME              CLASS   ADDRESS                      READY   REASON   AGE
    nexus-connector   nexus   https://nexus.example.com   True             10s

    Шаг 3: Создать Job для выполнения mvn deploy

    Создайте job, который использует connector для выполнения Maven операций:

    cat <<'EOF' | kubectl apply -n connectors-nexus-demo -f -
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: mvn-deploy
    spec:
      backoffLimit: 0
      template:
        spec:
          restartPolicy: Never
          containers:
          - name: mvn
            image: maven:3.9.11-eclipse-temurin-24-alpine # Замените на ваш образ с maven
            imagePullPolicy: IfNotPresent
            env:
            - name: MAVEN_OPTS
              value: -Dmaven.resolver.transport=wagon
            command:
            - "sh"
            - "-c"
            - |
              set -ex
    
              mkdir -p ~/.m2
              cp /opt/maven/settings.xml ~/.m2/settings.xml
    
              keytool -importcert -noprompt \
                -trustcacerts \
                -keystore $JAVA_HOME/lib/security/cacerts \
                -storepass changeit \
                -alias corp-ca \
                -file /opt/maven/ca.cert
    
              echo "Generating project using maven archetype"
              cd /tmp
              mvn archetype:generate -DgroupId=com.example -DartifactId=HelloWorldApp -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
    
              cd HelloWorldApp/
              echo "Building and deploying project"
              mvn package deploy -DaltDeploymentRepository=maven-snapshots::default::https://nexus.example.com/repository/maven-snapshots
    
            volumeMounts:
            - name: settings
              mountPath: /opt/maven
          volumes:
          - name: settings
            csi:
              readOnly: true
              driver: connectors-csi
              volumeAttributes:
                connector.name: "nexus-connector"
                configuration.names: "settings"
                configuration.params: '{"settings":{"mirrorRepository":"maven-public"}}' # опционально
    EOF

    Основные настройки

    MAVEN_OPTS в окружении контейнера:

    Установлено в MAVEN_OPTS=-Dmaven.resolver.transport=wagon

    Скрипты в контейнере:

    Используется команда keytool для импорта файла ca.cert в truststore клиента, чтобы доверять прокси-серверу connector перед выполнением операций mvn.

    keytool -importcert -noprompt \
      -trustcacerts \
      -keystore $JAVA_HOME/lib/security/cacerts \
      -storepass changeit \
      -alias corp-ca \
      -file /opt/maven/ca.cert

    volumes[].volumeAttributes

    • connector.name: имя вашего Nexus connector
    • configuration.names: установлено в settings, что ссылается на шаблон конфигурации Maven, определённый в Nexus ConnectorClass. Этот шаблон генерирует файл settings.xml с нужными настройками прокси и аутентификации.
    • configuration.params: JSON-строка с параметрами конфигурации во время выполнения. Для configuration.names: "settings" можно задать settings.mirrorRepository (опционально). Если не указано, используется значение по умолчанию ConnectorClass (""), и в settings.xml не добавляется зеркало Maven.

    Шаг 4: Проверить выполнение

    Проверьте логи job, чтобы убедиться, что операции mvn deploy выполнены успешно:

    kubectl logs -f job/mvn-deploy -n connectors-nexus-demo

    Вы должны увидеть успешное завершение операций mvn deploy и загрузку jar в Nexus репозиторий.

    Пример вывода:

    Uploading to maven-snapshots: https://nexus.example.com/repository/maven-snapshots/com/example/HelloWorldApp/1.0-SNAPSHOT/maven-metadata.xml
    Uploaded to maven-snapshots: https://nexus.example.com/repository/maven-snapshots/com/example/HelloWorldApp/1.0-SNAPSHOT/maven-metadata.xml (768 B at 80 B/s)
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  01:27 min
    [INFO] Finished at: 2025-09-02T10:18:50Z
    [INFO] ------------------------------------------------------------------------

    Что происходит под капотом

    Nexus connector работает следующим образом:

    1. Создаёт прокси-сервис, который находится между вашим клиентом и целевым Nexus репозиторием
    2. Вставляет информацию об аутентификации при прохождении запросов через прокси
    3. Предоставляет конфигурационные файлы (например, settings.xml, .npmrc, pip.conf) для клиентов, чтобы выполнять операции через прокси

    Для демонстрации этого механизма просмотрите сгенерированный файл settings.xml:

    cat <<EOF | kubectl apply -n connectors-nexus-demo -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: inspect-nexus-settings
    spec:
      restartPolicy: Never
      containers:
      - name: mvn
        image: maven:3.9.11-eclipse-temurin-24-alpine
        command: ["sleep", "3600"]
        volumeMounts:
        - name: settings
          mountPath: /opt/maven
      volumes:
      - name: settings
        csi:
          readOnly: true
          driver: connectors-csi
          volumeAttributes:
            connector.name: "nexus-connector"
            configuration.names: "settings"
    EOF

    Просмотрите сгенерированные файлы в /opt/maven/:

    $ kubectl exec -it inspect-nexus-settings -n connectors-nexus-demo -- ls -l /opt/maven
    
    total 8
    -r--r--r-- 1 root root 1261 Sep  2 10:25 ca.cert
    -r--r--r-- 1 root root 1679 Sep  2 10:25 settings.xml

    Просмотрите сгенерированный файл settings.xml:

    $ kubectl exec -it inspect-nexus-settings -n connectors-nexus-demo -- cat /opt/maven/settings.xml

    Пример вывода:

    <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">
    
      <proxies>
        <proxy>
          <id>connectors-proxy</id>
          <active>true</active>
          <protocol>http</protocol>
          <host>c-nexus-connector.connectors-nexus-demo.svc.cluster.local</host>
          <port>80</port>
          <username>connectors-nexus-demo/nexus-connector</username>
          <password>eyJhbGciOiJEnEZaTQ</password>
          <nonProxyHosts>localhost</nonProxyHosts>
        </proxy>
      </proxies>
    </settings>

    Важные замечания

    • В Pod монтируются два файла через Connectors CSI Driver: settings.xml и ca.cert.
    • Файл settings.xml содержит раздел конфигурации прокси, который позволяет подключаться к Nexus Maven репозиторию через прокси. Прокси вставляет информацию об аутентификации при прохождении запросов.
    • Файл settings.xml не содержит оригинальных секретов и монтируется в Pod через Connectors CSI Driver.

    Устранение неполадок

    Если операция не удалась, проверьте следующее:

    1. Статус Connector: Убедитесь, что connector в состоянии "Ready":

      kubectl describe connector nexus-connector -n connectors-nexus-demo
    2. Проверьте статус развертывания connectors: убедитесь, что все компоненты развернуты и находятся в состоянии "Ready"

      kubectl get pods -n <connector-component-namespace>

    Дополнительное чтение

    После успешного выполнения операций с использованием Nexus connector вы можете:

    Ссылки