【问题标题】:How Jenkins is passing username and password credentials for checkout pull operationsJenkins 如何为结帐拉取操作传递用户名和密码凭据
【发布时间】:2015-04-30 18:09:07
【问题描述】:

我有 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:签入
单片机:标签
ETC 当被调用时,启动底层版本控制命令(在我的例子中,hg 分支、hg 传出、hg 推送命令)。

目前,由于 either 用户没有包含 username 文件的 ~/.hgrc 文件,因此上述 hg 命令失败em> 和 password 变量设置 OR 用户没有对目标 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 参数(就像 Jenkins 在结帐/拉取时传递操作 - 由于我们在 Jenkins 作业的 Source Code Management 下输入的设置值)到 Maven SCM 插件时调用的 hg 命令 正在启动 scm:checkin / scm:tag 目标,最终调用 hg 命令(hg outgoing,hg push) / 所有 hg 命令都没有设置 ~/.hgrc 和安装 mercurial_keyring?

【问题讨论】:

    标签: jenkins mercurial mercurial-extension maven-scm-plugin mercurial-keyring


    【解决方案1】:

    找到解决方案:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-22
      • 1970-01-01
      • 2017-08-18
      • 2013-04-14
      • 2017-09-06
      • 2010-09-11
      相关资源
      最近更新 更多