11// npm modules
2+ const _ = require ( 'highland' ) ;
3+ const { Readable} = require ( 'stream' ) ;
24
35// our modules
46const logger = require ( '../logger' ) ;
57const { hasCompose, updateCompose, executeCompose} = require ( '../docker/dockercompose' ) ;
68const generateDockerfile = require ( '../docker/dockerfile' ) ;
79const build = require ( '../docker/build' ) ;
810const start = require ( '../docker/start' ) ;
9- const { sleep, cleanTemp, unpack, getProjectConfig, projectFromConfig} = require ( '../util' ) ;
11+ const { sleep, cleanTemp, unpack, getProjectConfig, projectFromConfig, writeStatus } = require ( '../util' ) ;
1012const docker = require ( '../docker/docker' ) ;
1113const { removeContainer} = require ( '../docker/util' ) ;
1214
1315// time to wait before removing old projects on update
1416const WAIT_TIME = 5000 ;
1517
1618// deployment from unpacked files
17- const deploy = async ( { username} ) => {
19+ const deploy = async ( { username, resultStream } ) => {
1820 // check if it's a docker-compose project
1921 if ( hasCompose ( ) ) {
2022 // if it does - run compose workflow
2123 logger . debug ( 'Docker-compose file found, executing compose workflow..' ) ;
24+ writeStatus ( resultStream , { message : 'Deploying docker-compose project..' , level : 'info' } ) ;
2225
2326 // update compose file with project params
2427 const composeConfig = updateCompose ( { username} ) ;
2528 logger . debug ( 'Compose modified:' , composeConfig ) ;
29+ writeStatus ( resultStream , { message : 'Compose file modified' , data : composeConfig , level : 'verbose' } ) ;
2630
2731 // execute compose
28- const { log } = await executeCompose ( ) ;
29- logger . debug ( 'Compose executed:' , log ) ;
32+ const exitCode = await executeCompose ( resultStream ) ;
33+ logger . debug ( 'Compose executed, exit code :' , exitCode ) ;
3034
3135 // get container infos
3236 const allContainers = await docker . listContainers ( { all : true } ) ;
@@ -38,36 +42,43 @@ const deploy = async ({username}) => {
3842 . map ( container => container . inspect ( ) )
3943 ) ;
4044 // return them
41- return [ { status : 'success' , deployments} , 200 ] ;
45+ writeStatus ( resultStream , { message : 'Deployment success!' , deployments, level : 'info' } ) ;
46+ resultStream . end ( '' ) ;
47+ return ;
4248 }
4349
4450 // generate dockerfile
45- generateDockerfile ( ) ;
51+ generateDockerfile ( resultStream ) ;
4652
4753 // build docker image
4854 try {
49- const buildRes = await build ( { username} ) ;
50- logger . debug ( 'build result:' , buildRes ) ;
55+ const buildRes = await build ( { username, resultStream } ) ;
56+ logger . debug ( 'Build result:' , buildRes ) ;
5157
5258 // check for errors in build log
5359 if ( buildRes . log . map ( it => it . toLowerCase ( ) ) . some ( it => it . includes ( 'error' ) || it . includes ( 'failed' ) ) ) {
54- logger . debug ( 'build log conains error!' ) ;
55- return [ { status : 'error' , result : buildRes } , 400 ] ;
60+ logger . debug ( 'Build log conains error!' ) ;
61+ writeStatus ( resultStream , { message : 'Build log contains errors!' , level : 'error' } ) ;
62+ resultStream . end ( '' ) ;
63+ return ;
5664 }
5765
5866 // start image
59- const containerInfo = await start ( Object . assign ( buildRes , { username} ) ) ;
67+ const containerInfo = await start ( Object . assign ( { } , buildRes , { username, resultStream } ) ) ;
6068 logger . debug ( containerInfo . Name ) ;
6169
6270 // clean temp folder
6371 await cleanTemp ( ) ;
6472
6573 const containerData = docker . getContainer ( containerInfo . Id ) ;
6674 const container = await containerData . inspect ( ) ;
67- return [ { status : 'success' , deployments : [ container ] } , 200 ] ;
75+ // return new deployments
76+ writeStatus ( resultStream , { message : 'Deployment success!' , deployments : [ container ] , level : 'info' } ) ;
77+ resultStream . end ( '' ) ;
6878 } catch ( e ) {
6979 logger . debug ( 'build failed!' , e ) ;
70- return [ { status : 'error' , result : e } , 400 ] ;
80+ writeStatus ( resultStream , { message : e . error , error : e . error , log : e . log , level : 'error' } ) ;
81+ resultStream . end ( '' ) ;
7182 }
7283} ;
7384
@@ -89,10 +100,12 @@ module.exports = server => {
89100 await cleanTemp ( ) ;
90101 // unpack to temp folder
91102 await unpack ( request . payload . path ) ;
103+ // create new highland stream for results
104+ const resultStream = _ ( ) ;
92105 // run deploy
93- const [ response , code ] = await deploy ( { username} ) ;
94- // respond
95- reply ( response ) . code ( code ) ;
106+ deploy ( { username, resultStream } ) ;
107+ // reply with deploy stream
108+ reply ( new Readable ( ) . wrap ( resultStream ) ) . code ( 200 ) ;
96109 } ,
97110 } ) ;
98111
@@ -125,9 +138,12 @@ module.exports = server => {
125138 c => c . Labels [ 'exoframe.user' ] === username && c . Labels [ 'exoframe.project' ] === project
126139 ) ;
127140
141+ // create new highland stream for results
142+ const resultStream = _ ( ) ;
128143 // deploy new versions
129- // run deploy
130- const [ response , code ] = await deploy ( { username, payload : request . payload } ) ;
144+ deploy ( { username, payload : request . payload , resultStream} ) ;
145+ // reply with deploy stream
146+ reply ( new Readable ( ) . wrap ( resultStream ) ) . code ( 200 ) ;
131147 // wait a bit for it to start
132148 await sleep ( WAIT_TIME ) ;
133149
@@ -140,9 +156,6 @@ module.exports = server => {
140156 logger . error ( 'Error removing old deployment:' , e ) ;
141157 }
142158 }
143-
144- // respond
145- reply ( response ) . code ( code ) ;
146159 } ,
147160 } ) ;
148161} ;
0 commit comments