我有一个shell脚本Test.sh
。我创建了一个ant build.xml
文件来运行这个shell脚本。
在詹金斯,我触发了这个build.xml
。Test.sh
包含svn存储库url,用于检查源代码。
当我在Jenkins中构建此作业时,它显示了一个错误,如'Jenkins'的密码:身份验证领域:和"授权失败:无法向服务器进行身份验证:拒绝基本挑战"。
为什么会出现这种情况?当我从我的机器上运行build.xml
文件时,svn checkout在没有任何身份验证的情况下运行良好。
当build.xml
被触发时,我应该如何配置Jenkins以类似的方式执行。我们应该以root身份运行詹金斯吗?
首先,触发是什么意思?
在Jenkins中,您可以通过多种方式触发构建。您可以通过URL远程执行生成,可以在特定时间运行生成,也可以在存储库中检测到更改时运行生成。你是如何触发构建的。
还有,詹金斯是如何得到这个build.xml
和这个Test.sh
的。您知道Jenkins可以运行Test.sh
本身而不必构建Ant脚本吗?另外,你可以让詹金斯帮你结账。这是使用詹金斯的一个重要原因。
你应该让詹金斯当根吗?绝对不是。Jenkins应该作为自己的用户运行。授予Jenkins root访问权限可能会导致意外的麻烦。想象一下,如果一个构建脚本包含rm -rf /
。将Jenkins作为自己的用户运行,并授予特定用户对存储库的只读访问权限(除非您让Jenkins提交或制作标记)。
为什么会出现这些错误?詹金斯什么时候会出现这些错误?当你走进詹金斯的时候?何时触发构建?当Jenkins试图从您的版本控制系统中签出代码时?如果是最后一个,那可能是詹金斯没有得到许可。设置作业并进行签出时,需要确保设置了签出凭据。
你能再给我解释一下这个工作是如何安排的吗?为什么您有一个shell脚本文件,它被放入build.xml中,告诉您要签出哪些目录?为什么不让詹金斯自己处理呢?你想建造什么?这是Java应用程序吗?(您使用的是build.xml
)。
附录
如何在不使用by-build文件的情况下运行shell脚本?你能给我一个例子吗?我想做的是,我们有一个web应用程序,它需要主干源、sql文件、安装路径以及SVN存储库中的一些其他文件。现在,shell脚本在未经授权的情况下检查所有必要的文件,并在/var/www文件夹中创建我们的应用程序实例。现在我要做的是使用jenkins,我必须每天下午7点调用这个build.xml文件(它由shell脚本组成),这样完成后我们就可以在该实例上运行自动化脚本。–/
我有一种感觉,你不了解詹金斯是如何工作的…
Jenkins可以运行各种各样的任务,而不仅仅是Ant。您可以添加生成步骤并指定所需内容。其中一种选择是运行shell脚本。
Jenkins是一个持续构建引擎。它不是一个安装程序,也不是crontab的替代品。
Jenkins在其工作区域中构建一个应用程序。您可以根据特定的时间、需求或项目中的任何变化进行构建。Jenkins将构建、运行测试、制作文档并存储工件以供部署。
我使用升级的构建插件来实际部署工件。作为构建过程的一部分,您也可以使用FTP和SCP插件将文件复制到部署区域。
我会提出一些建议:
-
使用
svn:externals
属性可以在一个Subversion项目下获得构建的所有不同部分。一次签出即可获得部署所需的一切。在指定各个部分时要小心。使用修订号或标记来冻结存储库的各个部分,或者使用相对标记,使所有内容都在一个分支上。 -
如果某些内容需要root访问权限,请使用
sudo
。您可以将sudo
设置为不需要特定用户的密码,并限制可以作为root用户运行的命令。顺便问一下,/var/www
归root所有吗?它不应该是。它应该由运行httd
的进程拥有,该进程也不应该是root。 -
有些网站的网页目录区域有一个Subversion工作目录。
svn update
将安装他们需要的东西。
顺便说一句,你可以像现在这样设置一个Jenkins任务来进行安装,但可能还有更好的工具可用。
我同意David上面的评论,直接从Jenkins作业运行shell脚本更容易,而不是在ant中创建exec任务。
无论如何,您所指的错误不是由Jenkins引起的,它来自SVN服务器。您的本地机器保存了svn身份验证,因此在通过script/直接访问svn时不必提供凭据。虽然运行build.xml(通过Jenkins)的机器没有保存SVN身份验证,但必须提到凭据。
请确保将SVN用户身份验证添加到test.sh脚本中。例如:svn-cosvn://myrepo/dev/trunk--用户名jenkins--密码password
注意:您不必每次都添加用户身份验证,只需执行一次,机器就会保存它。