Jenkins 如何为结帐拉取操作传递用户名和密码凭据

How Jenkins is passing username and password credentials for checkout pull operations

我有 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 工具中指定了一个用户来执行 read/checkout 操作,Jenkins 在启动 hg 命令时传递了一堆参数,即

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

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

scm:签到
scm:tag
ETC 当被调用时,它会启动底层版本控制命令(在我的例子中,hg branch、hg outgoing、hg push 命令)。

目前,由于 或者 用户没有 ~/.hgrc,上述 hg 命令失败包含用户名密码变量集的文件用户没有"WRITE"访问权限目标 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)

我想知道的是
如何传递--config xxxxx参数(就像 Jenkins 在执行结帐/拉取操作时通过 - 由于我们在 Jenkins 作业的 Source Code Management 下输入的设置值)到 hgMaven SCM 插件 启动时调用的命令 scm:checkin / scm:tag 最终调用 hg 命令的目标 (hg outgoing, hg push) / 所有没有 hg 命令设置 ~/.hgrc 并安装 mercurial_keyring?

找到解决方案:

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

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

我使用 Jenkins 路由并在 "Configure system" > 全局 parameters/passwords 部分下的 Jenkins 全局配置中创建了 2 个密码类型全局变量,然后将它们传递给 scm:checkin/tag 目标,同时在 Invoke Maven 步骤中调用它们(在 Jenkins 的 Release 插件配置中)。

我发现,如果你在 ~/.hgrc 中只设置了用户名,那么 Jenkins checkout /pull 命令开始失败,因为 Jenkins 进程停止使用我用于 pull/clone 源的凭据代码(它似乎首先优先考虑 ~/.hgrc 用户名,因为 Jenkins job/process 是 运行 jenkins 用户并且因为它没有在 ~/ 中设置密码 variable/field .hgrc,pull/clone 由于某种原因失败(它应该优先考虑我们在作业配置本身中指定的 user/credentials)。如果我将 ~/.hgrc 移动到 ~/.hgrc-backup ,然后 checkout/pull/clone 在 Jenkins 中工作得很好(因为它使用了我在 Mercurial 的源代码管理部分中提到的凭据)但是,它仍然在 Maven SCM 插件不处理底层 hg 命令的过程中失败。

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

解决方案是:

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

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

  3. 我猜,调用 hg 命令的 Maven SCM 插件目标 .. 不起作用的原因是插件存在问题。解决方法是使用 -DpushChanges=false 调用这些目标,这样,目标将不会调用底层版本控制推送操作,因此它会成功。然后你必须在 "Release Plugin in Jenkins's configuration" 中手动添加另一个步骤作为 "Execute Shell / Execute Windows Batch command" 方式到 运行 "hg push"。然后,它将起作用,在这种情况下,您不需要将 -Dusername 和 -Dpassword 参数传递给这些目标。