You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
2.4 KiB
90 lines
2.4 KiB
4 years ago
|
import * as dotenv from 'dotenv';
|
||
|
import * as path from 'path';
|
||
|
|
||
|
const replace = require('replace-in-file');
|
||
|
const version = require(path.resolve(__dirname, '..', 'package.json')).version;
|
||
|
|
||
|
/**
|
||
|
* Creates a docker image
|
||
|
*/
|
||
|
class Dockerizer {
|
||
|
/**
|
||
|
* @constructor
|
||
|
*/
|
||
|
constructor() {
|
||
|
dotenv.config({
|
||
|
path: path.resolve(__dirname, '..', '.env')
|
||
|
});
|
||
|
}
|
||
|
|
||
|
public async dockerize(aVersion: string) {
|
||
|
console.log('Dockerizing...');
|
||
|
|
||
|
console.log('Version:', aVersion);
|
||
|
|
||
|
await this.executeShellCommand('rm -rf ./dist');
|
||
|
|
||
|
console.log(`Building source...`);
|
||
|
|
||
|
await this.executeShellCommand('ng build --prod api');
|
||
|
|
||
|
await this.executeShellCommand('ng build --prod client');
|
||
|
|
||
|
await this.executeShellCommand('yarn run replace-placeholders-in-build');
|
||
|
|
||
|
console.log(`Copying files...`);
|
||
|
|
||
|
await this.executeShellCommand(`mkdir -p ./docker/${aVersion}`);
|
||
|
await this.executeShellCommand(`cp -r ./dist/ ./docker/${aVersion}`);
|
||
|
|
||
|
await this.executeShellCommand(`mkdir ./docker/${aVersion}/prisma`);
|
||
|
await this.executeShellCommand(
|
||
|
`cp -r ./prisma/schema.prisma ./docker/${aVersion}/prisma/schema.prisma`
|
||
|
);
|
||
|
|
||
|
await this.executeShellCommand(
|
||
|
`cp ./docker-compose.yml ./docker/${aVersion}`
|
||
|
);
|
||
|
|
||
|
try {
|
||
|
replace.sync({
|
||
|
allowEmptyPaths: false,
|
||
|
files: `./docker/${aVersion}/docker-compose.yml`,
|
||
|
from: /{{VERSION}}/g,
|
||
|
to: aVersion
|
||
|
});
|
||
|
} catch (error) {
|
||
|
console.error('Error while replacing docker-compose.yml:', error);
|
||
|
}
|
||
|
|
||
|
await this.executeShellCommand(`cp ./Dockerfile ./docker/${aVersion}`);
|
||
|
await this.executeShellCommand(`cp ./package.json ./docker/${aVersion}`);
|
||
|
await this.executeShellCommand(`cp ./yarn.lock ./docker/${aVersion}`);
|
||
|
|
||
|
await this.executeShellCommand(
|
||
|
`cd docker/${aVersion} && yarn install --production`
|
||
|
);
|
||
|
|
||
|
console.log('Dockerizing has been completed successfully.');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Executes a shell command and return it as a promise
|
||
|
*/
|
||
|
private executeShellCommand(cmd: string) {
|
||
|
const exec = require('child_process').exec;
|
||
|
return new Promise((resolve, reject) => {
|
||
|
// Maximum buffer size increased to 1000 * 1000KB
|
||
|
exec(cmd, { maxBuffer: 1000 * 1024 * 1000 }, (error, stdout, stderr) => {
|
||
|
if (error) {
|
||
|
console.warn(error);
|
||
|
}
|
||
|
resolve(stdout ? stdout : stderr);
|
||
|
});
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const dockerizer = new Dockerizer();
|
||
|
dockerizer.dockerize(version);
|