Jenkins Git Parameter插件无法读取标签 [英] Jenkins Git Parameter plugin cannot fetch tags
问题描述
- Jenkins版本:1.593
- Git参数插件:0.4.0
- GIT客户端插件:1.16 .1
我使用一个专用的git存储库,可以通过ssh访问。
我的构建是参数化的。
git参数是 TAG_TO_BUILD
,构建的分支是 refs / tags / $ {TAG_TO_BUILD}
完成工作空间的初始构建后,当我使用参数开始构建时,出现 noWorkspaceError 。
在Jenkins日志中,我有
2015年2月16日下午2点17分34秒WARNING org.eclipse .jetty.util.log.JavaUtilLog警告
服务http://foo/view/bar/job/baz/descriptorByName/net.uaznia.lukanus.hudson.plugins.gitparameter.GitParameterDefinition/fillValueItems $ b $时发生错误在sun.reflect.NativeMethodAccessorImpl.invoke在sun.reflect.NativeMethodAccessorImpl.invoke0 b java.lang.reflect.InvocationTargetException
(本机方法)
(NativeMethodAccessorImpl.java:57)
在阳光下。反射.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.kohsuke.stapler.Function $ InstanceFunction.invoke(功能。
at org.kohsuke.stapler.Function.bindAndInvoke(Function.java:161)
at org.kohsuke.stapler.Function.bindAndInvokeAndServeResponse(Function.java:96)
在org.kohsuke.stapler.MetaClass $ 1.doDispatch(MetaClass.java:121)
在org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:53)
在org.kohsuke.stapler。 Stapler.tryInvoke(Stapler.java:746)
at org.kohsuke.stapler.Stapler.invoke(Stapler.java:876)
at org.kohsuke.stapler.MetaClass $ 6.doDispatch(MetaClass.java :249)
at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:53)
at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:746)
at org.kohsuke.stapler.Stapler.invoke(Stapler.java:876)
at org.kohsuke.stapler.MetaClass $ 6.doDispatch(MetaClass.java:249)
at org.kohsuke.stapler.NameBasedDispatcher .dispatch(NameBasedDispatcher.java:53)
at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:746 )
在org.kohsuke.stapler.Stapler.invoke(Stapler.java:876)
在org.kohsuke.stapler.MetaClass $ 6.doDispatch(MetaClass.java:249)
在org .kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:53)
在org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:746)
在org.kohsuke.stapler.Stapler.invoke (Stapler.java:876)
at org.kohsuke.stapler.Stapler.invoke(Stapler.java:649)
at org.kohsuke.stapler.Stapler.service(Stapler.java:238)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:686)
at org。 eclipse.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1494)
在hudson.util.PluginServletFilter $ 1.doFilter(PluginServletFilter.java:96)
在com.smartcodeltd.jenkinsci.plugin .assetbundler.filters.LessCSS.doFilter(LessCSS.java:46)
at hudson.util.PluginServletFilter $ 1.doFilter(PluginSe rvletFilter.java:99)美元,org.jenkinsci.plugins.modernstatus.ModernStatusFilter.doFilter(ModernStatusFilter.java:52 B $ B)
在hudson.util.PluginServletFilter $ 1.doFilter(PluginServletFilter.java:99)
。在在哈德森org.eclipse.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1482)
hudson.util.PluginServletFilter.doFilter(PluginServletFilter.java:88)
。 security.csrf.CrumbFilter.doFilter(CrumbFilter.java:85)
。在org.eclipse.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1482)
。在hudson.security.ChainedServletFilter $ 1 .doFilter(ChainedServletFilter.java:84)
at hudson.security.UnwrapSecurityExceptionFilter.doFilter(UnwrapSecurityExceptionFilter.java:51)
at hudson.security.ChainedServletFilter $ 1.doFilter(ChainedServletFilter.java:87)
at jenkins.security.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:117)
at hudson.security.ChainedServletFilte r $ 1.doFilter(ChainedServletFilter.java:87)
at org.acegisecurity.providers.anonymous.AnonymousProcessingFilter.doFilter(AnonymousProcessingFilter.java:125)
at hudson.security.ChainedServletFilter $ 1.doFilter(ChainedServletFilter。的java:在org.acegisecurity.ui.rememberme.RememberMeProcessingFilter.doFilter(RememberMeProcessingFilter.java:142 87)
)
。在hudson.security.ChainedServletFilter $ 1.doFilter(ChainedServletFilter.java:87)
at org.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:271)
at hudson.security.ChainedServletFilter $ 1.doFilter(ChainedServletFilter.java:87)
at jenkins.security.BasicHeaderProcessor.doFilter (BasicHeaderProcessor.java:93)
at hudson.security.ChainedServletFilter $ 1.doFilter(ChainedServletFilter.java:87)
at org.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:249)$ b $ h at hudson.security.HttpSession ContextIntegrationFilter2.doFilter(HttpSessionContextIntegrationFilter2.java:67)
at hudson.security.ChainedServletFilter $ 1.doFilter(ChainedServletFilter.java:87)
at hudson.security.ChainedServletFilter.doFilter(ChainedServletFilter.java:76)
at hudson.security.HudsonFilter.doFilter(HudsonFilter.java:164)
at org.eclipse.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1482)
at org。 kohsuke.stapler.compression.CompressionFilter.doFilter(CompressionFilter.java:46)维持在hudson.util org.eclipse.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1482)
。 CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:81)
at org.eclipse.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1482)
at org.kohsuke.stapler.DiagnosticThreadNameFilter.doFilter( DiagnosticThreadNameFilter.java:30)
在org.eclipse.jetty.servlet.ServletHandler $ CachedChain.doFilter(Se rvletHandler.java:1474)
在org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:499)
在org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler。 java:137)
在org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:533)
在org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:428)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
在org.eclipse.jetty.server.Server.handle(Server.java:370)在org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:489)
在org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:949)
在org.eclipse.jetty.server.AbstractHttpConnection $ RequestHandler.headerComplete(AbstractHttpConnection.java:1011)
在org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:644)
。在组织.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
at org.eclipse.jetty .io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:668)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint $ 1.run(SelectChannelEndPoint.java:52)
在winstone.BoundedExecutorService $ 1 .run(BoundedExecutorService.java:77)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadP oolExecutor $ Worker.run(ThreadPoolExecutor.java:615)$ b $在java.lang.Thread.run(Thread.java:745)
引起:hudson.plugins.git.GitException:命令git - c core.askpass = true fetch --tags --progress git @ foo:foobar / foobaz.git + refs / heads / *:refs / remotes / origin / *返回状态码128:
stdout:
stderr:权限被拒绝,请重试。
权限被拒绝,请重试。
权限被拒绝(公钥,密码)。
致命:远程终端意外挂起
,位于org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:1591)
at org.jenkinsci.plugins。 gitclient.CliGitAPIImpl.launchCommandWithCredentials(CliGitAPIImpl.java:1379)
at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.access $ 300(CliGitAPIImpl.java:86)
at org.jenkinsci.plugins.gitclient.CliGitAPIImpl在net.uaznia.lukanus.hudson.plugins.gitparameter.GitParameterDefinition.generateContents $ 1.execute(CliGitAPIImpl.java:324)
(GitParameterDefinition.java:314)
。在net.uaznia.lukanus.hudson。 plugins.gitparameter.GitParameterDefinition $ DescriptorImpl.doFillValueItems(GitParameterDefinition.java:536)
... 85 more
我使用ssh用户名和私钥证书,私钥直接输入。我可以肯定的是,关键是正确的,因为这项工作可以建立在没有参数的情况下。
因此,看起来这个命令取得标签borks,不知道为什么: git -c core.askpass = true fetch --tags --progress git @ foo:foobar / foobaz.git + refs / heads / *:refs / remotes / origin / *
如果我在本地机器上执行这个命令,并且指向我自己的私钥的〜/ .ssh / config
文件,那么该命令不会出错。
有关故障排除的任何提示?我无法以jenkins用户的身份登录到Jenkins服务器,因为它是托管服务器,因此不在桌面上。
解决方案我无法得到这个工作。它被证实是一个SSH问题(请参阅对问题的评论),并且我没有权限访问jenkins用户,因此我无法创建〜/ .ssh / config
为它。
我用另一种方式解决了问题:
。
def feedUrl ='URL_TO_PHP_SCRIPT'
def gettags = new URL(feedUrl).getText()
def tags = []
def t1 = []
gettags.eachLine {tags.add(it)}
for (i in tags)
t1.add(i.split()[1] .replaceAll('\\ ^ \\ {\\}','')。replaceAll('refs / tags /',''))
t1 = t1.unique()。sort()。reverse()
return t1
- Jenkins可访问的服务器上的PHP脚本(碰巧是同一台服务器,但nginx作为jenkins的不同用户运行,而且我具有shell访问权限,因此可以创建
〜/ .ssh / config
):
。
<?php
exec('git ls-remote -t GIT_URL',$ output);
print(preg_replace('/ [a-z0-9] * \trends\ / heads\ //','',implode(\\\
,$ output)));
?>
-
〜/ .ssh / config <
$主机GIT_SERVER
IdentityFile PATH_TO_SSH_PRIVATE_KEY
IdentitiesOnly是
- 将相应的SSH公钥添加到Git服务器。
缺点这个设置是非常巧妙的。只要使用Git Parameter插件会更加优雅,但对我来说这很不幸。
我的主要优点是可以测试每个单独的部件:
- shell中的
git ls-remote
命令:输出SHA和标签引用。
-
php getgittags.php
将所有标签的列表输出到shell。 - 浏览到getgittags.php并验证我获得了相同的标签列表。
- 可扩展选择参数具有立即运行脚本按钮,允许您在保存之前进行测试
- 最后,开始一个参数化的构建。
- 将相应的SSH公钥添加到Git服务器。
- Jenkins version: 1.593
- Git Parameter Plug-In: 0.4.0
- GIT client plugin: 1.16.1
我从这些StackOverflow答案:
I use a private git repository, accessible over ssh.
My build is parameterized.
The git parameter is TAG_TO_BUILD
, the branch to build is refs/tags/${TAG_TO_BUILD}
After the initial build of the workspace, when I start a build with parameters, I get noWorkspaceError.
In the Jenkins log I have
Feb 16, 2015 2:17:34 PM WARNING org.eclipse.jetty.util.log.JavaUtilLog warn
Error while serving http://foo/view/bar/job/baz/descriptorByName/net.uaznia.lukanus.hudson.plugins.gitparameter.GitParameterDefinition/fillValueItems
java.lang.reflect.InvocationTargetException
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.kohsuke.stapler.Function$InstanceFunction.invoke(Function.java:298)
at org.kohsuke.stapler.Function.bindAndInvoke(Function.java:161)
at org.kohsuke.stapler.Function.bindAndInvokeAndServeResponse(Function.java:96)
at org.kohsuke.stapler.MetaClass$1.doDispatch(MetaClass.java:121)
at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:53)
at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:746)
at org.kohsuke.stapler.Stapler.invoke(Stapler.java:876)
at org.kohsuke.stapler.MetaClass$6.doDispatch(MetaClass.java:249)
at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:53)
at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:746)
at org.kohsuke.stapler.Stapler.invoke(Stapler.java:876)
at org.kohsuke.stapler.MetaClass$6.doDispatch(MetaClass.java:249)
at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:53)
at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:746)
at org.kohsuke.stapler.Stapler.invoke(Stapler.java:876)
at org.kohsuke.stapler.MetaClass$6.doDispatch(MetaClass.java:249)
at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:53)
at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:746)
at org.kohsuke.stapler.Stapler.invoke(Stapler.java:876)
at org.kohsuke.stapler.Stapler.invoke(Stapler.java:649)
at org.kohsuke.stapler.Stapler.service(Stapler.java:238)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:686)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1494)
at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:96)
at com.smartcodeltd.jenkinsci.plugin.assetbundler.filters.LessCSS.doFilter(LessCSS.java:46)
at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:99)
at org.jenkinsci.plugins.modernstatus.ModernStatusFilter.doFilter(ModernStatusFilter.java:52)
at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:99)
at hudson.util.PluginServletFilter.doFilter(PluginServletFilter.java:88)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1482)
at hudson.security.csrf.CrumbFilter.doFilter(CrumbFilter.java:85)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1482)
at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:84)
at hudson.security.UnwrapSecurityExceptionFilter.doFilter(UnwrapSecurityExceptionFilter.java:51)
at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
at jenkins.security.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:117)
at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
at org.acegisecurity.providers.anonymous.AnonymousProcessingFilter.doFilter(AnonymousProcessingFilter.java:125)
at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
at org.acegisecurity.ui.rememberme.RememberMeProcessingFilter.doFilter(RememberMeProcessingFilter.java:142)
at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
at org.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:271)
at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
at jenkins.security.BasicHeaderProcessor.doFilter(BasicHeaderProcessor.java:93)
at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
at org.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:249)
at hudson.security.HttpSessionContextIntegrationFilter2.doFilter(HttpSessionContextIntegrationFilter2.java:67)
at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
at hudson.security.ChainedServletFilter.doFilter(ChainedServletFilter.java:76)
at hudson.security.HudsonFilter.doFilter(HudsonFilter.java:164)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1482)
at org.kohsuke.stapler.compression.CompressionFilter.doFilter(CompressionFilter.java:46)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1482)
at hudson.util.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:81)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1482)
at org.kohsuke.stapler.DiagnosticThreadNameFilter.doFilter(DiagnosticThreadNameFilter.java:30)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1474)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:499)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:533)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:428)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
at org.eclipse.jetty.server.Server.handle(Server.java:370)
at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:489)
at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:949)
at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1011)
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:644)
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:668)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)
at winstone.BoundedExecutorService$1.run(BoundedExecutorService.java:77)
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 git@foo:foobar/foobaz.git +refs/heads/*:refs/remotes/origin/*" returned status code 128:
stdout:
stderr: Permission denied, please try again.
Permission denied, please try again.
Permission denied (publickey,password).
fatal: The remote end hung up unexpectedly
at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:1591)
at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandWithCredentials(CliGitAPIImpl.java:1379)
at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.access$300(CliGitAPIImpl.java:86)
at org.jenkinsci.plugins.gitclient.CliGitAPIImpl$1.execute(CliGitAPIImpl.java:324)
at net.uaznia.lukanus.hudson.plugins.gitparameter.GitParameterDefinition.generateContents(GitParameterDefinition.java:314)
at net.uaznia.lukanus.hudson.plugins.gitparameter.GitParameterDefinition$DescriptorImpl.doFillValueItems(GitParameterDefinition.java:536)
... 85 more
I am using ssh username with private key credentials, the private key is entered directly. I can be certain that the key is correct, because the job can be built without parameters.
So it seems that the fetching of tags borks on this command but I don't know why: git -c core.askpass=true fetch --tags --progress git@foo:foobar/foobaz.git +refs/heads/*:refs/remotes/origin/*
If I execute this command on my local machine, with a ~/.ssh/config
file that points to my own private key, then that command does not error out.
Any hints on troubleshooting? I cannot log in on the Jenkins server as the jenkins user because it is a hosted server, so that's off the table.
I could not get this to work. It's confirmed to be a SSH issue (see comment on question), and I don't have access to the jenkins user so I can't create a ~/.ssh/config
for it.
I solved it in another way:
- I installed the Extensible Choice Parameter plugin
- Parameter Name: TAG_TO_BUILD
- Choice provider: System Groovy Choice Parameter
- Groovy System Script
.
def feedUrl = 'URL_TO_PHP_SCRIPT'
def gettags = new URL(feedUrl).getText()
def tags = []
def t1 = []
gettags.eachLine {tags.add(it)}
for(i in tags)
t1.add(i.split()[1].replaceAll('\\^\\{\\}','').replaceAll('refs/tags/', ''))
t1 = t1.unique().sort().reverse()
return t1
- PHP script on a server that is accessible to Jenkins (happens to be the same server but with nginx running as a different user as jenkins, and I do have shell access so I can create a
~/.ssh/config
):
.
<?php
exec('git ls-remote -t GIT_URL', $output);
print(preg_replace('/[a-z0-9]*\trefs\/heads\//','',implode("\n", $output)));
?>
~/.ssh/config
on the user account that runs the webserver:
.
Host GIT_SERVER
IdentityFile PATH_TO_SSH_PRIVATE_KEY
IdentitiesOnly yes
- The corresponding SSH public key was added to the Git server.
The disadvantage of this setup is that it is very cludgy. Just using the Git Parameter plugin would have been a lot more elegant, but that is unfortunately broken for me.
The main advantage for me is that I could test every individual part of it:
- The
git ls-remote
command in a shell: outputs SHAs and tag references. php getgittags.php
outputs the list of all tags to the shell.- Browse to getgittags.php and verify I got the same tag list.
- The Extensible Choice Parameter has a "Run the Script Now" button, allowing you to test before you save your changes.
- Finally, start a parameterized build.
I took ideas from these StackOverflow answers:
这篇关于Jenkins Git Parameter插件无法读取标签的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!