<user_query>
пришел человк с с запросом

Михаил Школьный
32 минуты назад

@lmru-devops-bot
Добрый день!
Можно ли узнать, кто у нас тянет креды из Vault из неймспейса vspspc.
У нас такая ситуация, что кто-то спамит наш топик кафки.
Мы обратились к апи платформе и streaming solution с просьбой узнать, кто это может быть.
Права на запись в топик есть только у одного нашего пользователя. Попробовали изменить пароль.
Но трафик продолжился почти сразу после смены.
Хотим узнать, кто запрашивал креды.
Возможный точный путь к кредам в Vault:
price_calculator_orchestrator/test/kafka/token_ha sales_price_data_gatherer/test/kafka/token
Может можно узнать, кто брал эти креды?

vault login сделан
</user_query>


Понял задачу: нужно оперативно помочь с расследованием, кто мог читать эти креды из Vault по `vspspc` и указанным путям. Сначала проверю в репозитории, какие роли/сервис-аккаунты вообще имеют доступ к этим секретам, затем попробую через `vault` посмотреть аудит (если включен) и вытащить фактические чтения.

**Planning vault audit investigation**


Сейчас вижу, что локально `vault` стучится в `127.0.0.1:8200`, поэтому не видит сервер Vault — значит нужно подхватить правильный `VAULT_ADDR`/контекст. Параллельно ищу в репо, где именно используются эти пути секретов, чтобы сразу дать список потенциальных потребителей.

**Inspecting vault configuration and secrets**


Нашел, что в этом репо нет прямых вхождений самих путей `.../kafka/token(_ha)`, поэтому источник, вероятно, в другом конфиге или создается динамически. Сейчас проверю доступ к боевому Vault по `vault.lmru.tech` и отдельно соберу все манифесты в `vspspc`, где могут быть ссылки на Vault/ExternalSecret.

**Testing vault access and searching secrets**


Удалось достучаться до `vault.lmru.tech`, это уже хорошо. Дальше проверяю, есть ли у текущей сессии права посмотреть аудит и связанные роли/политики — это единственный надежный способ ответить именно “кто читал” (а не просто “кто потенциально может”).

**Assessing Vault audit and access queries**


Подтвердил: аудит в Vault включен (`file`, путь `/vault/logs/audit.log`), то есть технически источник истины есть. Сейчас делаю точечный проход по ACL-политикам Vault, чтобы определить, какие роли вообще могут читать эти два пути и сузить круг подозреваемых до конкретных identity/ролей.

**Planning policy audit commands**


**Testing permission scope and metadata access**


Есть ограничения по правам на просмотр всех ACL-политик, поэтому иду снизу вверх: проверяю, в каких mount’ах эти пути вообще существуют/читаемы (без вывода значений секрета), чтобы понять реальный контур доступа.

**Planning multi-path secret access tests**


**Assessing vault path and permissions**


**Exploring key listing commands**


**Assessing Vault auth methods**


Права текущего токена сильно ограничены (нет доступа к `sys/auth`, `sys/policies`, многим mount’ам), поэтому “кто именно читал” из CLI напрямую пока не извлекается. Проверю еще, доступен ли хотя бы `audit-hash` — это позволит связать путь/токен с записями в audit log для платформенной команды.

**Testing vault token capabilities**


**Exploring deeper path listing**


**Exploring Vault path and audit access**


**Planning HMAC audit hash generation**


Проверил прямо сейчас через Vault (с вашим логином).

- Аудит **включен**: `audit_log_1` типа `file`, путь `file_path=/vault/logs/audit.log`.
- Значит ответ на вопрос “кто брал креды” получить **можно**, но только через разбор audit-log (с этой машины файл недоступен).
- По текущему токену нет прав на полный просмотр `sys/policies`/`sys/auth`, поэтому список всех потенциальных ролей из Vault я не выгрузил.
- Точные пути, которые вы прислали, в проверенных mount’ах как есть не нашлись (`No value found`) — возможно, путь указан не полностью (например, с префиксом окружения/namespace или другой mount).

Сгенерировал HMAC для поиска в audit log (это правильный способ искать в Vault-аудите, т.к. путь там хранится в хэшированном виде):

- `service-platform/price_calculator_orchestrator/test/kafka/token_ha`
  `hmac-sha256:d7cb2e65704272d81be1e8f024af2f6cf29d199f04760f28ebda6ca9a56c2c28`
- `service-platform/sales_price_data_gatherer/test/kafka/token`
  `hmac-sha256:56234c5f869e64ca34a44764fe1b61f18ed6784c8fdd9b47a116fed7f3b88530`
- `service-platform/vspspc/price_calculator_orchestrator/test/kafka/token_ha`
  `hmac-sha256:9dd84eadf45944013e5ff977e42b6e8cdb497ff9ef1575b496a1d96d43e78246`
- `service-platform/vspspc/sales_price_data_gatherer/test/kafka/token`
  `hmac-sha256:bedad6e3921fcc146afe948ab97340a5288598098acd5e60d541e8c824f1817a`

Что попросить у платформы/ops (или сделать на ноде Vault):
- отфильтровать `audit.log` по этим HMAC в `request.path`
- взять записи с `request.operation=read` (и `update`, если это dynamic creds endpoint)
- из найденных записей отдать: `time`, `auth.display_name`, `auth.metadata`, `request.remote_address`, `request.path`

Это даст конкретного клиента/роль/источник, кто читал секреты.
Если хотите, подготовлю готовый текст ответа Михаилу в чат (коротко и без лишней технички).

**Clarifying audit log access limits**


<user_query>
вопрос не по репозиторию
Running on p-jenkins-node-m-04 in /data/jenkins-root/workspace/_dp--deploy-reviseur-orch_master
19:13:40  [Pipeline] {
19:13:40  [Pipeline] timestamps
19:13:40  The timestamps step is unnecessary when timestamps are enabled for all Pipeline builds.
19:13:40  [Pipeline] {
19:13:40  [Pipeline] ansiColor
19:13:40  [Pipeline] {
19:13:40
19:13:40  [Pipeline] cleanWs
19:13:40  [WS-CLEANUP] Deleting project workspace...
19:13:40  [WS-CLEANUP] Deferred wipeout is used...
19:13:40  [WS-CLEANUP] done
19:13:40  [Pipeline] stage
19:13:40  [Pipeline] { (checkout)
19:13:40  [Pipeline] checkout
19:13:40  The recommended git tool is: NONE
19:13:40  using credential id_rsa_svc-lmru-dataplatform
19:13:40  Cloning the remote Git repository
19:13:40  Cloning with configured refspecs honoured and without tags
19:13:40  Avoid second fetch
19:13:40  Checking out Revision 78cbfec622f96d41b97a8901efc1f13071a67fbd (master)
19:13:40  Commit message: "yac"
19:13:40  Cloning repository git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git
19:13:40   > git init /data/jenkins-root/workspace/_dp--deploy-reviseur-orch_master # timeout=10
19:13:40  Fetching upstream changes from git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git
19:13:40   > git --version # timeout=10
19:13:40   > git --version # 'git version 2.43.0'
19:13:40  using GIT_SSH to set credentials SSH key for svc-lmru-dataplatform (GitHub Enterprise)
19:13:40   > git fetch --no-tags --force --progress -- git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git +refs/heads/master:refs/remotes/origin/master # timeout=10
19:13:40   > git config remote.origin.url git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git # timeout=10
19:13:40   > git config --add remote.origin.fetch +refs/heads/master:refs/remotes/origin/master # timeout=10
19:13:40   > git config core.sparsecheckout # timeout=10
19:13:40   > git checkout -f 78cbfec622f96d41b97a8901efc1f13071a67fbd # timeout=10
19:13:40   > git rev-list --no-walk 78cbfec622f96d41b97a8901efc1f13071a67fbd # timeout=10
19:13:41  ERROR: Checkout failed
19:13:41  Also:   hudson.remoting.Channel$CallSiteStackTrace: Remote call to p-jenkins-node-m-04
19:13:41  		at hudson.remoting.Channel.attachCallSiteStackTrace(Channel.java:1916)
19:13:41  		at hudson.remoting.UserRequest$ExceptionResponse.retrieve(UserRequest.java:384)
19:13:41  		at hudson.remoting.Channel.call(Channel.java:1108)
19:13:41  		at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler.execute(RemoteGitImpl.java:155)
19:13:41  		at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source)
19:13:41  		at java.base/java.lang.reflect.Method.invoke(Unknown Source)
19:13:41  		at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler.invoke(RemoteGitImpl.java:140)
19:13:41  		at PluginClassLoader for git-client/jdk.proxy32/jdk.proxy32.$Proxy368.execute(Unknown Source)
19:13:41  		at PluginClassLoader for git//hudson.plugins.git.extensions.impl.SubmoduleOption.onCheckoutCompleted(SubmoduleOption.java:196)
19:13:41  		at PluginClassLoader for git//hudson.plugins.git.GitSCM._checkout(GitSCM.java:1395)
19:13:41  		at PluginClassLoader for git//hudson.plugins.git.GitSCM.checkout(GitSCM.java:1277)
19:13:41  		at PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep.checkout(SCMStep.java:136)
19:13:41  		at PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:101)
19:13:41  		at PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:88)
19:13:41  		at PluginClassLoader for workflow-step-api//org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:49)
19:13:41  		at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
19:13:41  		at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
19:13:41  		at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
19:13:41  		at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
19:13:41  		at java.base/java.lang.Thread.run(Unknown Source)
19:13:41  hudson.plugins.git.GitException: Command "git config --get submodule.playbooks.url" returned status code 1:
19:13:41  stdout:
19:13:41  stderr:
19:13:41  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2848)
19:13:41  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2773)
19:13:41  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2768)
19:13:41  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommand(CliGitAPIImpl.java:2055)
19:13:41  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommand(CliGitAPIImpl.java:2067)
19:13:41  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.getSubmoduleUrl(CliGitAPIImpl.java:1631)
19:13:41  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl$7.execute(CliGitAPIImpl.java:1548)
19:13:41  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler$GitCommandMasterToSlaveCallable.call(RemoteGitImpl.java:173)
19:13:41  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler$GitCommandMasterToSlaveCallable.call(RemoteGitImpl.java:164)
19:13:41  	at hudson.remoting.UserRequest.perform(UserRequest.java:225)
19:13:41  	at hudson.remoting.UserRequest.perform(UserRequest.java:50)
19:13:41  	at hudson.remoting.Request$2.run(Request.java:391)
19:13:41  	at hudson.remoting.InterceptingExecutorService.lambda$wrap$0(InterceptingExecutorService.java:81)
19:13:41  	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
19:13:41  	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
19:13:41  	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
19:13:41  	at java.base/java.lang.Thread.run(Thread.java:1583)
19:13:41  Caused: java.io.IOException: Could not perform submodule update
19:13:41  	at PluginClassLoader for git//hudson.plugins.git.extensions.impl.SubmoduleOption.onCheckoutCompleted(SubmoduleOption.java:201)
19:13:41  	at PluginClassLoader for git//hudson.plugins.git.GitSCM._checkout(GitSCM.java:1395)
19:13:41  	at PluginClassLoader for git//hudson.plugins.git.GitSCM.checkout(GitSCM.java:1277)
19:13:41  	at PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep.checkout(SCMStep.java:136)
19:13:41  	at PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:101)
19:13:41  	at PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:88)
19:13:41  	at PluginClassLoader for workflow-step-api//org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:49)
19:13:41  	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
19:13:41  	at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
19:13:41  	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
19:13:41  	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
19:13:41  	at java.base/java.lang.Thread.run(Unknown Source)
19:13:41  ERROR: Maximum checkout retry attempts reached, aborting

#!groovy

properties([
    buildDiscarder (logRotator (artifactDaysToKeepStr: '', artifactNumToKeepStr: '10', daysToKeepStr: '', numToKeepStr: '10')),
    disableConcurrentBuilds (),
    disableResume (),
]);

import org.jenkinsci.plugins.pipeline.modeldefinition.Utils
@Library('common-utils') _

node ('dockerhost') {
    timestamps {
        ansiColor('xterm') {
            cleanWs()

            stage('checkout'){
                checkout scm
            }

            stage('prepare'){
                // def response = httpRequest "http://amapi.apps.dev.data.lmru.tech/api/v1/getdeployinfo?repo_url=adeo/dp--batch-proc--ff-dom&module_env=test"
                withFolderProperties{
                    AIRFLOW_CLUSTER = env.airflow_cluster
                    PRODUCT_TITLE = env.product_title
                    VAULT_APPROLE = env.vault_approle
                }
                if (!AIRFLOW_CLUSTER){
                    echo "'airflow_cluster' variable doesn't set"
                    sh 'exit 1'
                }
                if (!PRODUCT_TITLE){
                    echo "'product_title' variable doesn't set"
                    sh 'exit 1'
                }
                if (!VAULT_APPROLE){
                    echo "'vault_approle' variable doesn't set"
                    sh 'exit 1'
                }
                PROJECT_CONFIG = vaultUtils.getSecrets([namespace:PRODUCT_TITLE, vaultPath:"airflow/${AIRFLOW_CLUSTER}/project_config", appRoleCredential: VAULT_APPROLE])
                imageName = "${PROJECT_CONFIG.docker_registry_url}/airflow/${PROJECT_CONFIG.deploy_image}"
                imageTag = getImageTag()
                toPush = toPush()
            }

            stage('build'){
                image = docker.build("${imageName}:${imageTag}", ". --pull")
            }

            stage('publish'){
                if (toPush){
                    docker.withRegistry("https://${PROJECT_CONFIG.docker_registry_url}", PROJECT_CONFIG.docker_registry_crentials_id) {
                    image.push("${imageTag}")
                }
                } else {
                    Utils.markStageSkippedForConditional('publish')
                }
            }

            stage('Security scans') {
                parallel (
                    'CheckmarxScan': {
                        checkmarxUtils.runCheckmarxScan_ZeroLicense(
                            failBuildOnError: "false"
                        )
                    },
                    'SecretsScan': {
                        securityUtils.secretsScan[:]
                    },
                    'IacScan': {
                        securityUtils.iacScan(reportFormat: 'html')
                    },
                    'ImageScan': {
                        sh "docker pull ${imageName}:${imageTag}"
                        securityUtils.scanImage(imageName: "${imageName}", imageTag: "${imageTag}")
                    }
                )
            }

        }
    }
}

def getImageTag() {
    def tag = "pipeline${env.BUILD_NUMBER}"
    if (env.BRANCH_NAME == "main" || env.BRANCH_NAME == "master") {
        tag = "latest"
    } else if (env.BRANCH_NAME == 'dev') {
        tag = "dev"
    }
    return tag
}

// Returns deployment env ID based on build env branch/tags.
def getDeployEnv() {
    if (env.BRANCH_NAME == "main" || env.BRANCH_NAME == "master") {
        return "dev"
    } else if (env.BRANCH_NAME == 'test') {
        return "test"
    } else if (env.TAG_NAME) {
        return "prod"
    }
    return null
}

def toPush(){
    if (env.BRANCH_NAME == "main" || env.BRANCH_NAME == "master" || env.BRANCH_NAME == "dev"){
        return true
    }
    return false
}

</user_query>


Падает не `checkout` самого репо, а **post-checkout шаг обновления submodule**.

Ключевая строка:
- `hudson.plugins.git.GitException: Command "git config --get submodule.playbooks.url" returned status code 1`
- и дальше: `Could not perform submodule update`

Это значит, Jenkins (Git plugin, `SubmoduleOption`) пытается обновить сабмодуль `playbooks`, но в текущем checkout нет `submodule.playbooks.url` (обычно нет записи в `.gitmodules`/`.git/config` для этого сабмодуля).

## Что это обычно означает

- В job включено поведение **“Update submodules / Recursively update submodules”**, хотя:
  - либо в репозитории уже нет сабмодуля `playbooks`,
  - либо он переименован,
  - либо `.gitmodules` не содержит корректный `url` для `playbooks`.

## Как починить

1. **Если сабмодули не нужны** — отключить submodule behavior в SCM job.
   - Jenkins job → SCM (Git) → Additional Behaviours → убрать `SubmoduleOption`.
2. **Если сабмодуль нужен** — проверить `.gitmodules` в коммите `78cbfec...`:
   - должна быть секция вроде:
     - `[submodule "playbooks"]`
     - `path = playbooks`
     - `url = git@...`
3. Для Pipeline лучше сделать явный `checkout(...)` без submodule extension, если хотите исключить влияние UI-конфига.

## Почему это не про ваш Jenkinsfile напрямую

В `Jenkinsfile` у вас просто `checkout scm`; настройки `scm` подтягиваются из конфигурации multibranch/job, где и сидит `SubmoduleOption`.
Предупреждение про `timestamps` — косметика, к падению не относится.

Если хотите, скину готовый минимальный `checkout`-блок для Jenkinsfile, который гарантированно не трогает сабмодули.

**Диагностика ошибки Jenkins с субмодулями**


<user_query>
.gitmodules
[submodule "playbooks"]
	path = playbooks
	url = git@github.lmru.tech:adeo/dp--deploy-airflow2-ansible.git
	branch = rel_v0.3.1
[submodule "helm"]
	path = helm
	url = git@github.lmru.tech:adeo/dp--deploy-airflow2-helm.git
	branch = rel_0.3
</user_query>


Отлично, это сужает проблему: `.gitmodules` у вас корректный и `playbooks` там есть.

Тогда ошибка почти наверняка в связке **Jenkins Git plugin / git-client plugin / настройки checkout**, а не в содержимом `.gitmodules`.

Что происходит:
- Плагин на этапе `SubmoduleOption.onCheckoutCompleted` дергает `git config --get submodule.playbooks.url`.
- Эта команда читает **.git/config**, а не `.gitmodules`.
- Если ключ не был перенесен/инициализирован в `.git/config` (или плагин сделал это в неверном порядке), он падает с `status code 1` и роняет checkout.

## Наиболее вероятные причины

- Баг/несовместимость версий `git` (у вас 2.43.0) и Jenkins `git-client`/`git` plugin.
- Нестабильная логика SubmoduleOption в конкретной версии плагина.
- Конфликт job-настроек (submodule behavior + дополнительные SCM options).

## Практичный план

1. **Временно отключить submodule behavior в job** и проверить, что checkout проходит.
2. Если сабмодули нужны — выполнять их явно после checkout (более предсказуемо):
   - `git submodule sync --recursive`
   - `git submodule update --init --recursive`
3. Проверить/обновить Jenkins плагины:
   - `git`
   - `git-client`
4. Сверить, что в проблемном коммите `78cbfec...` действительно есть `.gitmodules` (не только в текущем рабочем состоянии).

## Почему это похоже именно на плагин

У вас ошибка не “repo not found / auth failed”, а именно чтение `submodule.playbooks.url` через `git config --get`, то есть сбой на внутреннем шаге обработки сабмодулей после успешного checkout коммита.

Если хотите, дам готовый `checkout`-блок для Pipeline, который обходит этот сценарий и стабильно работает с сабмодулями.

**Explaining Jenkins submodule checkout issues**


<user_query>
дай
</user_query>


```groovy
stage('checkout') {
    checkout([
        $class: 'GitSCM',
        branches: [[name: "*/${env.BRANCH_NAME ?: 'master'}"]],
        doGenerateSubmoduleConfigurations: false,
        extensions: [
            [$class: 'CleanBeforeCheckout'],
            [$class: 'CloneOption', noTags: true, shallow: false, timeout: 20]
            // ВАЖНО: намеренно НЕ добавляем SubmoduleOption,
            // чтобы избежать падения в git-client на submodule.playbooks.url
        ],
        userRemoteConfigs: [[
            url: 'git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git',
            credentialsId: 'id_rsa_svc-lmru-dataplatform'
        ]]
    ])

    // Явно инициализируем сабмодули после checkout
    sh '''
      set -euxo pipefail
      git submodule sync --recursive
      git submodule update --init --recursive
    '''
}
```

Если у вас multibranch и хотите оставить `checkout scm`, тогда минимальный вариант:

```groovy
stage('checkout'){
    checkout scm
    sh '''
      set -euxo pipefail
      git submodule sync --recursive
      git submodule update --init --recursive
    '''
}
```

Но тогда в UI job лучше убрать `Update submodules`, чтобы не было двойной/конфликтной логики.


<user_query>
попробовал в реплее
Running on p-jenkins-node-m-24 in /data/jenkins-root/workspace/_dp--deploy-reviseur-orch_master
10:13:07  [Pipeline] {
10:13:07  [Pipeline] timestamps
10:13:07  The timestamps step is unnecessary when timestamps are enabled for all Pipeline builds.
10:13:07  [Pipeline] {
10:13:07  [Pipeline] ansiColor
10:13:07  [Pipeline] {
10:13:07
10:13:07  [Pipeline] cleanWs
10:13:07  [WS-CLEANUP] Deleting project workspace...
10:13:07  [WS-CLEANUP] Deferred wipeout is used...
10:13:07  [WS-CLEANUP] done
10:13:07  [Pipeline] stage
10:13:07  [Pipeline] { (checkout)
10:13:07  [Pipeline] checkout
10:13:07  The recommended git tool is: NONE
10:13:07  using credential id_rsa_svc-lmru-dataplatform
10:13:07  Cloning the remote Git repository
10:13:07  Cloning with configured refspecs honoured and without tags
10:13:07  Avoid second fetch
10:13:07  Checking out Revision 78cbfec622f96d41b97a8901efc1f13071a67fbd (master)
10:13:07  Commit message: "yac"
10:13:07  Cloning repository git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git
10:13:07   > git init /data/jenkins-root/workspace/_dp--deploy-reviseur-orch_master # timeout=10
10:13:07  Fetching upstream changes from git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git
10:13:07   > git --version # timeout=10
10:13:07   > git --version # 'git version 2.43.0'
10:13:07  using GIT_SSH to set credentials SSH key for svc-lmru-dataplatform (GitHub Enterprise)
10:13:07   > git fetch --no-tags --force --progress -- git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git +refs/heads/master:refs/remotes/origin/master # timeout=10
10:13:07   > git config remote.origin.url git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git # timeout=10
10:13:07   > git config --add remote.origin.fetch +refs/heads/master:refs/remotes/origin/master # timeout=10
10:13:07   > git config core.sparsecheckout # timeout=10
10:13:07   > git checkout -f 78cbfec622f96d41b97a8901efc1f13071a67fbd # timeout=10
10:13:07   > git rev-list --no-walk 78cbfec622f96d41b97a8901efc1f13071a67fbd # timeout=10
10:13:07  ERROR: Checkout failed
10:13:07  Also:   hudson.remoting.Channel$CallSiteStackTrace: Remote call to p-jenkins-node-m-24
10:13:07  		at hudson.remoting.Channel.attachCallSiteStackTrace(Channel.java:1916)
10:13:07  		at hudson.remoting.UserRequest$ExceptionResponse.retrieve(UserRequest.java:384)
10:13:07  		at hudson.remoting.Channel.call(Channel.java:1108)
10:13:07  		at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler.execute(RemoteGitImpl.java:155)
10:13:07  		at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source)
10:13:07  		at java.base/java.lang.reflect.Method.invoke(Unknown Source)
10:13:07  		at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler.invoke(RemoteGitImpl.java:140)
10:13:07  		at PluginClassLoader for git-client/jdk.proxy32/jdk.proxy32.$Proxy368.execute(Unknown Source)
10:13:07  		at PluginClassLoader for git//hudson.plugins.git.extensions.impl.SubmoduleOption.onCheckoutCompleted(SubmoduleOption.java:196)
10:13:07  		at PluginClassLoader for git//hudson.plugins.git.GitSCM._checkout(GitSCM.java:1395)
10:13:07  		at PluginClassLoader for git//hudson.plugins.git.GitSCM.checkout(GitSCM.java:1277)
10:13:07  		at PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep.checkout(SCMStep.java:136)
10:13:07  		at PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:101)
10:13:07  		at PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:88)
10:13:07  		at PluginClassLoader for workflow-step-api//org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:49)
10:13:07  		at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
10:13:07  		at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
10:13:07  		at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
10:13:07  		at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
10:13:07  		at java.base/java.lang.Thread.run(Unknown Source)
10:13:07  hudson.plugins.git.GitException: Command "git config --get submodule.playbooks.url" returned status code 1:
10:13:07  stdout:
10:13:07  stderr:
10:13:07  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2848)
10:13:07  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2773)
10:13:07  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2768)
10:13:07  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommand(CliGitAPIImpl.java:2055)
10:13:07  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommand(CliGitAPIImpl.java:2067)
10:13:07  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.getSubmoduleUrl(CliGitAPIImpl.java:1631)
10:13:07  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl$7.execute(CliGitAPIImpl.java:1548)
10:13:07  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler$GitCommandMasterToSlaveCallable.call(RemoteGitImpl.java:173)
10:13:07  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler$GitCommandMasterToSlaveCallable.call(RemoteGitImpl.java:164)
10:13:07  	at hudson.remoting.UserRequest.perform(UserRequest.java:225)
10:13:07  	at hudson.remoting.UserRequest.perform(UserRequest.java:50)
10:13:07  	at hudson.remoting.Request$2.run(Request.java:391)
10:13:07  	at hudson.remoting.InterceptingExecutorService.lambda$wrap$0(InterceptingExecutorService.java:81)
10:13:07  	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
10:13:07  	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
10:13:07  	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
10:13:07  	at java.base/java.lang.Thread.run(Thread.java:1583)
10:13:07  Caused: java.io.IOException: Could not perform submodule update
10:13:07  	at PluginClassLoader for git//hudson.plugins.git.extensions.impl.SubmoduleOption.onCheckoutCompleted(SubmoduleOption.java:201)
10:13:07  	at PluginClassLoader for git//hudson.plugins.git.GitSCM._checkout(GitSCM.java:1395)
10:13:07  	at PluginClassLoader for git//hudson.plugins.git.GitSCM.checkout(GitSCM.java:1277)
10:13:07  	at PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep.checkout(SCMStep.java:136)
10:13:07  	at PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:101)
10:13:07  	at PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:88)
10:13:07  	at PluginClassLoader for workflow-step-api//org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:49)
10:13:07  	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
10:13:07  	at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
10:13:07  	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
10:13:07  	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
10:13:07  	at java.base/java.lang.Thread.run(Unknown Source)
10:13:07  ERROR: Maximum checkout retry attempts reached, aborting
10:13:07  [Pipeline] }
10:13:07  [Pipeline] // stage
10:13:07  [Pipeline] }
10:13:07
10:13:07  [Pipeline] // ansiColor
10:13:07  [Pipeline] }
10:13:07  [Pipeline] // timestamps
10:13:07  [Pipeline] }
10:13:07  [Pipeline] // node
10:13:07  [Pipeline] End of Pipeline
10:13:07  Also:   hudson.remoting.Channel$CallSiteStackTrace: Remote call to p-jenkins-node-m-24
10:13:07  		at hudson.remoting.Channel.attachCallSiteStackTrace(Channel.java:1916)
10:13:07  		at hudson.remoting.UserRequest$ExceptionResponse.retrieve(UserRequest.java:384)
10:13:07  		at hudson.remoting.Channel.call(Channel.java:1108)
10:13:07  		at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler.execute(RemoteGitImpl.java:155)
10:13:07  		at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source)
10:13:07  		at java.base/java.lang.reflect.Method.invoke(Unknown Source)
10:13:07  		at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler.invoke(RemoteGitImpl.java:140)
10:13:07  		at PluginClassLoader for git-client/jdk.proxy32/jdk.proxy32.$Proxy368.execute(Unknown Source)
10:13:07  		at PluginClassLoader for git//hudson.plugins.git.extensions.impl.SubmoduleOption.onCheckoutCompleted(SubmoduleOption.java:196)
10:13:07  		at PluginClassLoader for git//hudson.plugins.git.GitSCM._checkout(GitSCM.java:1395)
10:13:07  		at PluginClassLoader for git//hudson.plugins.git.GitSCM.checkout(GitSCM.java:1277)
10:13:07  		at PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep.checkout(SCMStep.java:136)
10:13:07  		at PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:101)
10:13:07  		at PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:88)
10:13:07  		at PluginClassLoader for workflow-step-api//org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:49)
10:13:07  		at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
10:13:07  		at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
10:13:07  		at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
10:13:07  		at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
10:13:07  		at java.base/java.lang.Thread.run(Unknown Source)
10:13:07  hudson.plugins.git.GitException: Command "git config --get submodule.playbooks.url" returned status code 1:
10:13:07  stdout:
10:13:07  stderr:
10:13:07  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2848)
10:13:07  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2773)
10:13:07  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2768)
10:13:07  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommand(CliGitAPIImpl.java:2055)
10:13:07  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommand(CliGitAPIImpl.java:2067)
10:13:07  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.getSubmoduleUrl(CliGitAPIImpl.java:1631)
10:13:07  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl$7.execute(CliGitAPIImpl.java:1548)
10:13:07  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler$GitCommandMasterToSlaveCallable.call(RemoteGitImpl.java:173)
10:13:07  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler$GitCommandMasterToSlaveCallable.call(RemoteGitImpl.java:164)
10:13:07  	at hudson.remoting.UserRequest.perform(UserRequest.java:225)
10:13:07  	at hudson.remoting.UserRequest.perform(UserRequest.java:50)
10:13:07  	at hudson.remoting.Request$2.run(Request.java:391)
10:13:07  	at hudson.remoting.InterceptingExecutorService.lambda$wrap$0(InterceptingExecutorService.java:81)
10:13:07  	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
10:13:07  	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
10:13:07  	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
10:13:07  	at java.base/java.lang.Thread.run(Thread.java:1583)
10:13:07  Also:   org.jenkinsci.plugins.workflow.actions.ErrorAction$ErrorId: c8d869aa-9f14-45c9-b1d7-1db7cb24c258
10:13:07  Caused: java.io.IOException: Could not perform submodule update
10:13:07  	at PluginClassLoader for git//hudson.plugins.git.extensions.impl.SubmoduleOption.onCheckoutCompleted(SubmoduleOption.java:201)
10:13:07  	at PluginClassLoader for git//hudson.plugins.git.GitSCM._checkout(GitSCM.java:1395)
10:13:07  	at PluginClassLoader for git//hudson.plugins.git.GitSCM.checkout(GitSCM.java:1277)
10:13:07  	at PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep.checkout(SCMStep.java:136)
10:13:07  	at PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:101)
10:13:07  	at PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:88)
10:13:07  	at PluginClassLoader for workflow-step-api//org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:49)
10:13:07  	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
10:13:07  	at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
10:13:07  	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
10:13:07  	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
10:13:07  	at java.base/java.lang.Thread.run(Unknown Source)
10:13:07   > git remote # timeout=10
10:13:07   > git submodule init # timeout=10
10:13:07   > git submodule sync # timeout=10
10:13:07   > git config --get remote.origin.url # timeout=10
10:13:07   > git submodule init # timeout=10
10:13:07   > git config -f .gitmodules --get-regexp ^submodule\.(.+)\.url # timeout=10
10:13:07   > git config --get submodule.playbooks.url # timeout=10
10:13:08
10:13:08  GitHub has been notified of this commit’s build result
10:13:08
10:13:08  Finished: FAILURE
</user_query>


Да, по этому логу видно точно: проблема **не ушла**, потому что Jenkins все еще применяет `SubmoduleOption` из конфигурации job/branch source.

Ключевое доказательство в конце:
- `SubmoduleOption.onCheckoutCompleted(...)`
- затем автокоманды плагина: `git submodule init`, `git submodule sync`, `git config --get submodule.playbooks.url`

То есть это не ваш shell-блок, а именно SCM behavior Jenkins.

## Что это значит practically

`Replay` меняет Groovy, но если в job/Multibranch Source включен submodule behavior, он все равно будет применен при `checkout scm` (и иногда даже при похожем checkout из SCM definition).

## Что сделать

1. В настройках job / multibranch source отключить:
   - `Advanced sub-modules behaviours` / `Recursively update submodules`
   - если есть, проверить и убрать `Sparse checkout paths` (часто ломает submodule init).
2. Либо полностью уйти от `checkout scm`:
   - использовать явный `checkout([$class: 'GitSCM', ... extensions: [CloneOption, CleanBeforeCheckout] ...])` **без** `SubmoduleOption`
   - и затем руками `git submodule sync --recursive && git submodule update --init --recursive`.
3. Проверить версии плагинов `git` + `git-client` (похоже на баг/несовместимость с `git 2.43.0`).

Если хотите, дам короткий чек-лист “куда кликать” именно для Multibranch Pipeline UI (там это неочевидно находится).

**Explaining replay submodule issue and fixes**


[Image]
<image_files>
The following images were provdied by the user and saved to the workspace for future use:
1. /home/ruslanpi/.cursor/projects/home-ruslanpi-Documents-repos-lmru-devops-argocd-apps/assets/image-12ce6599-bbb4-4235-bfc7-e670513cbc58.png

These images can be copied for use in other locations.
</image_files>
<user_query>

</user_query>


По скрину видно главный триггер: включен `Update tracking submodules to tip of branch`.

Для вашего кейса это лишнее и часто ломает checkout в Jenkins Git plugin (особенно с `git 2.43` + старыми plugin-версиями).

Сделайте так в этом блоке:

- оставить `Recursively update submodules` — **ON** (если реально нужны сабмодули)
- оставить `Use credentials from default remote...` — **ON**
- `Update tracking submodules to tip of branch` — **OFF**
- `Shallow clone` — **OFF**
- `Disable submodules processing` — **OFF** (понятно)

Если после этого все еще падает, тогда надежный обходной путь:

- в SCM вообще убрать `Advanced sub-modules behaviours`
- в Jenkinsfile после `checkout scm` руками:
  - `git submodule sync --recursive`
  - `git submodule update --init --recursive`

И еще один важный момент: вы запускали через Replay, а checkout по-прежнему идет через `checkout scm`; значит часть настроек продолжает тянуться из job/branch configuration. Поэтому изменения надо делать именно в конфиге джобы (или полностью перейти на явный `checkout([$class: 'GitSCM', ...])` без `SubmoduleOption`).

**Recommending disabling tracking update**


<user_query>
выключил Update tracking submodules to tip of branch
Rebuilds build #11
10:17:19 10:17:19  Connecting to https://github.lmru.tech/api/v3 using GitHub Enterprise Jenkins integration (svc-lmru-common)
10:17:21  Obtained Jenkinsfile from 78cbfec622f96d41b97a8901efc1f13071a67fbd
10:17:21  Resume disabled by user, switching to high-performance, low-durability mode.
10:17:21  Loading library common-utils@master
10:17:21  Attempting to resolve master from remote references...
10:17:21   > git --version # timeout=10
10:17:21   > git --version # 'git version 2.47.3'
10:17:21  using GIT_SSH to set credentials SSH key for svc-lmru-devops (GitHub Enterprise)
10:17:21   > git ls-remote -h -t -- git@github.lmru.tech:adeo/lmru--devops--pipeline-shared-library.git # timeout=10
10:17:21  Found match: refs/heads/master revision 631dab72d03353f5a22eced17329b52730434d4a
10:17:21  The recommended git tool is: git
10:17:21  using credential id_rsa_svc-lmru-devops
10:17:21   > git rev-parse --resolve-git-dir /var/jenkins_home/workspace/_dp--deploy-reviseur-orch_master@libs/e02a363bc11db211517c6042e0c2d5f8c30e8205c9bc2507b45d17bfe6949736/.git # timeout=10
10:17:21  Fetching changes from the remote Git repository
10:17:21   > git config remote.origin.url git@github.lmru.tech:adeo/lmru--devops--pipeline-shared-library.git # timeout=10
10:17:21  Fetching without tags
10:17:21  Fetching upstream changes from git@github.lmru.tech:adeo/lmru--devops--pipeline-shared-library.git
10:17:21   > git --version # timeout=10
10:17:21   > git --version # 'git version 2.47.3'
10:17:21  using GIT_SSH to set credentials SSH key for svc-lmru-devops (GitHub Enterprise)
10:17:21   > git fetch --no-tags --force --progress -- git@github.lmru.tech:adeo/lmru--devops--pipeline-shared-library.git +refs/heads/*:refs/remotes/origin/* # timeout=10
10:17:21  Checking out Revision 631dab72d03353f5a22eced17329b52730434d4a (master)
10:17:21   > git config core.sparsecheckout # timeout=10
10:17:21   > git checkout -f 631dab72d03353f5a22eced17329b52730434d4a # timeout=10
10:17:21  Commit message: "Aqua sca fix (#487)"
10:17:22  [Pipeline] Start of Pipeline
10:17:22  [Pipeline] properties
10:17:22  [Pipeline] node
10:17:22  Running on p-jenkins-node-m-04 in /data/jenkins-root/workspace/_dp--deploy-reviseur-orch_master
10:17:22  [Pipeline] {
10:17:22  [Pipeline] timestamps
10:17:22  The timestamps step is unnecessary when timestamps are enabled for all Pipeline builds.
10:17:22  [Pipeline] {
10:17:22  [Pipeline] ansiColor
10:17:22  [Pipeline] {
10:17:22
10:17:22  [Pipeline] cleanWs
10:17:22  [WS-CLEANUP] Deleting project workspace...
10:17:22  [WS-CLEANUP] Deferred wipeout is used...
10:17:22  [WS-CLEANUP] done
10:17:22  [Pipeline] stage
10:17:22  [Pipeline] { (checkout)
10:17:22  [Pipeline] checkout
10:17:22  The recommended git tool is: NONE
10:17:22  using credential id_rsa_svc-lmru-dataplatform
10:17:22  Cloning the remote Git repository
10:17:22  Cloning with configured refspecs honoured and without tags
10:17:23  Avoid second fetch
10:17:23  Checking out Revision 78cbfec622f96d41b97a8901efc1f13071a67fbd (master)
10:17:23  Commit message: "yac"
10:17:22  Cloning repository git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git
10:17:22   > git init /data/jenkins-root/workspace/_dp--deploy-reviseur-orch_master # timeout=10
10:17:22  Fetching upstream changes from git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git
10:17:22   > git --version # timeout=10
10:17:22   > git --version # 'git version 2.43.0'
10:17:22  using GIT_SSH to set credentials SSH key for svc-lmru-dataplatform (GitHub Enterprise)
10:17:22   > git fetch --no-tags --force --progress -- git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git +refs/heads/master:refs/remotes/origin/master # timeout=10
10:17:23   > git config remote.origin.url git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git # timeout=10
10:17:23   > git config --add remote.origin.fetch +refs/heads/master:refs/remotes/origin/master # timeout=10
10:17:23   > git config core.sparsecheckout # timeout=10
10:17:23   > git checkout -f 78cbfec622f96d41b97a8901efc1f13071a67fbd # timeout=10
10:17:23   > git rev-list --no-walk 78cbfec622f96d41b97a8901efc1f13071a67fbd # timeout=10
10:17:23  ERROR: Checkout failed
10:17:23  Also:   hudson.remoting.Channel$CallSiteStackTrace: Remote call to p-jenkins-node-m-04
10:17:23  		at hudson.remoting.Channel.attachCallSiteStackTrace(Channel.java:1916)
10:17:23  		at hudson.remoting.UserRequest$ExceptionResponse.retrieve(UserRequest.java:384)
10:17:23  		at hudson.remoting.Channel.call(Channel.java:1108)
10:17:23  		at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler.execute(RemoteGitImpl.java:155)
10:17:23  		at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source)
10:17:23  		at java.base/java.lang.reflect.Method.invoke(Unknown Source)
10:17:23  		at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler.invoke(RemoteGitImpl.java:140)
10:17:23  		at PluginClassLoader for git-client/jdk.proxy32/jdk.proxy32.$Proxy368.execute(Unknown Source)
10:17:23  		at PluginClassLoader for git//hudson.plugins.git.extensions.impl.SubmoduleOption.onCheckoutCompleted(SubmoduleOption.java:196)
10:17:23  		at PluginClassLoader for git//hudson.plugins.git.GitSCM._checkout(GitSCM.java:1395)
10:17:23  		at PluginClassLoader for git//hudson.plugins.git.GitSCM.checkout(GitSCM.java:1277)
10:17:23  		at PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep.checkout(SCMStep.java:136)
10:17:23  		at PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:101)
10:17:23  		at PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:88)
10:17:23  		at PluginClassLoader for workflow-step-api//org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:49)
10:17:23  		at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
10:17:23  		at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
10:17:23  		at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
10:17:23  		at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
10:17:23  		at java.base/java.lang.Thread.run(Unknown Source)
10:17:23  hudson.plugins.git.GitException: Command "git config --get submodule.playbooks.url" returned status code 1:
10:17:23  stdout:
10:17:23  stderr:
10:17:23  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2848)
10:17:23  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2773)
10:17:23  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2768)
10:17:23  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommand(CliGitAPIImpl.java:2055)
10:17:23  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommand(CliGitAPIImpl.java:2067)
10:17:23  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.getSubmoduleUrl(CliGitAPIImpl.java:1631)
10:17:23  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl$7.execute(CliGitAPIImpl.java:1548)
10:17:23  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler$GitCommandMasterToSlaveCallable.call(RemoteGitImpl.java:173)
10:17:23  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler$GitCommandMasterToSlaveCallable.call(RemoteGitImpl.java:164)
10:17:23  	at hudson.remoting.UserRequest.perform(UserRequest.java:225)
10:17:23  	at hudson.remoting.UserRequest.perform(UserRequest.java:50)
10:17:23  	at hudson.remoting.Request$2.run(Request.java:391)
10:17:23  	at hudson.remoting.InterceptingExecutorService.lambda$wrap$0(InterceptingExecutorService.java:81)
10:17:23  	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
10:17:23  	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
10:17:23  	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
10:17:23  	at java.base/java.lang.Thread.run(Thread.java:1583)
10:17:23  Caused: java.io.IOException: Could not perform submodule update
10:17:23  	at PluginClassLoader for git//hudson.plugins.git.extensions.impl.SubmoduleOption.onCheckoutCompleted(SubmoduleOption.java:201)
10:17:23  	at PluginClassLoader for git//hudson.plugins.git.GitSCM._checkout(GitSCM.java:1395)
10:17:23  	at PluginClassLoader for git//hudson.plugins.git.GitSCM.checkout(GitSCM.java:1277)
10:17:23  	at PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep.checkout(SCMStep.java:136)
10:17:23  	at PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:101)
10:17:23  	at PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:88)
10:17:23  	at PluginClassLoader for workflow-step-api//org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:49)
10:17:23  	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
10:17:23  	at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
10:17:23  	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
10:17:23  	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
10:17:23  	at java.base/java.lang.Thread.run(Unknown Source)
10:17:23  ERROR: Maximum checkout retry attempts reached, aborting
10:17:23  [Pipeline] }
10:17:23  [Pipeline] // stage
10:17:23  [Pipeline] }
10:17:23
10:17:23  [Pipeline] // ansiColor
10:17:23  [Pipeline] }
10:17:23  [Pipeline] // timestamps
10:17:23  [Pipeline] }
10:17:23  [Pipeline] // node
10:17:23  [Pipeline] End of Pipeline
10:17:23  Also:   hudson.remoting.Channel$CallSiteStackTrace: Remote call to p-jenkins-node-m-04
10:17:23  		at hudson.remoting.Channel.attachCallSiteStackTrace(Channel.java:1916)
10:17:23  		at hudson.remoting.UserRequest$ExceptionResponse.retrieve(UserRequest.java:384)
10:17:23  		at hudson.remoting.Channel.call(Channel.java:1108)
10:17:23  		at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler.execute(RemoteGitImpl.java:155)
10:17:23  		at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source)
10:17:23  		at java.base/java.lang.reflect.Method.invoke(Unknown Source)
10:17:23  		at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler.invoke(RemoteGitImpl.java:140)
10:17:23  		at PluginClassLoader for git-client/jdk.proxy32/jdk.proxy32.$Proxy368.execute(Unknown Source)
10:17:23  		at PluginClassLoader for git//hudson.plugins.git.extensions.impl.SubmoduleOption.onCheckoutCompleted(SubmoduleOption.java:196)
10:17:23  		at PluginClassLoader for git//hudson.plugins.git.GitSCM._checkout(GitSCM.java:1395)
10:17:23  		at PluginClassLoader for git//hudson.plugins.git.GitSCM.checkout(GitSCM.java:1277)
10:17:23  		at PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep.checkout(SCMStep.java:136)
10:17:23  		at PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:101)
10:17:23  		at PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:88)
10:17:23  		at PluginClassLoader for workflow-step-api//org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:49)
10:17:23  		at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
10:17:23  		at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
10:17:23  		at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
10:17:23  		at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
10:17:23  		at java.base/java.lang.Thread.run(Unknown Source)
10:17:23  hudson.plugins.git.GitException: Command "git config --get submodule.playbooks.url" returned status code 1:
10:17:23  stdout:
10:17:23  stderr:
10:17:23  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2848)
10:17:23  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2773)
10:17:23  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2768)
10:17:23  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommand(CliGitAPIImpl.java:2055)
10:17:23  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommand(CliGitAPIImpl.java:2067)
10:17:23  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.getSubmoduleUrl(CliGitAPIImpl.java:1631)
10:17:23  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl$7.execute(CliGitAPIImpl.java:1548)
10:17:23  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler$GitCommandMasterToSlaveCallable.call(RemoteGitImpl.java:173)
10:17:23  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler$GitCommandMasterToSlaveCallable.call(RemoteGitImpl.java:164)
10:17:23  	at hudson.remoting.UserRequest.perform(UserRequest.java:225)
10:17:23  	at hudson.remoting.UserRequest.perform(UserRequest.java:50)
10:17:23  	at hudson.remoting.Request$2.run(Request.java:391)
10:17:23  	at hudson.remoting.InterceptingExecutorService.lambda$wrap$0(InterceptingExecutorService.java:81)
10:17:23  	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
10:17:23  	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
10:17:23  	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
10:17:23  	at java.base/java.lang.Thread.run(Thread.java:1583)
10:17:23  Also:   org.jenkinsci.plugins.workflow.actions.ErrorAction$ErrorId: c3d596bb-e177-4e68-987a-4f048dbb048d
10:17:23  Caused: java.io.IOException: Could not perform submodule update
10:17:23  	at PluginClassLoader for git//hudson.plugins.git.extensions.impl.SubmoduleOption.onCheckoutCompleted(SubmoduleOption.java:201)
10:17:23  	at PluginClassLoader for git//hudson.plugins.git.GitSCM._checkout(GitSCM.java:1395)
10:17:23  	at PluginClassLoader for git//hudson.plugins.git.GitSCM.checkout(GitSCM.java:1277)
10:17:23  	at PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep.checkout(SCMStep.java:136)
10:17:23  	at PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:101)
10:17:23  	at PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:88)
10:17:23  	at PluginClassLoader for workflow-step-api//org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:49)
10:17:23  	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
10:17:23  	at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
10:17:23  	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
10:17:23  	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
10:17:23  	at java.base/java.lang.Thread.run(Unknown Source)
10:17:23   > git remote # timeout=10
10:17:23   > git submodule init # timeout=10
10:17:23   > git submodule sync # timeout=10
10:17:23   > git config --get remote.origin.url # timeout=10
10:17:23   > git submodule init # timeout=10
10:17:23   > git config -f .gitmodules --get-regexp ^submodule\.(.+)\.url # timeout=10
10:17:23   > git config --get submodule.playbooks.url # timeout=10
10:17:23
10:17:23  GitHub has been notified of this commit’s build result
10:17:23
10:17:23  Finished: FAILURE
</user_query>


Лог подтвердил: отключение только `Update tracking...` недостаточно.
Падает все равно в `SubmoduleOption.onCheckoutCompleted`, то есть Jenkins **по‑прежнему выполняет встроенную обработку submodule** и именно она ломается.

Что делать дальше (рабочий путь):

- В SCM полностью убрать блок `Advanced sub-modules behaviours`
  **или** поставить `Disable submodules processing = ON`.
- В `Jenkinsfile` уйти с `checkout scm` на явный checkout без submodule extension.
- Сабмодули подтянуть вручную после checkout через `sh`.

Минимальный надежный вариант:

```groovy
stage('checkout') {
  git branch: env.BRANCH_NAME,
      credentialsId: 'id_rsa_svc-lmru-dataplatform',
      url: 'git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git'

  sh '''
    set -euxo pipefail
    git submodule sync --recursive
    git submodule update --init --recursive
  '''
}
```

Почему это сработает:
- `git` step не тащит ваш проблемный `SubmoduleOption`.
- submodule init/update выполняется обычным git, без бага Jenkins plugin.

Дополнительно по логу видно разнобой версий git:
- shared library: `2.47.3`
- ваш checkout на агенте: `2.43.0` + `The recommended git tool is: NONE`

После стабилизации checkout стоит выровнять git tool на агенте (и задать его явно в Jenkins), но первопричина текущего падения — именно `SubmoduleOption`.

**Diagnosing Jenkins git submodule failure**


<user_query>
дай полный блок для чекаут с переносом сабмодулей
</user_query>


```groovy
stage('checkout') {
    // Полностью явный checkout без checkout scm и без SubmoduleOption Jenkins
    checkout([
        $class: 'GitSCM',
        branches: [[name: "*/${env.BRANCH_NAME ?: 'master'}"]],
        doGenerateSubmoduleConfigurations: false,
        userRemoteConfigs: [[
            url: 'git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git',
            credentialsId: 'id_rsa_svc-lmru-dataplatform'
        ]],
        extensions: [
            [$class: 'CleanBeforeCheckout'],
            [$class: 'CloneOption', noTags: true, shallow: false, depth: 0, timeout: 20]
            // ВАЖНО: НЕ добавляем SubmoduleOption
        ]
    ])

    // Ручная обработка сабмодулей (вместо Jenkins SubmoduleOption)
    sh '''
      set -euxo pipefail

      # Диагностика
      git --version
      git rev-parse --abbrev-ref HEAD || true
      git rev-parse --short HEAD
      test -f .gitmodules

      # Подтянуть URL из .gitmodules в .git/config
      git submodule sync --recursive

      # Инициализация/обновление сабмодулей до зафиксированных в superproject коммитов
      git submodule update --init --recursive

      # Опционально: вывести зафиксированные ревизии сабмодулей
      git submodule status --recursive
    '''
}
```

Если хотите именно “tip of branch” для сабмодулей (аналог спорной опции Jenkins), добавьте после `update --init --recursive`:

```groovy
sh '''
  set -euxo pipefail
  git submodule foreach --recursive '
    branch="$(git config -f "$toplevel/.gitmodules" submodule.$name.branch || true)"
    if [ -n "$branch" ]; then
      git fetch origin "$branch"
      git checkout "$branch" || true
      git pull --ff-only origin "$branch"
    fi
  '
'''
```

Но для reproducible сборок обычно лучше **не** делать tip-of-branch, а оставаться на pinned commit из суперрепозитория.


<user_query>
попробовал вот так #!groovy

properties([
    buildDiscarder (logRotator (artifactDaysToKeepStr: '', artifactNumToKeepStr: '10', daysToKeepStr: '', numToKeepStr: '10')),
    disableConcurrentBuilds (),
    disableResume (),
]);

import org.jenkinsci.plugins.pipeline.modeldefinition.Utils
@Library('common-utils') _

node ('dockerhost') {
    timestamps {
        ansiColor('xterm') {
            cleanWs()

            stage('checkout'){
                checkout scm
                sh '''
                    set -euxo pipefail
                    git submodule sync --recursive
                    git submodule update --init --recursive
                '''
            }

            stage('prepare'){
                // def response = httpRequest "http://amapi.apps.dev.data.lmru.tech/api/v1/getdeployinfo?repo_url=adeo/dp--batch-proc--ff-dom&module_env=test"
                withFolderProperties{
                    AIRFLOW_CLUSTER = env.airflow_cluster
                    PRODUCT_TITLE = env.product_title
                    VAULT_APPROLE = env.vault_approle
                }
                if (!AIRFLOW_CLUSTER){
                    echo "'airflow_cluster' variable doesn't set"
                    sh 'exit 1'
                }
                if (!PRODUCT_TITLE){
                    echo "'product_title' variable doesn't set"
                    sh 'exit 1'
                }
                if (!VAULT_APPROLE){
                    echo "'vault_approle' variable doesn't set"
                    sh 'exit 1'
                }
                PROJECT_CONFIG = vaultUtils.getSecrets([namespace:PRODUCT_TITLE, vaultPath:"airflow/${AIRFLOW_CLUSTER}/project_config", appRoleCredential: VAULT_APPROLE])
                imageName = "${PROJECT_CONFIG.docker_registry_url}/airflow/${PROJECT_CONFIG.deploy_image}"
                imageTag = getImageTag()
                toPush = toPush()
            }

            stage('build'){
                image = docker.build("${imageName}:${imageTag}", ". --pull")
            }

            stage('publish'){
                if (toPush){
                    docker.withRegistry("https://${PROJECT_CONFIG.docker_registry_url}", PROJECT_CONFIG.docker_registry_crentials_id) {
                    image.push("${imageTag}")
                }
                } else {
                    Utils.markStageSkippedForConditional('publish')
                }
            }

            stage('Security scans') {
                parallel (
                    'CheckmarxScan': {
                        checkmarxUtils.runCheckmarxScan_ZeroLicense(
                            failBuildOnError: "false"
                        )
                    },
                    'SecretsScan': {
                        securityUtils.secretsScan[:]
                    },
                    'IacScan': {
                        securityUtils.iacScan(reportFormat: 'html')
                    },
                    'ImageScan': {
                        sh "docker pull ${imageName}:${imageTag}"
                        securityUtils.scanImage(imageName: "${imageName}", imageTag: "${imageTag}")
                    }
                )
            }

        }
    }
}

def getImageTag() {
    def tag = "pipeline${env.BUILD_NUMBER}"
    if (env.BRANCH_NAME == "main" || env.BRANCH_NAME == "master") {
        tag = "latest"
    } else if (env.BRANCH_NAME == 'dev') {
        tag = "dev"
    }
    return tag
}

// Returns deployment env ID based on build env branch/tags.
def getDeployEnv() {
    if (env.BRANCH_NAME == "main" || env.BRANCH_NAME == "master") {
        return "dev"
    } else if (env.BRANCH_NAME == 'test') {
        return "test"
    } else if (env.TAG_NAME) {
        return "prod"
    }
    return null
}

def toPush(){
    if (env.BRANCH_NAME == "main" || env.BRANCH_NAME == "master" || env.BRANCH_NAME == "dev"){
        return true
    }
    return false
}

10:26:11  Started by user Руслан Петрович (60231159)

10:26:11  Replayed #13

10:26:15 10:26:15  Connecting to https://github.lmru.tech/api/v3 using GitHub Enterprise Jenkins integration (svc-lmru-common)
10:26:16  Obtained Jenkinsfile from 78cbfec622f96d41b97a8901efc1f13071a67fbd
10:26:16  Resume disabled by user, switching to high-performance, low-durability mode.
10:26:16  Loading library common-utils@master
10:26:16  Attempting to resolve master from remote references...
10:26:16   > git --version # timeout=10
10:26:16   > git --version # 'git version 2.47.3'
10:26:16  using GIT_SSH to set credentials SSH key for svc-lmru-devops (GitHub Enterprise)
10:26:16   > git ls-remote -h -t -- git@github.lmru.tech:adeo/lmru--devops--pipeline-shared-library.git # timeout=10
10:26:17  Found match: refs/heads/master revision 631dab72d03353f5a22eced17329b52730434d4a
10:26:17  The recommended git tool is: git
10:26:17  using credential id_rsa_svc-lmru-devops
10:26:17   > git rev-parse --resolve-git-dir /var/jenkins_home/workspace/_dp--deploy-reviseur-orch_master@libs/e02a363bc11db211517c6042e0c2d5f8c30e8205c9bc2507b45d17bfe6949736/.git # timeout=10
10:26:17  Fetching changes from the remote Git repository
10:26:17   > git config remote.origin.url git@github.lmru.tech:adeo/lmru--devops--pipeline-shared-library.git # timeout=10
10:26:17  Fetching without tags
10:26:17  Fetching upstream changes from git@github.lmru.tech:adeo/lmru--devops--pipeline-shared-library.git
10:26:17   > git --version # timeout=10
10:26:17   > git --version # 'git version 2.47.3'
10:26:17  using GIT_SSH to set credentials SSH key for svc-lmru-devops (GitHub Enterprise)
10:26:17   > git fetch --no-tags --force --progress -- git@github.lmru.tech:adeo/lmru--devops--pipeline-shared-library.git +refs/heads/*:refs/remotes/origin/* # timeout=10
10:26:17  Checking out Revision 631dab72d03353f5a22eced17329b52730434d4a (master)
10:26:17   > git config core.sparsecheckout # timeout=10
10:26:17   > git checkout -f 631dab72d03353f5a22eced17329b52730434d4a # timeout=10
10:26:17  Commit message: "Aqua sca fix (#487)"
10:26:18  [Pipeline] Start of Pipeline
10:26:18  [Pipeline] properties
10:26:18  [Pipeline] node
10:26:18  Running on p-jenkins-node-m-03
 in /data/jenkins-root/workspace/_dp--deploy-reviseur-orch_master
10:26:18  [Pipeline] {
10:26:18  [Pipeline] timestamps
10:26:18  The timestamps step is unnecessary when timestamps are enabled for all Pipeline builds.
10:26:18  [Pipeline] {
10:26:18  [Pipeline] ansiColor
10:26:18  [Pipeline] {
10:26:18
10:26:18  [Pipeline] cleanWs
10:26:18  [WS-CLEANUP] Deleting project workspace...
10:26:18  [WS-CLEANUP] Deferred wipeout is used...
10:26:18  [WS-CLEANUP] done
10:26:18  [Pipeline] stage
10:26:18  [Pipeline] { (checkout)
10:26:18  [Pipeline] checkout
10:26:18  The recommended git tool is: NONE
10:26:18  using credential id_rsa_svc-lmru-dataplatform
10:26:18  Cloning the remote Git repository
10:26:18  Cloning with configured refspecs honoured and without tags
10:26:18  Avoid second fetch
10:26:18  Checking out Revision 78cbfec622f96d41b97a8901efc1f13071a67fbd (master)
10:26:18  Commit message: "yac"
10:26:18  Cloning repository git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git
10:26:18   > git init /data/jenkins-root/workspace/_dp--deploy-reviseur-orch_master # timeout=10
10:26:18  Fetching upstream changes from git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git
10:26:18   > git --version # timeout=10
10:26:18   > git --version # 'git version 2.43.0'
10:26:18  using GIT_SSH to set credentials SSH key for svc-lmru-dataplatform (GitHub Enterprise)
10:26:18   > git fetch --no-tags --force --progress -- git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git +refs/heads/master:refs/remotes/origin/master # timeout=10
10:26:18   > git config remote.origin.url git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git # timeout=10
10:26:18   > git config --add remote.origin.fetch +refs/heads/master:refs/remotes/origin/master # timeout=10
10:26:18   > git config core.sparsecheckout # timeout=10
10:26:18   > git checkout -f 78cbfec622f96d41b97a8901efc1f13071a67fbd # timeout=10
10:26:18   > git rev-list --no-walk 78cbfec622f96d41b97a8901efc1f13071a67fbd # timeout=10
10:26:18  ERROR: Checkout failed
10:26:18  Also:   hudson.remoting.Channel$CallSiteStackTrace: Remote call to p-jenkins-node-m-03
10:26:18  		at hudson.remoting.Channel.attachCallSiteStackTrace(Channel.java:1916)
10:26:18  		at hudson.remoting.UserRequest$ExceptionResponse.retrieve(UserRequest.java:384)
10:26:18  		at hudson.remoting.Channel.call(Channel.java:1108)
10:26:18  		at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler.execute(RemoteGitImpl.java:155)
10:26:18  		at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source)
10:26:18  		at java.base/java.lang.reflect.Method.invoke(Unknown Source)
10:26:18  		at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler.invoke(RemoteGitImpl.java:140)
10:26:18  		at PluginClassLoader for git-client/jdk.proxy32/jdk.proxy32.$Proxy368.execute(Unknown Source)
10:26:18  		at PluginClassLoader for git//hudson.plugins.git.extensions.impl.SubmoduleOption.onCheckoutCompleted(SubmoduleOption.java:196)
10:26:18  		at PluginClassLoader for git//hudson.plugins.git.GitSCM._checkout(GitSCM.java:1395)
10:26:18  		at PluginClassLoader for git//hudson.plugins.git.GitSCM.checkout(GitSCM.java:1277)
10:26:18  		at PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep.checkout(SCMStep.java:136)
10:26:18  		at PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:101)
10:26:18  		at PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:88)
10:26:18  		at PluginClassLoader for workflow-step-api//org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:49)
10:26:18  		at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
10:26:18  		at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
10:26:18  		at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
10:26:18  		at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
10:26:18  		at java.base/java.lang.Thread.run(Unknown Source)
10:26:18  hudson.plugins.git.GitException: Command "git config --get submodule.playbooks.url" returned status code 1:
10:26:18  stdout:
10:26:18  stderr:
10:26:18  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2848)
10:26:18  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2773)
10:26:18  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2768)
10:26:18  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommand(CliGitAPIImpl.java:2055)
10:26:18  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommand(CliGitAPIImpl.java:2067)
10:26:18  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.getSubmoduleUrl(CliGitAPIImpl.java:1631)
10:26:18  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl$7.execute(CliGitAPIImpl.java:1548)
10:26:18  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler$GitCommandMasterToSlaveCallable.call(RemoteGitImpl.java:173)
10:26:18  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler$GitCommandMasterToSlaveCallable.call(RemoteGitImpl.java:164)
10:26:18  	at hudson.remoting.UserRequest.perform(UserRequest.java:225)
10:26:18  	at hudson.remoting.UserRequest.perform(UserRequest.java:50)
10:26:18  	at hudson.remoting.Request$2.run(Request.java:391)
10:26:18  	at hudson.remoting.InterceptingExecutorService.lambda$wrap$0(InterceptingExecutorService.java:81)
10:26:18  	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
10:26:18  	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
10:26:18  	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
10:26:18  	at java.base/java.lang.Thread.run(Thread.java:1583)
10:26:18  Caused: java.io.IOException: Could not perform submodule update
10:26:18  	at PluginClassLoader for git//hudson.plugins.git.extensions.impl.SubmoduleOption.onCheckoutCompleted(SubmoduleOption.java:201)
10:26:18  	at PluginClassLoader for git//hudson.plugins.git.GitSCM._checkout(GitSCM.java:1395)
10:26:18  	at PluginClassLoader for git//hudson.plugins.git.GitSCM.checkout(GitSCM.java:1277)
10:26:18  	at PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep.checkout(SCMStep.java:136)
10:26:18  	at PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:101)
10:26:18  	at PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:88)
10:26:18  	at PluginClassLoader for workflow-step-api//org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:49)
10:26:18  	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
10:26:18  	at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
10:26:18  	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
10:26:18  	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
10:26:18  	at java.base/java.lang.Thread.run(Unknown Source)
10:26:18  ERROR: Maximum checkout retry attempts reached, aborting
10:26:18  [Pipeline] }
10:26:18  [Pipeline] // stage
10:26:18  [Pipeline] }
10:26:18
10:26:18  [Pipeline] // ansiColor
10:26:18  [Pipeline] }
10:26:18  [Pipeline] // timestamps
10:26:18  [Pipeline] }
10:26:18  [Pipeline] // node
10:26:18  [Pipeline] End of Pipeline
10:26:18  Also:   hudson.remoting.Channel$CallSiteStackTrace: Remote call to p-jenkins-node-m-03
10:26:18  		at hudson.remoting.Channel.attachCallSiteStackTrace(Channel.java:1916)
10:26:18  		at hudson.remoting.UserRequest$ExceptionResponse.retrieve(UserRequest.java:384)
10:26:18  		at hudson.remoting.Channel.call(Channel.java:1108)
10:26:18  		at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler.execute(RemoteGitImpl.java:155)
10:26:18  		at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source)
10:26:18  		at java.base/java.lang.reflect.Method.invoke(Unknown Source)
10:26:18  		at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler.invoke(RemoteGitImpl.java:140)
10:26:18  		at PluginClassLoader for git-client/jdk.proxy32/jdk.proxy32.$Proxy368.execute(Unknown Source)
10:26:18  		at PluginClassLoader for git//hudson.plugins.git.extensions.impl.SubmoduleOption.onCheckoutCompleted(SubmoduleOption.java:196)
10:26:18  		at PluginClassLoader for git//hudson.plugins.git.GitSCM._checkout(GitSCM.java:1395)
10:26:18  		at PluginClassLoader for git//hudson.plugins.git.GitSCM.checkout(GitSCM.java:1277)
10:26:18  		at PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep.checkout(SCMStep.java:136)
10:26:18  		at PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:101)
10:26:18  		at PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:88)
10:26:18  		at PluginClassLoader for workflow-step-api//org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:49)
10:26:18  		at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
10:26:18  		at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
10:26:18  		at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
10:26:18  		at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
10:26:18  		at java.base/java.lang.Thread.run(Unknown Source)
10:26:18  hudson.plugins.git.GitException: Command "git config --get submodule.playbooks.url" returned status code 1:
10:26:18  stdout:
10:26:18  stderr:
10:26:18  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2848)
10:26:18  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2773)
10:26:18  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2768)
10:26:18  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommand(CliGitAPIImpl.java:2055)
10:26:18  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommand(CliGitAPIImpl.java:2067)
10:26:18  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.getSubmoduleUrl(CliGitAPIImpl.java:1631)
10:26:18  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl$7.execute(CliGitAPIImpl.java:1548)
10:26:18  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler$GitCommandMasterToSlaveCallable.call(RemoteGitImpl.java:173)
10:26:18  	at PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler$GitCommandMasterToSlaveCallable.call(RemoteGitImpl.java:164)
10:26:18  	at hudson.remoting.UserRequest.perform(UserRequest.java:225)
10:26:18  	at hudson.remoting.UserRequest.perform(UserRequest.java:50)
10:26:18  	at hudson.remoting.Request$2.run(Request.java:391)
10:26:18  	at hudson.remoting.InterceptingExecutorService.lambda$wrap$0(InterceptingExecutorService.java:81)
10:26:18  	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
10:26:18  	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
10:26:18  	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
10:26:18  	at java.base/java.lang.Thread.run(Thread.java:1583)
10:26:18  Also:   org.jenkinsci.plugins.workflow.actions.ErrorAction$ErrorId: c738f023-26d0-40d2-b0c7-d9a64f52f676
10:26:18  Caused: java.io.IOException: Could not perform submodule update
10:26:18  	at PluginClassLoader for git//hudson.plugins.git.extensions.impl.SubmoduleOption.onCheckoutCompleted(SubmoduleOption.java:201)
10:26:18  	at PluginClassLoader for git//hudson.plugins.git.GitSCM._checkout(GitSCM.java:1395)
10:26:18  	at PluginClassLoader for git//hudson.plugins.git.GitSCM.checkout(GitSCM.java:1277)
10:26:18  	at PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep.checkout(SCMStep.java:136)
10:26:18  	at PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:101)
10:26:18  	at PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:88)
10:26:18  	at PluginClassLoader for workflow-step-api//org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:49)
10:26:18  	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
10:26:18  	at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
10:26:18  	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
10:26:18  	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
10:26:18  	at java.base/java.lang.Thread.run(Unknown Source)
10:26:18   > git remote # timeout=10
10:26:18   > git submodule init # timeout=10
10:26:18   > git submodule sync # timeout=10
10:26:18   > git config --get remote.origin.url # timeout=10
10:26:18   > git submodule init # timeout=10
10:26:18   > git config -f .gitmodules --get-regexp ^submodule\.(.+)\.url # timeout=10
10:26:18   > git config --get submodule.playbooks.url # timeout=10
10:26:19
10:26:19  GitHub has been notified of this commit’s build result
10:26:19
10:26:19  Finished: FAILURE

</user_query>


Да, теперь видно 100% причину: ваш `sh` вообще не успевает выполниться, потому что пайплайн падает **на `checkout scm`**.

`checkout scm` тянет SCM-конфиг job вместе с `SubmoduleOption`, и он снова делает:
- `git submodule init`
- `git config --get submodule.playbooks.url`
- падение

То есть текущий `stage('checkout')` нужно менять полностью: **не использовать `checkout scm`**.

Используйте такой блок:

```groovy
stage('checkout') {
    def branchName = env.CHANGE_BRANCH ?: env.BRANCH_NAME ?: 'master'

    checkout([
        $class: 'GitSCM',
        branches: [[name: "*/${branchName}"]],
        doGenerateSubmoduleConfigurations: false,
        userRemoteConfigs: [[
            url: 'git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git',
            credentialsId: 'id_rsa_svc-lmru-dataplatform'
        ]],
        extensions: [
            [$class: 'CleanBeforeCheckout'],
            [$class: 'CloneOption', noTags: true, shallow: false, timeout: 20]
            // ВАЖНО: без SubmoduleOption
        ]
    ])

    sh '''
      set -euxo pipefail
      git submodule sync --recursive
      git submodule update --init --recursive
      git submodule status --recursive
    '''
}
```

И важно в UI джобы:
- либо убрать `Advanced sub-modules behaviours`,
- либо включить `Disable submodules processing`.

Пока где-то остается `SubmoduleOption`, `checkout scm` будет продолжать падать независимо от последующего `sh`.

**Providing explicit Git checkout snippet**


<user_query>
я до этого сделал Disable submodules processing в мультибранче
</user_query>


Тогда это похоже на то, что изменение в multibranch **еще не попало в конкретный branch-job/запуск**, либо `Replay/Rebuild` использует старый `scm` контекст.

По вашему логу видно, что в рантайме все еще активен `SubmoduleOption`:
- `SubmoduleOption.onCheckoutCompleted`
- `git submodule init`
- `git config --get submodule.playbooks.url`

Если `Disable submodules processing` реально применился, этих шагов быть не должно.

Что сделать, чтобы точно проверить:

- Сохранить конфиг **родительского** multibranch.
- Нажать `Scan Multibranch Pipeline Now` (переиндексация).
- Запустить **обычный Build Now**, не `Replay` и не `Rebuild #...`.
- Проверить лог checkout: не должно быть `SubmoduleOption.onCheckoutCompleted`.

И самый надежный обход независимо от UI-настроек:
- убрать `checkout scm` из Jenkinsfile,
- сделать явный `checkout([$class: 'GitSCM', ...])` без `SubmoduleOption`,
- потом руками `git submodule sync/update`.

Потому что пока остается `checkout scm`, вы зависите от того, какой именно `scm` объект Jenkins подложил в этот запуск.

**Explaining submodule option persistence**


<user_query>
вот нашел пример в другом дата репозитории
#!groovy

properties([
    disableConcurrentBuilds (),
    pipelineTriggers([
        issueCommentTrigger('Jenkins please retry a build')
    ])
]);

import org.jenkinsci.plugins.pipeline.modeldefinition.Utils
@Library(['dp--jenkins-pipe-libs@main', 'common-utils']) _

build = [
    app: "data-pages",  // Application name
    tag: null,          // Artifacts tag
    publish: false,     // Publicate build artifacts (image,binary etc.)
    deployEnv: null,    // Deployment environment.
    deployCluster: "",  // Deploy Kubernetes cluster id
    commit: "",         // GIT commit hash
    time: "",           // Build time
    deployOnly: false,  // Use for deploy-only runs
]

node ('lmru-dockerhost') {
    timestamps {
        ansiColor('xterm') {
            try {
                stage('checkout') {
                    checkout([
                        $class: 'GitSCM',
                        userRemoteConfigs: [[
                            url: 'git@github.lmru.tech:adeo/dp--data-pages.git',
                            credentialsId: 'id_rsa_jenkins_gitlab'
                        ]],
                        branches: scm.branches,
                        doGenerateSubmoduleConfigurations: false,
                        extensions: scm.extensions + [[
                            $class: 'SubmoduleOption',
                            disableSubmodules: false,
                            parentCredentials: true,
                            recursiveSubmodules: true,
                            reference: '',
                            trackingSubmodules: true,
                            threads: 10
                        ]],
                        submoduleCfg: []
                    ]);
                }

</user_query>


Хороший пример, но для вашей проблемы в нем есть **опасный момент**:

- `extensions: scm.extensions + [[ $class: 'SubmoduleOption', ... ]]`

Это наследует все extension’ы из `scm` (из multibranch/job), где у вас как раз и живет проблемный `SubmoduleOption`.
То есть такой шаблон может снова тащить тот же баг.

Для вашего кейса лучше так:

1) **не использовать** `checkout scm`
2) **не использовать** `scm.extensions`
3) задать `extensions` вручную (без `SubmoduleOption`)
4) сабмодули делать руками в `sh`

---

Минимально безопасный блок (адаптирован под ваш репо):

```groovy
stage('checkout') {
    def branchName = env.CHANGE_BRANCH ?: env.BRANCH_NAME ?: 'master'

    checkout([
        $class: 'GitSCM',
        userRemoteConfigs: [[
            url: 'git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git',
            credentialsId: 'id_rsa_svc-lmru-dataplatform'
        ]],
        branches: [[name: "*/${branchName}"]],
        doGenerateSubmoduleConfigurations: false,
        extensions: [
            [$class: 'CleanBeforeCheckout'],
            [$class: 'CloneOption', noTags: true, shallow: false, timeout: 20]
        ],
        submoduleCfg: []
    ])

    sh '''
      set -euxo pipefail
      git submodule sync --recursive
      git -c submodule.active=. submodule update --init --recursive
      git submodule status --recursive
    '''
}
```

`-c submodule.active=.` добавил специально: это обход редкого кейса, когда на агенте в глобальном git-config выставлен `submodule.active`, и `git submodule init` не инициализирует часть модулей (как раз может давать ваш симптом с `submodule.playbooks.url`).

Если хотите, дам еще “строгий” вариант с fallback-диагностикой (`cat .gitmodules`, `git config -l --show-origin | grep submodule.active`) на случай следующего падения.

**Analyzing submodule init failure causes**


<user_query>
stage('checkout') {
    def branchName = env.CHANGE_BRANCH ?: env.BRANCH_NAME ?: 'master'

    checkout([
        $class: 'GitSCM',
        userRemoteConfigs: [[
            url: 'git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git',
            credentialsId: 'id_rsa_svc-lmru-dataplatform'
        ]],
        branches: [[name: "*/${branchName}"]],
        doGenerateSubmoduleConfigurations: false,
        extensions: [
            [$class: 'CleanBeforeCheckout'],
            [$class: 'CloneOption', noTags: true, shallow: false, timeout: 20]
        ],
        submoduleCfg: []
    ])

    sh '''
      set -euxo pipefail
      git submodule sync --recursive
      git -c submodule.active=. submodule update --init --recursive
      git submodule status --recursive
    '''
}
опиши каждую строку
</user_query>


```groovy
stage('checkout') {                                  // Этап пайплайна с именем checkout.
    def branchName = env.CHANGE_BRANCH ?: env.BRANCH_NAME ?: 'master'
                                                      // Определяем ветку для checkout:
                                                      // 1) PR-ветка (CHANGE_BRANCH), если это PR билд
                                                      // 2) обычная BRANCH_NAME
                                                      // 3) fallback на master, если оба пустые

    checkout([                                        // Запускаем явный SCM checkout (не checkout scm).
        $class: 'GitSCM',                            // Используем Jenkins GitSCM плагин как реализацию SCM.
        userRemoteConfigs: [[                        // Настройки удаленного репозитория (может быть несколько remotes).
            url: 'git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git',
                                                      // SSH URL репозитория, который нужно клонировать.
            credentialsId: 'id_rsa_svc-lmru-dataplatform'
                                                      // Jenkins credentials для доступа по SSH.
        ]],
        branches: [[name: "*/${branchName}"]],       // Какую ветку checkout'ить (refs/remotes/origin/<branchName>).
        doGenerateSubmoduleConfigurations: false,    // Старый/legacy флаг Jenkins для сабмодулей; держим false.
        extensions: [                                // Дополнительные поведения GitSCM.
            [$class: 'CleanBeforeCheckout'],         // Чистит рабочую копию перед checkout (убирает мусор/остатки).
            [$class: 'CloneOption', noTags: true, shallow: false, timeout: 20]
                                                      // Параметры clone/fetch:
                                                      // noTags:true   -> не тянем теги (быстрее)
                                                      // shallow:false -> полный клон, не shallow
                                                      // timeout:20    -> таймаут git-операций (минуты)
        ],
        submoduleCfg: []                             // Legacy-поле конфигурации сабмодулей; оставляем пустым.
    ])

    sh '''                                           // Выполняем shell-команды уже после успешного checkout.
      set -euxo pipefail                             // Строгий режим bash:
                                                     // -e: падать при ошибке команды
                                                     // -u: падать на неинициализированной переменной
                                                     // -x: печатать выполняемые команды в лог
                                                     // -o pipefail: учитывать ошибку любой команды в pipeline

      git submodule sync --recursive                 // Синхронизируем .git/config сабмодулей с .gitmodules рекурсивно.
      git -c submodule.active=. submodule update --init --recursive
                                                     // Инициализируем и обновляем все сабмодули рекурсивно.
                                                     // -c submodule.active=. временно включает "все сабмодули"
                                                     // в рамках команды, обходя возможный конфликт global git config.
      git submodule status --recursive               // Печатаем итоговый статус/коммиты сабмодулей в лог.
    '''
}
```

Коротко по смыслу блока:
вы убираете зависимость от `checkout scm` и его скрытых `scm.extensions`, делаете чистый checkout, а сабмодули обновляете вручную и предсказуемо.


<user_query>
10:48:34  /data/jenkins-root/workspace/_dp--deploy-reviseur-orch_master@tmp/durable-eba081a6/script.sh.copy: 2: set: Illegal option -o pipefail

</user_query>


Это нормально для `sh` в Jenkins: у вас step выполняется не в `bash`, а в `/bin/sh` (часто `dash`), где нет `pipefail`.

Исправления:

### Вариант 1 (рекомендую): явно запускать `bash`
```groovy
sh '''
  #!/usr/bin/env bash
  set -euxo pipefail
  git submodule sync --recursive
  git -c submodule.active=. submodule update --init --recursive
  git submodule status --recursive
'''
```

### Вариант 2: остаться на `sh` без `pipefail`
```groovy
sh '''
  set -eu
  git submodule sync --recursive
  git -c submodule.active=. submodule update --init --recursive
  git submodule status --recursive
'''
```

Если хотите, лучше еще использовать `label` для шага, чтобы в логе было читабельнее:
```groovy
sh(label: 'Init submodules', script: '''#!/usr/bin/env bash
set -euxo pipefail
...
''')
```

**Advising bash shebang over pipefail**