From 668190adc5b80f56970e2513a4c8783c3b738c80 Mon Sep 17 00:00:00 2001 From: CrazyMax <1951866+crazy-max@users.noreply.github.com> Date: Mon, 22 Jul 2024 10:41:37 +0200 Subject: [PATCH] switch to Docker exec Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com> --- __tests__/docker.test.ts | 23 ++++++++++++++++++----- src/docker.ts | 9 +++++---- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/__tests__/docker.test.ts b/__tests__/docker.test.ts index 1f45be5..e1213b0 100644 --- a/__tests__/docker.test.ts +++ b/__tests__/docker.test.ts @@ -2,14 +2,15 @@ import {expect, jest, test} from '@jest/globals'; import * as path from 'path'; import {loginStandard, logout} from '../src/docker'; -import {Exec} from '@docker/actions-toolkit/lib/exec'; + +import {Docker} from '@docker/actions-toolkit/lib/docker/docker'; process.env['RUNNER_TEMP'] = path.join(__dirname, 'runner'); test('loginStandard calls exec', async () => { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore - const execSpy = jest.spyOn(Exec, 'getExecOutput').mockImplementation(async () => { + const execSpy = jest.spyOn(Docker, 'getExecOutput').mockImplementation(async () => { return { exitCode: expect.any(Number), stdout: expect.any(Function), @@ -23,7 +24,13 @@ test('loginStandard calls exec', async () => { await loginStandard(registry, username, password); - expect(execSpy).toHaveBeenCalledWith(`docker`, ['login', '--password-stdin', '--username', username, registry], { + expect(execSpy).toHaveBeenCalledTimes(1); + const callfunc = execSpy.mock.calls[0]; + if (callfunc && callfunc[1]) { + // we don't want to check env opt + callfunc[1].env = undefined; + } + expect(execSpy).toHaveBeenCalledWith(['login', '--password-stdin', '--username', username, registry], { input: Buffer.from(password), silent: true, ignoreReturnCode: true @@ -33,7 +40,7 @@ test('loginStandard calls exec', async () => { test('logout calls exec', async () => { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore - const execSpy = jest.spyOn(Exec, 'getExecOutput').mockImplementation(async () => { + const execSpy = jest.spyOn(Docker, 'getExecOutput').mockImplementation(async () => { return { exitCode: expect.any(Number), stdout: expect.any(Function), @@ -45,7 +52,13 @@ test('logout calls exec', async () => { await logout(registry); - expect(execSpy).toHaveBeenCalledWith(`docker`, ['logout', registry], { + expect(execSpy).toHaveBeenCalledTimes(1); + const callfunc = execSpy.mock.calls[0]; + if (callfunc && callfunc[1]) { + // we don't want to check env opt + callfunc[1].env = undefined; + } + expect(execSpy).toHaveBeenCalledWith(['logout', registry], { ignoreReturnCode: true }); }); diff --git a/src/docker.ts b/src/docker.ts index 172ff4a..5e2c1d5 100644 --- a/src/docker.ts +++ b/src/docker.ts @@ -1,6 +1,7 @@ import * as aws from './aws'; import * as core from '@actions/core'; -import {Exec} from '@docker/actions-toolkit/lib/exec'; + +import {Docker} from '@docker/actions-toolkit/lib/docker/docker'; export async function login(registry: string, username: string, password: string, ecr: string): Promise { if (/true/i.test(ecr) || (ecr == 'auto' && aws.isECR(registry))) { @@ -11,7 +12,7 @@ export async function login(registry: string, username: string, password: string } export async function logout(registry: string): Promise { - await Exec.getExecOutput('docker', ['logout', registry], { + await Docker.getExecOutput(['logout', registry], { ignoreReturnCode: true }).then(res => { if (res.stderr.length > 0 && res.exitCode != 0) { @@ -40,7 +41,7 @@ export async function loginStandard(registry: string, username: string, password } else { core.info(`Logging into Docker Hub...`); } - await Exec.getExecOutput('docker', loginArgs, { + await Docker.getExecOutput(loginArgs, { ignoreReturnCode: true, silent: true, input: Buffer.from(password) @@ -57,7 +58,7 @@ export async function loginECR(registry: string, username: string, password: str const regDatas = await aws.getRegistriesData(registry, username, password); for (const regData of regDatas) { core.info(`Logging into ${regData.registry}...`); - await Exec.getExecOutput('docker', ['login', '--password-stdin', '--username', regData.username, regData.registry], { + await Docker.getExecOutput(['login', '--password-stdin', '--username', regData.username, regData.registry], { ignoreReturnCode: true, silent: true, input: Buffer.from(regData.password)