使用需要凭据的teamcity运行脚本

时间:2018-01-11 19:33:05

标签: python git teamcity

我有一个运行git远程命令并需要用户/密码凭据的脚本,因为脚本由teamcity运行我想知道teamcity是否有办法将这些凭据传递给我的脚本?

3 个答案:

答案 0 :(得分:0)

根据设计,TeamCity拒绝提供用户名/密码来构建步骤。这并不是说你无法以这种方式工作,而是要知道它的原因。如果任何人 能能够配置构建作业但不应该能够看到相关密码,那么您就会遇到安全问题。

我认为最好的解决方案是尽可能使用SSH。 TeamCity将很乐意在您的构建步骤执行时运行ssh-agent,并使用您选择的私钥(因此,身份)进行配置。只是能够配置构建不会让用户能够在这种情况下查看私钥(或任何其他敏感凭证),即使他们巧妙而恶意地编码。

当然,这并不是总是一个选项。但对于基本的git访问它通常是,你可能想要考虑它。

答案 1 :(得分:0)

TeamCity密码参数类型

将用户名和密码设置为TC构建参数。在Spec部分选择Edit,将Type设置为Password。一旦设置了参数值,这将在构建日志和所有TC对话框中模糊密码。

请注意,没有什么可以阻止狡猾的用户向echo %my.fancy.secret.password%添加构建步骤。因此,您的TC权限需要符合此处。

<强> SSH

正如Mark在他的回答中所说,ssh使用几乎任何构建工具来管理它变得更容易。我们在构建代理上使用ssh_config,这对您的问题非常重要。

答案 2 :(得分:0)

在我的情况下,我试图运行TeamCity Gradle的“发布”工作。
一路上我有几个错误,其中一个是这篇文章的原始问题。


这是我正在使用的工具:

  • TeamCity(作为我的构建机器,例如Jenkins)
  • Java应用程序
  • 成绩构建
  • 分级发布插件(id为“ net.researchgate.release”版本为“ 2.6.0”)
  • 隐藏(用于git版本控制)
  • Nexus


问题1: 尝试执行构建步骤时,出现此错误。 (提醒一下,构建步骤在VCS git签出完成后运行)

[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:

  • 我正在通过ssh(ssh://git@stash.somedomain.com/ins/my-service.git)使用git。
  • 我向TeamCity添加了一个SSH密钥(适用于我的git用户),该密钥已成功用于git克隆。
  • 此SSH密钥已添加到Stash(访问密钥)中,以允许进行读/写访问。
  • 运行发布作业时,它需要再次访问git,以git获取最新代码。
  • 就我而言,我必须打开SSH-Agent(构建功能)。

发生的事情是TeamCity知道如何使用SSH密钥进行VCS访问。但是一旦构建步骤开始运行,他们将不知道SSH密钥,因此git身份验证失败。


问题2: 在“发布”作业执行git更新,构建,运行测试和构建jar(工件)后,下一步是将这些jar发布到Nexus。

[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存储库)进行写访问。

  • 我将mavenUsermavenPassword作为环境变量添加到TeamCIty作业。
  • mavenPassword被添加为password format/spec,所以没有人看到该值。
  • 在我的构建步骤配置中,设置“其他Gradle命令行参数:” -DmavenUser=%env.mavenUser% -DmavenPassword=%env.mavenPassword%
  • 在我的build.gradle文件中,我使用System.getProperty("mavenUser")来访问这些值
  • 在我的build.gradle文件中,我添加了println "Release Job - mavenUser=" + System.getProperty("mavenUser"),因此我可以查看它是否已成问题。
  • 查看Nexus以查看您的工件(非快照)是否成功,并检查时间戳记。


问题3: 一旦“发布”作业将非快照工件发布到Nexus,它将更新为新版本号(在gradle.properties中)。它将在master分支上将其提交/推送回您的git repo。

  

错误:只能通过请求请求修改分支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仓库。

  • 就我而言(在Stash中),我们不允许将“没有拉取请求的更改”合并到我们的“ master”分支中。
  • 再次检查git用户(在Stash中)具有写访问权限。
  • 将您的git用户添加到“在没有请求请求的情况下防止更改,除非:”(在Stash中)。

再次运行“发布”作业,然后在git repo中查看最新的提交。


问题4: 您的构建可能需要很长时间才能运行所有测试,只是为了查看您的发布插件是否可以工作。

解决方案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")
}