diff --git a/__tests__/updater-integration.test.ts b/__tests__/updater-integration.test.ts index 6d58394..fbd1b6a 100644 --- a/__tests__/updater-integration.test.ts +++ b/__tests__/updater-integration.test.ts @@ -61,7 +61,7 @@ describe('Updater', () => { await removeDanglingUpdaterContainers() }) - jest.setTimeout(25000) + jest.setTimeout(120000) it('should run the updater and create a pull request', async () => { // Skip the test when we haven't preloaded the updater image if (process.env.SKIP_INTEGRATION_TESTS) { diff --git a/src/proxy.ts b/src/proxy.ts index 1a10c82..4e4b567 100644 --- a/src/proxy.ts +++ b/src/proxy.ts @@ -1,5 +1,5 @@ import * as core from '@actions/core' -import Docker, {Container} from 'dockerode' +import Docker, {Container, Network} from 'dockerode' import crypto from 'crypto' import { BasicAuthCredentials, @@ -43,8 +43,10 @@ const CERT_SUBJECT = [ export class Proxy { container?: Container + networkName: string url: string cert: string + network?: Network constructor( private readonly docker: Docker, @@ -52,6 +54,7 @@ export class Proxy { ) { // TODO: this is obviously gnarly, decouple some things so we don't need to // initialize these as empty strings + this.networkName = '' this.url = '' this.cert = '' } @@ -61,7 +64,11 @@ export class Proxy { const config = this.buildProxyConfig(credentials, details.id) this.cert = config.ca.cert + this.networkName = `job-${details.id}-network` + this.network = await this.ensureNetwork(this.networkName) + this.container = await this.createContainer(details.id, name) + await ContainerService.storeInput( CONFIG_FILE_NAME, CONFIG_FILE_PATH, @@ -81,6 +88,17 @@ export class Proxy { core.info(this.url) } + private async ensureNetwork(name: string): Promise { + const networks = await this.docker.listNetworks({ + filters: JSON.stringify({name: [name]}) + }) + if (networks.length > 0) { + return this.docker.getNetwork(networks[0].Id) + } else { + return await this.docker.createNetwork({Name: name}) + } + } + private buildProxyConfig( credentials: Credential[], jobID: string @@ -130,7 +148,7 @@ export class Proxy { AttachStderr: true, Env: [`JOB_ID=${jobID}`], HostConfig: { - NetworkMode: `job-test-network` // TODO: Dynamically generate network + NetworkMode: this.networkName } }) diff --git a/src/updater.ts b/src/updater.ts index 19fc12f..d18e04f 100644 --- a/src/updater.ts +++ b/src/updater.ts @@ -53,6 +53,7 @@ export class Updater { } finally { await this.proxy.container?.stop() await this.proxy.container?.remove() + await this.proxy.network?.remove() } } @@ -123,7 +124,6 @@ export class Updater { } private async createContainer(updaterCommand: string): Promise { - core.info(`Proxy: ${this.proxy.url}`) const container = await this.docker.createContainer({ Image: this.updaterImage, AttachStdout: true, @@ -147,7 +147,7 @@ export class Updater { `/usr/sbin/update-ca-certificates && $DEPENDABOT_HOME/dependabot-updater/bin/run ${updaterCommand}` ], HostConfig: { - NetworkMode: 'job-test-network', + NetworkMode: this.proxy.networkName, Binds: [ `${path.join(__dirname, '../output')}:${JOB_OUTPUT_PATH}:rw`, `${path.join(__dirname, '../repo')}:${REPO_CONTENTS_PATH}:rw`