role: user

type: text

text:
<user_query>
поменялись аппроли для вольта и перестали работать автотесты в дженкинсе pr-check
09:14:49  [Allure] [29615036] Waiting [10] seconds until all files will be indexed
09:14:59  [Allure] [29615036] Waiting until all files will be uploaded
09:15:03  [Allure] [29615036] Session [456193] total indexed [0], ignored [0], processed [0], errors [0]
09:15:03  [Allure] [29615036] Session [456193] stopped successfully...
09:15:04  [Allure] [29615036] Job run [https://allure.lmru.tech/jobrun/378566] stopped successfully...
09:15:04  [Pipeline] // withAllureUpload
09:15:04  [Pipeline] sh
09:15:04  + docker logs checkout_bff
09:15:04  TLS strict check disabled
09:15:04  Error messages for policy code will be suppressed
09:15:04  /app/dist/config.js:13
09:15:04          throw new Error('Invalid channel configuration');
09:15:04                ^
09:15:04
09:15:04  Error: Invalid channel configuration
09:15:04      at handleErrors (/app/dist/config.js:13:15)
09:15:04      at getConfig (/app/dist/config.js:23:9)
09:15:04      at async Object.init (/app/dist/app.js:106:25)
09:15:04      at async main (/app/dist/index.js:66:17)
09:15:04
09:15:04  Node.js v18.16.1
09:15:04  [Pipeline] }
09:15:04  [Pipeline] // stage
09:15:04  [Pipeline] stage
09:15:04  [Pipeline] { (Artifacts)
09:15:04  [Pipeline] echo
09:15:04  generate reports
09:15:04  [Pipeline] allure
09:15:04  [kout-platformeco-channel_PR-1087] $ /data/jenkins-root/tools/ru.yandex.qatools.allure.jenkins.tools.AllureCommandlineInstallation/Autoinstall/bin/allure generate -c -o /data/jenkins-root/workspace/kout-platformeco-channel_PR-1087/allure-report
09:15:05  allure-results does not exist
09:15:06  Report successfully generated to /data/jenkins-root/workspace/kout-platformeco-channel_PR-1087/allure-report
09:15:06  Allure report was successfully generated.
09:15:06  Archiving Allure report via ArtifactManager…
09:15:06  Allure artifact archived via ArtifactManager.
09:15:06  Allure report copied to: /var/jenkins_home/jobs/lego/jobs/CheckoutTunnel/jobs/PAO-BFF-AUTOTEST/jobs/lmru--checkout-platformeco-channel/branches/PR-1087/builds/3/allure-report
09:15:06  [Pipeline] }
09:15:06  [Pipeline] // stage
09:15:07  [Pipeline] stage
09:15:07  [Pipeline] { (Build status)
09:15:07  [Pipeline] sh
09:15:07  + cat ./tests/ucc/target/surefire-reports/TestSuite.txt
09:15:07  + head -4
09:15:07  + tail -1
09:15:07  cat: ./tests/ucc/target/surefire-reports/TestSuite.txt: No such file or directory
09:15:07  [Pipeline] sh
09:15:07  + echo https://jenkins.lmru.tech/job/lego/job/CheckoutTunnel/job/PAO-BFF-AUTOTEST/job/lmru--checkout-platformeco-channel/job/PR-1087/3/allure/
09:15:07  [Pipeline] echo
09:15:07  Allure message:
09:15:07  [Pipeline] echo
09:15:07  Allure url: https://jenkins.lmru.tech/job/lego/job/CheckoutTunnel/job/PAO-BFF-AUTOTEST/job/lmru--checkout-platformeco-channel/job/PR-1087/3/allure/
09:15:07
09:15:08  [Pipeline] }
09:15:08  [Pipeline] // stage
09:15:08  [Pipeline] stage
09:15:08  [Pipeline] { (Clean up)
09:15:08  [Pipeline] sh
09:15:08  + docker-compose down --remove-orphans -v
09:15:08  time="2026-02-19T06:15:08Z" level=warning msg="The \"MODULE\" variable is not set. Defaulting to a blank string."
09:15:08  time="2026-02-19T06:15:08Z" level=warning msg="The \"TAGS\" variable is not set. Defaulting to a blank string."
09:15:08  time="2026-02-19T06:15:08Z" level=warning msg="The \"ENV\" variable is not set. Defaulting to a blank string."
09:15:08  time="2026-02-19T06:15:08Z" level=warning msg="The \"ANYBRANCH_URL\" variable is not set. Defaulting to a blank string."
09:15:08  time="2026-02-19T06:15:08Z" level=warning msg="The \"WIREMOCK_URL\" variable is not set. Defaulting to a blank string."
09:15:08  time="2026-02-19T06:15:08Z" level=warning msg="The \"MODULE\" variable is not set. Defaulting to a blank string."
09:15:08  time="2026-02-19T06:15:08Z" level=warning msg="The \"TAGS\" variable is not set. Defaulting to a blank string."
09:15:08  time="2026-02-19T06:15:08Z" level=warning msg="The \"ENV\" variable is not set. Defaulting to a blank string."
09:15:08  time="2026-02-19T06:15:08Z" level=warning msg="The \"ANYBRANCH_URL\" variable is not set. Defaulting to a blank string."
09:15:08  time="2026-02-19T06:15:08Z" level=warning msg="The \"WIREMOCK_URL\" variable is not set. Defaulting to a blank string."
09:15:08   Container kout-platformeco-channel_pr-1087-tests-1 Stopping
09:15:08   Container kout-platformeco-channel_pr-1087-wiremock-1 Stopping
09:15:08   Container kout-platformeco-channel_pr-1087-wiremock-1 Stopped
09:15:08   Container kout-platformeco-channel_pr-1087-wiremock-1 Removing
09:15:08   Container kout-platformeco-channel_pr-1087-tests-1 Stopped
09:15:08   Container kout-platformeco-channel_pr-1087-tests-1 Removing
09:15:08   Container kout-platformeco-channel_pr-1087-wiremock-1 Removed
09:15:08   Container kout-platformeco-channel_pr-1087-tests-1 Removed
09:15:08   Container checkout_bff Stopping
09:15:08   Container checkout_bff Stopped
09:15:08   Container checkout_bff Removing
09:15:08   Container checkout_bff Removed
09:15:08   Container kout-platformeco-channel_pr-1087-redis-1 Stopping
09:15:08   Container kout-platformeco-channel_pr-1087-nats-redis-1 Stopping
09:15:08   Container kout-platformeco-channel_pr-1087-redis-1 Stopped
09:15:08   Container kout-platformeco-channel_pr-1087-redis-1 Removing
09:15:08   Container kout-platformeco-channel_pr-1087-nats-redis-1 Stopped
09:15:08   Container kout-platformeco-channel_pr-1087-nats-redis-1 Removing
09:15:08   Container kout-platformeco-channel_pr-1087-nats-redis-1 Removed
09:15:08   Container kout-platformeco-channel_pr-1087-redis-1 Removed
09:15:08   Network kout-platformeco-channel_pr-1087_default Removing
09:15:08   Network kout-platformeco-channel_pr-1087_default Removed
09:15:08  [Pipeline] sh
09:15:08  + docker-compose ps
09:15:08  time="2026-02-19T06:15:08Z" level=warning msg="The \"MODULE\" variable is not set. Defaulting to a blank string."
09:15:08  time="2026-02-19T06:15:08Z" level=warning msg="The \"TAGS\" variable is not set. Defaulting to a blank string."
09:15:08  time="2026-02-19T06:15:08Z" level=warning msg="The \"ENV\" variable is not set. Defaulting to a blank string."
09:15:08  time="2026-02-19T06:15:08Z" level=warning msg="The \"ANYBRANCH_URL\" variable is not set. Defaulting to a blank string."
09:15:08  time="2026-02-19T06:15:08Z" level=warning msg="The \"WIREMOCK_URL\" variable is not set. Defaulting to a blank string."
09:15:08  time="2026-02-19T06:15:08Z" level=warning msg="The \"MODULE\" variable is not set. Defaulting to a blank string."
09:15:08  time="2026-02-19T06:15:08Z" level=warning msg="The \"TAGS\" variable is not set. Defaulting to a blank string."
09:15:08  time="2026-02-19T06:15:08Z" level=warning msg="The \"ENV\" variable is not set. Defaulting to a blank string."
09:15:08  time="2026-02-19T06:15:08Z" level=warning msg="The \"ANYBRANCH_URL\" variable is not set. Defaulting to a blank string."
09:15:08  time="2026-02-19T06:15:08Z" level=warning msg="The \"WIREMOCK_URL\" variable is not set. Defaulting to a blank string."
09:15:08  NAME      IMAGE     COMMAND   SERVICE   CREATED   STATUS    PORTS
09:15:08  [Pipeline] cleanWs
09:15:08  [WS-CLEANUP] Deleting project workspace...
09:15:08  [WS-CLEANUP] Deferred wipeout is used...
09:15:08  [WS-CLEANUP] done
09:15:08  [Pipeline] }
09:15:09  [Pipeline] // stage
09:15:09  [Pipeline] }
09:15:09  [Pipeline] // node
09:15:09  [Pipeline] End of Pipeline
09:15:09
09:15:09  GitHub has been notified of this commit’s build result
09:15:09
09:15:09  Finished: SUCCESS

</user_query>


role: assistant

text:
Понял задачу: нужно выяснить, почему после изменений апрувов для `volta` в `pr-check` падает запуск сервиса с `Invalid channel configuration`, хотя пайплайн формально зелёный. Сейчас быстро найду место в коде, где валидируется `channel`-конфиг, и сопоставлю с логом Jenkins.

**Analyzing channel error source**


text: **Verifying repository contents**


text: **Checking directory contents**


text: **Investigating empty command output**


text:
По этому логу видно две отдельные проблемы:

- контейнер `checkout_bff` **падает при старте** с `Error: Invalid channel configuration` (`/app/dist/config.js`),
- но `pr-check` всё равно заканчивается `Finished: SUCCESS`, хотя тесты фактически не стартовали (`allure-results does not exist`, `TestSuite.txt: No such file or directory`).

Что это значит по сути:

- после изменения апрувов/настроек для `volta` в рантайм попал некорректный channel-конфиг (или пустой/неразрешённый channel),
- автотестовый пайплайн это не считает критической ошибкой (нет fail-fast на падение bff/отсутствие отчётов).

### Где корень падения сервиса
Ошибка летит в валидации конфига (`handleErrors -> getConfig -> app.init`).
Обычно такое бывает, когда:
- изменился `channel` (новое значение не входит в whitelist),
- не подтянулся channel-specific secret из `volta`,
- структура секрета изменилась (ключи переименованы/вложенность другая),
- env для `CHANNEL`/`ENV`/конфиг-источника пустой или не тот.

### Почему Jenkins “зелёный”
Судя по шагам:
- `docker logs checkout_bff` лишь печатает крэш, но не валит stage,
- генерация Allure проходит даже без результатов,
- `cat .../TestSuite.txt` тоже не останавливает pipeline (вероятно `|| true`/`set +e`/обёртка без строгого fail).

### Что проверить первым делом
1. В `volta` сравнить секреты **до/после** изменения апрувов: есть ли channel-конфиг для `platformeco-channel` и совпадают ли ключи.
2. Проверить фактические env в job `PR-1087` (особенно `CHANNEL`, `ENV`, путь до секрета/namespace).
3. В коде валидации конфига посмотреть, какое именно поле считается invalid (временный debug-лог перед throw).
4. В Jenkinsfile добавить fail-условия:
   - если контейнер `checkout_bff` exited != 0 -> `error(...)`,
   - если нет `allure-results` или `surefire-reports/TestSuite.txt` -> `error(...)`.

Если хочешь, помогу точечно: скинь `src/config.*` (или кусок с `handleErrors/getConfig`) и stage из Jenkinsfile, я сразу скажу, какой ключ в `volta`/какое условие в пайплайне нужно поправить.

**Diagnosing pipeline false success**


text:
<user_query>
не вольта, Hashicorp Vault
</user_query>


text:
Верно, речь про **HashiCorp Vault**, не про volta.

Тогда гипотеза становится ещё точнее: после смены апрувов/политик в Vault приложение перестало получать валидный channel-конфиг (или получает неполный), из-за чего падает на `Invalid channel configuration`.

Что проверить по Vault в первую очередь:

- **Policy/role/token** у Jenkins job: есть ли `read` на нужный путь секрета для этого PR/env.
- **Путь секрета** не изменился ли (KV v1/v2, `data/` префикс, namespace, mount).
- **Структура секрета**: ключи соответствуют ожиданиям `getConfig` (имена и вложенность).
- **Содержимое для конкретного channel**: есть ли блок для `platformeco-channel` (или как он называется в конфиге).
- **TTL/renew** токена: не истекает ли до чтения.

И отдельно по Jenkins: сейчас пайплайн маскирует фейл (сервис упал, тестов нет, билд зелёный). Стоит добавить жёсткий фейл, если:
- `checkout_bff` завершился с ошибкой;
- нет `allure-results`/`TestSuite.txt`.

Если дашь кусок, где читается секрет из Vault + валидация channel-конфига, я сразу скажу, какой именно ключ/policy вероятнее всего отвалилась.

**Giving brief correction and next steps**


text:
<user_query>
поменялась approle vault, найди откуда он подтягивается
</user_query>


text: Сейчас найду в репозитории, где именно в CI/коде подхватывается Vault AppRole (role_id/secret_id или vault login), и покажу конкретные файлы/точки входа.


text: **Planning vault usage inspection**


text:
Нашёл точку в CI: `AppRole` подставляется в `.env` из переменных Jenkins (`HC_VAULT_ROLE_ID`, `HC_VAULT_SECRET_ID`). Сейчас проверю, где в самом приложении эти переменные читаются и где делается login в Vault.

**Locating role ID source**


text: **Identifying source files with glob**


text: **Searching vault config usage**


text: **Extracting config fragment for vault-loader**


text: **Checking environment variable sources**


text: **Clarifying env loading and config flow**


text:
Подтягивание AppRole идёт из **Jenkins-переменных**, а не из кода сервиса напрямую.

- В `Jenkinsfile` берутся `env.HC_VAULT_ROLE_ID` и `env.HC_VAULT_SECRET_ID` и записываются в `bff/.env`:
```35:39:Jenkinsfile
                        fileContent: """HC_VAULT_ROLE_ID=${env.HC_VAULT_ROLE_ID}
HC_VAULT_SECRET_ID=${env.HC_VAULT_SECRET_ID}
NODE_ENV=localmock""",
                        fileName: 'bff/.env'
```

- Затем этот `.env` прокидывается в контейнер `bff` через `docker-compose`:
```35:37:docker-compose.yml
    env_file:
      - ./bff/.env
```

- В `localmock` сначала читается `.env` (`dotenv-loader`), потом запускается `vault-loader` с `loginType: APPROLE`:
```837:850:config/localmock.json
    {
      "id": "dotenv-loader",
      "name": "dotenv-loader",
      "initOrder": 0,
      "settings": {
        "filename": ".env"
      }
    },
    {
      "id": "vault-loader",
      "name": "vault-loader",
      "initOrder": 1,
      "settings": {
        "loginType": "APPROLE",
        "host": "vault.lmru.tech",
```

- Сам логин в Vault делает внешний пакет `@platformeco/vault-loader` (подключён в loaders), то есть в этом репо нет ручного `vault login` кода:
```1049:1054:config/localmock.json
    "loaders": [
      "./node_modules/@platformeco/vault-loader/src",
      "./loaders/lodash",
      "./loaders/uuid",
      "./loaders/entrepreneur-verification",
      "./node_modules/@platformeco/dotenv-loader/src"
```

Итог: если AppRole поменяли, точка правки обычно в Jenkins (Folder Properties/Job env/секреты), откуда приходят `HC_VAULT_ROLE_ID` и `HC_VAULT_SECRET_ID`.

**Summarizing Jenkins AppRole flow**


text:
<user_query>
да, лежали обычной строкой в Jenkins Folder Properties. Поругал, сказал переместить в креды
</user_query>


text:
Да, это правильное замечание: `HC_VAULT_ROLE_ID` и `HC_VAULT_SECRET_ID` не стоит хранить в `Folder Properties` обычным текстом.

Как лучше сделать:

- создать 2 Jenkins credentials типа **Secret text**:
  - `vault-approle-role-id`
  - `vault-approle-secret-id`
- в `Jenkinsfile` получать их через `withCredentials(...)`
- только внутри этого блока писать `bff/.env` (или прокидывать env напрямую)

Пример для вашего scripted pipeline:

```groovy
stage('Prepare') {
    withCredentials([
        string(credentialsId: 'vault-approle-role-id', variable: 'HC_VAULT_ROLE_ID'),
        string(credentialsId: 'vault-approle-secret-id', variable: 'HC_VAULT_SECRET_ID')
    ]) {
        writeFile file: 'bff/.env', text: """HC_VAULT_ROLE_ID=${HC_VAULT_ROLE_ID}
HC_VAULT_SECRET_ID=${HC_VAULT_SECRET_ID}
NODE_ENV=localmock
"""
    }

    sh 'docker stop checkout_bff && docker rm checkout_bff || true'
    // ...
}
```

Что это даст:

- секреты больше не лежат в открытом виде в `Folder Properties`;
- значения маскируются в консольных логах Jenkins;
- проще ротация AppRole (меняете credential — pipeline не трогаете).

И да, после миграции проверьте права credential на folder/job (чтобы PR-check их видел), иначе получите ту же симптоматику с падением `vault-loader`/конфига.

**Advising credentials migration**


text:
<user_query>

Евгений Кувычка
2 часа назад
я извиняюсь, а есть мануал че кого

-2 ч
мы грамоте не обучены

-2 ч
Какие-то внутренние креды в дженкинсе?

Руслан Петрович
2 часа назад
вот тут раздел с секретами в дженкинсе для конкретно этой репы, там есть тип Vault AppRole, потом в пайплайне указывать credentials (id), а не из переменных

https://jenkins.lmru.tech/job/lego/job/CheckoutTunnel/job/PAO-BFF-AUTOTEST/job/lmru--checkout-platformeco-channel/credentials/store/folder/domain/_/

Евгений Кувычка
2 часа назад
А тут к сожалению не вариант

-2 ч
Пайпа не наша ведь, а платформики

Руслан Петрович
2 часа назад
https://jenkins.lmru.tech/job/lego/job/CheckoutTunnel/job/PAO-BFF-AUTOTEST/credentials/store/folder/
на уровень выше не для репы, а для проекта

-2 ч
понял, хорошо

Евгений Кувычка
2 часа назад
Большое тебе спасибо за помощь!

Руслан Петрович
2 часа назад
я займусь коммуникацией)

-2 ч
приходите еще :)

-2 ч
@lmru-devops-bot close

lmru-devops-bot
БОТ
2 часа назад
Task has been closed

Руслан Петрович
1 час назад
@Евгений Кувычка платформеко с дженкинсом не работает. Я тут посмотрел, что это ты завозил 3 года назад. Посмотри все же еще раз пожалуйста :)
https://github.lmru.tech/adeo/lmru--checkout-platformeco-channel/pull/255

Евгений Кувычка
1 час назад
0_0

-1 ч
Вижу изменение на этапе tests, но это же другое?
P.S. там изменения не мои, а подлитые, но с радостью разберусь если подскажешь

-1 ч
credentials: 'ghe-svc-lmru-cft-jenkins-integration'
Типа вот этот блок отвечает за то откуда он будет на этапе энвы брать?

Евгений Кувычка
38 минут назад

Как будто это тоже не то, @Руслан Петрович можешь подсказать подробнее?
</user_query>


text:
Да, он правильно смотрит, но это **другой** `credentials`.

`credentials: 'ghe-svc-lmru-cft-jenkins-integration'` в `git_checkout` используется только для доступа к GitHub (клонирование автотестов), к Vault это не относится:

```24:27:Jenkinsfile
git_checkout([url: 'https://github.lmru.tech/adeo/lmru--pao--platformeco--bff--autotests', credentials: 'ghe-svc-lmru-cft-jenkins-integration', branch: env.CHANGE_BRANCH])
```

Vault AppRole сейчас берется из env-переменных Jenkins (`Folder Properties`), и затем пишется в `.env`:

```32:37:Jenkinsfile
withFolderProperties {
    fileOperations([
        fileCreateOperation(
            fileContent: """HC_VAULT_ROLE_ID=${env.HC_VAULT_ROLE_ID}
HC_VAULT_SECRET_ID=${env.HC_VAULT_SECRET_ID}
NODE_ENV=localmock""",
```

То есть ответ Евгению:
- блок с `ghe-svc-lmru-cft-jenkins-integration` — это **только Git checkout**;
- Vault берется из `HC_VAULT_ROLE_ID/HC_VAULT_SECRET_ID` в folder/project properties.

Можно отправить ему так (готовый текст):

> Жень, `credentials: 'ghe-svc-lmru-cft-jenkins-integration'` — это креды для GitHub checkout автотестов, не для Vault.
> Vault AppRole в этом пайплайне подтягивается из env (`HC_VAULT_ROLE_ID`, `HC_VAULT_SECRET_ID`) через `withFolderProperties`, потом пишется в `bff/.env`.
> Поэтому проблема после смены AppRole именно в этих переменных/доступах к ним, а не в блоке `git_checkout`.

**Подготовка пояснений по Jenkinsfile и credentials**


text:
<user_query>
надо ему объяснить как перенести в Credentials
</user_query>


text:
Вот готовая, простая инструкция, которую можно ему скинуть.

Переносим `HC_VAULT_ROLE_ID` и `HC_VAULT_SECRET_ID` из plain env в Jenkins Credentials.

## Что сделать в Jenkins UI

1. Открыть нужный scope credentials (у вас это уровень проекта `PAO-BFF-AUTOTEST`, не репа).
2. Нажать **Add Credentials**.
3. Создать 2 секрета типа **Secret text**:
   - ID: `vault-approle-role-id` (value = текущий `HC_VAULT_ROLE_ID`)
   - ID: `vault-approle-secret-id` (value = текущий `HC_VAULT_SECRET_ID`)
4. После этого старые значения из Folder Properties удалить (или хотя бы очистить), чтобы не дублировать источник истины.

## Что поменять в пайплайне

Сейчас в `Jenkinsfile` используется `withFolderProperties` + `env.HC_VAULT_*`.
Нужно читать через `withCredentials`.

Пример блока для `stage('Prepare')`:

```groovy
withCredentials([
    string(credentialsId: 'vault-approle-role-id', variable: 'HC_VAULT_ROLE_ID'),
    string(credentialsId: 'vault-approle-secret-id', variable: 'HC_VAULT_SECRET_ID')
]) {
    fileOperations([
        fileCreateOperation(
            fileContent: """HC_VAULT_ROLE_ID=${HC_VAULT_ROLE_ID}
HC_VAULT_SECRET_ID=${HC_VAULT_SECRET_ID}
NODE_ENV=localmock""",
            fileName: 'bff/.env'
        )
    ])
}
```

## Важные пояснения для него

- `credentials: 'ghe-svc-lmru-cft-jenkins-integration'` в `git_checkout` — это только GitHub, к Vault не относится.
- Vault в этом проекте живет через переменные `HC_VAULT_ROLE_ID`/`HC_VAULT_SECRET_ID`, которые пишет в `bff/.env` и затем читает `vault-loader`.
- Если job не видит credential по ID — значит добавили не в тот scope (частая причина).

## Быстрая проверка после миграции

- Запустить PR-check.
- Убедиться, что нет падения `Invalid channel configuration`.
- В логах не должно быть значений role/secret (маскируются как секреты).

Если хочешь, напишу короткий текст одним сообщением “для Евгения”, чтобы можно было вставить в чат без правок.

**Providing step-by-step Jenkins credentials migration**


text:
<user_query>
есть тип кредов Vault App Role
</user_query>


text:
Супер, если есть тип **Vault App Role**, это даже правильнее, чем два `Secret text`.

Лучший вариант: завести **один** credential типа `Vault App Role`, а в пайплайне привязать его к переменным `HC_VAULT_ROLE_ID` и `HC_VAULT_SECRET_ID`, которые уже ждёт ваш `.env`.

Пример (scripted pipeline):

```groovy
withCredentials([[
    $class: 'VaultAppRoleCredentialBinding',
    credentialsId: 'vault-approle-checkout',
    roleIdVariable: 'HC_VAULT_ROLE_ID',
    secretIdVariable: 'HC_VAULT_SECRET_ID'
]]) {
    fileOperations([
        fileCreateOperation(
            fileContent: """HC_VAULT_ROLE_ID=${HC_VAULT_ROLE_ID}
HC_VAULT_SECRET_ID=${HC_VAULT_SECRET_ID}
NODE_ENV=localmock""",
            fileName: 'bff/.env'
        )
    ])
}
```

Что важно:
- `credentialsId` — ID созданного credential типа Vault App Role.
- Этот блок заменяет чтение из `withFolderProperties`.
- `ghe-svc-lmru-cft-jenkins-integration` оставляете как есть — это только для Git checkout.

Если вдруг `$class: 'VaultAppRoleCredentialBinding'` не подхватится (разные версии плагина), проверьте точное имя через **Pipeline Syntax** в Jenkins (`withCredentials` snippet generator).
Могу дать короткий шаблон сообщения Евгению именно в таком виде, чтобы он просто вставил в PR/чат.

**Providing Vault App Role guidance**