Конвейер Дженкинса хранит учетные данные SSH в качестве параметра

#jenkins #jenkins-pipeline

Вопрос:

У меня есть следующий код конвейера:

 pipeline {  agent any   environment {  SSH_KEY_PARAMETER = credentials('SSH_KEY')      }  stages {  stage('Checkout') {  steps{  script{  git credentialsId: 'SSH_KEY_PARAMETER', url: 'git@github.com:SomeUser/PrivateRepo.git', branch: 'main'  }  }  }  } }  

Ожидаемый результат-клонирование репо. Фактический объем производства:

 ERROR: Error fetching remote repo 'origin' hudson.plugins.git.GitException: Failed to fetch from git@github.com:SomeUser/PrivateRepo.git  at hudson.plugins.git.GitSCM.fetchFrom(GitSCM.java:1001)  at hudson.plugins.git.GitSCM.retrieveChanges(GitSCM.java:1242)  at hudson.plugins.git.GitSCM.checkout(GitSCM.java:1302)  at org.jenkinsci.plugins.workflow.steps.scm.SCMStep.checkout(SCMStep.java:129)  at org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:97)  at org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:84)  at org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:47)  at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)  at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)  at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)  at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)  at java.base/java.lang.Thread.run(Thread.java:829) Caused by: hudson.plugins.git.GitException: Command "git fetch --tags --force --progress -- git@github.com:SomeUser/PrivateRepo.git  refs/heads/*:refs/remotes/origin/*" returned status code 128: stdout:  stderr: git@github.com: Permission denied (publickey). fatal: Could not read from remote repository.  Please make sure you have the correct access rights and the repository exists.   at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:2681)  at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandWithCredentials(CliGitAPIImpl.java:2102)  at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.access$500(CliGitAPIImpl.java:86)  at org.jenkinsci.plugins.gitclient.CliGitAPIImpl$1.execute(CliGitAPIImpl.java:624)  at hudson.plugins.git.GitSCM.fetchFrom(GitSCM.java:999)  

Если я изменю код конвейера, чтобы использовать идентификатор учетных данных вместо переменной, это сработает:

 pipeline {  agent any   environment {  SSH_KEY_PARAMETER = credentials('SSH_KEY')     }  stages {  stage('Checkout') {  steps{  script{  git credentialsId: 'SSH_KEY', url: 'git@github.com:SomeUser/PrivateRepo.git', branch: 'main'  }  }  }  }  }  

В моем конвейере мне нужно управлять кучей ключей SSH в зависимости от среды, поэтому мне нужно иметь возможность параметризовать ключ SSH, я что-то здесь упускаю или невозможно назначить ключ SSH в качестве переменной?

Ответ №1:

Ваша environment директива с использованием credentials вспомогательного метода синтаксически верна. Ваш синтаксис для доступа к переменной неверен. Вы присваиваете аргументу буквальное строковое значение 'SSH_KEY_PARAMETER' credentialsId . Фактическое значение также хранится в env объекте, поэтому вы можете получить к нему доступ с помощью соответствующего ключа env.SSH_KEY_PARAMETER . Использование тогда будет выглядеть так:

 credentialsId: env.SSH_KEY_PARAMETER  

Однако на этом git шаге ожидается идентификатор учетных данных для этого аргумента, а не фактические учетные данные. Поэтому вам также необходимо присвоить значение credentialsId в environment директиве вместо:

 SSH_KEY_PARAMETER = 'SSH_KEY'  

Собрав все это воедино, мы имеем:

 environment {  SSH_KEY_PARAMETER = 'SSH_KEY' }  stages {  ...  git credentialsId: env.SSH_KEY_PARAMETER, url: 'git@github.com:SomeUser/PrivateRepo.git', branch: 'main' }  

Комментарии:

1. Теперь я получаю Warning: CredentialId "****" could not be found.

2. @SimpleNiko Идентификатор учетных данных должен существовать и быть введен в плагин.

3. Он действительно существует, иначе он не работал бы, когда я напрямую вошел credentialsId: 'SSH_KEY'

4. @SimpleNiko, К сожалению, я не могу помочь вам дальше, потому что мой ответ работает, если учетные данные введены в плагин с указанным именем.