add option for npm access level
This commit is contained in:
@@ -1,93 +1,109 @@
|
||||
import * as plugins from './mod.plugins'
|
||||
import * as NpmciEnv from '../npmci.env'
|
||||
import { bash } from '../npmci.bash'
|
||||
import * as paths from '../npmci.paths'
|
||||
import * as plugins from './mod.plugins';
|
||||
import * as NpmciEnv from '../npmci.env';
|
||||
import { bash } from '../npmci.bash';
|
||||
import * as paths from '../npmci.paths';
|
||||
|
||||
import { DockerRegistry } from './mod.classes.dockerregistry'
|
||||
import * as helpers from './mod.helpers'
|
||||
import { DockerRegistry } from './mod.classes.dockerregistry';
|
||||
import * as helpers from './mod.helpers';
|
||||
|
||||
/**
|
||||
* class Dockerfile represents a Dockerfile on disk in npmci
|
||||
*/
|
||||
export class Dockerfile {
|
||||
filePath: string
|
||||
repo: string
|
||||
version: string
|
||||
cleanTag: string
|
||||
buildTag: string
|
||||
containerName: string
|
||||
content: string
|
||||
baseImage: string
|
||||
localBaseImageDependent: boolean
|
||||
localBaseDockerfile: Dockerfile
|
||||
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
|
||||
filePath: string;
|
||||
repo: string;
|
||||
version: string;
|
||||
cleanTag: string;
|
||||
buildTag: string;
|
||||
containerName: string;
|
||||
content: string;
|
||||
baseImage: string;
|
||||
localBaseImageDependent: boolean;
|
||||
localBaseDockerfile: Dockerfile;
|
||||
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;
|
||||
|
||||
this.containerName = 'dockerfile-' + this.version
|
||||
this.containerName = 'dockerfile-' + this.version;
|
||||
if (options.filePath && options.read) {
|
||||
this.content = plugins.smartfile.fs.toStringSync(plugins.path.resolve(options.filePath))
|
||||
this.content = plugins.smartfile.fs.toStringSync(plugins.path.resolve(options.filePath));
|
||||
}
|
||||
this.baseImage = helpers.dockerBaseImage(this.content)
|
||||
this.localBaseImageDependent = false
|
||||
this.baseImage = helpers.dockerBaseImage(this.content);
|
||||
this.localBaseImageDependent = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* builds the Dockerfile
|
||||
*/
|
||||
async build () {
|
||||
plugins.beautylog.info('now building Dockerfile for ' + this.cleanTag)
|
||||
let buildArgsString = await helpers.getDockerBuildArgs()
|
||||
let buildCommand = `docker build -t ${this.buildTag} -f ${this.filePath} ${buildArgsString} .`
|
||||
await bash(buildCommand)
|
||||
return
|
||||
async build() {
|
||||
plugins.beautylog.info('now building Dockerfile for ' + this.cleanTag);
|
||||
let buildArgsString = await helpers.getDockerBuildArgs();
|
||||
let buildCommand = `docker build -t ${this.buildTag} -f ${this.filePath} ${buildArgsString} .`;
|
||||
await bash(buildCommand);
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* pushes the Dockerfile to a registry
|
||||
*/
|
||||
async push (dockerRegistryArg: DockerRegistry, versionSuffix: string = null) {
|
||||
let pushTag = helpers.getDockerTagString(dockerRegistryArg.registryUrl, this.repo, this.version, versionSuffix)
|
||||
await bash(`docker tag ${this.buildTag} ${pushTag}`)
|
||||
await bash(`docker push ${pushTag}`)
|
||||
async push(dockerRegistryArg: DockerRegistry, versionSuffix: string = null) {
|
||||
let pushTag = helpers.getDockerTagString(
|
||||
dockerRegistryArg.registryUrl,
|
||||
this.repo,
|
||||
this.version,
|
||||
versionSuffix
|
||||
);
|
||||
await bash(`docker tag ${this.buildTag} ${pushTag}`);
|
||||
await bash(`docker push ${pushTag}`);
|
||||
}
|
||||
|
||||
/**
|
||||
* pulls the Dockerfile from a registry
|
||||
*/
|
||||
async pull (registryArg: DockerRegistry, versionSuffixArg: string = null) {
|
||||
let pullTag = helpers.getDockerTagString(registryArg.registryUrl,this.repo, this.version, versionSuffixArg)
|
||||
await bash(`docker pull ${pullTag}`)
|
||||
await bash(`docker tag ${pullTag} ${this.buildTag}`)
|
||||
async pull(registryArg: DockerRegistry, versionSuffixArg: string = null) {
|
||||
let pullTag = helpers.getDockerTagString(
|
||||
registryArg.registryUrl,
|
||||
this.repo,
|
||||
this.version,
|
||||
versionSuffixArg
|
||||
);
|
||||
await bash(`docker pull ${pullTag}`);
|
||||
await bash(`docker tag ${pullTag} ${this.buildTag}`);
|
||||
}
|
||||
|
||||
/**
|
||||
* tests the Dockerfile;
|
||||
*/
|
||||
async test () {
|
||||
let testFile: string = plugins.path.join(paths.NpmciTestDir, 'test_' + this.version + '.sh')
|
||||
let testFileExists: boolean = plugins.smartfile.fs.fileExistsSync(testFile)
|
||||
async test() {
|
||||
let testFile: string = plugins.path.join(paths.NpmciTestDir, 'test_' + this.version + '.sh');
|
||||
let testFileExists: boolean = plugins.smartfile.fs.fileExistsSync(testFile);
|
||||
if (testFileExists) {
|
||||
// run tests
|
||||
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`)
|
||||
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`);
|
||||
} else {
|
||||
plugins.beautylog.warn('skipping tests for ' + this.cleanTag + ' because no testfile was found!')
|
||||
plugins.beautylog.warn(
|
||||
'skipping tests for ' + this.cleanTag + ' because no testfile was found!'
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* gets the id of a Dockerfile
|
||||
*/
|
||||
async getId () {
|
||||
let containerId = await bash('docker inspect --type=image --format=\"{{.Id}}\" ' + this.buildTag)
|
||||
return containerId
|
||||
async getId() {
|
||||
let containerId = await bash('docker inspect --type=image --format="{{.Id}}" ' + this.buildTag);
|
||||
return containerId;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user