diff --git a/__tests__/dependabot-api.test.ts b/__tests__/dependabot-api.test.ts index 488964a..cca2171 100644 --- a/__tests__/dependabot-api.test.ts +++ b/__tests__/dependabot-api.test.ts @@ -1,4 +1,3 @@ -import axios, {AxiosInstance} from 'axios' import {DependabotAPI, PackageManager} from '../src/dependabot-api' describe('DependabotAPI', () => { diff --git a/__tests__/updater/fetcher.test.ts b/__tests__/updater/fetcher.test.ts new file mode 100644 index 0000000..2cd9908 --- /dev/null +++ b/__tests__/updater/fetcher.test.ts @@ -0,0 +1,10 @@ +import Docker from 'dockerode' +import {runFileFetcher} from '../../src/updater/fetcher' + +describe('runFileFetcher', () => { + const docker = new Docker() + + it('should run the file fetcher', async () => { + await runFileFetcher(docker, 'debian:buster-slim') + }) +}) \ No newline at end of file diff --git a/package.json b/package.json index 3cb0b4f..3e47b7f 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "format-check": "prettier --check **/*.ts", "lint": "eslint src/**/*.ts", "package": "ncc build --source-map --license licenses.txt", - "test": "jest", + "test": "jest --detectOpenHandles", "all": "npm run build && npm run format && npm run lint && npm run package && npm test" }, "repository": { diff --git a/src/main.ts b/src/main.ts index e792e9e..8a230ff 100644 --- a/src/main.ts +++ b/src/main.ts @@ -3,13 +3,18 @@ import * as github from '@actions/github' import {getJobParameters} from './inputs' import Docker from 'dockerode' import {runFileFetcher} from './updater/fetcher' +import {pullImage} from './updater/image' import {DependabotAPI} from './dependabot-api' import axios from 'axios' const apiUrl = 'https://38d4f0538147.ngrok.io' +// FIXME: read from JobParameters? at the least this should be an updater (not core) +const updaterImage = 'dependabot/dependabot-core:0.156.3' + async function run(): Promise { try { + // Decode JobParameters: const params = getJobParameters(github.context) if (params === null) { return @@ -17,16 +22,17 @@ async function run(): Promise { core.setSecret(params.jobToken) core.setSecret(params.credentialsToken) - // TODO: api client: fetch job details + // Fetch JobParameters: const client = axios.create({baseURL: apiUrl}) const api = new DependabotAPI(client, params) - const jobDetails = await api.getJobDetails() core.info(`Details: ${JSON.stringify(jobDetails)}`) + // TODO: credentials // TODO: the full docker jamboree const docker = new Docker() - await runFileFetcher(docker) + await pullImage(docker, updaterImage) + await runFileFetcher(docker, updaterImage) } catch (error) { core.setFailed(error.message) } diff --git a/src/updater/fetcher.ts b/src/updater/fetcher.ts index 50228a9..020e9b4 100644 --- a/src/updater/fetcher.ts +++ b/src/updater/fetcher.ts @@ -1,10 +1,30 @@ import * as core from '@actions/core' import * as Docker from 'dockerode' -export async function runFileFetcher(docker: Docker): Promise { - // hello docker - const containers = await docker.listContainers() - for (const container of containers) { - core.info(`Container ${container.Id} - ${container.Names}`) +export async function runFileFetcher( + docker: Docker, + image: string +): Promise { + const container = await docker.createContainer({ + Image: image, + AttachStdout: true, + AttachStderr: true, + Cmd: ['/bin/bash', '-c', 'for i in `seq 3`; do echo .; sleep 1; done'] + }) + core.info(`Created container ${container.id}`) + + try { + await container.start() + const stream = await container.attach({ + stream: true, + stdout: true, + stderr: true + }) + container.modem.demuxStream(stream, process.stdout, process.stderr) + + await container.wait() + } finally { + await container.remove() + core.info(`Cleaned up container ${container.id}`) } } diff --git a/src/updater/image.ts b/src/updater/image.ts new file mode 100644 index 0000000..1c874b1 --- /dev/null +++ b/src/updater/image.ts @@ -0,0 +1,10 @@ +import * as Docker from 'dockerode' + +export async function pullImage(docker: Docker, image: string): Promise { + const stream = await docker.pull(image) + await new Promise((resolve, reject) => { + docker.modem.followProgress(stream, (err: Error) => + err ? reject(err) : resolve(null) + ) + }) +}