Includes global state.vscdb, per-repo transcripts, workspace storage, composer exports, and restore scripts for a new machine. Co-authored-by: Cursor <cursoragent@cursor.com>
68 lines
151 KiB
JSON
68 lines
151 KiB
JSON
{"role":"user","message":{"content":[{"type":"text","text":"<user_query>\nпришел человк с с запросом \n\t\nМихаил Школьный\n32 минуты назад\n\n@lmru-devops-bot \nДобрый день! \nМожно ли узнать, кто у нас тянет креды из Vault из неймспейса vspspc. \nУ нас такая ситуация, что кто-то спамит наш топик кафки. \nМы обратились к апи платформе и streaming solution с просьбой узнать, кто это может быть. \nПрава на запись в топик есть только у одного нашего пользователя. Попробовали изменить пароль. \nНо трафик продолжился почти сразу после смены. \nХотим узнать, кто запрашивал креды. \nВозможный точный путь к кредам в Vault: \nprice_calculator_orchestrator/test/kafka/token_ha sales_price_data_gatherer/test/kafka/token \nМожет можно узнать, кто брал эти креды?\n\nvault login сделан\n</user_query>"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"Понял задачу: нужно оперативно помочь с расследованием, кто мог читать эти креды из Vault по `vspspc` и указанным путям. Сначала проверю в репозитории, какие роли/сервис-аккаунты вообще имеют доступ к этим секретам, затем попробую через `vault` посмотреть аудит (если включен) и вытащить фактические чтения.\n\n**Planning vault audit investigation**"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"Сейчас вижу, что локально `vault` стучится в `127.0.0.1:8200`, поэтому не видит сервер Vault — значит нужно подхватить правильный `VAULT_ADDR`/контекст. Параллельно ищу в репо, где именно используются эти пути секретов, чтобы сразу дать список потенциальных потребителей.\n\n**Inspecting vault configuration and secrets**"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"Нашел, что в этом репо нет прямых вхождений самих путей `.../kafka/token(_ha)`, поэтому источник, вероятно, в другом конфиге или создается динамически. Сейчас проверю доступ к боевому Vault по `vault.lmru.tech` и отдельно соберу все манифесты в `vspspc`, где могут быть ссылки на Vault/ExternalSecret.\n\n**Testing vault access and searching secrets**"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"Удалось достучаться до `vault.lmru.tech`, это уже хорошо. Дальше проверяю, есть ли у текущей сессии права посмотреть аудит и связанные роли/политики — это единственный надежный способ ответить именно “кто читал” (а не просто “кто потенциально может”).\n\n**Assessing Vault audit and access queries**"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"Подтвердил: аудит в Vault включен (`file`, путь `/vault/logs/audit.log`), то есть технически источник истины есть. Сейчас делаю точечный проход по ACL-политикам Vault, чтобы определить, какие роли вообще могут читать эти два пути и сузить круг подозреваемых до конкретных identity/ролей.\n\n**Planning policy audit commands**"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"**Testing permission scope and metadata access**"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"Есть ограничения по правам на просмотр всех ACL-политик, поэтому иду снизу вверх: проверяю, в каких mount’ах эти пути вообще существуют/читаемы (без вывода значений секрета), чтобы понять реальный контур доступа.\n\n**Planning multi-path secret access tests**"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"**Assessing vault path and permissions**"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"**Exploring key listing commands**"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"**Assessing Vault auth methods**"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"Права текущего токена сильно ограничены (нет доступа к `sys/auth`, `sys/policies`, многим mount’ам), поэтому “кто именно читал” из CLI напрямую пока не извлекается. Проверю еще, доступен ли хотя бы `audit-hash` — это позволит связать путь/токен с записями в audit log для платформенной команды.\n\n**Testing vault token capabilities**"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"**Exploring deeper path listing**"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"**Exploring Vault path and audit access**"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"**Planning HMAC audit hash generation**"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"Проверил прямо сейчас через Vault (с вашим логином).\n\n- Аудит **включен**: `audit_log_1` типа `file`, путь `file_path=/vault/logs/audit.log`.\n- Значит ответ на вопрос “кто брал креды” получить **можно**, но только через разбор audit-log (с этой машины файл недоступен).\n- По текущему токену нет прав на полный просмотр `sys/policies`/`sys/auth`, поэтому список всех потенциальных ролей из Vault я не выгрузил.\n- Точные пути, которые вы прислали, в проверенных mount’ах как есть не нашлись (`No value found`) — возможно, путь указан не полностью (например, с префиксом окружения/namespace или другой mount).\n\nСгенерировал HMAC для поиска в audit log (это правильный способ искать в Vault-аудите, т.к. путь там хранится в хэшированном виде):\n\n- `service-platform/price_calculator_orchestrator/test/kafka/token_ha` \n `hmac-sha256:d7cb2e65704272d81be1e8f024af2f6cf29d199f04760f28ebda6ca9a56c2c28`\n- `service-platform/sales_price_data_gatherer/test/kafka/token` \n `hmac-sha256:56234c5f869e64ca34a44764fe1b61f18ed6784c8fdd9b47a116fed7f3b88530`\n- `service-platform/vspspc/price_calculator_orchestrator/test/kafka/token_ha` \n `hmac-sha256:9dd84eadf45944013e5ff977e42b6e8cdb497ff9ef1575b496a1d96d43e78246`\n- `service-platform/vspspc/sales_price_data_gatherer/test/kafka/token` \n `hmac-sha256:bedad6e3921fcc146afe948ab97340a5288598098acd5e60d541e8c824f1817a`\n\nЧто попросить у платформы/ops (или сделать на ноде Vault):\n- отфильтровать `audit.log` по этим HMAC в `request.path`\n- взять записи с `request.operation=read` (и `update`, если это dynamic creds endpoint)\n- из найденных записей отдать: `time`, `auth.display_name`, `auth.metadata`, `request.remote_address`, `request.path`\n\nЭто даст конкретного клиента/роль/источник, кто читал секреты. \nЕсли хотите, подготовлю готовый текст ответа Михаилу в чат (коротко и без лишней технички).\n\n**Clarifying audit log access limits**"}]}}
|
||
{"role":"user","message":{"content":[{"type":"text","text":"<user_query>\nвопрос не по репозиторию\nRunning on p-jenkins-node-m-04 in /data/jenkins-root/workspace/_dp--deploy-reviseur-orch_master\n19:13:40 [Pipeline] {\n19:13:40 [Pipeline] timestamps\n19:13:40 The timestamps step is unnecessary when timestamps are enabled for all Pipeline builds.\n19:13:40 [Pipeline] {\n19:13:40 [Pipeline] ansiColor\n19:13:40 [Pipeline] {\n19:13:40 \n19:13:40 [Pipeline] cleanWs\n19:13:40 [WS-CLEANUP] Deleting project workspace...\n19:13:40 [WS-CLEANUP] Deferred wipeout is used...\n19:13:40 [WS-CLEANUP] done\n19:13:40 [Pipeline] stage\n19:13:40 [Pipeline] { (checkout)\n19:13:40 [Pipeline] checkout\n19:13:40 The recommended git tool is: NONE\n19:13:40 using credential id_rsa_svc-lmru-dataplatform\n19:13:40 Cloning the remote Git repository\n19:13:40 Cloning with configured refspecs honoured and without tags\n19:13:40 Avoid second fetch\n19:13:40 Checking out Revision 78cbfec622f96d41b97a8901efc1f13071a67fbd (master)\n19:13:40 Commit message: \"yac\"\n19:13:40 Cloning repository git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git\n19:13:40 > git init /data/jenkins-root/workspace/_dp--deploy-reviseur-orch_master # timeout=10\n19:13:40 Fetching upstream changes from git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git\n19:13:40 > git --version # timeout=10\n19:13:40 > git --version # 'git version 2.43.0'\n19:13:40 using GIT_SSH to set credentials SSH key for svc-lmru-dataplatform (GitHub Enterprise)\n19: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\n19:13:40 > git config remote.origin.url git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git # timeout=10\n19:13:40 > git config --add remote.origin.fetch +refs/heads/master:refs/remotes/origin/master # timeout=10\n19:13:40 > git config core.sparsecheckout # timeout=10\n19:13:40 > git checkout -f 78cbfec622f96d41b97a8901efc1f13071a67fbd # timeout=10\n19:13:40 > git rev-list --no-walk 78cbfec622f96d41b97a8901efc1f13071a67fbd # timeout=10\n19:13:41 ERROR: Checkout failed\n19:13:41 Also: hudson.remoting.Channel$CallSiteStackTrace: Remote call to p-jenkins-node-m-04\n19:13:41 \t\tat hudson.remoting.Channel.attachCallSiteStackTrace(Channel.java:1916)\n19:13:41 \t\tat hudson.remoting.UserRequest$ExceptionResponse.retrieve(UserRequest.java:384)\n19:13:41 \t\tat hudson.remoting.Channel.call(Channel.java:1108)\n19:13:41 \t\tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler.execute(RemoteGitImpl.java:155)\n19:13:41 \t\tat java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source)\n19:13:41 \t\tat java.base/java.lang.reflect.Method.invoke(Unknown Source)\n19:13:41 \t\tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler.invoke(RemoteGitImpl.java:140)\n19:13:41 \t\tat PluginClassLoader for git-client/jdk.proxy32/jdk.proxy32.$Proxy368.execute(Unknown Source)\n19:13:41 \t\tat PluginClassLoader for git//hudson.plugins.git.extensions.impl.SubmoduleOption.onCheckoutCompleted(SubmoduleOption.java:196)\n19:13:41 \t\tat PluginClassLoader for git//hudson.plugins.git.GitSCM._checkout(GitSCM.java:1395)\n19:13:41 \t\tat PluginClassLoader for git//hudson.plugins.git.GitSCM.checkout(GitSCM.java:1277)\n19:13:41 \t\tat PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep.checkout(SCMStep.java:136)\n19:13:41 \t\tat PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:101)\n19:13:41 \t\tat PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:88)\n19:13:41 \t\tat PluginClassLoader for workflow-step-api//org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:49)\n19:13:41 \t\tat java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)\n19:13:41 \t\tat java.base/java.util.concurrent.FutureTask.run(Unknown Source)\n19:13:41 \t\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)\n19:13:41 \t\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)\n19:13:41 \t\tat java.base/java.lang.Thread.run(Unknown Source)\n19:13:41 hudson.plugins.git.GitException: Command \"git config --get submodule.playbooks.url\" returned status code 1:\n19:13:41 stdout: \n19:13:41 stderr: \n19:13:41 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2848)\n19:13:41 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2773)\n19:13:41 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2768)\n19:13:41 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommand(CliGitAPIImpl.java:2055)\n19:13:41 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommand(CliGitAPIImpl.java:2067)\n19:13:41 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.getSubmoduleUrl(CliGitAPIImpl.java:1631)\n19:13:41 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl$7.execute(CliGitAPIImpl.java:1548)\n19:13:41 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler$GitCommandMasterToSlaveCallable.call(RemoteGitImpl.java:173)\n19:13:41 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler$GitCommandMasterToSlaveCallable.call(RemoteGitImpl.java:164)\n19:13:41 \tat hudson.remoting.UserRequest.perform(UserRequest.java:225)\n19:13:41 \tat hudson.remoting.UserRequest.perform(UserRequest.java:50)\n19:13:41 \tat hudson.remoting.Request$2.run(Request.java:391)\n19:13:41 \tat hudson.remoting.InterceptingExecutorService.lambda$wrap$0(InterceptingExecutorService.java:81)\n19:13:41 \tat java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)\n19:13:41 \tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)\n19:13:41 \tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)\n19:13:41 \tat java.base/java.lang.Thread.run(Thread.java:1583)\n19:13:41 Caused: java.io.IOException: Could not perform submodule update\n19:13:41 \tat PluginClassLoader for git//hudson.plugins.git.extensions.impl.SubmoduleOption.onCheckoutCompleted(SubmoduleOption.java:201)\n19:13:41 \tat PluginClassLoader for git//hudson.plugins.git.GitSCM._checkout(GitSCM.java:1395)\n19:13:41 \tat PluginClassLoader for git//hudson.plugins.git.GitSCM.checkout(GitSCM.java:1277)\n19:13:41 \tat PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep.checkout(SCMStep.java:136)\n19:13:41 \tat PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:101)\n19:13:41 \tat PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:88)\n19:13:41 \tat PluginClassLoader for workflow-step-api//org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:49)\n19:13:41 \tat java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)\n19:13:41 \tat java.base/java.util.concurrent.FutureTask.run(Unknown Source)\n19:13:41 \tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)\n19:13:41 \tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)\n19:13:41 \tat java.base/java.lang.Thread.run(Unknown Source)\n19:13:41 ERROR: Maximum checkout retry attempts reached, aborting\n\n#!groovy\n\nproperties([\n buildDiscarder (logRotator (artifactDaysToKeepStr: '', artifactNumToKeepStr: '10', daysToKeepStr: '', numToKeepStr: '10')),\n disableConcurrentBuilds (),\n disableResume (),\n]);\n\nimport org.jenkinsci.plugins.pipeline.modeldefinition.Utils\n@Library('common-utils') _\n\nnode ('dockerhost') {\n timestamps {\n ansiColor('xterm') {\n cleanWs()\n\n stage('checkout'){\n checkout scm\n }\n\n stage('prepare'){\n // def response = httpRequest \"http://amapi.apps.dev.data.lmru.tech/api/v1/getdeployinfo?repo_url=adeo/dp--batch-proc--ff-dom&module_env=test\"\n withFolderProperties{\n AIRFLOW_CLUSTER = env.airflow_cluster\n PRODUCT_TITLE = env.product_title\n VAULT_APPROLE = env.vault_approle\n }\n if (!AIRFLOW_CLUSTER){\n echo \"'airflow_cluster' variable doesn't set\"\n sh 'exit 1'\n }\n if (!PRODUCT_TITLE){\n echo \"'product_title' variable doesn't set\"\n sh 'exit 1'\n }\n if (!VAULT_APPROLE){\n echo \"'vault_approle' variable doesn't set\"\n sh 'exit 1'\n }\n PROJECT_CONFIG = vaultUtils.getSecrets([namespace:PRODUCT_TITLE, vaultPath:\"airflow/${AIRFLOW_CLUSTER}/project_config\", appRoleCredential: VAULT_APPROLE])\n imageName = \"${PROJECT_CONFIG.docker_registry_url}/airflow/${PROJECT_CONFIG.deploy_image}\"\n imageTag = getImageTag()\n toPush = toPush()\n }\n\n stage('build'){\n image = docker.build(\"${imageName}:${imageTag}\", \". --pull\")\n }\n\n stage('publish'){\n if (toPush){\n docker.withRegistry(\"https://${PROJECT_CONFIG.docker_registry_url}\", PROJECT_CONFIG.docker_registry_crentials_id) {\n image.push(\"${imageTag}\")\n }\n } else {\n Utils.markStageSkippedForConditional('publish')\n }\n }\n\n stage('Security scans') {\n parallel (\n 'CheckmarxScan': {\n checkmarxUtils.runCheckmarxScan_ZeroLicense(\n failBuildOnError: \"false\"\n )\n },\n 'SecretsScan': {\n securityUtils.secretsScan[:]\n },\n 'IacScan': {\n securityUtils.iacScan(reportFormat: 'html')\n },\n 'ImageScan': {\n sh \"docker pull ${imageName}:${imageTag}\"\n securityUtils.scanImage(imageName: \"${imageName}\", imageTag: \"${imageTag}\")\n }\n )\n }\n\n }\n }\n}\n\ndef getImageTag() {\n def tag = \"pipeline${env.BUILD_NUMBER}\"\n if (env.BRANCH_NAME == \"main\" || env.BRANCH_NAME == \"master\") {\n tag = \"latest\"\n } else if (env.BRANCH_NAME == 'dev') {\n tag = \"dev\"\n }\n return tag\n}\n\n// Returns deployment env ID based on build env branch/tags.\ndef getDeployEnv() {\n if (env.BRANCH_NAME == \"main\" || env.BRANCH_NAME == \"master\") {\n return \"dev\"\n } else if (env.BRANCH_NAME == 'test') {\n return \"test\"\n } else if (env.TAG_NAME) {\n return \"prod\"\n }\n return null\n}\n\ndef toPush(){\n if (env.BRANCH_NAME == \"main\" || env.BRANCH_NAME == \"master\" || env.BRANCH_NAME == \"dev\"){\n return true\n }\n return false\n}\n\n</user_query>"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"Падает не `checkout` самого репо, а **post-checkout шаг обновления submodule**.\n\nКлючевая строка:\n- `hudson.plugins.git.GitException: Command \"git config --get submodule.playbooks.url\" returned status code 1`\n- и дальше: `Could not perform submodule update`\n\nЭто значит, Jenkins (Git plugin, `SubmoduleOption`) пытается обновить сабмодуль `playbooks`, но в текущем checkout нет `submodule.playbooks.url` (обычно нет записи в `.gitmodules`/`.git/config` для этого сабмодуля).\n\n## Что это обычно означает\n\n- В job включено поведение **“Update submodules / Recursively update submodules”**, хотя:\n - либо в репозитории уже нет сабмодуля `playbooks`,\n - либо он переименован,\n - либо `.gitmodules` не содержит корректный `url` для `playbooks`.\n\n## Как починить\n\n1. **Если сабмодули не нужны** — отключить submodule behavior в SCM job.\n - Jenkins job → SCM (Git) → Additional Behaviours → убрать `SubmoduleOption`.\n2. **Если сабмодуль нужен** — проверить `.gitmodules` в коммите `78cbfec...`:\n - должна быть секция вроде:\n - `[submodule \"playbooks\"]`\n - `path = playbooks`\n - `url = git@...`\n3. Для Pipeline лучше сделать явный `checkout(...)` без submodule extension, если хотите исключить влияние UI-конфига.\n\n## Почему это не про ваш Jenkinsfile напрямую\n\nВ `Jenkinsfile` у вас просто `checkout scm`; настройки `scm` подтягиваются из конфигурации multibranch/job, где и сидит `SubmoduleOption`. \nПредупреждение про `timestamps` — косметика, к падению не относится.\n\nЕсли хотите, скину готовый минимальный `checkout`-блок для Jenkinsfile, который гарантированно не трогает сабмодули.\n\n**Диагностика ошибки Jenkins с субмодулями**"}]}}
|
||
{"role":"user","message":{"content":[{"type":"text","text":"<user_query>\n.gitmodules\n[submodule \"playbooks\"]\n\tpath = playbooks\n\turl = git@github.lmru.tech:adeo/dp--deploy-airflow2-ansible.git\n\tbranch = rel_v0.3.1\n[submodule \"helm\"]\n\tpath = helm\n\turl = git@github.lmru.tech:adeo/dp--deploy-airflow2-helm.git\n\tbranch = rel_0.3\n</user_query>"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"Отлично, это сужает проблему: `.gitmodules` у вас корректный и `playbooks` там есть.\n\nТогда ошибка почти наверняка в связке **Jenkins Git plugin / git-client plugin / настройки checkout**, а не в содержимом `.gitmodules`.\n\nЧто происходит:\n- Плагин на этапе `SubmoduleOption.onCheckoutCompleted` дергает `git config --get submodule.playbooks.url`.\n- Эта команда читает **.git/config**, а не `.gitmodules`.\n- Если ключ не был перенесен/инициализирован в `.git/config` (или плагин сделал это в неверном порядке), он падает с `status code 1` и роняет checkout.\n\n## Наиболее вероятные причины\n\n- Баг/несовместимость версий `git` (у вас 2.43.0) и Jenkins `git-client`/`git` plugin.\n- Нестабильная логика SubmoduleOption в конкретной версии плагина.\n- Конфликт job-настроек (submodule behavior + дополнительные SCM options).\n\n## Практичный план\n\n1. **Временно отключить submodule behavior в job** и проверить, что checkout проходит.\n2. Если сабмодули нужны — выполнять их явно после checkout (более предсказуемо):\n - `git submodule sync --recursive`\n - `git submodule update --init --recursive`\n3. Проверить/обновить Jenkins плагины:\n - `git`\n - `git-client`\n4. Сверить, что в проблемном коммите `78cbfec...` действительно есть `.gitmodules` (не только в текущем рабочем состоянии).\n\n## Почему это похоже именно на плагин\n\nУ вас ошибка не “repo not found / auth failed”, а именно чтение `submodule.playbooks.url` через `git config --get`, то есть сбой на внутреннем шаге обработки сабмодулей после успешного checkout коммита.\n\nЕсли хотите, дам готовый `checkout`-блок для Pipeline, который обходит этот сценарий и стабильно работает с сабмодулями.\n\n**Explaining Jenkins submodule checkout issues**"}]}}
|
||
{"role":"user","message":{"content":[{"type":"text","text":"<user_query>\nдай\n</user_query>"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"```groovy\nstage('checkout') {\n checkout([\n $class: 'GitSCM',\n branches: [[name: \"*/${env.BRANCH_NAME ?: 'master'}\"]],\n doGenerateSubmoduleConfigurations: false,\n extensions: [\n [$class: 'CleanBeforeCheckout'],\n [$class: 'CloneOption', noTags: true, shallow: false, timeout: 20]\n // ВАЖНО: намеренно НЕ добавляем SubmoduleOption,\n // чтобы избежать падения в git-client на submodule.playbooks.url\n ],\n userRemoteConfigs: [[\n url: 'git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git',\n credentialsId: 'id_rsa_svc-lmru-dataplatform'\n ]]\n ])\n\n // Явно инициализируем сабмодули после checkout\n sh '''\n set -euxo pipefail\n git submodule sync --recursive\n git submodule update --init --recursive\n '''\n}\n```\n\nЕсли у вас multibranch и хотите оставить `checkout scm`, тогда минимальный вариант:\n\n```groovy\nstage('checkout'){\n checkout scm\n sh '''\n set -euxo pipefail\n git submodule sync --recursive\n git submodule update --init --recursive\n '''\n}\n```\n\nНо тогда в UI job лучше убрать `Update submodules`, чтобы не было двойной/конфликтной логики."}]}}
|
||
{"role":"user","message":{"content":[{"type":"text","text":"<user_query>\nпопробовал в реплее\nRunning on p-jenkins-node-m-24 in /data/jenkins-root/workspace/_dp--deploy-reviseur-orch_master\n10:13:07 [Pipeline] {\n10:13:07 [Pipeline] timestamps\n10:13:07 The timestamps step is unnecessary when timestamps are enabled for all Pipeline builds.\n10:13:07 [Pipeline] {\n10:13:07 [Pipeline] ansiColor\n10:13:07 [Pipeline] {\n10:13:07 \n10:13:07 [Pipeline] cleanWs\n10:13:07 [WS-CLEANUP] Deleting project workspace...\n10:13:07 [WS-CLEANUP] Deferred wipeout is used...\n10:13:07 [WS-CLEANUP] done\n10:13:07 [Pipeline] stage\n10:13:07 [Pipeline] { (checkout)\n10:13:07 [Pipeline] checkout\n10:13:07 The recommended git tool is: NONE\n10:13:07 using credential id_rsa_svc-lmru-dataplatform\n10:13:07 Cloning the remote Git repository\n10:13:07 Cloning with configured refspecs honoured and without tags\n10:13:07 Avoid second fetch\n10:13:07 Checking out Revision 78cbfec622f96d41b97a8901efc1f13071a67fbd (master)\n10:13:07 Commit message: \"yac\"\n10:13:07 Cloning repository git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git\n10:13:07 > git init /data/jenkins-root/workspace/_dp--deploy-reviseur-orch_master # timeout=10\n10:13:07 Fetching upstream changes from git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git\n10:13:07 > git --version # timeout=10\n10:13:07 > git --version # 'git version 2.43.0'\n10:13:07 using GIT_SSH to set credentials SSH key for svc-lmru-dataplatform (GitHub Enterprise)\n10: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\n10:13:07 > git config remote.origin.url git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git # timeout=10\n10:13:07 > git config --add remote.origin.fetch +refs/heads/master:refs/remotes/origin/master # timeout=10\n10:13:07 > git config core.sparsecheckout # timeout=10\n10:13:07 > git checkout -f 78cbfec622f96d41b97a8901efc1f13071a67fbd # timeout=10\n10:13:07 > git rev-list --no-walk 78cbfec622f96d41b97a8901efc1f13071a67fbd # timeout=10\n10:13:07 ERROR: Checkout failed\n10:13:07 Also: hudson.remoting.Channel$CallSiteStackTrace: Remote call to p-jenkins-node-m-24\n10:13:07 \t\tat hudson.remoting.Channel.attachCallSiteStackTrace(Channel.java:1916)\n10:13:07 \t\tat hudson.remoting.UserRequest$ExceptionResponse.retrieve(UserRequest.java:384)\n10:13:07 \t\tat hudson.remoting.Channel.call(Channel.java:1108)\n10:13:07 \t\tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler.execute(RemoteGitImpl.java:155)\n10:13:07 \t\tat java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source)\n10:13:07 \t\tat java.base/java.lang.reflect.Method.invoke(Unknown Source)\n10:13:07 \t\tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler.invoke(RemoteGitImpl.java:140)\n10:13:07 \t\tat PluginClassLoader for git-client/jdk.proxy32/jdk.proxy32.$Proxy368.execute(Unknown Source)\n10:13:07 \t\tat PluginClassLoader for git//hudson.plugins.git.extensions.impl.SubmoduleOption.onCheckoutCompleted(SubmoduleOption.java:196)\n10:13:07 \t\tat PluginClassLoader for git//hudson.plugins.git.GitSCM._checkout(GitSCM.java:1395)\n10:13:07 \t\tat PluginClassLoader for git//hudson.plugins.git.GitSCM.checkout(GitSCM.java:1277)\n10:13:07 \t\tat PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep.checkout(SCMStep.java:136)\n10:13:07 \t\tat PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:101)\n10:13:07 \t\tat PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:88)\n10:13:07 \t\tat PluginClassLoader for workflow-step-api//org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:49)\n10:13:07 \t\tat java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)\n10:13:07 \t\tat java.base/java.util.concurrent.FutureTask.run(Unknown Source)\n10:13:07 \t\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)\n10:13:07 \t\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)\n10:13:07 \t\tat java.base/java.lang.Thread.run(Unknown Source)\n10:13:07 hudson.plugins.git.GitException: Command \"git config --get submodule.playbooks.url\" returned status code 1:\n10:13:07 stdout: \n10:13:07 stderr: \n10:13:07 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2848)\n10:13:07 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2773)\n10:13:07 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2768)\n10:13:07 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommand(CliGitAPIImpl.java:2055)\n10:13:07 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommand(CliGitAPIImpl.java:2067)\n10:13:07 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.getSubmoduleUrl(CliGitAPIImpl.java:1631)\n10:13:07 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl$7.execute(CliGitAPIImpl.java:1548)\n10:13:07 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler$GitCommandMasterToSlaveCallable.call(RemoteGitImpl.java:173)\n10:13:07 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler$GitCommandMasterToSlaveCallable.call(RemoteGitImpl.java:164)\n10:13:07 \tat hudson.remoting.UserRequest.perform(UserRequest.java:225)\n10:13:07 \tat hudson.remoting.UserRequest.perform(UserRequest.java:50)\n10:13:07 \tat hudson.remoting.Request$2.run(Request.java:391)\n10:13:07 \tat hudson.remoting.InterceptingExecutorService.lambda$wrap$0(InterceptingExecutorService.java:81)\n10:13:07 \tat java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)\n10:13:07 \tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)\n10:13:07 \tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)\n10:13:07 \tat java.base/java.lang.Thread.run(Thread.java:1583)\n10:13:07 Caused: java.io.IOException: Could not perform submodule update\n10:13:07 \tat PluginClassLoader for git//hudson.plugins.git.extensions.impl.SubmoduleOption.onCheckoutCompleted(SubmoduleOption.java:201)\n10:13:07 \tat PluginClassLoader for git//hudson.plugins.git.GitSCM._checkout(GitSCM.java:1395)\n10:13:07 \tat PluginClassLoader for git//hudson.plugins.git.GitSCM.checkout(GitSCM.java:1277)\n10:13:07 \tat PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep.checkout(SCMStep.java:136)\n10:13:07 \tat PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:101)\n10:13:07 \tat PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:88)\n10:13:07 \tat PluginClassLoader for workflow-step-api//org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:49)\n10:13:07 \tat java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)\n10:13:07 \tat java.base/java.util.concurrent.FutureTask.run(Unknown Source)\n10:13:07 \tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)\n10:13:07 \tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)\n10:13:07 \tat java.base/java.lang.Thread.run(Unknown Source)\n10:13:07 ERROR: Maximum checkout retry attempts reached, aborting\n10:13:07 [Pipeline] }\n10:13:07 [Pipeline] // stage\n10:13:07 [Pipeline] }\n10:13:07 \n10:13:07 [Pipeline] // ansiColor\n10:13:07 [Pipeline] }\n10:13:07 [Pipeline] // timestamps\n10:13:07 [Pipeline] }\n10:13:07 [Pipeline] // node\n10:13:07 [Pipeline] End of Pipeline\n10:13:07 Also: hudson.remoting.Channel$CallSiteStackTrace: Remote call to p-jenkins-node-m-24\n10:13:07 \t\tat hudson.remoting.Channel.attachCallSiteStackTrace(Channel.java:1916)\n10:13:07 \t\tat hudson.remoting.UserRequest$ExceptionResponse.retrieve(UserRequest.java:384)\n10:13:07 \t\tat hudson.remoting.Channel.call(Channel.java:1108)\n10:13:07 \t\tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler.execute(RemoteGitImpl.java:155)\n10:13:07 \t\tat java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source)\n10:13:07 \t\tat java.base/java.lang.reflect.Method.invoke(Unknown Source)\n10:13:07 \t\tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler.invoke(RemoteGitImpl.java:140)\n10:13:07 \t\tat PluginClassLoader for git-client/jdk.proxy32/jdk.proxy32.$Proxy368.execute(Unknown Source)\n10:13:07 \t\tat PluginClassLoader for git//hudson.plugins.git.extensions.impl.SubmoduleOption.onCheckoutCompleted(SubmoduleOption.java:196)\n10:13:07 \t\tat PluginClassLoader for git//hudson.plugins.git.GitSCM._checkout(GitSCM.java:1395)\n10:13:07 \t\tat PluginClassLoader for git//hudson.plugins.git.GitSCM.checkout(GitSCM.java:1277)\n10:13:07 \t\tat PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep.checkout(SCMStep.java:136)\n10:13:07 \t\tat PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:101)\n10:13:07 \t\tat PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:88)\n10:13:07 \t\tat PluginClassLoader for workflow-step-api//org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:49)\n10:13:07 \t\tat java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)\n10:13:07 \t\tat java.base/java.util.concurrent.FutureTask.run(Unknown Source)\n10:13:07 \t\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)\n10:13:07 \t\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)\n10:13:07 \t\tat java.base/java.lang.Thread.run(Unknown Source)\n10:13:07 hudson.plugins.git.GitException: Command \"git config --get submodule.playbooks.url\" returned status code 1:\n10:13:07 stdout: \n10:13:07 stderr: \n10:13:07 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2848)\n10:13:07 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2773)\n10:13:07 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2768)\n10:13:07 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommand(CliGitAPIImpl.java:2055)\n10:13:07 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommand(CliGitAPIImpl.java:2067)\n10:13:07 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.getSubmoduleUrl(CliGitAPIImpl.java:1631)\n10:13:07 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl$7.execute(CliGitAPIImpl.java:1548)\n10:13:07 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler$GitCommandMasterToSlaveCallable.call(RemoteGitImpl.java:173)\n10:13:07 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler$GitCommandMasterToSlaveCallable.call(RemoteGitImpl.java:164)\n10:13:07 \tat hudson.remoting.UserRequest.perform(UserRequest.java:225)\n10:13:07 \tat hudson.remoting.UserRequest.perform(UserRequest.java:50)\n10:13:07 \tat hudson.remoting.Request$2.run(Request.java:391)\n10:13:07 \tat hudson.remoting.InterceptingExecutorService.lambda$wrap$0(InterceptingExecutorService.java:81)\n10:13:07 \tat java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)\n10:13:07 \tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)\n10:13:07 \tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)\n10:13:07 \tat java.base/java.lang.Thread.run(Thread.java:1583)\n10:13:07 Also: org.jenkinsci.plugins.workflow.actions.ErrorAction$ErrorId: c8d869aa-9f14-45c9-b1d7-1db7cb24c258\n10:13:07 Caused: java.io.IOException: Could not perform submodule update\n10:13:07 \tat PluginClassLoader for git//hudson.plugins.git.extensions.impl.SubmoduleOption.onCheckoutCompleted(SubmoduleOption.java:201)\n10:13:07 \tat PluginClassLoader for git//hudson.plugins.git.GitSCM._checkout(GitSCM.java:1395)\n10:13:07 \tat PluginClassLoader for git//hudson.plugins.git.GitSCM.checkout(GitSCM.java:1277)\n10:13:07 \tat PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep.checkout(SCMStep.java:136)\n10:13:07 \tat PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:101)\n10:13:07 \tat PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:88)\n10:13:07 \tat PluginClassLoader for workflow-step-api//org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:49)\n10:13:07 \tat java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)\n10:13:07 \tat java.base/java.util.concurrent.FutureTask.run(Unknown Source)\n10:13:07 \tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)\n10:13:07 \tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)\n10:13:07 \tat java.base/java.lang.Thread.run(Unknown Source)\n10:13:07 > git remote # timeout=10\n10:13:07 > git submodule init # timeout=10\n10:13:07 > git submodule sync # timeout=10\n10:13:07 > git config --get remote.origin.url # timeout=10\n10:13:07 > git submodule init # timeout=10\n10:13:07 > git config -f .gitmodules --get-regexp ^submodule\\.(.+)\\.url # timeout=10\n10:13:07 > git config --get submodule.playbooks.url # timeout=10\n10:13:08 \n10:13:08 GitHub has been notified of this commit’s build result\n10:13:08 \n10:13:08 Finished: FAILURE\n</user_query>"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"Да, по этому логу видно точно: проблема **не ушла**, потому что Jenkins все еще применяет `SubmoduleOption` из конфигурации job/branch source.\n\nКлючевое доказательство в конце:\n- `SubmoduleOption.onCheckoutCompleted(...)`\n- затем автокоманды плагина: `git submodule init`, `git submodule sync`, `git config --get submodule.playbooks.url`\n\nТо есть это не ваш shell-блок, а именно SCM behavior Jenkins.\n\n## Что это значит practically\n\n`Replay` меняет Groovy, но если в job/Multibranch Source включен submodule behavior, он все равно будет применен при `checkout scm` (и иногда даже при похожем checkout из SCM definition).\n\n## Что сделать\n\n1. В настройках job / multibranch source отключить:\n - `Advanced sub-modules behaviours` / `Recursively update submodules`\n - если есть, проверить и убрать `Sparse checkout paths` (часто ломает submodule init).\n2. Либо полностью уйти от `checkout scm`:\n - использовать явный `checkout([$class: 'GitSCM', ... extensions: [CloneOption, CleanBeforeCheckout] ...])` **без** `SubmoduleOption`\n - и затем руками `git submodule sync --recursive && git submodule update --init --recursive`.\n3. Проверить версии плагинов `git` + `git-client` (похоже на баг/несовместимость с `git 2.43.0`).\n\nЕсли хотите, дам короткий чек-лист “куда кликать” именно для Multibranch Pipeline UI (там это неочевидно находится).\n\n**Explaining replay submodule issue and fixes**"}]}}
|
||
{"role":"user","message":{"content":[{"type":"text","text":"[Image]\n<image_files>\nThe following images were provdied by the user and saved to the workspace for future use:\n1. /home/ruslanpi/.cursor/projects/home-ruslanpi-Documents-repos-lmru-devops-argocd-apps/assets/image-12ce6599-bbb4-4235-bfc7-e670513cbc58.png\n\nThese images can be copied for use in other locations.\n</image_files>\n<user_query>\n\n</user_query>"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"По скрину видно главный триггер: включен `Update tracking submodules to tip of branch`.\n\nДля вашего кейса это лишнее и часто ломает checkout в Jenkins Git plugin (особенно с `git 2.43` + старыми plugin-версиями).\n\nСделайте так в этом блоке:\n\n- оставить `Recursively update submodules` — **ON** (если реально нужны сабмодули)\n- оставить `Use credentials from default remote...` — **ON**\n- `Update tracking submodules to tip of branch` — **OFF**\n- `Shallow clone` — **OFF**\n- `Disable submodules processing` — **OFF** (понятно)\n\nЕсли после этого все еще падает, тогда надежный обходной путь:\n\n- в SCM вообще убрать `Advanced sub-modules behaviours`\n- в Jenkinsfile после `checkout scm` руками:\n - `git submodule sync --recursive`\n - `git submodule update --init --recursive`\n\nИ еще один важный момент: вы запускали через Replay, а checkout по-прежнему идет через `checkout scm`; значит часть настроек продолжает тянуться из job/branch configuration. Поэтому изменения надо делать именно в конфиге джобы (или полностью перейти на явный `checkout([$class: 'GitSCM', ...])` без `SubmoduleOption`).\n\n**Recommending disabling tracking update**"}]}}
|
||
{"role":"user","message":{"content":[{"type":"text","text":"<user_query>\nвыключил Update tracking submodules to tip of branch\nRebuilds build #11\n10:17:19 10:17:19 Connecting to https://github.lmru.tech/api/v3 using GitHub Enterprise Jenkins integration (svc-lmru-common)\n10:17:21 Obtained Jenkinsfile from 78cbfec622f96d41b97a8901efc1f13071a67fbd\n10:17:21 Resume disabled by user, switching to high-performance, low-durability mode.\n10:17:21 Loading library common-utils@master\n10:17:21 Attempting to resolve master from remote references...\n10:17:21 > git --version # timeout=10\n10:17:21 > git --version # 'git version 2.47.3'\n10:17:21 using GIT_SSH to set credentials SSH key for svc-lmru-devops (GitHub Enterprise)\n10:17:21 > git ls-remote -h -t -- git@github.lmru.tech:adeo/lmru--devops--pipeline-shared-library.git # timeout=10\n10:17:21 Found match: refs/heads/master revision 631dab72d03353f5a22eced17329b52730434d4a\n10:17:21 The recommended git tool is: git\n10:17:21 using credential id_rsa_svc-lmru-devops\n10:17:21 > git rev-parse --resolve-git-dir /var/jenkins_home/workspace/_dp--deploy-reviseur-orch_master@libs/e02a363bc11db211517c6042e0c2d5f8c30e8205c9bc2507b45d17bfe6949736/.git # timeout=10\n10:17:21 Fetching changes from the remote Git repository\n10:17:21 > git config remote.origin.url git@github.lmru.tech:adeo/lmru--devops--pipeline-shared-library.git # timeout=10\n10:17:21 Fetching without tags\n10:17:21 Fetching upstream changes from git@github.lmru.tech:adeo/lmru--devops--pipeline-shared-library.git\n10:17:21 > git --version # timeout=10\n10:17:21 > git --version # 'git version 2.47.3'\n10:17:21 using GIT_SSH to set credentials SSH key for svc-lmru-devops (GitHub Enterprise)\n10: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\n10:17:21 Checking out Revision 631dab72d03353f5a22eced17329b52730434d4a (master)\n10:17:21 > git config core.sparsecheckout # timeout=10\n10:17:21 > git checkout -f 631dab72d03353f5a22eced17329b52730434d4a # timeout=10\n10:17:21 Commit message: \"Aqua sca fix (#487)\"\n10:17:22 [Pipeline] Start of Pipeline\n10:17:22 [Pipeline] properties\n10:17:22 [Pipeline] node\n10:17:22 Running on p-jenkins-node-m-04 in /data/jenkins-root/workspace/_dp--deploy-reviseur-orch_master\n10:17:22 [Pipeline] {\n10:17:22 [Pipeline] timestamps\n10:17:22 The timestamps step is unnecessary when timestamps are enabled for all Pipeline builds.\n10:17:22 [Pipeline] {\n10:17:22 [Pipeline] ansiColor\n10:17:22 [Pipeline] {\n10:17:22 \n10:17:22 [Pipeline] cleanWs\n10:17:22 [WS-CLEANUP] Deleting project workspace...\n10:17:22 [WS-CLEANUP] Deferred wipeout is used...\n10:17:22 [WS-CLEANUP] done\n10:17:22 [Pipeline] stage\n10:17:22 [Pipeline] { (checkout)\n10:17:22 [Pipeline] checkout\n10:17:22 The recommended git tool is: NONE\n10:17:22 using credential id_rsa_svc-lmru-dataplatform\n10:17:22 Cloning the remote Git repository\n10:17:22 Cloning with configured refspecs honoured and without tags\n10:17:23 Avoid second fetch\n10:17:23 Checking out Revision 78cbfec622f96d41b97a8901efc1f13071a67fbd (master)\n10:17:23 Commit message: \"yac\"\n10:17:22 Cloning repository git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git\n10:17:22 > git init /data/jenkins-root/workspace/_dp--deploy-reviseur-orch_master # timeout=10\n10:17:22 Fetching upstream changes from git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git\n10:17:22 > git --version # timeout=10\n10:17:22 > git --version # 'git version 2.43.0'\n10:17:22 using GIT_SSH to set credentials SSH key for svc-lmru-dataplatform (GitHub Enterprise)\n10: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\n10:17:23 > git config remote.origin.url git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git # timeout=10\n10:17:23 > git config --add remote.origin.fetch +refs/heads/master:refs/remotes/origin/master # timeout=10\n10:17:23 > git config core.sparsecheckout # timeout=10\n10:17:23 > git checkout -f 78cbfec622f96d41b97a8901efc1f13071a67fbd # timeout=10\n10:17:23 > git rev-list --no-walk 78cbfec622f96d41b97a8901efc1f13071a67fbd # timeout=10\n10:17:23 ERROR: Checkout failed\n10:17:23 Also: hudson.remoting.Channel$CallSiteStackTrace: Remote call to p-jenkins-node-m-04\n10:17:23 \t\tat hudson.remoting.Channel.attachCallSiteStackTrace(Channel.java:1916)\n10:17:23 \t\tat hudson.remoting.UserRequest$ExceptionResponse.retrieve(UserRequest.java:384)\n10:17:23 \t\tat hudson.remoting.Channel.call(Channel.java:1108)\n10:17:23 \t\tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler.execute(RemoteGitImpl.java:155)\n10:17:23 \t\tat java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source)\n10:17:23 \t\tat java.base/java.lang.reflect.Method.invoke(Unknown Source)\n10:17:23 \t\tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler.invoke(RemoteGitImpl.java:140)\n10:17:23 \t\tat PluginClassLoader for git-client/jdk.proxy32/jdk.proxy32.$Proxy368.execute(Unknown Source)\n10:17:23 \t\tat PluginClassLoader for git//hudson.plugins.git.extensions.impl.SubmoduleOption.onCheckoutCompleted(SubmoduleOption.java:196)\n10:17:23 \t\tat PluginClassLoader for git//hudson.plugins.git.GitSCM._checkout(GitSCM.java:1395)\n10:17:23 \t\tat PluginClassLoader for git//hudson.plugins.git.GitSCM.checkout(GitSCM.java:1277)\n10:17:23 \t\tat PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep.checkout(SCMStep.java:136)\n10:17:23 \t\tat PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:101)\n10:17:23 \t\tat PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:88)\n10:17:23 \t\tat PluginClassLoader for workflow-step-api//org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:49)\n10:17:23 \t\tat java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)\n10:17:23 \t\tat java.base/java.util.concurrent.FutureTask.run(Unknown Source)\n10:17:23 \t\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)\n10:17:23 \t\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)\n10:17:23 \t\tat java.base/java.lang.Thread.run(Unknown Source)\n10:17:23 hudson.plugins.git.GitException: Command \"git config --get submodule.playbooks.url\" returned status code 1:\n10:17:23 stdout: \n10:17:23 stderr: \n10:17:23 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2848)\n10:17:23 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2773)\n10:17:23 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2768)\n10:17:23 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommand(CliGitAPIImpl.java:2055)\n10:17:23 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommand(CliGitAPIImpl.java:2067)\n10:17:23 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.getSubmoduleUrl(CliGitAPIImpl.java:1631)\n10:17:23 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl$7.execute(CliGitAPIImpl.java:1548)\n10:17:23 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler$GitCommandMasterToSlaveCallable.call(RemoteGitImpl.java:173)\n10:17:23 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler$GitCommandMasterToSlaveCallable.call(RemoteGitImpl.java:164)\n10:17:23 \tat hudson.remoting.UserRequest.perform(UserRequest.java:225)\n10:17:23 \tat hudson.remoting.UserRequest.perform(UserRequest.java:50)\n10:17:23 \tat hudson.remoting.Request$2.run(Request.java:391)\n10:17:23 \tat hudson.remoting.InterceptingExecutorService.lambda$wrap$0(InterceptingExecutorService.java:81)\n10:17:23 \tat java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)\n10:17:23 \tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)\n10:17:23 \tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)\n10:17:23 \tat java.base/java.lang.Thread.run(Thread.java:1583)\n10:17:23 Caused: java.io.IOException: Could not perform submodule update\n10:17:23 \tat PluginClassLoader for git//hudson.plugins.git.extensions.impl.SubmoduleOption.onCheckoutCompleted(SubmoduleOption.java:201)\n10:17:23 \tat PluginClassLoader for git//hudson.plugins.git.GitSCM._checkout(GitSCM.java:1395)\n10:17:23 \tat PluginClassLoader for git//hudson.plugins.git.GitSCM.checkout(GitSCM.java:1277)\n10:17:23 \tat PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep.checkout(SCMStep.java:136)\n10:17:23 \tat PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:101)\n10:17:23 \tat PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:88)\n10:17:23 \tat PluginClassLoader for workflow-step-api//org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:49)\n10:17:23 \tat java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)\n10:17:23 \tat java.base/java.util.concurrent.FutureTask.run(Unknown Source)\n10:17:23 \tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)\n10:17:23 \tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)\n10:17:23 \tat java.base/java.lang.Thread.run(Unknown Source)\n10:17:23 ERROR: Maximum checkout retry attempts reached, aborting\n10:17:23 [Pipeline] }\n10:17:23 [Pipeline] // stage\n10:17:23 [Pipeline] }\n10:17:23 \n10:17:23 [Pipeline] // ansiColor\n10:17:23 [Pipeline] }\n10:17:23 [Pipeline] // timestamps\n10:17:23 [Pipeline] }\n10:17:23 [Pipeline] // node\n10:17:23 [Pipeline] End of Pipeline\n10:17:23 Also: hudson.remoting.Channel$CallSiteStackTrace: Remote call to p-jenkins-node-m-04\n10:17:23 \t\tat hudson.remoting.Channel.attachCallSiteStackTrace(Channel.java:1916)\n10:17:23 \t\tat hudson.remoting.UserRequest$ExceptionResponse.retrieve(UserRequest.java:384)\n10:17:23 \t\tat hudson.remoting.Channel.call(Channel.java:1108)\n10:17:23 \t\tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler.execute(RemoteGitImpl.java:155)\n10:17:23 \t\tat java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source)\n10:17:23 \t\tat java.base/java.lang.reflect.Method.invoke(Unknown Source)\n10:17:23 \t\tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler.invoke(RemoteGitImpl.java:140)\n10:17:23 \t\tat PluginClassLoader for git-client/jdk.proxy32/jdk.proxy32.$Proxy368.execute(Unknown Source)\n10:17:23 \t\tat PluginClassLoader for git//hudson.plugins.git.extensions.impl.SubmoduleOption.onCheckoutCompleted(SubmoduleOption.java:196)\n10:17:23 \t\tat PluginClassLoader for git//hudson.plugins.git.GitSCM._checkout(GitSCM.java:1395)\n10:17:23 \t\tat PluginClassLoader for git//hudson.plugins.git.GitSCM.checkout(GitSCM.java:1277)\n10:17:23 \t\tat PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep.checkout(SCMStep.java:136)\n10:17:23 \t\tat PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:101)\n10:17:23 \t\tat PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:88)\n10:17:23 \t\tat PluginClassLoader for workflow-step-api//org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:49)\n10:17:23 \t\tat java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)\n10:17:23 \t\tat java.base/java.util.concurrent.FutureTask.run(Unknown Source)\n10:17:23 \t\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)\n10:17:23 \t\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)\n10:17:23 \t\tat java.base/java.lang.Thread.run(Unknown Source)\n10:17:23 hudson.plugins.git.GitException: Command \"git config --get submodule.playbooks.url\" returned status code 1:\n10:17:23 stdout: \n10:17:23 stderr: \n10:17:23 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2848)\n10:17:23 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2773)\n10:17:23 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2768)\n10:17:23 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommand(CliGitAPIImpl.java:2055)\n10:17:23 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommand(CliGitAPIImpl.java:2067)\n10:17:23 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.getSubmoduleUrl(CliGitAPIImpl.java:1631)\n10:17:23 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl$7.execute(CliGitAPIImpl.java:1548)\n10:17:23 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler$GitCommandMasterToSlaveCallable.call(RemoteGitImpl.java:173)\n10:17:23 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler$GitCommandMasterToSlaveCallable.call(RemoteGitImpl.java:164)\n10:17:23 \tat hudson.remoting.UserRequest.perform(UserRequest.java:225)\n10:17:23 \tat hudson.remoting.UserRequest.perform(UserRequest.java:50)\n10:17:23 \tat hudson.remoting.Request$2.run(Request.java:391)\n10:17:23 \tat hudson.remoting.InterceptingExecutorService.lambda$wrap$0(InterceptingExecutorService.java:81)\n10:17:23 \tat java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)\n10:17:23 \tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)\n10:17:23 \tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)\n10:17:23 \tat java.base/java.lang.Thread.run(Thread.java:1583)\n10:17:23 Also: org.jenkinsci.plugins.workflow.actions.ErrorAction$ErrorId: c3d596bb-e177-4e68-987a-4f048dbb048d\n10:17:23 Caused: java.io.IOException: Could not perform submodule update\n10:17:23 \tat PluginClassLoader for git//hudson.plugins.git.extensions.impl.SubmoduleOption.onCheckoutCompleted(SubmoduleOption.java:201)\n10:17:23 \tat PluginClassLoader for git//hudson.plugins.git.GitSCM._checkout(GitSCM.java:1395)\n10:17:23 \tat PluginClassLoader for git//hudson.plugins.git.GitSCM.checkout(GitSCM.java:1277)\n10:17:23 \tat PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep.checkout(SCMStep.java:136)\n10:17:23 \tat PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:101)\n10:17:23 \tat PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:88)\n10:17:23 \tat PluginClassLoader for workflow-step-api//org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:49)\n10:17:23 \tat java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)\n10:17:23 \tat java.base/java.util.concurrent.FutureTask.run(Unknown Source)\n10:17:23 \tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)\n10:17:23 \tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)\n10:17:23 \tat java.base/java.lang.Thread.run(Unknown Source)\n10:17:23 > git remote # timeout=10\n10:17:23 > git submodule init # timeout=10\n10:17:23 > git submodule sync # timeout=10\n10:17:23 > git config --get remote.origin.url # timeout=10\n10:17:23 > git submodule init # timeout=10\n10:17:23 > git config -f .gitmodules --get-regexp ^submodule\\.(.+)\\.url # timeout=10\n10:17:23 > git config --get submodule.playbooks.url # timeout=10\n10:17:23 \n10:17:23 GitHub has been notified of this commit’s build result\n10:17:23 \n10:17:23 Finished: FAILURE\n</user_query>"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"Лог подтвердил: отключение только `Update tracking...` недостаточно. \nПадает все равно в `SubmoduleOption.onCheckoutCompleted`, то есть Jenkins **по‑прежнему выполняет встроенную обработку submodule** и именно она ломается.\n\nЧто делать дальше (рабочий путь):\n\n- В SCM полностью убрать блок `Advanced sub-modules behaviours` \n **или** поставить `Disable submodules processing = ON`.\n- В `Jenkinsfile` уйти с `checkout scm` на явный checkout без submodule extension.\n- Сабмодули подтянуть вручную после checkout через `sh`.\n\nМинимальный надежный вариант:\n\n```groovy\nstage('checkout') {\n git branch: env.BRANCH_NAME,\n credentialsId: 'id_rsa_svc-lmru-dataplatform',\n url: 'git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git'\n\n sh '''\n set -euxo pipefail\n git submodule sync --recursive\n git submodule update --init --recursive\n '''\n}\n```\n\nПочему это сработает:\n- `git` step не тащит ваш проблемный `SubmoduleOption`.\n- submodule init/update выполняется обычным git, без бага Jenkins plugin.\n\nДополнительно по логу видно разнобой версий git:\n- shared library: `2.47.3`\n- ваш checkout на агенте: `2.43.0` + `The recommended git tool is: NONE`\n\nПосле стабилизации checkout стоит выровнять git tool на агенте (и задать его явно в Jenkins), но первопричина текущего падения — именно `SubmoduleOption`.\n\n**Diagnosing Jenkins git submodule failure**"}]}}
|
||
{"role":"user","message":{"content":[{"type":"text","text":"<user_query>\nдай полный блок для чекаут с переносом сабмодулей\n</user_query>"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"```groovy\nstage('checkout') {\n // Полностью явный checkout без checkout scm и без SubmoduleOption Jenkins\n checkout([\n $class: 'GitSCM',\n branches: [[name: \"*/${env.BRANCH_NAME ?: 'master'}\"]],\n doGenerateSubmoduleConfigurations: false,\n userRemoteConfigs: [[\n url: 'git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git',\n credentialsId: 'id_rsa_svc-lmru-dataplatform'\n ]],\n extensions: [\n [$class: 'CleanBeforeCheckout'],\n [$class: 'CloneOption', noTags: true, shallow: false, depth: 0, timeout: 20]\n // ВАЖНО: НЕ добавляем SubmoduleOption\n ]\n ])\n\n // Ручная обработка сабмодулей (вместо Jenkins SubmoduleOption)\n sh '''\n set -euxo pipefail\n\n # Диагностика\n git --version\n git rev-parse --abbrev-ref HEAD || true\n git rev-parse --short HEAD\n test -f .gitmodules\n\n # Подтянуть URL из .gitmodules в .git/config\n git submodule sync --recursive\n\n # Инициализация/обновление сабмодулей до зафиксированных в superproject коммитов\n git submodule update --init --recursive\n\n # Опционально: вывести зафиксированные ревизии сабмодулей\n git submodule status --recursive\n '''\n}\n```\n\nЕсли хотите именно “tip of branch” для сабмодулей (аналог спорной опции Jenkins), добавьте после `update --init --recursive`:\n\n```groovy\nsh '''\n set -euxo pipefail\n git submodule foreach --recursive '\n branch=\"$(git config -f \"$toplevel/.gitmodules\" submodule.$name.branch || true)\"\n if [ -n \"$branch\" ]; then\n git fetch origin \"$branch\"\n git checkout \"$branch\" || true\n git pull --ff-only origin \"$branch\"\n fi\n '\n'''\n```\n\nНо для reproducible сборок обычно лучше **не** делать tip-of-branch, а оставаться на pinned commit из суперрепозитория."}]}}
|
||
{"role":"user","message":{"content":[{"type":"text","text":"<user_query>\nпопробовал вот так #!groovy\n\nproperties([\n buildDiscarder (logRotator (artifactDaysToKeepStr: '', artifactNumToKeepStr: '10', daysToKeepStr: '', numToKeepStr: '10')),\n disableConcurrentBuilds (),\n disableResume (),\n]);\n\nimport org.jenkinsci.plugins.pipeline.modeldefinition.Utils\n@Library('common-utils') _\n\nnode ('dockerhost') {\n timestamps {\n ansiColor('xterm') {\n cleanWs()\n\n stage('checkout'){\n checkout scm\n sh '''\n set -euxo pipefail\n git submodule sync --recursive\n git submodule update --init --recursive\n '''\n }\n\n stage('prepare'){\n // def response = httpRequest \"http://amapi.apps.dev.data.lmru.tech/api/v1/getdeployinfo?repo_url=adeo/dp--batch-proc--ff-dom&module_env=test\"\n withFolderProperties{\n AIRFLOW_CLUSTER = env.airflow_cluster\n PRODUCT_TITLE = env.product_title\n VAULT_APPROLE = env.vault_approle\n }\n if (!AIRFLOW_CLUSTER){\n echo \"'airflow_cluster' variable doesn't set\"\n sh 'exit 1'\n }\n if (!PRODUCT_TITLE){\n echo \"'product_title' variable doesn't set\"\n sh 'exit 1'\n }\n if (!VAULT_APPROLE){\n echo \"'vault_approle' variable doesn't set\"\n sh 'exit 1'\n }\n PROJECT_CONFIG = vaultUtils.getSecrets([namespace:PRODUCT_TITLE, vaultPath:\"airflow/${AIRFLOW_CLUSTER}/project_config\", appRoleCredential: VAULT_APPROLE])\n imageName = \"${PROJECT_CONFIG.docker_registry_url}/airflow/${PROJECT_CONFIG.deploy_image}\"\n imageTag = getImageTag()\n toPush = toPush()\n }\n\n stage('build'){\n image = docker.build(\"${imageName}:${imageTag}\", \". --pull\")\n }\n\n stage('publish'){\n if (toPush){\n docker.withRegistry(\"https://${PROJECT_CONFIG.docker_registry_url}\", PROJECT_CONFIG.docker_registry_crentials_id) {\n image.push(\"${imageTag}\")\n }\n } else {\n Utils.markStageSkippedForConditional('publish')\n }\n }\n\n stage('Security scans') {\n parallel (\n 'CheckmarxScan': {\n checkmarxUtils.runCheckmarxScan_ZeroLicense(\n failBuildOnError: \"false\"\n )\n },\n 'SecretsScan': {\n securityUtils.secretsScan[:]\n },\n 'IacScan': {\n securityUtils.iacScan(reportFormat: 'html')\n },\n 'ImageScan': {\n sh \"docker pull ${imageName}:${imageTag}\"\n securityUtils.scanImage(imageName: \"${imageName}\", imageTag: \"${imageTag}\")\n }\n )\n }\n\n }\n }\n}\n\ndef getImageTag() {\n def tag = \"pipeline${env.BUILD_NUMBER}\"\n if (env.BRANCH_NAME == \"main\" || env.BRANCH_NAME == \"master\") {\n tag = \"latest\"\n } else if (env.BRANCH_NAME == 'dev') {\n tag = \"dev\"\n }\n return tag\n}\n\n// Returns deployment env ID based on build env branch/tags.\ndef getDeployEnv() {\n if (env.BRANCH_NAME == \"main\" || env.BRANCH_NAME == \"master\") {\n return \"dev\"\n } else if (env.BRANCH_NAME == 'test') {\n return \"test\"\n } else if (env.TAG_NAME) {\n return \"prod\"\n }\n return null\n}\n\ndef toPush(){\n if (env.BRANCH_NAME == \"main\" || env.BRANCH_NAME == \"master\" || env.BRANCH_NAME == \"dev\"){\n return true\n }\n return false\n}\n\n10:26:11 Started by user Руслан Петрович (60231159)\n\n10:26:11 Replayed #13\n\n10:26:15 10:26:15 Connecting to https://github.lmru.tech/api/v3 using GitHub Enterprise Jenkins integration (svc-lmru-common)\n10:26:16 Obtained Jenkinsfile from 78cbfec622f96d41b97a8901efc1f13071a67fbd\n10:26:16 Resume disabled by user, switching to high-performance, low-durability mode.\n10:26:16 Loading library common-utils@master\n10:26:16 Attempting to resolve master from remote references...\n10:26:16 > git --version # timeout=10\n10:26:16 > git --version # 'git version 2.47.3'\n10:26:16 using GIT_SSH to set credentials SSH key for svc-lmru-devops (GitHub Enterprise)\n10:26:16 > git ls-remote -h -t -- git@github.lmru.tech:adeo/lmru--devops--pipeline-shared-library.git # timeout=10\n10:26:17 Found match: refs/heads/master revision 631dab72d03353f5a22eced17329b52730434d4a\n10:26:17 The recommended git tool is: git\n10:26:17 using credential id_rsa_svc-lmru-devops\n10:26:17 > git rev-parse --resolve-git-dir /var/jenkins_home/workspace/_dp--deploy-reviseur-orch_master@libs/e02a363bc11db211517c6042e0c2d5f8c30e8205c9bc2507b45d17bfe6949736/.git # timeout=10\n10:26:17 Fetching changes from the remote Git repository\n10:26:17 > git config remote.origin.url git@github.lmru.tech:adeo/lmru--devops--pipeline-shared-library.git # timeout=10\n10:26:17 Fetching without tags\n10:26:17 Fetching upstream changes from git@github.lmru.tech:adeo/lmru--devops--pipeline-shared-library.git\n10:26:17 > git --version # timeout=10\n10:26:17 > git --version # 'git version 2.47.3'\n10:26:17 using GIT_SSH to set credentials SSH key for svc-lmru-devops (GitHub Enterprise)\n10: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\n10:26:17 Checking out Revision 631dab72d03353f5a22eced17329b52730434d4a (master)\n10:26:17 > git config core.sparsecheckout # timeout=10\n10:26:17 > git checkout -f 631dab72d03353f5a22eced17329b52730434d4a # timeout=10\n10:26:17 Commit message: \"Aqua sca fix (#487)\"\n10:26:18 [Pipeline] Start of Pipeline\n10:26:18 [Pipeline] properties\n10:26:18 [Pipeline] node\n10:26:18 Running on p-jenkins-node-m-03\n in /data/jenkins-root/workspace/_dp--deploy-reviseur-orch_master\n10:26:18 [Pipeline] {\n10:26:18 [Pipeline] timestamps\n10:26:18 The timestamps step is unnecessary when timestamps are enabled for all Pipeline builds.\n10:26:18 [Pipeline] {\n10:26:18 [Pipeline] ansiColor\n10:26:18 [Pipeline] {\n10:26:18 \n10:26:18 [Pipeline] cleanWs\n10:26:18 [WS-CLEANUP] Deleting project workspace...\n10:26:18 [WS-CLEANUP] Deferred wipeout is used...\n10:26:18 [WS-CLEANUP] done\n10:26:18 [Pipeline] stage\n10:26:18 [Pipeline] { (checkout)\n10:26:18 [Pipeline] checkout\n10:26:18 The recommended git tool is: NONE\n10:26:18 using credential id_rsa_svc-lmru-dataplatform\n10:26:18 Cloning the remote Git repository\n10:26:18 Cloning with configured refspecs honoured and without tags\n10:26:18 Avoid second fetch\n10:26:18 Checking out Revision 78cbfec622f96d41b97a8901efc1f13071a67fbd (master)\n10:26:18 Commit message: \"yac\"\n10:26:18 Cloning repository git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git\n10:26:18 > git init /data/jenkins-root/workspace/_dp--deploy-reviseur-orch_master # timeout=10\n10:26:18 Fetching upstream changes from git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git\n10:26:18 > git --version # timeout=10\n10:26:18 > git --version # 'git version 2.43.0'\n10:26:18 using GIT_SSH to set credentials SSH key for svc-lmru-dataplatform (GitHub Enterprise)\n10: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\n10:26:18 > git config remote.origin.url git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git # timeout=10\n10:26:18 > git config --add remote.origin.fetch +refs/heads/master:refs/remotes/origin/master # timeout=10\n10:26:18 > git config core.sparsecheckout # timeout=10\n10:26:18 > git checkout -f 78cbfec622f96d41b97a8901efc1f13071a67fbd # timeout=10\n10:26:18 > git rev-list --no-walk 78cbfec622f96d41b97a8901efc1f13071a67fbd # timeout=10\n10:26:18 ERROR: Checkout failed\n10:26:18 Also: hudson.remoting.Channel$CallSiteStackTrace: Remote call to p-jenkins-node-m-03\n10:26:18 \t\tat hudson.remoting.Channel.attachCallSiteStackTrace(Channel.java:1916)\n10:26:18 \t\tat hudson.remoting.UserRequest$ExceptionResponse.retrieve(UserRequest.java:384)\n10:26:18 \t\tat hudson.remoting.Channel.call(Channel.java:1108)\n10:26:18 \t\tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler.execute(RemoteGitImpl.java:155)\n10:26:18 \t\tat java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source)\n10:26:18 \t\tat java.base/java.lang.reflect.Method.invoke(Unknown Source)\n10:26:18 \t\tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler.invoke(RemoteGitImpl.java:140)\n10:26:18 \t\tat PluginClassLoader for git-client/jdk.proxy32/jdk.proxy32.$Proxy368.execute(Unknown Source)\n10:26:18 \t\tat PluginClassLoader for git//hudson.plugins.git.extensions.impl.SubmoduleOption.onCheckoutCompleted(SubmoduleOption.java:196)\n10:26:18 \t\tat PluginClassLoader for git//hudson.plugins.git.GitSCM._checkout(GitSCM.java:1395)\n10:26:18 \t\tat PluginClassLoader for git//hudson.plugins.git.GitSCM.checkout(GitSCM.java:1277)\n10:26:18 \t\tat PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep.checkout(SCMStep.java:136)\n10:26:18 \t\tat PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:101)\n10:26:18 \t\tat PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:88)\n10:26:18 \t\tat PluginClassLoader for workflow-step-api//org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:49)\n10:26:18 \t\tat java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)\n10:26:18 \t\tat java.base/java.util.concurrent.FutureTask.run(Unknown Source)\n10:26:18 \t\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)\n10:26:18 \t\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)\n10:26:18 \t\tat java.base/java.lang.Thread.run(Unknown Source)\n10:26:18 hudson.plugins.git.GitException: Command \"git config --get submodule.playbooks.url\" returned status code 1:\n10:26:18 stdout: \n10:26:18 stderr: \n10:26:18 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2848)\n10:26:18 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2773)\n10:26:18 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2768)\n10:26:18 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommand(CliGitAPIImpl.java:2055)\n10:26:18 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommand(CliGitAPIImpl.java:2067)\n10:26:18 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.getSubmoduleUrl(CliGitAPIImpl.java:1631)\n10:26:18 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl$7.execute(CliGitAPIImpl.java:1548)\n10:26:18 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler$GitCommandMasterToSlaveCallable.call(RemoteGitImpl.java:173)\n10:26:18 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler$GitCommandMasterToSlaveCallable.call(RemoteGitImpl.java:164)\n10:26:18 \tat hudson.remoting.UserRequest.perform(UserRequest.java:225)\n10:26:18 \tat hudson.remoting.UserRequest.perform(UserRequest.java:50)\n10:26:18 \tat hudson.remoting.Request$2.run(Request.java:391)\n10:26:18 \tat hudson.remoting.InterceptingExecutorService.lambda$wrap$0(InterceptingExecutorService.java:81)\n10:26:18 \tat java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)\n10:26:18 \tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)\n10:26:18 \tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)\n10:26:18 \tat java.base/java.lang.Thread.run(Thread.java:1583)\n10:26:18 Caused: java.io.IOException: Could not perform submodule update\n10:26:18 \tat PluginClassLoader for git//hudson.plugins.git.extensions.impl.SubmoduleOption.onCheckoutCompleted(SubmoduleOption.java:201)\n10:26:18 \tat PluginClassLoader for git//hudson.plugins.git.GitSCM._checkout(GitSCM.java:1395)\n10:26:18 \tat PluginClassLoader for git//hudson.plugins.git.GitSCM.checkout(GitSCM.java:1277)\n10:26:18 \tat PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep.checkout(SCMStep.java:136)\n10:26:18 \tat PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:101)\n10:26:18 \tat PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:88)\n10:26:18 \tat PluginClassLoader for workflow-step-api//org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:49)\n10:26:18 \tat java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)\n10:26:18 \tat java.base/java.util.concurrent.FutureTask.run(Unknown Source)\n10:26:18 \tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)\n10:26:18 \tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)\n10:26:18 \tat java.base/java.lang.Thread.run(Unknown Source)\n10:26:18 ERROR: Maximum checkout retry attempts reached, aborting\n10:26:18 [Pipeline] }\n10:26:18 [Pipeline] // stage\n10:26:18 [Pipeline] }\n10:26:18 \n10:26:18 [Pipeline] // ansiColor\n10:26:18 [Pipeline] }\n10:26:18 [Pipeline] // timestamps\n10:26:18 [Pipeline] }\n10:26:18 [Pipeline] // node\n10:26:18 [Pipeline] End of Pipeline\n10:26:18 Also: hudson.remoting.Channel$CallSiteStackTrace: Remote call to p-jenkins-node-m-03\n10:26:18 \t\tat hudson.remoting.Channel.attachCallSiteStackTrace(Channel.java:1916)\n10:26:18 \t\tat hudson.remoting.UserRequest$ExceptionResponse.retrieve(UserRequest.java:384)\n10:26:18 \t\tat hudson.remoting.Channel.call(Channel.java:1108)\n10:26:18 \t\tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler.execute(RemoteGitImpl.java:155)\n10:26:18 \t\tat java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source)\n10:26:18 \t\tat java.base/java.lang.reflect.Method.invoke(Unknown Source)\n10:26:18 \t\tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler.invoke(RemoteGitImpl.java:140)\n10:26:18 \t\tat PluginClassLoader for git-client/jdk.proxy32/jdk.proxy32.$Proxy368.execute(Unknown Source)\n10:26:18 \t\tat PluginClassLoader for git//hudson.plugins.git.extensions.impl.SubmoduleOption.onCheckoutCompleted(SubmoduleOption.java:196)\n10:26:18 \t\tat PluginClassLoader for git//hudson.plugins.git.GitSCM._checkout(GitSCM.java:1395)\n10:26:18 \t\tat PluginClassLoader for git//hudson.plugins.git.GitSCM.checkout(GitSCM.java:1277)\n10:26:18 \t\tat PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep.checkout(SCMStep.java:136)\n10:26:18 \t\tat PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:101)\n10:26:18 \t\tat PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:88)\n10:26:18 \t\tat PluginClassLoader for workflow-step-api//org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:49)\n10:26:18 \t\tat java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)\n10:26:18 \t\tat java.base/java.util.concurrent.FutureTask.run(Unknown Source)\n10:26:18 \t\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)\n10:26:18 \t\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)\n10:26:18 \t\tat java.base/java.lang.Thread.run(Unknown Source)\n10:26:18 hudson.plugins.git.GitException: Command \"git config --get submodule.playbooks.url\" returned status code 1:\n10:26:18 stdout: \n10:26:18 stderr: \n10:26:18 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2848)\n10:26:18 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2773)\n10:26:18 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2768)\n10:26:18 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommand(CliGitAPIImpl.java:2055)\n10:26:18 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommand(CliGitAPIImpl.java:2067)\n10:26:18 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl.getSubmoduleUrl(CliGitAPIImpl.java:1631)\n10:26:18 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.CliGitAPIImpl$7.execute(CliGitAPIImpl.java:1548)\n10:26:18 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler$GitCommandMasterToSlaveCallable.call(RemoteGitImpl.java:173)\n10:26:18 \tat PluginClassLoader for git-client//org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler$GitCommandMasterToSlaveCallable.call(RemoteGitImpl.java:164)\n10:26:18 \tat hudson.remoting.UserRequest.perform(UserRequest.java:225)\n10:26:18 \tat hudson.remoting.UserRequest.perform(UserRequest.java:50)\n10:26:18 \tat hudson.remoting.Request$2.run(Request.java:391)\n10:26:18 \tat hudson.remoting.InterceptingExecutorService.lambda$wrap$0(InterceptingExecutorService.java:81)\n10:26:18 \tat java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)\n10:26:18 \tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)\n10:26:18 \tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)\n10:26:18 \tat java.base/java.lang.Thread.run(Thread.java:1583)\n10:26:18 Also: org.jenkinsci.plugins.workflow.actions.ErrorAction$ErrorId: c738f023-26d0-40d2-b0c7-d9a64f52f676\n10:26:18 Caused: java.io.IOException: Could not perform submodule update\n10:26:18 \tat PluginClassLoader for git//hudson.plugins.git.extensions.impl.SubmoduleOption.onCheckoutCompleted(SubmoduleOption.java:201)\n10:26:18 \tat PluginClassLoader for git//hudson.plugins.git.GitSCM._checkout(GitSCM.java:1395)\n10:26:18 \tat PluginClassLoader for git//hudson.plugins.git.GitSCM.checkout(GitSCM.java:1277)\n10:26:18 \tat PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep.checkout(SCMStep.java:136)\n10:26:18 \tat PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:101)\n10:26:18 \tat PluginClassLoader for workflow-scm-step//org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:88)\n10:26:18 \tat PluginClassLoader for workflow-step-api//org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:49)\n10:26:18 \tat java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)\n10:26:18 \tat java.base/java.util.concurrent.FutureTask.run(Unknown Source)\n10:26:18 \tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)\n10:26:18 \tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)\n10:26:18 \tat java.base/java.lang.Thread.run(Unknown Source)\n10:26:18 > git remote # timeout=10\n10:26:18 > git submodule init # timeout=10\n10:26:18 > git submodule sync # timeout=10\n10:26:18 > git config --get remote.origin.url # timeout=10\n10:26:18 > git submodule init # timeout=10\n10:26:18 > git config -f .gitmodules --get-regexp ^submodule\\.(.+)\\.url # timeout=10\n10:26:18 > git config --get submodule.playbooks.url # timeout=10\n10:26:19 \n10:26:19 GitHub has been notified of this commit’s build result\n10:26:19 \n10:26:19 Finished: FAILURE\n\n</user_query>"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"Да, теперь видно 100% причину: ваш `sh` вообще не успевает выполниться, потому что пайплайн падает **на `checkout scm`**.\n\n`checkout scm` тянет SCM-конфиг job вместе с `SubmoduleOption`, и он снова делает:\n- `git submodule init`\n- `git config --get submodule.playbooks.url`\n- падение\n\nТо есть текущий `stage('checkout')` нужно менять полностью: **не использовать `checkout scm`**.\n\nИспользуйте такой блок:\n\n```groovy\nstage('checkout') {\n def branchName = env.CHANGE_BRANCH ?: env.BRANCH_NAME ?: 'master'\n\n checkout([\n $class: 'GitSCM',\n branches: [[name: \"*/${branchName}\"]],\n doGenerateSubmoduleConfigurations: false,\n userRemoteConfigs: [[\n url: 'git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git',\n credentialsId: 'id_rsa_svc-lmru-dataplatform'\n ]],\n extensions: [\n [$class: 'CleanBeforeCheckout'],\n [$class: 'CloneOption', noTags: true, shallow: false, timeout: 20]\n // ВАЖНО: без SubmoduleOption\n ]\n ])\n\n sh '''\n set -euxo pipefail\n git submodule sync --recursive\n git submodule update --init --recursive\n git submodule status --recursive\n '''\n}\n```\n\nИ важно в UI джобы:\n- либо убрать `Advanced sub-modules behaviours`,\n- либо включить `Disable submodules processing`.\n\nПока где-то остается `SubmoduleOption`, `checkout scm` будет продолжать падать независимо от последующего `sh`.\n\n**Providing explicit Git checkout snippet**"}]}}
|
||
{"role":"user","message":{"content":[{"type":"text","text":"<user_query>\nя до этого сделал Disable submodules processing в мультибранче\n</user_query>"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"Тогда это похоже на то, что изменение в multibranch **еще не попало в конкретный branch-job/запуск**, либо `Replay/Rebuild` использует старый `scm` контекст.\n\nПо вашему логу видно, что в рантайме все еще активен `SubmoduleOption`:\n- `SubmoduleOption.onCheckoutCompleted`\n- `git submodule init`\n- `git config --get submodule.playbooks.url`\n\nЕсли `Disable submodules processing` реально применился, этих шагов быть не должно.\n\nЧто сделать, чтобы точно проверить:\n\n- Сохранить конфиг **родительского** multibranch.\n- Нажать `Scan Multibranch Pipeline Now` (переиндексация).\n- Запустить **обычный Build Now**, не `Replay` и не `Rebuild #...`.\n- Проверить лог checkout: не должно быть `SubmoduleOption.onCheckoutCompleted`.\n\nИ самый надежный обход независимо от UI-настроек:\n- убрать `checkout scm` из Jenkinsfile,\n- сделать явный `checkout([$class: 'GitSCM', ...])` без `SubmoduleOption`,\n- потом руками `git submodule sync/update`.\n\nПотому что пока остается `checkout scm`, вы зависите от того, какой именно `scm` объект Jenkins подложил в этот запуск.\n\n**Explaining submodule option persistence**"}]}}
|
||
{"role":"user","message":{"content":[{"type":"text","text":"<user_query>\nвот нашел пример в другом дата репозитории\n#!groovy\n\nproperties([\n disableConcurrentBuilds (),\n pipelineTriggers([\n issueCommentTrigger('Jenkins please retry a build')\n ])\n]);\n\nimport org.jenkinsci.plugins.pipeline.modeldefinition.Utils\n@Library(['dp--jenkins-pipe-libs@main', 'common-utils']) _\n\nbuild = [\n app: \"data-pages\", // Application name\n tag: null, // Artifacts tag\n publish: false, // Publicate build artifacts (image,binary etc.)\n deployEnv: null, // Deployment environment.\n deployCluster: \"\", // Deploy Kubernetes cluster id\n commit: \"\", // GIT commit hash\n time: \"\", // Build time\n deployOnly: false, // Use for deploy-only runs\n]\n\nnode ('lmru-dockerhost') {\n timestamps {\n ansiColor('xterm') {\n try {\n stage('checkout') {\n checkout([\n $class: 'GitSCM',\n userRemoteConfigs: [[ \n url: 'git@github.lmru.tech:adeo/dp--data-pages.git',\n credentialsId: 'id_rsa_jenkins_gitlab'\n ]],\n branches: scm.branches,\n doGenerateSubmoduleConfigurations: false,\n extensions: scm.extensions + [[\n $class: 'SubmoduleOption',\n disableSubmodules: false,\n parentCredentials: true,\n recursiveSubmodules: true,\n reference: '',\n trackingSubmodules: true,\n threads: 10\n ]],\n submoduleCfg: []\n ]);\n }\n\n</user_query>"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"Хороший пример, но для вашей проблемы в нем есть **опасный момент**:\n\n- `extensions: scm.extensions + [[ $class: 'SubmoduleOption', ... ]]`\n\nЭто наследует все extension’ы из `scm` (из multibranch/job), где у вас как раз и живет проблемный `SubmoduleOption`. \nТо есть такой шаблон может снова тащить тот же баг.\n\nДля вашего кейса лучше так:\n\n1) **не использовать** `checkout scm` \n2) **не использовать** `scm.extensions` \n3) задать `extensions` вручную (без `SubmoduleOption`) \n4) сабмодули делать руками в `sh`\n\n---\n\nМинимально безопасный блок (адаптирован под ваш репо):\n\n```groovy\nstage('checkout') {\n def branchName = env.CHANGE_BRANCH ?: env.BRANCH_NAME ?: 'master'\n\n checkout([\n $class: 'GitSCM',\n userRemoteConfigs: [[\n url: 'git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git',\n credentialsId: 'id_rsa_svc-lmru-dataplatform'\n ]],\n branches: [[name: \"*/${branchName}\"]],\n doGenerateSubmoduleConfigurations: false,\n extensions: [\n [$class: 'CleanBeforeCheckout'],\n [$class: 'CloneOption', noTags: true, shallow: false, timeout: 20]\n ],\n submoduleCfg: []\n ])\n\n sh '''\n set -euxo pipefail\n git submodule sync --recursive\n git -c submodule.active=. submodule update --init --recursive\n git submodule status --recursive\n '''\n}\n```\n\n`-c submodule.active=.` добавил специально: это обход редкого кейса, когда на агенте в глобальном git-config выставлен `submodule.active`, и `git submodule init` не инициализирует часть модулей (как раз может давать ваш симптом с `submodule.playbooks.url`).\n\nЕсли хотите, дам еще “строгий” вариант с fallback-диагностикой (`cat .gitmodules`, `git config -l --show-origin | grep submodule.active`) на случай следующего падения.\n\n**Analyzing submodule init failure causes**"}]}}
|
||
{"role":"user","message":{"content":[{"type":"text","text":"<user_query>\nstage('checkout') {\n def branchName = env.CHANGE_BRANCH ?: env.BRANCH_NAME ?: 'master'\n\n checkout([\n $class: 'GitSCM',\n userRemoteConfigs: [[\n url: 'git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git',\n credentialsId: 'id_rsa_svc-lmru-dataplatform'\n ]],\n branches: [[name: \"*/${branchName}\"]],\n doGenerateSubmoduleConfigurations: false,\n extensions: [\n [$class: 'CleanBeforeCheckout'],\n [$class: 'CloneOption', noTags: true, shallow: false, timeout: 20]\n ],\n submoduleCfg: []\n ])\n\n sh '''\n set -euxo pipefail\n git submodule sync --recursive\n git -c submodule.active=. submodule update --init --recursive\n git submodule status --recursive\n '''\n}\nопиши каждую строку\n</user_query>"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"```groovy\nstage('checkout') { // Этап пайплайна с именем checkout.\n def branchName = env.CHANGE_BRANCH ?: env.BRANCH_NAME ?: 'master'\n // Определяем ветку для checkout:\n // 1) PR-ветка (CHANGE_BRANCH), если это PR билд\n // 2) обычная BRANCH_NAME\n // 3) fallback на master, если оба пустые\n\n checkout([ // Запускаем явный SCM checkout (не checkout scm).\n $class: 'GitSCM', // Используем Jenkins GitSCM плагин как реализацию SCM.\n userRemoteConfigs: [[ // Настройки удаленного репозитория (может быть несколько remotes).\n url: 'git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git',\n // SSH URL репозитория, который нужно клонировать.\n credentialsId: 'id_rsa_svc-lmru-dataplatform'\n // Jenkins credentials для доступа по SSH.\n ]],\n branches: [[name: \"*/${branchName}\"]], // Какую ветку checkout'ить (refs/remotes/origin/<branchName>).\n doGenerateSubmoduleConfigurations: false, // Старый/legacy флаг Jenkins для сабмодулей; держим false.\n extensions: [ // Дополнительные поведения GitSCM.\n [$class: 'CleanBeforeCheckout'], // Чистит рабочую копию перед checkout (убирает мусор/остатки).\n [$class: 'CloneOption', noTags: true, shallow: false, timeout: 20]\n // Параметры clone/fetch:\n // noTags:true -> не тянем теги (быстрее)\n // shallow:false -> полный клон, не shallow\n // timeout:20 -> таймаут git-операций (минуты)\n ],\n submoduleCfg: [] // Legacy-поле конфигурации сабмодулей; оставляем пустым.\n ])\n\n sh ''' // Выполняем shell-команды уже после успешного checkout.\n set -euxo pipefail // Строгий режим bash:\n // -e: падать при ошибке команды\n // -u: падать на неинициализированной переменной\n // -x: печатать выполняемые команды в лог\n // -o pipefail: учитывать ошибку любой команды в pipeline\n\n git submodule sync --recursive // Синхронизируем .git/config сабмодулей с .gitmodules рекурсивно.\n git -c submodule.active=. submodule update --init --recursive\n // Инициализируем и обновляем все сабмодули рекурсивно.\n // -c submodule.active=. временно включает \"все сабмодули\"\n // в рамках команды, обходя возможный конфликт global git config.\n git submodule status --recursive // Печатаем итоговый статус/коммиты сабмодулей в лог.\n '''\n}\n```\n\nКоротко по смыслу блока: \nвы убираете зависимость от `checkout scm` и его скрытых `scm.extensions`, делаете чистый checkout, а сабмодули обновляете вручную и предсказуемо."}]}}
|
||
{"role":"user","message":{"content":[{"type":"text","text":"<user_query>\n10:48:34 /data/jenkins-root/workspace/_dp--deploy-reviseur-orch_master@tmp/durable-eba081a6/script.sh.copy: 2: set: Illegal option -o pipefail\n\n</user_query>"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"Это нормально для `sh` в Jenkins: у вас step выполняется не в `bash`, а в `/bin/sh` (часто `dash`), где нет `pipefail`.\n\nИсправления:\n\n### Вариант 1 (рекомендую): явно запускать `bash`\n```groovy\nsh '''\n #!/usr/bin/env bash\n set -euxo pipefail\n git submodule sync --recursive\n git -c submodule.active=. submodule update --init --recursive\n git submodule status --recursive\n'''\n```\n\n### Вариант 2: остаться на `sh` без `pipefail`\n```groovy\nsh '''\n set -eu\n git submodule sync --recursive\n git -c submodule.active=. submodule update --init --recursive\n git submodule status --recursive\n'''\n```\n\nЕсли хотите, лучше еще использовать `label` для шага, чтобы в логе было читабельнее:\n```groovy\nsh(label: 'Init submodules', script: '''#!/usr/bin/env bash\nset -euxo pipefail\n...\n''')\n```\n\n**Advising bash shebang over pipefail**"}]}}
|
||
{"role":"user","message":{"content":[{"type":"text","text":"<user_query>\n#!groovy\n\nproperties([\n buildDiscarder (logRotator (artifactDaysToKeepStr: '', artifactNumToKeepStr: '10', daysToKeepStr: '', numToKeepStr: '10')),\n disableConcurrentBuilds (),\n disableResume (),\n]);\n\nimport org.jenkinsci.plugins.pipeline.modeldefinition.Utils\n@Library('common-utils') _\n\nnode ('dockerhost') {\n timestamps {\n ansiColor('xterm') {\n cleanWs()\n\n stage('checkout') {\n def branchName = env.CHANGE_BRANCH ?: env.BRANCH_NAME ?: 'master'\n \n checkout([\n $class: 'GitSCM',\n userRemoteConfigs: [[\n url: 'git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git',\n credentialsId: 'id_rsa_svc-lmru-dataplatform'\n ]],\n branches: [[name: \"*/${branchName}\"]],\n doGenerateSubmoduleConfigurations: false,\n extensions: [\n [$class: 'CleanBeforeCheckout'],\n [$class: 'CloneOption', noTags: true, shallow: false, timeout: 20]\n ],\n submoduleCfg: []\n ])\n \n sh '''\n set -eu\n git submodule sync --recursive\n git -c submodule.active=. submodule update --init --recursive\n git submodule status --recursive\n '''\n }\n\n stage('prepare'){\n // def response = httpRequest \"http://amapi.apps.dev.data.lmru.tech/api/v1/getdeployinfo?repo_url=adeo/dp--batch-proc--ff-dom&module_env=test\"\n withFolderProperties{\n AIRFLOW_CLUSTER = env.airflow_cluster\n PRODUCT_TITLE = env.product_title\n VAULT_APPROLE = env.vault_approle\n }\n if (!AIRFLOW_CLUSTER){\n echo \"'airflow_cluster' variable doesn't set\"\n sh 'exit 1'\n }\n if (!PRODUCT_TITLE){\n echo \"'product_title' variable doesn't set\"\n sh 'exit 1'\n }\n if (!VAULT_APPROLE){\n echo \"'vault_approle' variable doesn't set\"\n sh 'exit 1'\n }\n PROJECT_CONFIG = vaultUtils.getSecrets([namespace:PRODUCT_TITLE, vaultPath:\"airflow/${AIRFLOW_CLUSTER}/project_config\", appRoleCredential: VAULT_APPROLE])\n imageName = \"${PROJECT_CONFIG.docker_registry_url}/airflow/${PROJECT_CONFIG.deploy_image}\"\n imageTag = getImageTag()\n toPush = toPush()\n }\n\n stage('build'){\n image = docker.build(\"${imageName}:${imageTag}\", \". --pull\")\n }\n\n stage('publish'){\n if (toPush){\n docker.withRegistry(\"https://${PROJECT_CONFIG.docker_registry_url}\", PROJECT_CONFIG.docker_registry_crentials_id) {\n image.push(\"${imageTag}\")\n }\n } else {\n Utils.markStageSkippedForConditional('publish')\n }\n }\n\n stage('Security scans') {\n parallel (\n 'CheckmarxScan': {\n checkmarxUtils.runCheckmarxScan_ZeroLicense(\n failBuildOnError: \"false\"\n )\n },\n 'SecretsScan': {\n securityUtils.secretsScan[:]\n },\n 'IacScan': {\n securityUtils.iacScan(reportFormat: 'html')\n },\n 'ImageScan': {\n sh \"docker pull ${imageName}:${imageTag}\"\n securityUtils.scanImage(imageName: \"${imageName}\", imageTag: \"${imageTag}\")\n }\n )\n }\n\n }\n }\n}\n\ndef getImageTag() {\n def tag = \"pipeline${env.BUILD_NUMBER}\"\n if (env.BRANCH_NAME == \"main\" || env.BRANCH_NAME == \"master\") {\n tag = \"latest\"\n } else if (env.BRANCH_NAME == 'dev') {\n tag = \"dev\"\n }\n return tag\n}\n\n// Returns deployment env ID based on build env branch/tags.\ndef getDeployEnv() {\n if (env.BRANCH_NAME == \"main\" || env.BRANCH_NAME == \"master\") {\n return \"dev\"\n } else if (env.BRANCH_NAME == 'test') {\n return \"test\"\n } else if (env.TAG_NAME) {\n return \"prod\"\n }\n return null\n}\n\ndef toPush(){\n if (env.BRANCH_NAME == \"main\" || env.BRANCH_NAME == \"master\" || env.BRANCH_NAME == \"dev\"){\n return true\n }\n return false\n}\n\n10:51:25 Started by user Руслан Петрович (60231159)\n\n10:51:25 Replayed #17\n\n10:51:29 10:51:29 Connecting to https://github.lmru.tech/api/v3 using GitHub Enterprise Jenkins integration (svc-lmru-common)\n10:51:30 Obtained Jenkinsfile from 02b357830a86a284f9f2d2e7ab0f86b24653db5b\n10:51:30 Resume disabled by user, switching to high-performance, low-durability mode.\n10:51:30 Loading library common-utils@master\n10:51:30 Attempting to resolve master from remote references...\n10:51:30 > git --version # timeout=10\n10:51:30 > git --version # 'git version 2.47.3'\n10:51:30 using GIT_SSH to set credentials SSH key for svc-lmru-devops (GitHub Enterprise)\n10:51:30 > git ls-remote -h -t -- git@github.lmru.tech:adeo/lmru--devops--pipeline-shared-library.git # timeout=10\n10:51:30 Found match: refs/heads/master revision 631dab72d03353f5a22eced17329b52730434d4a\n10:51:30 The recommended git tool is: git\n10:51:30 using credential id_rsa_svc-lmru-devops\n10:51:30 > git rev-parse --resolve-git-dir /var/jenkins_home/workspace/_dp--deploy-reviseur-orch_master@libs/e02a363bc11db211517c6042e0c2d5f8c30e8205c9bc2507b45d17bfe6949736/.git # timeout=10\n10:51:30 Fetching changes from the remote Git repository\n10:51:30 > git config remote.origin.url git@github.lmru.tech:adeo/lmru--devops--pipeline-shared-library.git # timeout=10\n10:51:30 Fetching without tags\n10:51:30 Fetching upstream changes from git@github.lmru.tech:adeo/lmru--devops--pipeline-shared-library.git\n10:51:30 > git --version # timeout=10\n10:51:30 > git --version # 'git version 2.47.3'\n10:51:30 using GIT_SSH to set credentials SSH key for svc-lmru-devops (GitHub Enterprise)\n10:51:30 > git fetch --no-tags --force --progress -- git@github.lmru.tech:adeo/lmru--devops--pipeline-shared-library.git +refs/heads/*:refs/remotes/origin/* # timeout=10\n10:51:31 Checking out Revision 631dab72d03353f5a22eced17329b52730434d4a (master)\n10:51:31 > git config core.sparsecheckout # timeout=10\n10:51:31 > git checkout -f 631dab72d03353f5a22eced17329b52730434d4a # timeout=10\n10:51:31 Commit message: \"Aqua sca fix (#487)\"\n10:51:31 [Pipeline] Start of Pipeline\n10:51:31 [Pipeline] properties\n10:51:31 [Pipeline] node\n10:51:31 Running on p-jenkins-node-m-02\n in /data/jenkins-root/workspace/_dp--deploy-reviseur-orch_master\n10:51:31 [Pipeline] {\n10:51:31 [Pipeline] timestamps\n10:51:31 The timestamps step is unnecessary when timestamps are enabled for all Pipeline builds.\n10:51:31 [Pipeline] {\n10:51:31 [Pipeline] ansiColor\n10:51:31 [Pipeline] {\n10:51:31 \n10:51:31 [Pipeline] cleanWs\n10:51:31 [WS-CLEANUP] Deleting project workspace...\n10:51:31 [WS-CLEANUP] Deferred wipeout is used...\n10:51:31 [WS-CLEANUP] done\n10:51:31 [Pipeline] stage\n10:51:31 [Pipeline] { (checkout)\n10:51:31 [Pipeline] checkout\n10:51:31 The recommended git tool is: NONE\n10:51:31 using credential id_rsa_svc-lmru-dataplatform\n10:51:31 Cloning the remote Git repository\n10:51:31 Avoid fetching tags\n10:51:32 Avoid second fetch\n10:51:32 Checking out Revision 02b357830a86a284f9f2d2e7ab0f86b24653db5b (refs/remotes/origin/master)\n10:51:32 Commit message: \"init\"\n10:51:31 Cloning repository git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git\n10:51:31 > git init /data/jenkins-root/workspace/_dp--deploy-reviseur-orch_master # timeout=10\n10:51:31 Fetching upstream changes from git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git\n10:51:31 > git --version # timeout=10\n10:51:31 > git --version # 'git version 2.43.0'\n10:51:31 using GIT_SSH to set credentials SSH key for svc-lmru-dataplatform (GitHub Enterprise)\n10:51:31 > git fetch --no-tags --force --progress -- git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git +refs/heads/*:refs/remotes/origin/* # timeout=20\n10:51:32 > git config remote.origin.url git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git # timeout=10\n10:51:32 > git config --add remote.origin.fetch +refs/heads/*:refs/remotes/origin/* # timeout=10\n10:51:32 > git rev-parse refs/remotes/origin/master^{commit} # timeout=10\n10:51:32 > git config core.sparsecheckout # timeout=10\n10:51:32 > git checkout -f 02b357830a86a284f9f2d2e7ab0f86b24653db5b # timeout=10\n10:51:32 > git rev-list --no-walk 02b357830a86a284f9f2d2e7ab0f86b24653db5b # timeout=10\n10:51:32 [Pipeline] sh\n10:51:33 + set -eu\n10:51:33 + git submodule sync --recursive\n10:51:33 + git -c submodule.active=. submodule update --init --recursive\n10:51:33 + git submodule status --recursive\n10:51:33 [Pipeline] }\n10:51:33 [Pipeline] // stage\n10:51:33 [Pipeline] stage\n10:51:33 [Pipeline] { (prepare)\n10:51:33 [Pipeline] withFolderProperties\n10:51:33 [Pipeline] {\n10:51:33 Did you forget the `def` keyword? WorkflowScript seems to be setting a field named AIRFLOW_CLUSTER (to a value of type String) which could lead to memory leaks or other issues.\n10:51:33 Did you forget the `def` keyword? WorkflowScript seems to be setting a field named PRODUCT_TITLE (to a value of type String) which could lead to memory leaks or other issues.\n10:51:33 Did you forget the `def` keyword? WorkflowScript seems to be setting a field named VAULT_APPROLE (to a value of type String) which could lead to memory leaks or other issues.\n10:51:33 [Pipeline] }\n10:51:33 [Pipeline] // withFolderProperties\n10:51:33 [Pipeline] httpRequest\n10:51:33 [Pipeline] withCredentials\n10:51:33 Masking supported pattern matches of $USERNAME or $PASSWORD\n10:51:33 [Pipeline] {\n10:51:33 [Pipeline] sh\n10:51:33 Warning: A secret was passed to \"sh\" using Groovy String interpolation, which is insecure.\n10:51:33 \t\t Affected argument(s) used the following variable(s): [PASSWORD, USERNAME]\n10:51:33 \t\t See https://jenkins.io/redirect/groovy-string-interpolation for details.\n10:51:33 + set +x\n10:51:33 [Pipeline] readJSON\n10:51:33 [Pipeline] sh\n10:51:33 + set +x\n10:51:34 [Pipeline] readJSON\n10:51:34 [Pipeline] sh\n10:51:34 + set +x\n10:51:34 [Pipeline] readJSON\n10:51:34 [Pipeline] }\n10:51:34 [Pipeline] // withCredentials\n10:51:34 Did you forget the `def` keyword? WorkflowScript seems to be setting a field named PROJECT_CONFIG (to a value of type LinkedHashMap) which could lead to memory leaks or other issues.\n10:51:34 Did you forget the `def` keyword? WorkflowScript seems to be setting a field named imageName (to a value of type GStringImpl) which could lead to memory leaks or other issues.\n10:51:34 Did you forget the `def` keyword? WorkflowScript seems to be setting a field named imageTag (to a value of type String) which could lead to memory leaks or other issues.\n10:51:34 Did you forget the `def` keyword? WorkflowScript seems to be setting a field named toPush (to a value of type Boolean) which could lead to memory leaks or other issues.\n10:51:34 [Pipeline] }\n10:51:34 [Pipeline] // stage\n10:51:34 [Pipeline] stage\n10:51:34 [Pipeline] { (build)\n10:51:34 [Pipeline] isUnix\n10:51:34 [Pipeline] withEnv\n10:51:34 [Pipeline] {\n10:51:34 [Pipeline] sh\n10:51:34 + docker build -t null/airflow/null:latest . --pull\n10:51:34 #0 building with \"default\" instance using docker driver\n10:51:34 \n10:51:34 #1 [internal] load build definition from Dockerfile\n10:51:34 #1 transferring dockerfile: 293B done\n10:51:34 #1 WARN: InvalidDefaultArgInFrom: Default value for ARG ${DOCKER_IMAGE} results in empty or invalid base image name (line 2)\n10:51:34 #1 DONE 0.0s\n10:51:34 \n10:51:34 1 warning found (use docker --debug to expand):\n10:51:34 - InvalidDefaultArgInFrom: Default value for ARG ${DOCKER_IMAGE} results in empty or invalid base image name (line 2)\n10:51:34 Dockerfile:2\n10:51:34 --------------------\n10:51:34 1 | ARG DOCKER_IMAGE=''\n10:51:34 2 | >>> FROM ${DOCKER_IMAGE}\n10:51:34 3 | \n10:51:34 4 | FROM docker-local-dataplatform.art.lmru.tech/common-deploy:latest\n10:51:34 --------------------\n10:51:34 ERROR: failed to build: failed to solve: base name (${DOCKER_IMAGE}) should not be blank\n10:51:34 [Pipeline] }\n10:51:34 [Pipeline] // withEnv\n10:51:34 [Pipeline] }\n10:51:34 [Pipeline] // stage\n10:51:34 [Pipeline] }\n10:51:34 \n10:51:34 [Pipeline] // ansiColor\n10:51:34 [Pipeline] }\n10:51:34 [Pipeline] // timestamps\n10:51:35 [Pipeline] }\n10:51:35 [Pipeline] // node\n10:51:35 [Pipeline] End of Pipeline\n10:51:35 ERROR: script returned exit code 1\n10:51:35 \n10:51:35 GitHub has been notified of this commit’s build result\n10:51:35 \n10:51:35 Finished: FAILURE\n\n</user_query>"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"Отлично: checkout и сабмодули уже починились. \nТекущий фейл теперь в `prepare/build`, не в Git.\n\n## Что сломалось сейчас\n\nПо логу:\n\n- `docker build -t null/airflow/null:latest ...`\n- `FROM ${DOCKER_IMAGE}` → `base name ... should not be blank`\n\nЗначит в `prepare` у вас получились `null` как минимум для:\n\n- `PROJECT_CONFIG.docker_registry_url`\n- `PROJECT_CONFIG.deploy_image`\n\nИменно поэтому тег стал `null/airflow/null:latest`.\n\n## Вероятная причина\n\n`vaultUtils.getSecrets(...)` вернул map без нужных ключей (или с `null`) по пути:\n\n- `airflow/${AIRFLOW_CLUSTER}/project_config`\n\nТо есть либо путь/namespace не тот, либо в секрете нет этих полей.\n\n## Что проверить первым делом\n\n- Фактические значения `AIRFLOW_CLUSTER`, `PRODUCT_TITLE`, `VAULT_APPROLE` (без секретов).\n- Какие ключи реально пришли в `PROJECT_CONFIG`.\n- Совпадает ли имя ключа `docker_registry_crentials_id` (в коде опечатка в слове `credentials` — возможно это историческое имя, но проверить надо).\n\n## Почему есть warning’и про `def`\n\n`Did you forget the def keyword?` — это не причина падения, но лучше поправить. \nВы присваиваете переменные как поля скрипта (CPS warning), а не локальные переменные.\n\n## Минимальная диагностика в `prepare` (что добавить)\n\n- вывести безопасные поля:\n - `echo \"AIRFLOW_CLUSTER=${AIRFLOW_CLUSTER}, PRODUCT_TITLE=${PRODUCT_TITLE}\"`\n - `echo \"PROJECT_CONFIG keys: ${PROJECT_CONFIG.keySet().sort()}\"`\n\n- и сделать явную валидацию до `docker.build`:\n - `docker_registry_url`\n - `deploy_image`\n - `docker_registry_crentials_id` (или корректное имя ключа)\n\nЕсли хотите, дам готовый блок `prepare` с `def` + fail-fast валидацией, чтобы сборка падала с понятной ошибкой “какого ключа не хватает”, а не на Docker этапе.\n\n**Diagnosing null config values**"}]}}
|
||
{"role":"user","message":{"content":[{"type":"text","text":"<user_query>\nкак ты понял, что починились сабмодули\n</user_query>"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"По вашему последнему логу видно прямые признаки, что сабмодули уже не ломают пайплайн:\n\n- Нет ошибки `SubmoduleOption.onCheckoutCompleted` и `git config --get submodule.playbooks.url` (раньше на этом падало).\n- `stage('checkout')` завершился успешно и выполнился ваш `sh`:\n - `git submodule sync --recursive`\n - `git -c submodule.active=. submodule update --init --recursive`\n - `git submodule status --recursive`\n- После checkout пайплайн пошел дальше в `stage('prepare')` и упал уже на `docker build` с другой причиной (`null/airflow/null`, пустой `DOCKER_IMAGE`).\n\nТо есть переход точки падения с checkout/submodule на prepare/build = сабмодульная проблема устранена."}]}}
|
||
{"role":"user","message":{"content":[{"type":"text","text":"<user_query>\nмогу предложить ему такой вариант чекаута, а может ему вообще предложить отказаться от сабмодулей? что тогда написать?\n</user_query>"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"Да, можно написать в двух вариантах: быстрый фикс и стратегическое предложение.\n\n## Что написать сейчас (практично)\n\nПредложи так:\n\n- Проблема была в `SubmoduleOption` Jenkins (`git config --get submodule.playbooks.url`).\n- Мы обошли это явным checkout без `checkout scm` и ручным `git submodule update`.\n- Это уже отработало: checkout + submodules прошли, дальше упало в другом месте.\n\nТекст для коллеги:\n\n> Привет! Нашли причину падения checkout: ломается Jenkins `SubmoduleOption` на `git config --get submodule.playbooks.url`. \n> Временный рабочий вариант — не использовать `checkout scm`, а сделать явный `GitSCM` checkout без submodule extension и затем руками:\n> `git submodule sync --recursive && git -c submodule.active=. submodule update --init --recursive`. \n> После этого checkout проходит стабильно.\n\n---\n\n## Стоит ли предлагать отказаться от сабмодулей\n\nДа, **как отдельную инициативу** — стоит, но не как срочный фикс.\n\nКогда это уместно:\n- частые падения CI из-за сабмодулей/прав/веток;\n- много команд и независимый lifecycle `playbooks`/`helm`;\n- нужны предсказуемые релизы без “магии” Jenkins.\n\nЧто предложить вместо:\n- либо отдельные репы + версионирование через теги/релизные артефакты;\n- либо монорепа (если команды и релизы жестко связаны);\n- либо dependency manager (helm chart dependency, release bundle и т.д.).\n\nТекст “стратегии”:\n\n> Отдельно предлагаю рассмотреть отказ от git submodules для deploy-репо. \n> Сейчас сабмодули добавляют нестабильность в Jenkins checkout (особенно при разных версиях git/plugin). \n> Более надежный вариант — подтягивать зависимости как версии (тег/релиз) из отдельных репозиториев или перейти на монорепу для тесно связанных компонентов. \n> Это снизит число инфраструктурных фейлов в CI.\n\n---\n\nЕсли хочешь, могу дать готовое короткое сообщение “в чат” и длинное “в тикет” (с рисками/планом миграции)."}]}}
|
||
{"role":"user","message":{"content":[{"type":"text","text":"<user_query>\nдай в чат простым языком\n</user_query>"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"Коллеги, нашли причину падения: ломался не сам git checkout, а встроенная обработка сабмодулей в Jenkins (`SubmoduleOption`).\n\nЧто сделали:\n- убрали зависимость от `checkout scm` для этого шага;\n- делаем обычный checkout репозитория;\n- сабмодули подтягиваем вручную командами:\n`git submodule sync --recursive` \n`git -c submodule.active=. submodule update --init --recursive`\n\nПосле этого checkout проходит, и пайплайн идет дальше.\n\nОтдельно предлагаю подумать, не уйти ли от сабмодулей совсем (они часто дают нестабильность в CI). Но как быстрый фикс текущей проблемы — вариант выше рабочий."}]}}
|
||
{"role":"user","message":{"content":[{"type":"text","text":"[Image]\n<image_files>\nThe following images were provdied by the user and saved to the workspace for future use:\n1. /home/ruslanpi/.cursor/projects/home-ruslanpi-Documents-repos-lmru-devops-argocd-apps/assets/image-00370e3f-c7ac-481c-9c72-4dcc87a04036.png\n\nThese images can be copied for use in other locations.\n</image_files>\n<user_query>\n\t\nАлександр Дядиченко\n5 минут назад\n@Руслан Петрович привет, этот проект построен с использованием сабмодулей, и в других местах оно без проблем работает\nhttps://jenkins.lmru.tech/job/datalakehouse/job/airflow-core/job/dp--deploy-airflow2-dlh/job/master/\nвсе таки хочется понять причину, почему здесь не работает\n\nвот где он скинул рабочий вариант\n#!groovy\n\nproperties([\n buildDiscarder (logRotator (artifactDaysToKeepStr: '', artifactNumToKeepStr: '10', daysToKeepStr: '', numToKeepStr: '10')),\n disableConcurrentBuilds (),\n disableResume (),\n]);\n\nimport org.jenkinsci.plugins.pipeline.modeldefinition.Utils\n@Library('common-utils') _\n\nnode ('dockerhost') {\n timestamps {\n ansiColor('xterm') {\n cleanWs()\n\n stage('checkout'){\n checkout scm\n }\n\n stage('prepare'){\n // def response = httpRequest \"http://amapi.apps.dev.data.lmru.tech/api/v1/getdeployinfo?repo_url=adeo/dp--batch-proc--ff-dom&module_env=test\"\n withFolderProperties{\n AIRFLOW_CLUSTER = env.airflow_cluster\n PRODUCT_TITLE = env.product_title\n VAULT_APPROLE = env.vault_approle\n }\n if (!AIRFLOW_CLUSTER){\n echo \"'airflow_cluster' variable doesn't set\"\n sh 'exit 1'\n }\n if (!PRODUCT_TITLE){\n echo \"'product_title' variable doesn't set\"\n sh 'exit 1'\n }\n if (!VAULT_APPROLE){\n echo \"'vault_approle' variable doesn't set\"\n sh 'exit 1'\n }\n PROJECT_CONFIG = vaultUtils.getSecrets([namespace:PRODUCT_TITLE, vaultPath:\"airflow/${AIRFLOW_CLUSTER}/project_config\", appRoleCredential: VAULT_APPROLE])\n imageName = \"${PROJECT_CONFIG.docker_registry_url}/airflow/${PROJECT_CONFIG.deploy_image}\"\n imageTag = getImageTag()\n toPush = toPush()\n }\n\n stage('build'){\n image = docker.build(\"${imageName}:${imageTag}\", \". --pull\")\n }\n\n stage('publish'){\n if (toPush){\n docker.withRegistry(\"https://${PROJECT_CONFIG.docker_registry_url}\", PROJECT_CONFIG.docker_registry_crentials_id) {\n image.push(\"${imageTag}\")\n }\n } else {\n Utils.markStageSkippedForConditional('publish')\n }\n }\n\n stage('Security scans') {\n parallel (\n 'CheckmarxScan': {\n checkmarxUtils.runCheckmarxScan_ZeroLicense(\n failBuildOnError: \"false\"\n )\n },\n 'SecretsScan': {\n securityUtils.secretsScan[:]\n },\n 'IacScan': {\n securityUtils.iacScan(reportFormat: 'html')\n },\n 'ImageScan': {\n sh \"docker pull ${imageName}:${imageTag}\"\n securityUtils.scanImage(imageName: \"${imageName}\", imageTag: \"${imageTag}\")\n }\n )\n }\n\n }\n }\n}\n\ndef getImageTag() {\n def tag = \"pipeline${env.BUILD_NUMBER}\"\n if (env.BRANCH_NAME == \"main\" || env.BRANCH_NAME == \"master\") {\n tag = \"latest\"\n } else if (env.BRANCH_NAME == 'dev') {\n tag = \"dev\"\n }\n return tag\n}\n\n// Returns deployment env ID based on build env branch/tags.\ndef getDeployEnv() {\n if (env.BRANCH_NAME == \"main\" || env.BRANCH_NAME == \"master\") {\n return \"dev\"\n } else if (env.BRANCH_NAME == 'test') {\n return \"test\"\n } else if (env.TAG_NAME) {\n return \"prod\"\n }\n return null\n}\n\ndef toPush(){\n if (env.BRANCH_NAME == \"main\" || env.BRANCH_NAME == \"master\" || env.BRANCH_NAME == \"dev\"){\n return true\n }\n return false\n}\n\n</user_query>"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"Можно ответить так, простым языком:\n\n> Саша, да, сабмодули как подход рабочие — проблема не в них как в концепции. \n> По логам здесь ломается именно Jenkins Git-плагин на шаге `SubmoduleOption`: \n> он видит `playbooks` в `.gitmodules`, но не находит `submodule.playbooks.url` в локальном `.git/config` и падает. \n> \n> То есть это разница окружения/инструментов на конкретных агентах (у нас в логе для этого checkout git `2.43.0` и `recommended git tool: NONE`), а не “проект с сабмодулями неправильный”. \n> \n> Поэтому временно обошли это явным checkout + ручным `git submodule sync/update` — так стабильно работает. \n> Параллельно можно добить первопричину на Jenkins-агентах (git tool/version/global git config), чтобы `checkout scm` тоже вел себя одинаково.\n\nЕсли нужно, дам еще супер-короткую версию в 2 строки для чата.\n\n**Crafting simple Russian explanation**"}]}}
|
||
{"role":"user","message":{"content":[{"type":"text","text":"<user_query>\nа давай попробуем и вправду разобраться, скинул рабочий вариант выше\n</user_query>"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"Отличная идея — тут реально можно докопаться до первопричины, а не жить на workaround.\n\nСамое вероятное сейчас: на “падающих” агентах есть отличие в git-окружении (особенно `submodule.active`/global git config), из-за чего Jenkins `SubmoduleOption` не прописывает `submodule.playbooks.url` в `.git/config`.\n\n## Почему так думаю\n\n- Падает именно на `git config --get submodule.playbooks.url`.\n- `.gitmodules` у вас корректный.\n- Явный checkout + `git -c submodule.active=. submodule update ...` у вас проходит.\n- Значит проблема в том, **как Jenkins plugin инициализирует submodule в конкретном окружении**.\n\n## Как быстро проверить (3 коротких шага)\n\n### 1) Сверить агент/версию git между “рабочим” и “падающим”\nВ логах уже видно разницу (`2.47.3` vs `2.43.0` в разных местах). \nНужно проверить именно git на node, где падает `checkout scm`.\n\n### 2) Перед `checkout scm` вывести git config на агенте\nДобавить временно stage до checkout:\n\n```groovy\nstage('diag-git-env') {\n sh '''\n set -eu\n whoami\n hostname\n git --version\n git config --system --list || true\n git config --global --list || true\n git config --list || true\n '''\n}\n```\n\nЧто ищем: `submodule.active`, `url.*.insteadOf`, любые submodule-related override.\n\n### 3) На этом же агенте вручную воспроизвести цепочку plugin\n(через `sshagent` с теми же кредами), и проверить момент, когда должен появиться `submodule.playbooks.url`:\n\n```bash\ngit init .\ngit remote add origin git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git\ngit fetch --no-tags origin +refs/heads/master:refs/remotes/origin/master\ngit checkout -f <commit>\ngit config -f .gitmodules --get-regexp '^submodule\\.(.+)\\.url'\ngit submodule init\ngit config --get submodule.playbooks.url\n```\n\nЕсли после `git submodule init` ключа нет — причина точно в git env на агенте, а не в репо.\n\n---\n\nЕсли хочешь, я соберу для тебя готовый диагностический `stage('diag')` под Jenkinsfile (с `sshagent`), чтобы вставить и получить полный дамп за один прогон.\n\n**Proposing concrete debugging plan**"}]}}
|
||
{"role":"user","message":{"content":[{"type":"text","text":"<user_query>\nдавай\n</user_query>"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"Супер, вот готовый диагностический блок. \nЕго лучше поставить **сразу после `cleanWs()` и до `stage('checkout')`**.\n\n```groovy\nstage('diag submodule env') {\n sshagent(credentials: ['id_rsa_svc-lmru-dataplatform']) {\n sh '''\n set -eu\n\n echo \"=== NODE / SHELL / GIT ===\"\n hostname || true\n whoami || true\n pwd\n git --version\n command -v git || true\n\n echo \"=== GIT CONFIG (system/global/local) ===\"\n git config --system --list --show-origin || true\n git config --global --list --show-origin || true\n\n echo \"=== CLEAN TEST REPO ===\"\n rm -rf .git .gitmodules playbooks helm || true\n\n git init .\n git remote add origin git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git\n git fetch --no-tags --force origin +refs/heads/master:refs/remotes/origin/master\n git checkout -f refs/remotes/origin/master\n\n echo \"=== .gitmodules content ===\"\n test -f .gitmodules && cat .gitmodules || echo \"NO .gitmodules\"\n\n echo \"=== SUBMODULE URLS FROM .gitmodules ===\"\n git config -f .gitmodules --get-regexp '^submodule\\\\.(.+)\\\\.url' || true\n\n echo \"=== BEFORE init: submodule.* from .git/config ===\"\n git config --get-regexp '^submodule\\\\.' || true\n\n echo \"=== RUN git submodule init ===\"\n git submodule init || true\n\n echo \"=== AFTER init: submodule.* from .git/config ===\"\n git config --get-regexp '^submodule\\\\.' || true\n\n echo \"=== DIRECT CHECK (problem key) ===\"\n git config --get submodule.playbooks.url || true\n\n echo \"=== TRY WITH submodule.active=. ===\"\n git -c submodule.active=. submodule init || true\n git config --get submodule.playbooks.url || true\n\n echo \"=== SUBMODULE STATUS ===\"\n git submodule status || true\n '''\n }\n}\n```\n\nЧто смотреть в выводе:\n\n- Есть ли `submodule.playbooks.url` после обычного `git submodule init`.\n- Появляется ли он только после `-c submodule.active=.`.\n- Есть ли в `--system/--global` что-то вроде `submodule.active=...` (это частый корень проблемы).\n\nЕсли после этого скинешь кусок лога `diag submodule env`, я помогу точно сформулировать RCA для команды Jenkins."}]}}
|
||
{"role":"user","message":{"content":[{"type":"text","text":"<user_query>\nтолько что просто нажал билд нау по мастеру и ошибки с сабмодулями не вылезло)\n</user_query>"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"Отлично — это как раз подтверждает гипотезу про контекст запуска, а не про “битые сабмодули” в репо.\n\nПочему так могло быть:\n\n- `Replay/Rebuild` мог тянуть старый `scm`-объект/настройки branch-job.\n- После обычного `Build Now` multibranch подхватил актуальную конфигурацию.\n- Разные агенты/окружения тоже могли влиять (но сейчас уже не блокирует).\n\nЧто лучше сделать сейчас:\n\n- Зафиксировать, что проблема воспроизводилась только в replay/rebuild.\n- Оставить короткий комментарий в задаче: “обычный Build Now по master проходит; падение было в checkout scm + SubmoduleOption в старом контексте запуска”.\n- На всякий случай прогнать еще 2-3 обычных билда для стабильности.\n\nЕсли хочешь, дам готовый текст в чат Александру “что было и почему сейчас ок”.\n\n**Explaining stale context potential**"}]}}
|
||
{"role":"user","message":{"content":[{"type":"text","text":"<user_query>\n15:04:06 [ssh-agent] Using credentials svc-lmru-dataplatform (SSH key for svc-lmru-dataplatform (GitHub Enterprise))\n15:04:06 $ ssh-agent\n15:04:06 SSH_AUTH_SOCK=/tmp/ssh-BS6X2Qd9rwTW/agent.4183200\n15:04:06 SSH_AGENT_PID=4183203\n15:04:06 Running ssh-add (command line suppressed)\n15:04:06 Identity added: /data/jenkins-root/workspace/_dp--deploy-reviseur-orch_master@tmp/private_key_7865611287264224738.key (svc-lmru-dataplatform)\n15:04:06 [ssh-agent] Started.\n15:04:06 [Pipeline] {\n15:04:06 [Pipeline] sh\n15:04:07 + set -eu\n15:04:07 + echo === NODE / SHELL / GIT ===\n15:04:07 === NODE / SHELL / GIT ===\n15:04:07 + hostname\n15:04:07 p-jenkins-node-m-07\n15:04:07 + whoami\n15:04:07 root\n15:04:07 + pwd\n15:04:07 /data/jenkins-root/workspace/_dp--deploy-reviseur-orch_master\n15:04:07 + git --version\n15:04:07 git version 2.43.0\n15:04:07 + command -v git\n15:04:07 /usr/bin/git\n15:04:07 + echo === GIT CONFIG (system/global/local) ===\n15:04:07 === GIT CONFIG (system/global/local) ===\n15:04:07 + git config --system --list --show-origin\n15:04:07 fatal: unable to read config file '/etc/gitconfig': No such file or directory\n15:04:07 + true\n15:04:07 + git config --global --list --show-origin\n15:04:07 file:/root/.gitconfig\tuser.email=jenkins@lmru.com\n15:04:07 file:/root/.gitconfig\tuser.name=Jenkins LMRU\n15:04:07 file:/root/.gitconfig\tcredential.helper=cache\n15:04:07 file:/root/.gitconfig\tpush.default=simple\n15:04:07 file:/root/.gitconfig\tsafe.directory=/opt/homebrew\n15:04:07 + echo === CLEAN TEST REPO ===\n15:04:07 === CLEAN TEST REPO ===\n15:04:07 + rm -rf .git .gitmodules playbooks helm\n15:04:07 + git init .\n15:04:07 hint: Using 'master' as the name for the initial branch. This default branch name\n15:04:07 hint: is subject to change. To configure the initial branch name to use in all\n15:04:07 hint: of your new repositories, which will suppress this warning, call:\n15:04:07 hint: \n15:04:07 hint: \tgit config --global init.defaultBranch <name>\n15:04:07 hint: \n15:04:07 hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and\n15:04:07 hint: 'development'. The just-created branch can be renamed via this command:\n15:04:07 hint: \n15:04:07 hint: \tgit branch -m <name>\n15:04:07 Initialized empty Git repository in /data/jenkins-root/workspace/_dp--deploy-reviseur-orch_master/.git/\n15:04:07 + git remote add origin git@github.lmru.tech:adeo/dp--deploy-reviseur-orch.git\n15:04:07 + git fetch --no-tags --force origin +refs/heads/master:refs/remotes/origin/master\n15:04:07 From github.lmru.tech:adeo/dp--deploy-reviseur-orch\n15:04:07 * [new branch] master -> origin/master\n15:04:07 + git checkout -f refs/remotes/origin/master\n15:04:07 Note: switching to 'refs/remotes/origin/master'.\n15:04:07 \n15:04:07 You are in 'detached HEAD' state. You can look around, make experimental\n15:04:07 changes and commit them, and you can discard any commits you make in this\n15:04:07 state without impacting any branches by switching back to a branch.\n15:04:07 \n15:04:07 If you want to create a new branch to retain commits you create, you may\n15:04:07 do so (now or later) by using -c with the switch command. Example:\n15:04:07 \n15:04:07 git switch -c <new-branch-name>\n15:04:07 \n15:04:07 Or undo this operation with:\n15:04:07 \n15:04:07 git switch -\n15:04:07 \n15:04:07 Turn off this advice by setting config variable advice.detachedHead to false\n15:04:07 \n15:04:07 HEAD is now at 41b400b init\n15:04:07 + echo === .gitmodules content ===\n15:04:07 === .gitmodules content ===\n15:04:07 + test -f .gitmodules\n15:04:07 + cat .gitmodules\n15:04:07 [submodule \"playbooks\"]\n15:04:07 \tpath = playbooks\n15:04:07 \turl = git@github.lmru.tech:adeo/dp--deploy-airflow2-ansible.git\n15:04:07 \tbranch = rel_v0.3.1\n15:04:07 [submodule \"helm\"]\n15:04:07 \tpath = helm\n15:04:07 \turl = git@github.lmru.tech:adeo/dp--deploy-airflow2-helm.git\n15:04:07 \tbranch = rel_0.3\n15:04:07 + echo === SUBMODULE URLS FROM .gitmodules ===\n15:04:07 === SUBMODULE URLS FROM .gitmodules ===\n15:04:07 + git config -f .gitmodules --get-regexp ^submodule\\.(.+)\\.url\n15:04:07 submodule.playbooks.url git@github.lmru.tech:adeo/dp--deploy-airflow2-ansible.git\n15:04:07 submodule.helm.url git@github.lmru.tech:adeo/dp--deploy-airflow2-helm.git\n15:04:07 + echo === BEFORE init: submodule.* from .git/config ===\n15:04:07 === BEFORE init: submodule.* from .git/config ===\n15:04:07 + git config --get-regexp ^submodule\\.\n15:04:07 + true\n15:04:07 + echo === RUN git submodule init ===\n15:04:07 === RUN git submodule init ===\n15:04:07 + git submodule init\n15:04:07 + echo === AFTER init: submodule.* from .git/config ===\n15:04:07 === AFTER init: submodule.* from .git/config ===\n15:04:07 + git config --get-regexp ^submodule\\.\n15:04:07 + true\n15:04:07 + echo === DIRECT CHECK (problem key) ===\n15:04:07 === DIRECT CHECK (problem key) ===\n15:04:07 + git config --get submodule.playbooks.url\n15:04:07 + true\n15:04:07 + echo === TRY WITH submodule.active=. ===\n15:04:07 === TRY WITH submodule.active=. ===\n15:04:07 + git -c submodule.active=. submodule init\n15:04:07 + git config --get submodule.playbooks.url\n15:04:07 + true\n15:04:07 + echo === SUBMODULE STATUS ===\n15:04:07 === SUBMODULE STATUS ===\n15:04:07 + git submodule status\n15:04:07 [Pipeline] }\n15:04:07 $ ssh-agent -k\n15:04:07 unset SSH_AUTH_SOCK;\n15:04:07 unset SSH_AGENT_PID;\n15:04:07 echo Agent pid 4183203 killed;\n15:04:07 [ssh-agent] Stopped.\n</user_query>"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"Супер, этот лог дал **четкую первопричину**.\n\n## Что он доказал\n\n- `.gitmodules` есть и в нем `playbooks`/`helm` прописаны.\n- Но после `git submodule init` в `.git/config` **ничего не появилось**:\n - `git config --get-regexp ^submodule\\.` → пусто\n - `git config --get submodule.playbooks.url` → пусто\n- `git submodule status` тоже пустой.\n\nЭто обычно значит: в самом коммите нет gitlink-записей сабмодулей (mode `160000`) для `playbooks`/`helm`, то есть есть только `.gitmodules`, а “подмодули как объекты git” не зарегистрированы в дереве коммита.\n\nИз-за этого Jenkins `SubmoduleOption` и падает: он ожидает `submodule.playbooks.url` в `.git/config`, а `git submodule init` его не создает.\n\n---\n\nМожно ответить Александру так:\n\n> Причину нашли: в этом репо в текущем коммите есть `.gitmodules`, но сами сабмодули не инициализируются (`git submodule status` пустой, `git submodule init` не добавляет `submodule.*` в `.git/config`). \n> Поэтому Jenkins `SubmoduleOption` падает на `git config --get submodule.playbooks.url`. \n> То есть проблема не “сабмодули вообще не работают”, а несоответствие состояния репозитория: `.gitmodules` есть, а gitlink-записей сабмодулей в коммите нет/неактивны.\n\n---\n\nЕсли хотите быстро добить проверку “на 100%”, попросите выполнить в репо:\n\n- `git ls-tree HEAD playbooks helm`\n- у корректного сабмодуля там должен быть тип `commit` и mode `160000`.\n\nЕсли там пусто (или не `160000`) — RCA окончательно подтверждено.\n\n**Explaining git submodule config issue**"}]}}
|
||
{"role":"user","message":{"content":[{"type":"text","text":"<user_query>\n@dp--deploy-reviseur-orch на сам проверь\n</user_query>"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"Проверю сам репозиторий `dp--deploy-reviseur-orch`: посмотрю состояние `.gitmodules`, gitlink-записей для `playbooks/helm` и воспроизведу команды, на которых падал Jenkins. Сейчас сначала найду его локально и сниму факты по `git`.\n\n**Planning repo location check**"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"Нашел репозиторий локально в `lmru--devops--argocd-apps/dp--deploy-reviseur-orch`. Сейчас проверю его как Git-объект: есть ли gitlink для `playbooks/helm` в `HEAD`, и что дают `submodule init/status` на чистом клоне.\n\n**Inspecting nested git repo**"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"**Planning safe submodule inspection**"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"Проверил “наживую”: в `master` реально есть только файл `.gitmodules`, а самих gitlink-сабмодулей нет, поэтому `submodule init` ничего не добавляет. Сейчас посмотрю историю, когда это состояние появилось, чтобы можно было аргументировать коллегам.\n\n**Planning repository history inspection**"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"**Testing git revision listing strategies**"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"**Confirming no submodules added**"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"Проверил сам `dp--deploy-reviseur-orch` локально.\n\nФакты:\n\n- Репо чистое: `master...origin/master`.\n- В `HEAD` для сабмодулей нет gitlink-объектов:\n - `git ls-tree HEAD playbooks helm .gitmodules` возвращает только `.gitmodules`.\n- `.gitmodules` содержит секции `playbooks` и `helm`, но это только декларация.\n- В свежем клоне:\n - `git submodule init` ничего не добавляет в `.git/config`\n - `git config --get submodule.playbooks.url` пусто\n - `git submodule status` пусто\n- Коммит `3bf462f` (первое добавление `.gitmodules`) добавил файл `.gitmodules`, но **не добавил** gitlink-записи `playbooks/helm` как сабмодули.\n\nИтог:\n\n- Jenkins падает закономерно: `SubmoduleOption` ожидает `submodule.playbooks.url` после `submodule init`, но его неоткуда взять, потому что в дереве коммита нет сабмодулей как gitlink (`160000`).\n\nЧто делать:\n\n- либо оформить `playbooks`/`helm` как реальные сабмодули (чтобы в `ls-tree` были `160000 commit ... playbooks|helm`),\n- либо убрать `.gitmodules` и отключить submodule processing для этого репо (если сабмодули фактически не используются).\n\n**Summarizing submodule issue**"}]}}
|
||
{"role":"user","message":{"content":[{"type":"text","text":"<user_query>\nчто я могу сделать сам чтобы починить?\n</user_query>"}]}}
|
||
{"role":"assistant","message":{"content":[{"type":"text","text":"Ты можешь починить сам двумя путями — зависит от того, нужны ли сабмодули реально.\n\n## Вариант 1 (самый быстрый): сабмодули не нужны\nЕсли `playbooks/helm` не используются как сабмодули в этом репо:\n\n1. В Jenkins job отключи обработку сабмодулей (`Disable submodules processing`).\n2. В репо убери `.gitmodules` (чтобы не вводил в заблуждение).\n3. Закоммить и запусти билд.\n\nЭто самый простой и стабильный путь.\n\n---\n\n## Вариант 2 (правильный, если сабмодули нужны)\nСейчас у тебя есть `.gitmodules`, но **нет gitlink-записей сабмодулей** в коммите. Нужно добавить сабмодули правильно.\n\nВ корне `dp--deploy-reviseur-orch`:\n\n```bash\ngit checkout master\ngit pull\n\n# если папки playbooks/helm существуют локально как обычные директории — удалить/перенести перед add\ngit submodule add -b rel_v0.3.1 git@github.lmru.tech:adeo/dp--deploy-airflow2-ansible.git playbooks\ngit submodule add -b rel_0.3 git@github.lmru.tech:adeo/dp--deploy-airflow2-helm.git helm\n\ngit add .gitmodules playbooks helm\ngit commit -m \"fix: register playbooks and helm as real git submodules\"\ngit push\n```\n\nПроверка (обязательная):\n\n```bash\ngit ls-tree HEAD playbooks helm\n```\n\nДолжно быть что-то вроде:\n- `160000 commit ... playbooks`\n- `160000 commit ... helm`\n\nЕсли видишь `160000`, значит Jenkins `checkout scm` с submodule option больше не должен падать.\n\n---\n\nЕсли хочешь, помогу выбрать между 1 и 2 по вашему реальному процессу релиза (что именно от `playbooks/helm` ожидается в этом пайплайне).\n\n**Предлагая два варианта решения**"}]}} |