2016-07-18 18:48:34 +00:00
"use strict" ;
const plugins = require ( "./npmdocker.plugins" ) ;
2016-07-19 17:21:06 +00:00
const paths = require ( "./npmdocker.paths" ) ;
const snippets = require ( "./npmdocker.snippets" ) ;
2016-07-19 22:40:37 +00:00
const npmdocker _promisechain _1 = require ( "./npmdocker.promisechain" ) ;
2016-07-19 17:21:06 +00:00
let config ;
let dockerData = {
imageTag : "npmdocker-temp-image:latest" ,
2016-08-04 20:25:15 +00:00
containerName : "npmdocker-temp-container" ,
dockerProjectMountString : "" ,
dockerSockString : "" ,
dockerEnvString : ""
2016-07-19 17:21:06 +00:00
} ;
2016-07-18 18:48:34 +00:00
/ * *
* check if docker is available
* /
2016-07-19 17:21:06 +00:00
let checkDocker = ( ) => {
2016-07-18 18:48:34 +00:00
let done = plugins . q . defer ( ) ;
2016-07-19 22:40:37 +00:00
npmdocker _promisechain _1 . npmdockerOra . text ( "checking docker..." ) ;
2016-07-18 18:48:34 +00:00
if ( plugins . shelljs . which ( "docker" ) ) {
2016-07-19 17:21:06 +00:00
plugins . beautylog . ok ( "Docker found!" ) ;
2016-07-18 18:48:34 +00:00
done . resolve ( ) ;
}
else {
done . reject ( new Error ( "docker not found on this machine" ) ) ;
}
return done . promise ;
} ;
2016-07-19 17:21:06 +00:00
/ * *
* builds the Dockerfile according to the config in the project
* /
let buildDockerFile = ( ) => {
let done = plugins . q . defer ( ) ;
2016-07-19 22:40:37 +00:00
npmdocker _promisechain _1 . npmdockerOra . text ( "building Dockerfile..." ) ;
2016-07-19 17:21:06 +00:00
let dockerfile = snippets . dockerfileSnippet ( {
baseImage : config . baseImage ,
command : config . command
} ) ;
plugins . beautylog . info ( ` Base image is: ${ config . baseImage } ` ) ;
plugins . beautylog . info ( ` Command is: ${ config . command } ` ) ;
plugins . smartfile . memory . toFsSync ( dockerfile , paths . dockerfile ) ;
plugins . beautylog . ok ( "Dockerfile created!" ) ;
done . resolve ( ) ;
return done . promise ;
} ;
/ * *
* builds the Dockerimage from the built Dockerfile
* /
let buildDockerImage = ( ) => {
let done = plugins . q . defer ( ) ;
2016-07-19 22:40:37 +00:00
npmdocker _promisechain _1 . npmdockerOra . text ( "pulling latest base image from registry..." ) ;
2016-07-19 17:21:06 +00:00
plugins . shelljs . exec ( ` docker pull ${ config . baseImage } ` , {
silent : true
} , ( ) => {
2016-07-19 22:40:37 +00:00
npmdocker _promisechain _1 . npmdockerOra . text ( "building Dockerimage..." ) ;
2016-07-28 22:52:30 +00:00
// are we creating a build context form project ?
if ( process . env . CI == "true" ) {
npmdocker _promisechain _1 . npmdockerOra . text ( "creating build context..." ) ;
plugins . smartfile . fs . copySync ( paths . cwd , paths . buildContextDir ) ;
}
2016-07-19 22:40:37 +00:00
plugins . shelljs . exec ( ` docker build -f ${ paths . dockerfile } -t ${ dockerData . imageTag } ${ paths . assets } ` , {
silent : true
} , ( ) => {
plugins . beautylog . ok ( "Dockerimage built!" ) ;
done . resolve ( ) ;
} ) ;
} ) ; // first pull latest version of baseImage
2016-07-19 17:21:06 +00:00
return done . promise ;
} ;
2016-08-04 20:25:15 +00:00
let buildDockerProjectMountString = ( ) => {
2016-07-19 17:21:06 +00:00
let done = plugins . q . defer ( ) ;
2016-07-28 22:52:30 +00:00
if ( process . env . CI != "true" ) {
2016-08-04 20:25:15 +00:00
dockerData . dockerProjectMountString = ` -v ${ paths . cwd } :/workspace ` ;
2016-07-28 22:52:30 +00:00
}
;
2016-08-04 20:25:15 +00:00
done . resolve ( ) ;
return done . promise ;
} ;
let buildDockerEnvString = ( ) => {
let done = plugins . q . defer ( ) ;
for ( let keyValueObjectArg of config . keyValueObjectArray ) {
let envString = dockerData . dockerEnvString = dockerData . dockerEnvString + ` -e ${ keyValueObjectArg . key } = ${ keyValueObjectArg . value } ` ;
}
;
done . resolve ( ) ;
return done . promise ;
} ;
let buildDockerSockString = ( ) => {
let done = plugins . q . defer ( ) ;
2016-07-28 16:01:02 +00:00
if ( config . dockerSock ) {
2016-08-04 20:25:15 +00:00
dockerData . dockerSockString = ` -v /var/run/docker.sock:/var/run/docker.sock ` ;
2016-07-28 16:01:02 +00:00
}
;
2016-08-04 20:25:15 +00:00
done . resolve ( ) ;
return done ;
} ;
/ * *
* creates a container by running the built Dockerimage
* /
let runDockerImage = ( ) => {
let done = plugins . q . defer ( ) ;
npmdocker _promisechain _1 . npmdockerOra . text ( "starting Container..." ) ;
npmdocker _promisechain _1 . npmdockerOra . end ( ) ;
2016-07-29 20:00:22 +00:00
plugins . beautylog . log ( "now running Dockerimage" ) ;
2016-08-04 20:25:15 +00:00
config . exitCode = plugins . shelljs . exec ( ` docker run ${ dockerData . dockerProjectMountString } ${ dockerData . dockerSockString } ${ dockerData . dockerEnvString } --name ${ dockerData . containerName } ${ dockerData . imageTag } ` ) . code ;
2016-07-19 17:21:06 +00:00
done . resolve ( ) ;
return done . promise ;
} ;
2016-07-29 20:00:22 +00:00
let deleteDockerContainer = ( ) => {
2016-07-19 17:21:06 +00:00
let done = plugins . q . defer ( ) ;
2016-07-29 20:19:53 +00:00
plugins . shelljs . exec ( ` docker rm -f ${ dockerData . containerName } ` , {
2016-07-19 17:21:06 +00:00
silent : true
} ) ;
done . resolve ( ) ;
return done . promise ;
} ;
let deleteDockerImage = ( ) => {
let done = plugins . q . defer ( ) ;
plugins . shelljs . exec ( ` docker rmi ${ dockerData . imageTag } ` , {
silent : true
} ) ;
2016-07-28 22:52:30 +00:00
done . resolve ( ) ;
return done . promise ;
} ;
let deleteBuildContext = ( ) => {
let done = plugins . q . defer ( ) ;
2016-07-29 20:00:22 +00:00
plugins . smartfile . fs . remove ( paths . buildContextDir )
. then ( done . resolve ) ;
2016-07-19 17:21:06 +00:00
return done . promise ;
} ;
2016-07-29 20:00:22 +00:00
let preClean = ( ) => {
let done = plugins . q . defer ( ) ;
deleteDockerImage ( )
. then ( deleteDockerContainer )
. then ( ( ) => {
plugins . beautylog . ok ( "ensured clean Docker environment!" ) ;
done . resolve ( ) ;
} ) ;
} ;
let postClean = ( ) => {
let done = plugins . q . defer ( ) ;
deleteDockerContainer ( )
. then ( deleteDockerImage )
. then ( deleteBuildContext )
. then ( ( ) => {
plugins . beautylog . ok ( "cleaned up!" ) ;
done . resolve ( ) ;
} ) ;
} ;
2016-07-18 22:37:13 +00:00
exports . run = ( configArg ) => {
let done = plugins . q . defer ( ) ;
2016-07-19 17:21:06 +00:00
config = configArg ;
checkDocker ( )
2016-07-29 20:00:22 +00:00
. then ( preClean )
2016-07-19 17:21:06 +00:00
. then ( buildDockerFile )
. then ( buildDockerImage )
2016-08-04 20:25:15 +00:00
. then ( buildDockerProjectMountString )
. then ( buildDockerEnvString )
. then ( buildDockerSockString )
2016-07-19 17:21:06 +00:00
. then ( runDockerImage )
2016-07-29 20:00:22 +00:00
. then ( postClean )
2016-07-19 17:21:06 +00:00
. then ( ( ) => {
2016-07-19 22:40:37 +00:00
done . resolve ( config ) ;
2016-08-04 20:25:15 +00:00
} ) . catch ( err => { console . log ( err ) ; } ) ;
2016-07-18 22:37:13 +00:00
return done . promise ;
} ;
2016-08-04 20:36:00 +00:00
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnBtZG9ja2VyLmRvY2tlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL25wbWRvY2tlci5kb2NrZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE1BQVksT0FBTyxXQUFNLHFCQUFxQixDQUFDLENBQUE7QUFDL0MsTUFBWSxLQUFLLFdBQU0sbUJBQW1CLENBQUMsQ0FBQTtBQUMzQyxNQUFZLFFBQVEsV0FBTSxzQkFBc0IsQ0FBQyxDQUFBO0FBRWpELHlDQUE2QiwwQkFBMEIsQ0FBQyxDQUFBO0FBS3hELElBQUksTUFBZSxDQUFDO0FBQ3BCLElBQUksVUFBVSxHQUFHO0lBQ2IsUUFBUSxFQUFFLDZCQUE2QjtJQUN2QyxhQUFhLEVBQUUsMEJBQTBCO0lBQ3pDLHdCQUF3QixFQUFFLEVBQUU7SUFDNUIsZ0JBQWdCLEVBQUUsRUFBRTtJQUNwQixlQUFlLEVBQUUsRUFBRTtDQUN0QixDQUFDO0FBRUY7O0dBRUc7QUFDSCxJQUFJLFdBQVcsR0FBRztJQUNkLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDN0IscUNBQVksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUN4QyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLENBQUE7UUFDckMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFBQyxJQUFJLENBQUMsQ0FBQztRQUNKLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUN4QixDQUFDLENBQUM7QUFFRjs7R0FFRztBQUNILElBQUksZUFBZSxH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