【发布时间】:2018-10-17 06:07:10
【问题描述】:
我有一个运行 git 远程命令并需要用户/密码凭据的脚本,因为该脚本由 teamcity 运行我想知道是否有办法让 teamcity 将这些凭据传递给我的脚本?
【问题讨论】:
我有一个运行 git 远程命令并需要用户/密码凭据的脚本,因为该脚本由 teamcity 运行我想知道是否有办法让 teamcity 将这些凭据传递给我的脚本?
【问题讨论】:
在我的情况下,我试图运行 TeamCity Gradle “发布”作业。
在此过程中我遇到了几个错误,其中一个是这篇文章的原始问题。
[Step 5/5] Execution failed for task ':my-service:checkUpdateNeeded'. org.gradle.api.GradleException: Failed to run [git remote update] - [Fetching origin
][Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
error: Could not fetch origin
]
解决方案 1:
发生的事情是 TeamCity 知道如何使用 SSH 密钥进行 VCS 访问。但是一旦构建步骤开始运行,他们不知道 SSH 密钥,因此 git 身份验证失败。
[Step 5/5] Execution failed for task ':my-service:my-service:myServiceCore:publishMavenJavaPublicationToMavenRepository'. org.gradle.api.artifacts.PublishException: Failed to publish publication 'mavenJava' to repository 'maven'
[17:31:17][Step 5/5] Release process failed, reverting back any changes made by Release Plugin.
解决方案 2:
我需要向构建作业添加凭据,以便对 Nexus release 存储库(而不是 snapshot 存储库)进行写访问。
mavenUser 和 mavenPassword 作为环境变量添加到 TeamCIty 作业中。mavenPassword 添加为password format/spec,因此没有人可以看到该值。-DmavenUser=%env.mavenUser% -DmavenPassword=%env.mavenPassword%
System.getProperty("mavenUser") 来访问这些值println "Release Job - mavenUser=" + System.getProperty("mavenUser"),所以我可以查看它是否正在制作成 gradle。gradle.properties)。它将在master 分支上将其提交/推送回您的 git 存储库。
错误:分支 refs/heads/master 只能通过拉取请求修改
[Step 5/5] Execution failed for task ':my-service:preTagCommit'. org.gradle.api.GradleException: Failed to push to remote - [To ssh://git@stash.somedomain.com/ins/my-service.git
! refs/heads/master:refs/heads/master [remote rejected] (pre-receive hook declined)
][remote: *%%%%%.
remote: %%% %%%
remote: ,%# %%
remote: %% %%
remote: %# %%
remote: %% %
remote: %( %%
remote: %%%%%%%%%%%%%%%%%%%%%%%%%%%
remote: %#%*%#///////%# %%///////%%%%%%
remote: ,% %*%%******%# %%******%(%%,%
remote: %%/ %%/**%%/%%%%%%%(**#%( %%#
remote: %% %%% %(
remote: % .%
remote: *% %%%%% .%
remote: %# %%
remote: .%% .%%
remote: .%%.%%, %%%.%%/
remote: %%%%%%##%. #%%%%%. .%((%%%%%%
remote: %%#(((((((((%%, #%%(((((((((#%%.
remote: %%%((((((((((((((((((%%%, .%%%((((((((((((((((((#%%*
remote: %%(((((((((((((((((((((((((%(((((((((((((((((((((((((#%.
remote: ,%(((((((((((((((((((((((((((((((((((((((((((((((((((((((%#
remote: %#((((((((((((((((((((((((((((((((((((((((((((((((((((((((%
remote: %%%%%%%%%%%%%(((((((((((((((((((((((((((((((((%%%%%%%%%%%%%
remote: %% %####((((((###%%%%%%%%#(((((((((% ,%
remote: ,% %%%%%%#. %%%((((((%* %%
remote: #% %%%# %%
remote: .% .%%%%%%%%% %#
remote: % #%%% %
remote: % %%%% %*
remote: /%************/#%%%%%%######%%* ..,*/(%%
remote: %%######(((((((##################%%
remote: %%######(((((((((((((((((((((((((%%
remote: //////////////%%%%%%%%#########################%%///////// ///
remote: ----------------------------------------------------
remote: Branch refs/heads/master can only be modified through pull requests.
remote: Check your branch permissions configuration with the project administrator.
remote: ----------------------------------------------------
remote:
remote:
error: failed to push some refs to 'ssh://git@stash.somedomain.com/ins/my-service.git'
]
解决方案 3: 确保您的 git 用户(基于您的 SSH 密钥)有权更新 git 存储库。
再次运行“发布”作业,并在您的 git 存储库中查看最新提交。
解决方案 4: 临时添加这个来配置“发布”任务(在 build.gradle 中)。
release {
String skipTests = System.getProperty('skipTests', 'false')
println "Release Job - skipTests=" + skipTests
if (skipTests == 'true') {
buildTasks = ['jar']
}
//Make sure the user/password is making it into Gradle
println "Release Job - mavenUser=" + System.getProperty("mavenUser")
println "Release Job - mavenPassword=" + System.getProperty("mavenPassword")
}
【讨论】:
根据设计,TeamCity 拒绝使用用户名/密码来构建步骤。这并不是说你不能让它这样工作,而是要知道它这样做的原因。如果有人应该能够配置构建作业,但不应该能够看到有问题的密码,那么你就会遇到安全问题。
我认为最好的解决方案是尽可能使用 SSH。 TeamCity 很乐意在您执行构建步骤时运行 ssh-agent,并使用您选择的私钥(因此是身份)进行配置。在这种情况下,仅仅能够配置构建并不能让用户看到私钥(或任何其他敏感凭证),即使他们巧妙地和恶意地编码。
当然,这总是不是一个选项。但是对于基本的 git 访问通常是这样,您可能需要考虑它。
【讨论】:
TeamCity 密码参数类型
将用户名和密码设置为 TC 构建参数。在 Spec 部分选择 Edit,将 Type 设置为 Password。一旦您设置了参数值,这将在构建日志和所有 TC 对话框中混淆密码。
请注意,没有什么能阻止狡猾的用户向echo %my.fancy.secret.password% 添加构建步骤。所以你的 TC 权限需要在这里遵守。
ssh
正如 Mark 在他的回答中所说,使用 ssh 几乎可以使用任何构建工具进行管理。我们在构建代理上使用ssh_config,您的问题微不足道。
【讨论】: