2016-09-12 4 views
10

Я разработал проект с многоканальным конвейером в jenkins. Мне нужно использовать два репозитория и оба требуют учетные данные.Использование учетных данных из магазина jenkins в файле jenkins

Я создал Jenkinsfile в repository1:

node ('label1'){ 
    stage 'sanity check' 
    sh 'echo sanity check' 
    stage 'checkout other repository' 
    checkout([ 
    $class: 'GitSCM', branches: [[name: '*/master']], 
    userRemoteConfigs: [[url: 'https://[email protected]/BRNTZN/repository2.git'],[credentialsId:'23b2eed1-2863-49d5-bc7b-bcccb9ad914d']] 
    ]) 
    stage 'log results' 
    sh 'echo result = OK' 
} 

Когда я нажимаю этот файл на ветви repository1 и начать сборку я получаю следующее сообщение об ошибке в Дженкинс:

Branch indexing 
Setting origin to https://[email protected]/BRNTZN/repository1.git 
Fetching origin... 
> git rev-parse --is-inside-work-tree # timeout=10 
Fetching changes from the remote Git repository 
> git config remote.origin.url https://[email protected]/BRNTZN/repository1.git # timeout=10 
Fetching upstream changes from https://[email protected]/BRNTZN/repository1.git 
> git --version # timeout=10 
using .gitcredentials to set credentials 
> git config --local credential.username BRNTZN # timeout=10 
> git config --local credential.helper store --file=/tmp/git1367320661933193799.credentials # timeout=10 
> git -c core.askpass=true fetch --tags --progress https://[email protected]/BRNTZN/repository1.git +refs/heads/*:refs/remotes/origin/* 
> git config --local --remove-section credential # timeout=10 
Checking out Revision d997a29e9d1f639d56eb425ec00e03309e099c7a (jenkinsfilebranch1) 
> git config core.sparsecheckout # timeout=10 
> git checkout -f d997a29e9d1f639d56eb425ec00e03309e099c7a 
> git rev-list f81d0d366fd751857a2640c587817f4d047a15af # timeout=10 
[Pipeline] node 
Running on jenkins agent (i-07353fc08cb42f10e) in /var/jenkins/workspace/multiBranch/jenkinsfilebranch1 
[Pipeline] { 
[Pipeline] stage (sanity check) 
Entering stage sanity check 
Proceeding 
[Pipeline] sh 
[jenkinsfilebranch1] Running shell script 
+ echo sanity check 
sanity check 
[Pipeline] stage (checkout other repository) 
Entering stage checkout other repository 
Proceeding 
[Pipeline] checkout 
> git rev-parse --is-inside-work-tree # timeout=10 
Fetching changes from the remote Git repository 
> git config remote.origin.url https://[email protected]/BRNTZN/repository2.git # timeout=10 
Fetching upstream changes from https://[email protected]/BRNTZN/repository2.git 
> git --version # timeout=10 
> git -c core.askpass=true fetch --tags --progress https://[email protected]/BRNTZN/repository2.git +refs/heads/*:refs/remotes/origin/* 
ERROR: Error fetching remote repo 'origin' 
hudson.plugins.git.GitException: Failed to fetch from https://[email protected]/BRNTZN/repository2.git 
    at hudson.plugins.git.GitSCM.fetchFrom(GitSCM.java:799) 
    at hudson.plugins.git.GitSCM.retrieveChanges(GitSCM.java:1055) 
    at hudson.plugins.git.GitSCM.checkout(GitSCM.java:1086) 
    at org.jenkinsci.plugins.workflow.steps.scm.SCMStep.checkout(SCMStep.java:109) 
    at org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:83) 
    at org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:73) 
    at org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution$1$1.call(AbstractSynchronousNonBlockingStepExecution.java:52) 
    at hudson.security.ACL.impersonate(ACL.java:213) 
    at org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution$1.run(AbstractSynchronousNonBlockingStepExecution.java:49) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:262) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: hudson.plugins.git.GitException: Command "git -c core.askpass=true fetch --tags --progress https://[email protected]/BRNTZN/repository2.git +refs/heads/*:refs/remotes/origin/*" returned status code 128: 
stdout: 
stderr: remote: Invalid username or password. If you log in via a third party service you must ensure you have an account password set in your account profile. 
fatal: Authentication failed for 'https://[email protected]/BRNTZN/repository2.git/' 

    at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:1723) 
    at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandWithCredentials(CliGitAPIImpl.java:1459) 
    at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.access$300(CliGitAPIImpl.java:63) 
    at org.jenkinsci.plugins.gitclient.CliGitAPIImpl$1.execute(CliGitAPIImpl.java:314) 
    at org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler$1.call(RemoteGitImpl.java:152) 
    at org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler$1.call(RemoteGitImpl.java:145) 
    at hudson.remoting.UserRequest.perform(UserRequest.java:153) 
    at hudson.remoting.UserRequest.perform(UserRequest.java:50) 
    at hudson.remoting.Request$2.run(Request.java:332) 
    at hudson.remoting.InterceptingExecutorService$1.call(InterceptingExecutorService.java:68) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:262) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:744) 
    at ......remote call to jenkins agent (i-07353fc08cb42f10e)(Native Method) 
    at hudson.remoting.Channel.attachCallSiteStackTrace(Channel.java:1416) 
    at hudson.remoting.UserResponse.retrieve(UserRequest.java:253) 
    at hudson.remoting.Channel.call(Channel.java:781) 
    at org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler.execute(RemoteGitImpl.java:145) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler.invoke(RemoteGitImpl.java:131) 
    at com.sun.proxy.$Proxy75.execute(Unknown Source) 
    at hudson.plugins.git.GitSCM.fetchFrom(GitSCM.java:797) 
    ... 13 more 
[Pipeline] } 
[Pipeline] // node 
[Pipeline] End of Pipeline 
ERROR: null 
Finished: FAILURE 

Полномочия должны верны: enter image description here

И использование этих учетных данных для этого репозитория в проекте фристайла не дает Ошибка: enter image description here

Update Я создал проект фристайл с использованием учетных данных SSH и добавил, что открытый ключ к моему Bitbucket счету, чтобы проверить, могу ли я сделать SSH работы: freestylecredentials ssh

Это сработало:

Started by user admin 
Building remotely on jenkins agent (i-039385e75b60d70f7) (label1) in workspace /var/jenkins/workspace/gitcredentials test 
> git rev-parse --is-inside-work-tree # timeout=10 
Fetching changes from the remote Git repository 
> git config remote.origin.url [email protected]:BRNTZN/repository2.git # timeout=10 
Fetching upstream changes from [email protected]:BRNTZN/repository2.git 
> git --version # timeout=10 
using GIT_SSH to set credentials jenkinsmaster key 
> git -c core.askpass=true fetch --tags --progress [email protected]:BRNTZN/repository2.git +refs/heads/*:refs/remotes/origin/* 
> git rev-parse refs/remotes/origin/master^{commit} # timeout=10 
> git rev-parse refs/remotes/origin/origin/master^{commit} # timeout=10 
Checking out Revision 1d51064143e7337cbc0b1910918166facc9c2330 (refs/remotes/origin/master) 
> git config core.sparsecheckout # timeout=10 
> git checkout -f 1d51064143e7337cbc0b1910918166facc9c2330 
First time build. Skipping changelog. 
Finished: SUCCESS 

Однако при обновлении файла jenkins следующим образом:

node ('label1'){ 
    stage 'sanity check' 
    sh 'echo sanity check' 
    stage 'checkout other repository' 
    checkout([ 
    $class: 'GitSCM', branches: [[name: '*/master']], 
    userRemoteConfigs: [[url: '[email protected]:BRNTZN/repository2.git'],[credentialsId:'jenkinsmaster']] 
    ]) 
    stage 'log results' 
    sh 'echo result = OK' 
} 

я все еще получаю ту же ошибку:

Started by user admin 
Setting origin to [email protected]:BRNTZN/repository1.git 
Fetching origin... 
> git rev-parse --is-inside-work-tree # timeout=10 
Fetching changes from the remote Git repository 
> git config remote.origin.url [email protected]:BRNTZN/repository1.git # timeout=10 
Fetching upstream changes from [email protected]:BRNTZN/repository1.git 
> git --version # timeout=10 
using GIT_SSH to set credentials jenkinsmaster key 
> git -c core.askpass=true fetch --tags --progress [email protected]:BRNTZN/repository1.git +refs/heads/*:refs/remotes/origin/* 
Checking out Revision 29fc47911827d829f5abe9456bd8df78bc478fe7 (jenkinsfilebranch1) 
> git config core.sparsecheckout # timeout=10 
> git checkout -f 29fc47911827d829f5abe9456bd8df78bc478fe7 
> git rev-list 29fc47911827d829f5abe9456bd8df78bc478fe7 # timeout=10 
[Pipeline] node 
Running on jenkins agent (i-039385e75b60d70f7) in /var/jenkins/workspace/multiBranch/jenkinsfilebranch1 
[Pipeline] { 
[Pipeline] stage (sanity check) 
Entering stage sanity check 
Proceeding 
[Pipeline] sh 
[jenkinsfilebranch1] Running shell script 
+ echo sanity check 
sanity check 
[Pipeline] stage (checkout other repository) 
Entering stage checkout other repository 
Proceeding 
[Pipeline] checkout 
> git rev-parse --is-inside-work-tree # timeout=10 
Fetching changes from the remote Git repository 
> git config remote.origin.url [email protected]:BRNTZN/repository2.git # timeout=10 
Fetching upstream changes from [email protected]:BRNTZN/repository2.git 
> git --version # timeout=10 
> git -c core.askpass=true fetch --tags --progress [email protected]:BRNTZN/repository2.git +refs/heads/*:refs/remotes/origin/* 
ERROR: Error fetching remote repo 'origin' 
hudson.plugins.git.GitException: Failed to fetch from [email protected]:BRNTZN/repository2.git 
    at hudson.plugins.git.GitSCM.fetchFrom(GitSCM.java:799) 
    at hudson.plugins.git.GitSCM.retrieveChanges(GitSCM.java:1055) 
    at hudson.plugins.git.GitSCM.checkout(GitSCM.java:1086) 
    at org.jenkinsci.plugins.workflow.steps.scm.SCMStep.checkout(SCMStep.java:109) 
    at org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:83) 
    at org.jenkinsci.plugins.workflow.steps.scm.SCMStep$StepExecutionImpl.run(SCMStep.java:73) 
    at org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution$1$1.call(AbstractSynchronousNonBlockingStepExecution.java:52) 
    at hudson.security.ACL.impersonate(ACL.java:213) 
    at org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution$1.run(AbstractSynchronousNonBlockingStepExecution.java:49) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:262) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: hudson.plugins.git.GitException: Command "git -c core.askpass=true fetch --tags --progress [email protected]:BRNTZN/repository2.git +refs/heads/*:refs/remotes/origin/*" returned status code 128: 
stdout: 
stderr: 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:1723) 
    at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandWithCredentials(CliGitAPIImpl.java:1459) 
    at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.access$300(CliGitAPIImpl.java:63) 
    at org.jenkinsci.plugins.gitclient.CliGitAPIImpl$1.execute(CliGitAPIImpl.java:314) 
    at org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler$1.call(RemoteGitImpl.java:152) 
    at org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler$1.call(RemoteGitImpl.java:145) 
    at hudson.remoting.UserRequest.perform(UserRequest.java:153) 
    at hudson.remoting.UserRequest.perform(UserRequest.java:50) 
    at hudson.remoting.Request$2.run(Request.java:332) 
    at hudson.remoting.InterceptingExecutorService$1.call(InterceptingExecutorService.java:68) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:262) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:744) 
    at ......remote call to jenkins agent (i-039385e75b60d70f7)(Native Method) 
    at hudson.remoting.Channel.attachCallSiteStackTrace(Channel.java:1416) 
    at hudson.remoting.UserResponse.retrieve(UserRequest.java:253) 
    at hudson.remoting.Channel.call(Channel.java:781) 
    at org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler.execute(RemoteGitImpl.java:145) 
    at sun.reflect.GeneratedMethodAccessor1180.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.jenkinsci.plugins.gitclient.RemoteGitImpl$CommandInvocationHandler.invoke(RemoteGitImpl.java:131) 
    at com.sun.proxy.$Proxy75.execute(Unknown Source) 
    at hudson.plugins.git.GitSCM.fetchFrom(GitSCM.java:797) 
    ... 13 more 
[Pipeline] } 
[Pipeline] // node 
[Pipeline] End of Pipeline 
ERROR: null 
Finished: FAILURE 
+0

Вы уверены, что вы используете правильный credentialsId? Также рассмотрите использование URL-адреса SSH для вашего соединения Git вместо HTTP-адреса. – Pom12

+0

@ Pom12 Я уверен, что это правильно, я обновил вопрос с помощью изображений. – BRNTZN

+0

Вместо того, чтобы вставлять «жестко запрограммированные» идентификаторы учетных данных в сценарии Pipeline, я принял к добавлению параметра Credentials в задание, которое по умолчанию относится к известному-хорошему. Затем в скрипте 'credentialsId:" $ {git_credentials} "' – MarkHu

ответ

10

Неверная реализация экземпляра класса GitSCM. У вас есть два объекта UserRemoteConfig - один с URL-адресом «[email protected]: BRNTZN/repository2.git» и один с учетными данными «jenkinsmaster». Вместо этого вы хотите, чтобы один объект имел оба свойства.

checkout([ 
    $class: 'GitSCM', branches: [[name: '*/master']], 
    userRemoteConfigs: [[url: '[email protected]:BRNTZN/repository2.git'],[credentialsId:'jenkinsmaster']] 
]) 

Должен быть

checkout([ 
    $class: 'GitSCM', branches: [[name: '*/master']], 
    userRemoteConfigs: [[url: '[email protected]:BRNTZN/repository2.git',credentialsId:'jenkinsmaster']] 
]) 

Я только что столкнулся с той же проблемой и подключен затмением отладчик Дженкинс, чтобы найти проблему.

См https://issues.jenkins-ci.org/browse/JENKINS-45007

+0

G расно. @BRNTZN, пожалуйста, установите его как правильный ответ –

0

Какие учетные данные вы используете?

Я предлагаю вам использовать SSH учетные данные (т.е. частные/публичные ключи):

  1. Generate пара ключей SSH (! Убедитесь, что вы создаете его для правильного имени пользователя)
  2. Добавить общедоступный SSH key to your Bitbucket account
  3. Настройте Дженкинс, чтобы использовать вновь созданный SSH закрытый ключ, как показано в следующем примере:

Затем вам нужно использовать SSH URL в связи с вашим Git учетными данными в вашем трубопроводе (вместо HTTP URL), следующим образом:

checkout([ 
    $class: 'GitSCM', branches: [[name: '*/master']], 
    userRemoteConfigs: [[url:'ssh://[email protected]:BRNTZN/repository2.git'],[credentialsId:'jenkins_ssh_key']] 
]) 

Кроме того, обратите внимание, что вы можете установить определенный идентификатор для ваших учетных данных (например, jenkins_ssh_key или BRNTZN_ssh_key), чтобы улучшить читаемость и упростить конфигурацию конвейера.

+0

Может ли jenkins использовать ключ ssh, если он помещен на моем хозяине? Или мне нужно сделать его доступным для каждого раба, который я запускаю? – BRNTZN

+0

Я не уверен и не хочу говорить что-то глупое, но я бы сказал, что Дженкинс сделает ваши учетные данные доступными для всех ваших узлов, независимо от того, какой узел в настоящее время выполняет ваш конвейер, потому что параметр указывает «Из файл на Jenkins master' – Pom12

+0

Обновлен op с попыткой ssh. – BRNTZN

4

У меня была одна и та же проблема: проверка с использованием учетных данных в проекте freestyle прекрасна, проверка в оболочке (как пользователь jenkins) работает нормально, проверка в конвейере завершается с ошибкой. Я обновил плагины Jenkins + до последней версии.

Мне, наконец, удалось заставить его работать, поместив правильный ключ в /var/lib/jenkins/.ssh/id_rsa. Похоже, что плагин GitSCM полностью игнорирует предоставленные credentialsId и просто использует ключ в /var/lib/jenkins/.ssh/id_rsa.Для этого я создал пару ключей без кодовой фразы.

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

+0

Произошло ли это на master для вас или вы также выполнили сборку на отдельном подчиненном экземпляре? Потому что я пробовал то, что вы делали, но не может заставить его работать. – BRNTZN

+0

При создании ключей на подчиненном устройстве, а затем добавлении этот открытый ключ для битбакета устранил мою проблему. Мне просто нужно убедиться, что каждый подчиненный использует тот же открытый ключ, и я думаю, что мне хорошо идти. – BRNTZN

+0

@BRNTZN Это было на хозяине, я не проверял поведение на подчиненные узлы. – rdeboo

0

Как указано в статье Pipeline plugin tutorial, для проекта с несколькими каналами вам не нужно указывать репозиторий в узле. Просто используйте checkout scm.

Смежные вопросы