forked from rhysgodfrey/MSBuildAzure
-
Notifications
You must be signed in to change notification settings - Fork 0
/
CopyToAzureBlobStorageTask.cs
125 lines (96 loc) · 3.25 KB
/
CopyToAzureBlobStorageTask.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
using System;
using System.IO;
using System.Linq;
using Microsoft.Build.Framework;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Blob;
namespace RhysG.MSBuild.Azure
{
public class CopyToAzureBlobStorageTask : ITask
{
[Required]
public string ContainerName { get; set; }
[Required]
public string ConnectionString { get; set; }
[Required]
public string ContentType { get; set; }
[Required]
public ITaskItem[] Files { get; set; }
public string ContainerPermission { get; set; }
public string ContentEncoding { get; set; }
public IBuildEngine BuildEngine { get; set; }
public ITaskHost HostObject { get; set; }
public bool Execute()
{
var container = GetBloblContainer();
if (container == null) return false;
foreach (var file in Files.Select(fileItem => new FileInfo(fileItem.ItemSpec)))
{
BuildEngine.LogMessageEvent(new BuildMessageEventArgs(String.Format("Updating: {0}", file.Name), String.Empty,
"CopyToAzureBlobStorageTask", MessageImportance.High));
var blob = container.GetBlockBlobReference(file.Name);
try
{
blob.FetchAttributes();
}
catch (StorageException)
{
}
if (IsRemoteFileOlder(file, blob))
{
using (var filename = File.OpenRead(file.FullName))
{
blob.UploadFromStream(filename);
}
blob.Properties.ContentType = ContentType;
if (!String.IsNullOrWhiteSpace(ContentEncoding))
blob.Properties.ContentEncoding = ContentEncoding;
blob.Metadata["LastModified"] = file.LastWriteTimeUtc.Ticks.ToString();
blob.SetMetadata();
blob.SetProperties();
BuildEngine.LogMessageEvent(new BuildMessageEventArgs(String.Format("Updating: {0} - Uploaded!", file.Name),
String.Empty,
"CopyToAzureBlobStorageTask", MessageImportance.High));
}
}
return true;
}
private bool IsRemoteFileOlder(FileSystemInfo file, ICloudBlob blob)
{
var remoteLastModified = DateTime.MinValue;
if (blob != null &&
blob.Metadata.ContainsKey("LastModified") &&
!String.IsNullOrWhiteSpace(blob.Metadata["LastModified"]))
{
var timeTicks = long.Parse(blob.Metadata["LastModified"]);
remoteLastModified = new DateTime(timeTicks, DateTimeKind.Utc);
}
if (remoteLastModified >= file.LastWriteTimeUtc)
{
BuildEngine.LogMessageEvent(
new BuildMessageEventArgs(String.Format("Updating: {0} - Local file is older than remote, skipping", file.Name),
String.Empty,
"CopyToAzureBlobStorageTask", MessageImportance.High));
return false;
}
return true;
}
private CloudBlobContainer GetBloblContainer()
{
CloudStorageAccount account;
if (!CloudStorageAccount.TryParse(ConnectionString, out account)) return null;
var client = account.CreateCloudBlobClient();
var container = client.GetContainerReference(ContainerName);
container.CreateIfNotExists();
container.SetPermissions(GetPermissions());
return container;
}
private BlobContainerPermissions GetPermissions()
{
BlobContainerPublicAccessType accessType;
return Enum.TryParse(ContainerPermission, out accessType)
? new BlobContainerPermissions { PublicAccess = accessType }
: new BlobContainerPermissions { PublicAccess = BlobContainerPublicAccessType.Off };
}
}
}