- Allow to run semantic-release (via API) from anywhere passing the current working directory. - Allows to simplify the tests and to run them in parallel in both the core and plugins.
73 lines
2.2 KiB
JavaScript
73 lines
2.2 KiB
JavaScript
import Docker from 'dockerode';
|
|
import getStream from 'get-stream';
|
|
import pRetry from 'p-retry';
|
|
import {initBareRepo, gitShallowClone} from './git-utils';
|
|
|
|
const IMAGE = 'pvdlg/docker-gitbox';
|
|
const SERVER_PORT = 80;
|
|
const HOST_PORT = 2080;
|
|
const SERVER_HOST = 'localhost';
|
|
const GIT_USERNAME = 'integration';
|
|
const GIT_PASSWORD = 'suchsecure';
|
|
const docker = new Docker();
|
|
let container;
|
|
|
|
const gitCredential = `${GIT_USERNAME}:${GIT_PASSWORD}`;
|
|
|
|
/**
|
|
* Download the `gitbox` Docker image, create a new container and start it.
|
|
*/
|
|
async function start() {
|
|
await getStream(await docker.pull(IMAGE));
|
|
|
|
container = await docker.createContainer({
|
|
Tty: true,
|
|
Image: IMAGE,
|
|
PortBindings: {[`${SERVER_PORT}/tcp`]: [{HostPort: `${HOST_PORT}`}]},
|
|
});
|
|
await container.start();
|
|
|
|
const exec = await container.exec({
|
|
Cmd: ['ng-auth', '-u', GIT_USERNAME, '-p', GIT_PASSWORD],
|
|
AttachStdout: true,
|
|
AttachStderr: true,
|
|
});
|
|
await exec.start();
|
|
}
|
|
|
|
/**
|
|
* Stop and remote the `mockserver` Docker container.
|
|
*/
|
|
async function stop() {
|
|
await container.stop();
|
|
await container.remove();
|
|
}
|
|
|
|
/**
|
|
* Initialize a remote repository and creates a shallow clone.
|
|
*
|
|
* @param {String} name The remote repository name.
|
|
* @param {String} [branch='master'] The branch to initialize.
|
|
* @param {String} [description=`Repository ${name}`] The repository description.
|
|
* @return {Object} The `repositoryUrl` (URL without auth) and `authUrl` (URL with auth).
|
|
*/
|
|
async function createRepo(name, branch = 'master', description = `Repository ${name}`) {
|
|
const exec = await container.exec({
|
|
Cmd: ['repo-admin', '-n', name, '-d', description],
|
|
AttachStdout: true,
|
|
AttachStderr: true,
|
|
});
|
|
await exec.start();
|
|
|
|
const repositoryUrl = `http://${SERVER_HOST}:${HOST_PORT}/git/${name}.git`;
|
|
const authUrl = `http://${gitCredential}@${SERVER_HOST}:${HOST_PORT}/git/${name}.git`;
|
|
|
|
// Retry as the server might take a few ms to make the repo available push
|
|
await pRetry(() => initBareRepo(authUrl, branch), {retries: 3, minTimeout: 500, factor: 2});
|
|
const cwd = await gitShallowClone(authUrl);
|
|
|
|
return {cwd, repositoryUrl, authUrl};
|
|
}
|
|
|
|
export default {start, stop, gitCredential, createRepo};
|