#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, К сожалению, я не могу помочь вам дальше, потому что мой ответ работает, если учетные данные введены в плагин с указанным именем.