-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
129 lines (114 loc) · 4.42 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
'use strict'
var s3Config = require("./config/s3.json");
var bitbucketConfig = require('./config/bitbucket.json');
var fs = require('fs');
var path = require('path');
var aws = require('aws-sdk');
var s3 = new aws.S3({apiVersion: "2006-03-01"});
var decompress = require('decompress');
var archiver = require('archiver');
var shell = require('shelljs');
var bitbucketEvent = null;
exports.handler = (event, context, callback) => {
console.log("Function started!");
bitbucketEvent = event;
bitbucketEvent.fileLocation = "/tmp/"+(bitbucketEvent.repoName).toLowerCase()+".zip";
lambda().then(function(success){
callback(null,success.message);
},function(error){
callback(error.message);
});
};
const lambda = function(){
return new Promise(function(resolve, reject) {
if((bitbucketConfig.branches).indexOf(bitbucketEvent.branch) < 0){
reject({'success' : false,'message' : 'No configured build for this branch!'});
} else {
bitbucket().then(function(success){
resolve(success);
},function(error){
reject(error);
});
}
});
};
const bitbucket = function(){
console.log('Branch integration of '+bitbucketEvent.branch+' initialized...');
return new Promise(function(resolve, reject) {
var credentials = bitbucketConfig.user+":"+bitbucketConfig.password;
var curlURL = "https://"+credentials+"@bitbucket.org/" + bitbucketEvent.owner+"/"+bitbucketEvent.repoName+"/get/"+bitbucketEvent.branch+".zip";
var curl = "curl --silent -L "+curlURL+" > "+bitbucketEvent.fileLocation;
console.log("Downloading file from Bitbucket.org...");
if (shell.exec(curl).code !== 0) {
reject({'success' : false,'message' : "Can't Download File!"});
} else {
unzipFile().then(function(success){
resolve(success);
},function(error){
reject(error);
});
}
});
};
const unzipFile = function () {
return new Promise(function(resolve, reject) {
decompress(bitbucketEvent.fileLocation, path.dirname(bitbucketEvent.fileLocation)).then(function(success){
shell.rm('-rf',bitbucketEvent.fileLocation);
var path = "/tmp/"+success[0].path;
console.log("File unzipped!");
reZipFile(path).then(function(success){
resolve(success);
},function(error){
reject(error);
});
},function(){
reject({'success' : false,'message' : "Can't unzip file"});
});
});
};
const reZipFile = function(path){
console.log('Re-ziping file with correct structure...');
return new Promise(function(resolve, reject) {
var output = fs.createWriteStream(bitbucketEvent.fileLocation);
var archive = archiver('zip', {zlib: { level: 9 }});
archive.pipe(output);
archive.directory(path, false);
archive.finalize().then(function() {
shell.rm('-rf',path);
console.log("File zipped to "+bitbucketEvent.fileLocation);
upload2s3().then(function(success){
resolve(success);
},function(error){
reject(error);
});
},function() {
reject({'success' : false,'message' : "Can't zip file"});
});
});
};
const upload2s3 = function (){
return new Promise(function(resolve, reject) {
console.log("Loading file for stream...");
var fileStream = fs.createReadStream(bitbucketEvent.fileLocation);
fileStream.on('error', function (err) {
console.log('File Error', err);
reject({'success' : false,'message' : 'File Error!'});
});
fileStream.on('open', function () {
console.log("Uploading file before downloaded to S3...");
s3.upload({
Bucket: s3Config.bucket,
Key: (bitbucketEvent.repoName).toLowerCase() + "/" + bitbucketEvent.branch+".zip",
Body: fileStream
}, function (err, data) {
if (err) {
reject({'success' : false,'message' : 'Uploading error!'});
}
if (data) {
console.log("Upload Success!", data.Location);
resolve({'success' : true,'message' : 'Success!'});
}
});
});
});
};