diff --git a/.gitignore b/.gitignore index 09e2b635..122fb003 100644 --- a/.gitignore +++ b/.gitignore @@ -11,9 +11,13 @@ helmfile.d/70-cronjobs.carlos.yaml helmfile.d/values/ipaddress.yaml helmfile.d/values/gogs.yaml secondary-master.d/values/ipaddress.yaml +helmfile.d/70-cronjobs.yaml # chart deps charts/gogs/charts/ # secrets and private files secrets.sh + +#node +node_modules/ diff --git a/.idea/jsLibraryMappings.xml b/.idea/jsLibraryMappings.xml new file mode 100644 index 00000000..d23208fb --- /dev/null +++ b/.idea/jsLibraryMappings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/docker/docker-build.js b/docker/docker-build.js new file mode 100644 index 00000000..a4542684 --- /dev/null +++ b/docker/docker-build.js @@ -0,0 +1,70 @@ +const execSync = require('child_process').execSync; +// const logger = require('../src/api/logger'); +const logger = console; +logger.warning = console.warn; +const argv = require('minimist')(process.argv.slice(2)); + +const imageName = argv.image; +if (!imageName) { + logger.error('DOCKER:BUILD', 'Please specify an image name with --image='); + process.exit(1); +} + +try { + process.chdir(`docker/${imageName}`); + + console.log(`New directory: ${process.cwd()}`); +} +catch (err) { + logger.error('DOCKER:BUILD', 'Chdir failed', err); +} + +const ioOptions = { stdio: [process.stdin, process.stdout, process.stderr] }; + +const username = execSync('whoami').toString('ascii').trim(); +const version = execSync('git log -n 1 --pretty=format:%h').toString('ascii').trim(); +const dockerImageName = `${username}/${imageName}:v${version}`; +const dockerImageNameLatest = `${username}/${imageName}:latest`; + +function run() { + if (argv.force) { + build(); + } + else { + logger.info('DOCKER:BUILD', `Checking docker image: ${dockerImageName}...`); + + const imageID = execSync(`docker images -q ${dockerImageName}`).toString(); + + if (!imageID) { + build(); + } + else { + logger.warning( + 'DOCKER:BUILD', + 'The tag already exists, commit something first to build new image or run with --force.' + ); + } + } +} + +function build() { + // Build and then tag the docker image with the current version AND "latest" + const dockerBuildCommand = `docker build -t docker.io/${dockerImageName} -t docker.io/${dockerImageNameLatest} .`; + const pushCommand = `docker push docker.io/${dockerImageName}`; + const pushCommandLatest = `docker push docker.io/${dockerImageNameLatest}`; + + try { + logger.info('DOCKER:BUILD', `Running: ${dockerBuildCommand}`); + execSync(dockerBuildCommand, ioOptions); + logger.info('DOCKER:BUILD', `Running: ${pushCommand}`); + execSync(pushCommand, ioOptions); + logger.info('DOCKER:BUILD', `Running: ${pushCommandLatest}`); + execSync(pushCommandLatest, ioOptions); + } + catch (err) { + logger.error('DOCKER:BUILD', 'A fatal error has occurred.', err.message); + process.exit(1); + } +} + +run(); diff --git a/docker/docker-run.js b/docker/docker-run.js new file mode 100644 index 00000000..3cea0696 --- /dev/null +++ b/docker/docker-run.js @@ -0,0 +1,52 @@ +const exec = require('child_process').spawn; +const execSync = require('child_process').execSync; +// const logger = require('../src/api/logger'); +const logger = console; +logger.warning = console.warn; +const argv = require('minimist')(process.argv.slice(2)); + +console.log(argv); + +// TODO: each docker folder can export a manifest of their params, docker-compose file? + +const imageName = argv.image; +if (!imageName) { + logger.error('DOCKER:BUILD', 'Please specify an image name with --image='); + process.exit(1); +} + +const stdio = [process.stdin, process.stdout, process.stderr]; +const ioOptions = { detached: true, shell: true, stdio }; +const username = execSync('whoami').toString('ascii').trim(); +const dockerImageNameLatest = `${username}/${imageName}:latest`; + +process.on('exit', (code) => { + if (code !== 0) { + logger.error('DOCKER:RUN', `Exiting with exit code: ${code}`); + } + + logger.info('DOCKER:RUN', 'Shutting down'); + execSync(`docker stop ${imageName}`, { stdio }); + logger.info('DOCKER:RUN', 'Shut down complete'); +}); + +process.on('SIGINT', () => { + process.exit(0); +}); + +const runCommand = `docker run --rm --name=${imageName} ${argv._.join(' ')} docker.io/${dockerImageNameLatest}`; + +try { + logger.info('DOCKER:RUN', `Running: ${runCommand}`); + exec(runCommand, ioOptions); +} +catch (error) { + console.error('ERROR!'); + console.error(error.status); + + if (error.status > 0) { + console.error('A fatal error has occurred.'); + console.error(error.message); + process.exit(1); + } +} diff --git a/helmfile.d/53-mqtt-smarttings.yaml b/helmfile.d/53-mqtt-smarttings.yaml index c2c63cdb..59909259 100644 --- a/helmfile.d/53-mqtt-smarttings.yaml +++ b/helmfile.d/53-mqtt-smarttings.yaml @@ -45,7 +45,7 @@ releases: chart: ../charts/nest-mqtt-bridge values: - image: - tag: "v1" + tag: "v5cd8cb" - volumes: - name: yasr-volume persistentVolumeClaim: diff --git a/package.json b/package.json new file mode 100644 index 00000000..bed33933 --- /dev/null +++ b/package.json @@ -0,0 +1,16 @@ +{ + "name": "k8s-infrastructure", + "version": "1.0.0", + "main": "index.js", + "repository": "git@github.com:gandazgul/my-infrastructure.git", + "author": "Carlos Ravelo ", + "license": "MIT", + "private": true, + "scripts": { + "docker:build": "node ./docker/docker-build.js", + "docker:run": "node ./docker/docker-run.js" + }, + "dependencies": { + "minimist": "^1.2.0" + } +} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 00000000..eefb57a9 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,8 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=