-
Notifications
You must be signed in to change notification settings - Fork 9
/
index.js
134 lines (111 loc) · 4.56 KB
/
index.js
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
126
127
128
129
130
131
132
133
134
import fs from 'fs';
import path from 'path';
import { promisify } from 'util';
import { lookup } from 'mime-types';
import { getInput, setFailed, debug, error } from '@actions/core';
import { BlobServiceClient } from '@azure/storage-blob';
import { DefaultAzureCredential } from '@azure/identity';
async function* listFiles(rootFolder){
const readdir = promisify(fs.readdir);
const listFilesAsync = async function* (parentFolder){
const statSync = fs.statSync(parentFolder);
if(statSync.isFile()){
yield parentFolder;
}
else if (statSync.isDirectory()){
const files = await readdir(parentFolder);
for (const file of files){
const fileName = path.join(parentFolder, file);
yield *listFilesAsync(fileName);
}
}
}
yield *listFilesAsync(rootFolder);
}
async function uploadFileToBlob(containerService, fileName, blobName, blobCacheControl){
var blobClient = containerService.getBlockBlobClient(blobName);
var blobContentType = lookup(fileName) || 'application/octet-stream';
await blobClient.uploadFile(fileName, { blobHTTPHeaders: { blobContentType, blobCacheControl} });
debug(`The file ${fileName} was uploaded as ${blobName}, with the content-type of ${blobContentType}`);
}
const main = async () => {
let blobServiceClient = null;
const storageAccountName = getInput('storage-account-name');
const connectionString = getInput('connection-string');
if (!storageAccountName && !connectionString) {
throw "storage-account-name or connection-string must be specified!";
}
if (!!connectionString) {
blobServiceClient = BlobServiceClient.fromConnectionString(connectionString);
}
else {
const storageAccountKey = getInput('storage-account-key');
// no storage account key, use managed identity
blobServiceClient = new BlobServiceClient(`https://${storageAccountName}.blob.core.windows.net`,
storageAccountKey || new DefaultAzureCredential()
);
}
const enableStaticWebSite = getInput('enabled-static-website');
const containerName = (enableStaticWebSite) ? "$web" : getInput('blob-container-name') ;
if (!containerName) {
throw "Either specify a container name, or set enableStaticWebSite to true!";
}
const folder = getInput('folder');
const accessPolicy = getInput('public-access-policy');
const indexFile = getInput('index-file') || 'index.html';
const errorFile = getInput('error-file');
const removeExistingFiles = getInput('remove-existing-files');
const blobCacheControl = getInput('cache-control');
// Change the accessPolicy to map the new interface
if(accessPolicy && accessPolicy.localeCompare("none", undefined, { sensitivity: 'accent' }) === 0){
accessPolicy = null;
}
if(accessPolicy){
if(accessPolicy.localeCompare("blobcontainer", undefined, { sensitivity: 'accent' }) === 0){
accessPolicy = 'container';
}
else if(accessPolicy.localeCompare("blob", undefined, { sensitivity: 'accent' }) === 0){
accessPolicy = 'blob';
}
}
if (enableStaticWebSite) {
var props = await blobServiceClient.getProperties();
props.cors = props.cors || [];
props.staticWebsite.enabled = true;
if(!!indexFile){
props.staticWebsite.indexDocument = indexFile;
}
if(!!errorFile){
props.staticWebsite.errorDocument404Path = errorFile;
}
await blobServiceClient.setProperties(props);
}
const containerService = blobServiceClient.getContainerClient(containerName);
if (!await containerService.exists()) {
await containerService.create({ access: accessPolicy });
}
else if(accessPolicy){
await containerService.setAccessPolicy(accessPolicy);
}
if(removeExistingFiles){
for await (const blob of containerService.listBlobsFlat()){
await containerService.deleteBlob(blob.name);
}
}
const rootFolder = path.resolve(folder);
if(fs.statSync(rootFolder).isFile()){
return await uploadFileToBlob(containerService, rootFolder, path.basename(rootFolder));
}
else{
for await (const fileName of listFiles(rootFolder)) {
var blobName = path.relative(rootFolder, fileName);
await uploadFileToBlob(containerService, fileName, blobName, blobCacheControl);
}
}
};
main().catch(err => {
error(err);
error(err.stack);
setFailed(err);
process.exit(-1);
})