2

我有 Jenkins / Mercurial 最新版本。机器是 Red Hat Linux 6.6。

我在 Jenkins 中使用 Release 插件。Maven 插件(maven-scm-plugin、maven-version-plugin 和 maven-enforcer-plugin)用于在项目上进行发布过程。所有这些版本都使用最新的可用版本,并且配置设置正确。

在 Jenkins 工作中,我正在检查位于 RhodeCode (Mercurial hg) 后面的项目的源代码。 在此处输入图像描述

输出显示如下:

06:00:02 Started by timer
06:00:02 [EnvInject] - Loading node environment variables.
06:00:03 Building on master in workspace /main/jenkins/instance2/workspace/MyCoolProject
06:00:06 [MyCoolProject] $ hg --config auth.jenkins.prefix=* --config ******** --config ******** --config "auth.jenkins.schemes=http https" showconfig paths.default
06:00:06 [MyCoolProject] $ hg --config auth.jenkins.prefix=* --config ******** --config ******** --config "auth.jenkins.schemes=http https" pull --rev default
06:00:12 pulling from http://mercurialserver.my.company.com:9001/csa/MyCoolProject/
06:00:12 no changes found
06:00:12 [MyCoolProject] $ hg --config auth.jenkins.prefix=* --config ******** --config ******** --config "auth.jenkins.schemes=http https" update --clean --rev default
06:00:13 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
06:00:13 [MyCoolProject] $ hg --config auth.jenkins.prefix=* --config ******** --config ******** --config "auth.jenkins.schemes=http https" --config extensions.purge= clean --all
06:00:13 [MyCoolProject] $ hg --config auth.jenkins.prefix=* --config ******** --config ******** --config "auth.jenkins.schemes=http https" log --rev . --template {node}
06:00:13 [MyCoolProject] $ hg --config auth.jenkins.prefix=* --config ******** --config ******** --config "auth.jenkins.schemes=http https" log --rev . --template {rev}
06:00:13 [MyCoolProject] $ hg --config auth.jenkins.prefix=* --config ******** --config ******** --config "auth.jenkins.schemes=http https" log --rev 

正如你在上面看到的,因为我们在 Mercurial DVCS 工具中指定了一个用户来执行读取/签出操作,所以 Jenkins 在启动 hg 命令时传递了一堆参数,即

--config auth.jenkins.prefix=* --config ******** --config ******** --config "auth.jenkins.schemes=http https"

当我使用 Maven SCM 插件及其目标时,我正在尝试找出如何发送相同的内容。

scm:checkin
scm:tag
等在调用时启动底层版本控制命令(在我的情况下,hg 分支、hg 传出、hg 推送命令)。

目前,上述 hg 命令失败是因为用户没有包含用户名密码变量集的~/.hgrc文件,或者用户没有对目标RhodeCode /Mercurial 存储库的“写入”访问权限。

20:16:26 [INFO] --- maven-scm-plugin:1.9.4:checkin (default-cli) @ MyCoolProject ---
20:16:27 [INFO] EXECUTING: /bin/sh -c cd /main/jenkins/instance2/workspace/MyCoolProject && hg branch
20:16:27 [INFO] EXECUTING: /bin/sh -c cd /main/jenkins/instance2/workspace/MyCoolProject && hg outgoing
20:16:29 [INFO] EXECUTING: /bin/sh -c cd /main/jenkins/instance2/workspace/MyCoolProject && hg status
20:16:29 [INFO] [pom.xml:modified]
20:16:29 [INFO] [jenkins-MyCoolProject-43.appVersion.txt:unknown]
20:16:29 [INFO] [pom.xml.versionsBackup:unknown]
20:16:29 [INFO] EXECUTING: /bin/sh -c cd /main/jenkins/instance2/workspace/MyCoolProject && hg commit --message '"CM Jenkins - Release plugin auto check-in and creation of release tag = 0.0.29'
20:16:30 [INFO] EXECUTING: /bin/sh -c cd /main/jenkins/instance2/workspace/MyCoolProject && hg push http://cmprod2merc.my.company.com:9001/csa/MyCoolProject
20:16:34 [ERROR] 
20:16:34 EXECUTION FAILED
20:16:34   Execution of cmd : push failed with exit code: 255.
20:16:34   Working directory was: 
20:16:34     /main/jenkins/instance2/workspace/MyCoolProject
20:16:34   Your Hg installation seems to be valid and complete.
20:16:34     Hg version: 1.9.2 (OK)
  • 我尝试配置 ~/.hgrc 文件(根据 Mercurial 文档),如果您在此文件中指定的用户名对目标源代码存储库/项目具有有效的 WRITE 访问权限,则一切正常,则不会出现上述错误消息。

  • 如果我在构建机器上安装/配置密钥环和 mercurial_keyring 扩展/插件(根据在线 mercurial 密钥环文档很容易),这也可以解决。

我想知道的是
我如何将--config xxxxx参数传递给当Maven SCM 插件启动scm:checkin / scm:tag目标时调用的hg命令最终调用hg命令(hg传出,hg push)/所有 hg 命令而不设置 ~/.hgrc 并安装 mercurial_keyring?

4

1 回答 1

0

找到了解决方案:

  1. 即使用户 (jenkins) 对目标 RhodeCode/Meruial 存储库具有有效的 WRITE 访问权限,并且 ~/.hgrc 或 mercurial_keyring setup wsa 配置成功(即在一次手动输入后用户名/密码少 hg 操作),Maven SCM 插件 scm: checkin 和 scm:tag 操作仍然失败。

原因是 scm:checkin / scm:tag 目标(Maven SCM 插件)调用版本工具命令(在我的例子中是 hg 命令),但它没有通过身份验证参数(用户名/密码)。为此,我可以在项目 pom.xml 或 ~/.m2/settings.xml 中使用 maven-scm-plugin 插件的配置添加和值--- 或 (更安全的方法是)创建/使用 2 个新的 Jenkins全局级别变量(密码类型)用于创建用户名/密码变量并使用/传递它们到 scm:checkin / scm:tag 目标,同时在 Jenkins 的发布插件的配置设置中调用这些目标,即 -Dusername=$username 和 -Dpassword=$密码(因为这些值来自 Jenkins,它们将被自动屏蔽)。

我使用 Jenkins 路由并在“配置系统”> 全局参数/密码部分下的 Jenkins 全局配置中创建 2 个密码类型全局变量,并在调用 Maven 步骤(在发布插件中)时将它们传递给 scm:checkin/tag 目标Jenkins 中的配置)。

我发现,如果您在其中设置了 ~/.hgrc 仅包含用户名,那么 Jenkins checkout /pull 命令开始失败,因为 Jenkins 进程停止使用我用来提取/克隆源代码的凭据(看起来好像是优先使用 ~/.hgrc 用户名,因为 Jenkins 作业/进程正在使用 jenkins 用户运行,并且因为它没有在 ~/.hgrc 中设置密码变量/字段,所以拉/克隆由于某种原因失败(它应该已优先考虑我们在作业配置本身中指定的用户/凭据。如果我将 ~/.hgrc 移动到 ~/.hgrc-backup,则在 Jenkins 中的 checkout/pull/clone 工作正常(因为它使用了凭据我在 Mercurial 的源代码管理部分中提到的)但是,在 Maven SCM 插件未处理底层 hg 命令期间它仍然失败。

PS:在工作区上运行“hg push”成功(独立,在命令行)但是当 Maven SCM 插件调用这些目标并且目标调用 hg 命令时,由于某种原因它不起作用。

解决方案是:

  1. 将 -Dusername=$username -Dpassword=$password 变量传递给 scm:checkin/scm:tag 目标

  2. 确保 ~/.hgrc 设置了用户名/密码变量 --OR mercurial_keyring 设置为与存储库一起使用(不提示输入用户名和密码)。

  3. 调用 hg 命令的 Maven SCM 插件目标 .. 不起作用的原因是我猜该插件存在问题。一种解决方法是使用 -D pushChanges=false调用这些目标,这样,目标不会调用底层版本控制推送操作,因此它会成功。然后您必须在“Jenkins 配置中的发布插件”中手动添加另一个步骤为“执行 Shell / 执行 Windows 批处理命令”方式来运行“hg push”。然后,它将起作用,在这种情况下,您不需要将 -Dusername 和 -Dpassword 参数传递给这些目标。

于 2015-05-01T19:37:50.583 回答