Azure devops 使用Azure Devops自托管构建代理避免git clean

Azure devops 使用Azure Devops自托管构建代理避免git clean,azure-devops,azure-devops-self-hosted-agent,azure-devops-pipelines,Azure Devops,Azure Devops Self Hosted Agent,Azure Devops Pipelines,我在Azure托管的git存储库中有一个YAML构建脚本,它在本地VM上运行的7个构建代理之间被触发。每次运行时,构建都会执行git清理,这需要大量时间,因为清理需要较长时间的大型节点\u modules文件夹 MSDN页面似乎建议这是可配置的,但没有显示如何配置它的详细信息。我无法判断这是应该在代理、YAML脚本、管道上的DevOps中指定的设置,还是应该在何处指定 是否有任何其他文件我丢失或这是不可能的 更新: YAML文件的开头如下所示: variables: BUILD_VERSIO

我在Azure托管的git存储库中有一个YAML构建脚本,它在本地VM上运行的7个构建代理之间被触发。每次运行时,构建都会执行git清理,这需要大量时间,因为清理需要较长时间的大型
节点\u modules
文件夹

MSDN页面似乎建议这是可配置的,但没有显示如何配置它的详细信息。我无法判断这是应该在代理、YAML脚本、管道上的DevOps中指定的设置,还是应该在何处指定

是否有任何其他文件我丢失或这是不可能的

更新: YAML文件的开头如下所示:

variables:
  BUILD_VERSION: 1.0.0.$(Build.BuildId)
  buildConfiguration: 'Release'
  process.clean: false

jobs:
###### ######################################################
###### 1 - Build and publish .NET
#############################################################

- job: net_build_publish
  displayName: .NET build and publish
  pool:
    name: default
  steps:
  - script: echo $(BUILD_VERSION)

  - task: DotNetCoreCLI@2
    displayName: dotnet build $(buildConfiguration)
    inputs:
      command: 'build'
      projects: |
        myrepo/**/API/*.csproj
      arguments: '-c $(buildConfiguration) /p:Version=$(BUILD_VERSION)'
完整的yaml要长得多,但第一个作业的输出将此输出包含在
签出任务中

Checkout myrepo@master to s

View raw log

Starting: Checkout myrepo@master to s
==============================================================================
Task         : Get sources
Description  : Get sources from a repository. Supports Git, TfsVC, and SVN repositories.
Version      : 1.0.0
Author       : Microsoft
Help         : [More Information](https://go.microsoft.com/fwlink/?LinkId=798199)
==============================================================================
Syncing repository: myrepo (Git)
Prepending Path environment variable with directory containing 'git.exe'.
git version
git version 2.26.2.windows.1
git lfs version
git-lfs/2.11.0 (GitHub; windows amd64; go 1.14.2; git 48b28d97)
git config --get remote.origin.url
git clean -ffdx
Removing myrepo/Data/Core/API/bin/
Removing myrepo/Data/Core/API/customersettings.json
Removing myrepo/Data/Core/API/obj/
Removing myrepo/Data/Core/Shared/bin/
Removing myrepo/Data/Core/Shared/obj/
....

我们还有另一项工作,它为Angular项目运行
npm安装
npm构建
,管道中的每个构建都需要5分钟来执行npm安装步骤,可能是因为检索存储库时进行了git清理?

,正如我在下面提到的。在运行npm安装之前,需要计算哈希值。如果哈希值与保持在节点模块附近的哈希值相同,则可以跳过安装依赖项。这可能有助于您实现以下目标:

步骤:
-任务:PowerShell@2
displayName:“计算并保存packages.config哈希”
投入:
targetType:“内联”
普华永道:是的
脚本:|
#生成package-lock.json的哈希
$newHash=Get FileHash-Algorithm MD5-Path(Get ChildItem package lock.json)
$hashPath=“$(System.DefaultWorkingDirectory)/cache npm/hash.txt”
if(测试路径-路径$hashPath){
if(比较对象-引用对象$(获取内容$hashPath)-差异对象$newHash){
写入主机“##vso[task.setvariable variable=NodeModulesReupToDate;]true”
$newHash>$hashPath
写入主机(“哈希文件保存到”+$hashPath)
}否则{
#文件是一样的
写入主机“无需安装节点_模块”
}
}否则{
$newHash>$hashPath
写入主机(“哈希文件保存到”+$hashPath)
}
$storedHash=获取内容$hashPath
写入主机$storedHash
workingDirectory:“$(System.DefaultWorkingDirectory)/cache npm”
-脚本:npm安装
工作目录:“$(Build.SourcesDirectory)/cache npm”
条件:ne(变量['NodeModulesReupToDate',true)

git clean-ffdx
将清除源代码中未经源代码管理跟踪的任何更改。您可以尝试,这有助于减少生成时间,因为它允许在以后的运行中重用一次运行的输出或下载的依赖项,从而减少或避免重新创建或重新下载相同文件的成本。检查以下链接:


尝试添加:
步骤:-签出:自清理:false
或:
作业:myJob工作区:清理:false
假设您有两个分支,A和B。您正在更新B上的版本。您推送B。执行NPM安装的管道在7个代理中的1个上运行。更新了。您在B上进行更新并推送。它被2号特工接走了。没有运行npm安装,所以版本是否错误?假设您现在将更改推送到不包含包锁的服务器上。一号探员把它捡起来。没有安装npm,但它以前是通过初始B推送更新的。这个场景听起来有效吗?此解决方案不会导致版本问题吗?对于此解决方案,您需要散列您的package-lock.json,并使其靠近node_modules目录。每次运行管道时,都需要计算当前文件的哈希值,并将其和文件系统中保存的哈希值进行比较。当它们不同时,运行npm安装和更新哈希。如果哈希值相同,则跳过npm安装。这样,您将以单一管道结束。我稍后会更新我的答案,因为这种方法似乎更好。你能检查我编辑的答案吗?目前我无法使用自托管代理来测试它,但它应该适合您。这看起来令人鼓舞!下周我会测试这个-谢谢你的支持input@JLo测试后请告诉我,欢迎:)
variables:
  npm_config_cache: $(Pipeline.Workspace)/.npm

steps:
- task: Cache@2
  inputs:
    key: 'npm | "$(Agent.OS)" | package-lock.json'
    restoreKeys: |
       npm | "$(Agent.OS)"
    path: $(npm_config_cache)
  displayName: Cache npm