【问题标题】:run a script using teamcity that require credentials使用需要凭据的 teamcity 运行脚本
【发布时间】:2018-10-17 06:07:10
【问题描述】:

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

【问题讨论】:

    标签: python git teamcity


    【解决方案1】:

    在我的情况下,我试图运行 TeamCity Gradle “发布”作业。
    在此过程中我遇到了几个错误,其中一个是这篇文章的原始问题。


    以下是我正在使用的工具:
    • TeamCity(作为我的构建机器,如 Jenkins)
    • Java 应用程序
    • Gradle 构建
    • Gradle 发布插件(id 'net.researchgate.release' 版本 '2.6.0')
    • Stash(用于 git 版本控制)
    • 连结


    问题 1: 在尝试执行构建步骤时,我收到了这个错误。 (提醒,构建步骤在 VCS git checkout 完成后运行)
    [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 clone。
    • 此 SSH 密钥已添加到 Stash(访问密钥)以允许读/写访问。
    • 在运行发布作业时,需要再次访问 git,以便 git 获取最新代码。
    • 就我而言,我必须打开 SSH-Agent(构建功能)。

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


    问题 2: 在“发布”作业完成 git 更新、构建、运行测试和构建 jars(工件)之后 - 下一步是将这些 jars 发布到 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"),所以我可以查看它是否正在制作成 gradle。
    • 在 Nexus 中查看您的工件(非快照)是否成功,并检查时间戳


    问题 3: 一旦“发布”作业将非快照工件发布到 Nexus,它将更新为新的版本号(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 存储库。

    • 就我而言(在 Stash 中),我们不允许将“没有拉取请求的更改”合并到我们的“主”分支中。
    • 仔细检查 git 用户(在 Stash 中)是否具有写入权限。
    • 将您的 git 用户添加到设置“在没有拉取请求的情况下阻止更改,除非:”(在 Stash 中)。

    再次运行“发布”作业,并在您的 git 存储库中查看最新提交。


    问题 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")
    }
    

    【讨论】:

      【解决方案2】:

      根据设计,TeamCity 拒绝使用用户名/密码来构建步骤。这并不是说你不能让它这样工作,而是要知道它这样做的原因。如果有人应该能够配置构建作业,但不应该能够看到有问题的密码,那么你就会遇到安全问题。

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

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

      【讨论】:

        【解决方案3】:

        TeamCity 密码参数类型

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

        请注意,没有什么能阻止狡猾的用户向echo %my.fancy.secret.password% 添加构建步骤。所以你的 TC 权限需要在这里遵守。

        ssh

        正如 Mark 在他的回答中所说,使用 ssh 几乎可以使用任何构建工具进行管理。我们在构建代理上使用ssh_config,您的问题微不足道。

        【讨论】:

          猜你喜欢
          • 2012-07-28
          • 2013-07-08
          • 1970-01-01
          • 1970-01-01
          • 2016-08-21
          • 2020-06-27
          • 1970-01-01
          • 1970-01-01
          • 2016-04-04
          相关资源
          最近更新 更多