【问题标题】:Jenkins not able to execute build.xml file. Should jenkins run by root user?Jenkins 无法执行 build.xml 文件。 jenkins 应该由 root 用户运行吗?
【发布时间】:2014-04-18 15:51:23
【问题描述】:

我有一个 shell 脚本 Test.sh。我创建了一个 ant build.xml 文件来运行这个 shell 脚本。

在 Jenkins 中,我触发了这个 build.xmlTest.sh 包含检查源代码的 svn 存储库 url。

当我在 Jenkins 中构建此作业时,它显示类似 Password for 'jenkins': Authentication realm: 和“授权失败:无法对服务器进行身份验证:拒绝基本质询"

为什么会出现这种情况?当我从我的机器运行build.xml 文件时,svn checkout 无需任何身份验证即可正常工作。

build.xml 被触发时,我应该如何配置 Jenkins 以类似的方式执行。我们应该以 root 身份运行 jenkins 吗?

【问题讨论】:

    标签: shell svn ant jenkins hudson


    【解决方案1】:

    首先,触发是什么意思?

    在 Jenkins 中,您可以通过多种方式触发构建。您可以通过 URL 远程执行构建,可以在特定时间运行构建,或者在存储库中检测到更改时运行构建。你是如何触发构建的。

    另外,Jenkins 是如何得到这个build.xml 和这个Test.sh 的。您意识到 Jenkins 可以运行 Test.sh 本身而无需构建 Ant 脚本来执行此操作?此外,您可以让 Jenkins 为您结帐。这是使用 Jenkins 的重要原因之一。

    您应该以 root 身份运行 Jenkins 吗?绝对不。 Jenkins 应该以自己的用户身份运行。授予 Jenkins 根访问权限可能会导致意想不到的麻烦。想象一下,如果构建脚本包含rm -rf /。以自己的用户身份运行 Jenkins,并授予该特定用户只读对您的存储库的访问权限(除非您让 Jenkins 进行提交或制作标签)。

    为什么会出现这些错误? Jenkins 什么时候会收到这些错误?当你进入詹金斯本身?当你触发构建?当 Jenkins 尝试从您的版本控制系统中检出代码时?如果是最后一个,可能是 Jenkins 没有权限。当您设置作业并进行结帐时,您需要确保设置了结帐凭据。

    你能多解释一下这个工作是如何设置的吗?为什么你有一个作为 shell 脚本的文件,它被放入 build.xml 中,告诉你要签出哪些目录?为什么不让詹金斯自己处理呢?你想建立什么?这是一个 Java 应用程序吗? (您正在使用build.xml)。


    附录

    如何在不使用构建文件的情况下运行 shell 脚本你能给我一个例子吗?我想做的是,我们有一个 Web 应用程序,它需要我们的 SVN 存储库中的主干源、sql 文件、安装路径和一些其他文件。现在,shell 脚本未经授权检查所有必要的文件,并在 /var/www 文件夹中创建我们应用程序的实例。现在我要做的是使用 jenkins 我必须在每天晚上 7 点调用这个 build.xml 文件(由 shell 脚本组成),以便在完成后我们可以在该实例上运行自动化脚本。 - /

    我感觉你不明白 Jenkins 的工作原理……

    Jenkins 可以运行各种各样的任务,而不仅仅是 Ant。您可以添加构建步骤并指定您想要的内容。一种选择是运行 shell 脚本。

    Jenkins 是一个持续构建引擎。它不是安装程序,也不是 crontab 的替代品。

    Jenkins 在其工作区构建一个应用程序。您可以根据特定时间、按需或项目中的某些变化进行构建。 Jenkins 将构建、运行测试、制作文档并存储工件以供部署。

    我使用promoted build plugin 来实际部署工件。作为构建过程的一部分,您也可以使用 FTP 和 SCP 插件将文件复制到部署区域。

    我会提出一些建议:

    • 使用svn:externals 属性在单个Subversion 项目下获取构建的所有不同部分。一次检出即可获得部署所需的一切。请注意如何指定各个部分。使用修订号或标签来冻结存储库的各个部分,或使用相对标签,因此所有内容都在一个分支上。

    • 如果需要 root 访问权限,请使用 sudo。您可以将sudo 设置为不需要特定用户的密码,并限制可以以root 身份运行的命令。顺便问一下,/var/www 是 root 拥有的吗?不应该。它应该归运行httd 的进程所有,它也不应该是root。

    • 有些网站的网页目录区域是 Subversion 工作目录。 svn update 将安装他们需要的东西。

    顺便说一句,您可以设置一个 Jenkins 任务来像您一样进行安装,但可能有更好的工具可用。

    【讨论】:

    • 我的 jenkins 工作没有任何 svn 配置,但我已经说过它调用 ant build。在那里,我给出了 build.xml 文件的路径,该文件又运行上面提到的 shell 脚本。这个 shell 脚本是由我的运营团队提供的,我必须在每次构建时调用它。由于 svn 访问,我收到这些错误。如果我们在 VM 中运行这个 shell 脚本,它从不要求 svn 访问,但在 jenkins 中它无法调用 ant 说授权在 svn 中失败。现在我的问题是如何让 jenkins 在没有任何授权的情况下为我的构建文件工作?
    • 如何在不使用构建文件的情况下运行 shell 脚本你能给我一个例子吗?我想做的是,我们有一个 Web 应用程序,它需要我们的 SVN 存储库中的主干源、sql 文件、安装路径和一些其他文件。现在,shell 脚本未经授权检查所有必要的文件,并在 /var/www 文件夹中创建我们应用程序的实例。现在我要做的是使用 jenkins 我必须在每天晚上 7 点调用这个 build.xml 文件(由 shell 脚本组成),以便在完成后我们可以在该实例上运行自动化脚本。
    • 如何在构建过程中执行 shell 脚本?您选择“添加构建步骤”,然后选择“shell 脚本”。
    • @vtiger 请参阅我的答案的附录。
    【解决方案2】:

    我同意上面 David 的 cmets,直接从 Jenkins 作业运行 shell 脚本更容易,而不是在 ant 中创建 exec 任务。

    无论如何,您所指的错误不是由 Jenkins 引起的,它来自 SVN 服务器。您的本地计算机已保存 svn 身份验证,因此您在通过脚本/直接访问 SVN 时不必提供凭据。虽然您运行 build.xml(通过 Jenkins)的机器没有保存 SVN 身份验证,但您必须提及凭据。

    确保将 SVN 用户身份验证添加到您的 test.sh 脚本。 例如:svn co svn://myrepo/dev/trunk --username jenkins --password PASSWORD

    注意:不必每次都加用户认证,只加一次,机器保存。

    【讨论】:

    • 因此,如果我通过 jenkins 运行我的 test.sh,并在 test.sh 中提到了 svn 身份验证详细信息,它会在我的机器上运行时成功运行吗?你能给我举个例子,说明如何通过 jenkins 执行 shell 脚本吗?
    • 在您的 Jenkins 作业中,单击“添加构建步骤”按钮并选择“执行 Shell”。这将创建一个新部分,您可以在其中指定“test.sh”的路径或直接输入命令。 Jenkins 将此输入部分转换为脚本,并在执行作业时以“sh”身份运行。
    • 查看此链接,例如:wiki.jenkins-ci.org/display/JENKINS/…
    猜你喜欢
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    • 1970-01-01
    • 2019-09-01
    相关资源
    最近更新 更多