TFS Drop Location Clean Up Utility in PowerShell

In TFS, we do build Automation and the output of the build Automation is kept in some DFS share called the drop location. When you build the application multiple times using the automated build process, it generates the output and keeps it in the drop location. Let’s say, you have application “abc” and you did build of it ten times. It will copy the output to drop location in different folders like –

[DFS Share]\abc\1.0.0.0

[DFS Share]\abc\1.0.0.1

[DFS Share]\abc\1.0.0.2

….

[DFS Share]\abc\1.0.0.10

In long interval of time, the drop location will hold n number of output folders. Now, think what will happen when we have multiple applications and multiple teams are working on it. It will consume lots of space.

To address this issue, one has to manually manage the drop location. Manual activity is always time consuming and prone to errors.

One has to look for some kind of automation to manage the drop location. Here are the basic requirements –

1.) We need to delete the output folder older then n (say 10 days) number of days.

2.) We need to keep last three output folders even if they are older then n (say 10 days) number of days.

3.) It should send email to the concerned team/person for the notification of the clean-up done.

These two requirements can be easily implemented using PowerShell scripting.

Here is the script content –

Minimum PowerShell version required is v5.

——————————-

   1: <#

   2: .Synopsis

   3:    Script is to delete all the folders with the content from the TFS Drop location which are older then n number of days.

   4: .DESCRIPTION

   5:    Script is to delete all the folders with the content from the TFS Drop location which are older then n number of days.

   6: #>

   7:  

   8: #Updated - First Version

   9:  

  10: $Global:DataForEmailBody

  11:  

  12: Function SendEmail {

  13:  

  14: $Email = New-Object -ComObject "CDO.Message"

  15: $Email.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2

  16: $Email.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = 'XXXXX'

  17: $Email.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25

  18: $Email.Configuration.Fields.Update()

  19:  

  20: $Email.From="TFSAdmin@xyz.com"

  21: $Email.To="abcd@xyz.com"

  22: $Email.Subject="Utility | Scheduled Job | TFS Drop Location Cleanup Activity"

  23: $Email.HTMLBody = "<font color=""black"" face=""Calibri, Verdana"" size=""3"">

  24:                     <p><b> All, </b></p>

  25:                     <p><mark> fyi....</mark></p>

  26:                     <p><b> </b></p>

  27:                     <p> TFSDropLocationCleanupUtility has cleanup the drop location. Here are the details...</p>

  28:                     <p><b> </b></p>

  29:                     <p>----------------------------------------------</p>

  30:                     <p><b> </b></p>

  31:                     <a> $Global:DataForEmailBody </a>                    

  32:                     <p>----------------------------------------------</p>                                                           

  33:                     <p> Regards, TFS Administration Team </p>

  34:                         <font color=""blue"" face=""Arial, Verdana"" size=""2""

  35:                         <p> This is an auto generated email from the scheduled Job in TFS. If you need more information, contact TFS admin </p>"

  36:  

  37: $Email.Send()

  38: }

  39:  

  40: #Start-Transcript -Path ".\TFSDropLocCleanupUtility.log"

  41: $DayCount = 30 #Folders to be deleted prior to current - this day count

  42:  

  43: $dt = (Get-Date).AddDays(-$DayCount)

  44: $FolderCountsToSkip = 3

  45: $DropLocation = "P:\temp"

  46: $flag = $false

  47:  

  48: $Global:DataForEmailBody = "<p> Batch Started.....</p>"

  49:  

  50: $RootFolder = Get-ChildItem $DropLocation -Directory

  51:  

  52: foreach ($_RootFolder in $RootFolder)

  53: {

  54: #Write-Host $_RootFolder

  55:  

  56:    $FolderFirstLevel = Get-ChildItem $DropLocation\$_RootFolder -directory -recurse -depth 0 | Where-Object {$_.Name -notmatch "^[0-9].(\d+(\.\d+){1,4})"} 

  57:    foreach ($_FolderFirstLevel in $FolderFirstLevel)

  58:     {

  59:        # Write-Host $_FolderFirstLevel.FullName

  60:         

  61:         $FolderInfo = Get-ChildItem $_FolderFirstLevel.FullName | Where{$_.LastWriteTime -lt $dt} | sort { [version]($_.Name -replace '^[0-9].(\d+(\.\d+){1,4})', '$1') } -Descending | Select-Object -skip $FolderCountsToSkip

  62:         foreach ($_FolderInfo in $FolderInfo)

  63:         {

  64:             Write-Host $_FolderInfo.FullName " Deleted!!!"

  65:             Remove-Item $_FolderInfo.FullName -Force -Recurse

  66:             $Global:DataForEmailBody += "<p>" + $_FolderInfo.FullName  + " Deleted!!! </p>"

  67:             $flag = $true

  68:         }

  69:     }

  70:  

  71:  

  72:    $FolderFirstLevel = Get-ChildItem $DropLocation\$_RootFolder -directory -recurse -depth 0 | Where-Object {$_.Name -match "^[0-9].(\d+(\.\d+){1,4})"} | Where{$_.LastWriteTime -lt $dt} | sort { [version]($_.Name -replace '^[0-9].(\d+(\.\d+){1,4})', '$1') } -Descending | Select-Object -skip $FolderCountsToSkip

  73:    foreach ($_FolderFirstLevel in $FolderFirstLevel)

  74:     {

  75:         Write-Host $_FolderFirstLevel.FullName " Deleted!!!"

  76:         Remove-Item $_FolderFirstLevel.FullName -Force -Recurse

  77:         $Global:DataForEmailBody += "<p>" + $_FolderFirstLevel.FullName  + " Deleted!!! </p>"

  78:         $flag = $true

  79:     }

  80: }

  81:  

  82: if($flag)

  83: {

  84:  

  85:     SendEmail 

  86: }

  87: else

  88: {

  89:     $Global:DataForEmailBody += "<p> Drop Location is already upto date. No cleanup required for today!! </p>"

  90:     SendEmail

  91: }

  92:  

  93:  

I have used regular expression for finding the folder name in the drop location. In my case, the folder name is based on version in the format like aa.bb.cc.dd. You need to modify the regular express based on the naming convention in your drop location.

Please note the below screenshot for first two requirements.

clip_image001

Schedule the above PowerShell script to the task scheduler or as a TFS job to run it daily.

 

clip_image001[4]

On every successful execution, it will cleanup the drop location based on the number of days and number of folders to keep. Finally it will send the email with the information of the folders that it has deleted.

Email Content will be like below –

Case 1 – Folders deleted and clean up done –

Email Content –

All,

fyi….

TFSDropLocationCleanupUtility has cleanup the drop location. Here are the details…

———————————————-

Batch Started…..

P:\temp\abcd\1.0.0.52 DELETED!!!

P:\temp\abcd\1.0.0.51 DELETED!!!

P:\temp\abcd\1.0.0.46 DELETED!!!

P:\temp\abcd\1.0.0.45 DELETED!!!

P:\temp\xyz\1.0.0.69 DELETED!!!

P:\temp\zzzz\Desktop\1.0.0.36 DELETED!!!

P:\temp\zzzz\Desktop\1.0.0.31 DELETED!!!

———————————————-

Regards, TFS Administration Team

This is an auto generated email from the scheduled Job in TFS. If you need more information, contact TFS admin

————————

Case 2 – Drop location is already up to date –

Email Content –

All,

fyi….

TFSDropLocationCleanupUtility has cleanup the drop location. Here are the details…

———————————————-

Batch Started…..

Drop Location is already upto date. No cleanup required for today!!

———————————————-

Regards, TFS Administration Team

This is an auto generated email from the scheduled Job in TFS. If you need more information, contact TFS admin

——End of the Article—-

Advertisements