npmci/ts/mod_docker/mod.classes.dockerfile.ts

109 lines
3.6 KiB
TypeScript
Raw Normal View History

2018-11-24 14:00:19 +00:00
import { logger } from '../npmci.logging';
2018-04-04 20:25:13 +00:00
import * as plugins from './mod.plugins';
import * as NpmciEnv from '../npmci.env';
import { bash } from '../npmci.bash';
import * as paths from '../npmci.paths';
2017-08-27 23:03:59 +00:00
2018-04-04 20:25:13 +00:00
import { DockerRegistry } from './mod.classes.dockerregistry';
import * as helpers from './mod.helpers';
2017-08-27 23:03:59 +00:00
/**
* class Dockerfile represents a Dockerfile on disk in npmci
*/
export class Dockerfile {
2018-11-24 14:00:19 +00:00
public filePath: string;
public repo: string;
public version: string;
public cleanTag: string;
public buildTag: string;
public containerName: string;
public content: string;
public baseImage: string;
public localBaseImageDependent: boolean;
public localBaseDockerfile: Dockerfile;
2018-04-04 20:25:13 +00:00
constructor(options: { filePath?: string; fileContents?: string | Buffer; read?: boolean }) {
this.filePath = options.filePath;
this.repo = NpmciEnv.repo.user + '/' + NpmciEnv.repo.repo;
this.version = helpers.dockerFileVersion(plugins.path.parse(options.filePath).base);
this.cleanTag = this.repo + ':' + this.version;
this.buildTag = this.cleanTag;
2017-08-27 23:03:59 +00:00
2018-04-04 20:25:13 +00:00
this.containerName = 'dockerfile-' + this.version;
2017-08-27 23:03:59 +00:00
if (options.filePath && options.read) {
2018-04-04 20:25:13 +00:00
this.content = plugins.smartfile.fs.toStringSync(plugins.path.resolve(options.filePath));
2017-08-27 23:03:59 +00:00
}
2018-04-04 20:25:13 +00:00
this.baseImage = helpers.dockerBaseImage(this.content);
this.localBaseImageDependent = false;
2017-08-27 23:03:59 +00:00
}
/**
* builds the Dockerfile
*/
2018-11-24 14:00:19 +00:00
public async build() {
logger.log('info', 'now building Dockerfile for ' + this.cleanTag);
const buildArgsString = await helpers.getDockerBuildArgs();
const buildCommand = `docker build -t ${this.buildTag} -f ${this.filePath} ${buildArgsString} .`;
2018-04-04 20:25:13 +00:00
await bash(buildCommand);
return;
2017-08-27 23:03:59 +00:00
}
/**
* pushes the Dockerfile to a registry
*/
2018-11-24 14:00:19 +00:00
public async push(dockerRegistryArg: DockerRegistry, versionSuffix: string = null) {
const pushTag = helpers.getDockerTagString(
2018-04-04 20:25:13 +00:00
dockerRegistryArg.registryUrl,
this.repo,
this.version,
versionSuffix
);
await bash(`docker tag ${this.buildTag} ${pushTag}`);
await bash(`docker push ${pushTag}`);
2017-08-27 23:03:59 +00:00
}
/**
* pulls the Dockerfile from a registry
*/
2018-11-24 14:00:19 +00:00
public async pull(registryArg: DockerRegistry, versionSuffixArg: string = null) {
const pullTag = helpers.getDockerTagString(
2018-04-04 20:25:13 +00:00
registryArg.registryUrl,
this.repo,
this.version,
versionSuffixArg
);
await bash(`docker pull ${pullTag}`);
await bash(`docker tag ${pullTag} ${this.buildTag}`);
2017-08-27 23:03:59 +00:00
}
/**
* tests the Dockerfile;
*/
2018-11-24 14:00:19 +00:00
public async test() {
const testFile: string = plugins.path.join(paths.NpmciTestDir, 'test_' + this.version + '.sh');
const testFileExists: boolean = plugins.smartfile.fs.fileExistsSync(testFile);
2017-08-27 23:03:59 +00:00
if (testFileExists) {
// run tests
2018-04-04 20:25:13 +00:00
await bash(
`docker run --name npmci_test_container --entrypoint="bash" ${
this.buildTag
} -c "mkdir /npmci_test"`
);
await bash(`docker cp ${testFile} npmci_test_container:/npmci_test/test.sh`);
await bash(`docker commit npmci_test_container npmci_test_image`);
await bash(`docker run --entrypoint="bash" npmci_test_image -x /npmci_test/test.sh`);
await bash(`docker rm npmci_test_container`);
await bash(`docker rmi --force npmci_test_image`);
2017-08-27 23:03:59 +00:00
} else {
2018-11-24 14:00:19 +00:00
logger.log('warn', 'skipping tests for ' + this.cleanTag + ' because no testfile was found!');
2017-08-27 23:03:59 +00:00
}
}
/**
* gets the id of a Dockerfile
*/
2018-11-24 14:00:19 +00:00
public async getId() {
const containerId = await bash('docker inspect --type=image --format="{{.Id}}" ' + this.buildTag);
2018-04-04 20:25:13 +00:00
return containerId;
2017-08-27 23:03:59 +00:00
}
}