99 lines
2.3 KiB
TypeScript
99 lines
2.3 KiB
TypeScript
import { execSync } from "child_process"
|
|
|
|
let dockerPsResult: string | undefined
|
|
|
|
function formatDockerPsResult(serverName: string, port: number) {
|
|
const lines = dockerPsResult?.split("\n")
|
|
let first = true
|
|
if (!lines) {
|
|
return null
|
|
}
|
|
for (let line of lines) {
|
|
if (first) {
|
|
first = false
|
|
continue
|
|
}
|
|
let toLookFor = serverName.split("-service")[0]
|
|
if (!line.includes(toLookFor)) {
|
|
continue
|
|
}
|
|
const regex = new RegExp(`0.0.0.0:([0-9]*)->${port}`, "g")
|
|
const found = line.match(regex)
|
|
if (found) {
|
|
return found[0].split(":")[1].split("->")[0]
|
|
}
|
|
}
|
|
return null
|
|
}
|
|
|
|
function getTestContainerSettings(
|
|
serverName: string,
|
|
key: string
|
|
): string | null {
|
|
const entry = Object.entries(global).find(
|
|
([k]) =>
|
|
k.includes(`_${serverName.toUpperCase()}`) &&
|
|
k.includes(`_${key.toUpperCase()}__`)
|
|
)
|
|
if (!entry) {
|
|
return null
|
|
}
|
|
return entry[1]
|
|
}
|
|
|
|
function getContainerInfo(containerName: string, port: number) {
|
|
let assignedPort = getTestContainerSettings(
|
|
containerName.toUpperCase(),
|
|
`PORT_${port}`
|
|
)
|
|
if (!dockerPsResult) {
|
|
try {
|
|
const outputBuffer = execSync("docker ps")
|
|
dockerPsResult = outputBuffer.toString("utf8")
|
|
} catch (err) {
|
|
//no-op
|
|
}
|
|
}
|
|
const possiblePort = formatDockerPsResult(containerName, port)
|
|
if (possiblePort) {
|
|
assignedPort = possiblePort
|
|
}
|
|
const host = getTestContainerSettings(containerName.toUpperCase(), "IP")
|
|
return {
|
|
port: assignedPort,
|
|
host,
|
|
url: host && assignedPort && `http://${host}:${assignedPort}`,
|
|
}
|
|
}
|
|
|
|
function getCouchConfig() {
|
|
return getContainerInfo("couchdb-service", 5984)
|
|
}
|
|
|
|
function getMinioConfig() {
|
|
return getContainerInfo("minio-service", 9000)
|
|
}
|
|
|
|
function getRedisConfig() {
|
|
return getContainerInfo("redis-service", 6379)
|
|
}
|
|
|
|
export function setupEnv(...envs: any[]) {
|
|
const couch = getCouchConfig(),
|
|
minio = getCouchConfig(),
|
|
redis = getRedisConfig()
|
|
const configs = [
|
|
{ key: "COUCH_DB_PORT", value: couch.port },
|
|
{ key: "COUCH_DB_URL", value: couch.url },
|
|
{ key: "MINIO_PORT", value: minio.port },
|
|
{ key: "MINIO_URL", value: minio.url },
|
|
{ key: "REDIS_URL", value: redis.url },
|
|
]
|
|
|
|
for (const config of configs.filter(x => !!x.value)) {
|
|
for (const env of envs) {
|
|
env._set(config.key, config.value)
|
|
}
|
|
}
|
|
}
|