mirror of
https://github.com/docker/build-push-action.git
synced 2025-05-06 21:49:33 +02:00
*: unify error handling and add more unit tests
This commit is contained in:
parent
c71ad2dbef
commit
f9d1e150a9
5 changed files with 156 additions and 85 deletions
|
@ -2,7 +2,7 @@ import * as core from '@actions/core';
|
|||
import * as main from '../main';
|
||||
import * as reporter from '../reporter';
|
||||
import {getDockerfilePath} from '../context';
|
||||
import { getBuilderAddr } from '../setup_builder';
|
||||
import * as setupBuilder from '../setup_builder';
|
||||
|
||||
jest.mock('@actions/core', () => ({
|
||||
debug: jest.fn(),
|
||||
|
@ -25,7 +25,10 @@ jest.mock('../reporter', () => ({
|
|||
}));
|
||||
|
||||
jest.mock('../setup_builder', () => ({
|
||||
getBuilderAddr: jest.fn()
|
||||
...jest.requireActual('../setup_builder'),
|
||||
startAndConfigureBuildkitd: jest.fn(),
|
||||
setupStickyDisk: jest.fn(),
|
||||
getNumCPUs: jest.fn().mockResolvedValue(4)
|
||||
}));
|
||||
|
||||
describe('startBlacksmithBuilder', () => {
|
||||
|
@ -51,13 +54,13 @@ describe('startBlacksmithBuilder', () => {
|
|||
mockInputs.nofallback = true;
|
||||
|
||||
await expect(main.startBlacksmithBuilder(mockInputs)).rejects.toThrow('Failed to resolve dockerfile path');
|
||||
expect(core.warning).not.toHaveBeenCalled();
|
||||
expect(core.warning).toHaveBeenCalledWith('Error during Blacksmith builder setup: Failed to resolve dockerfile path. Failing the build because nofallback is set.');
|
||||
expect(reporter.reportBuilderCreationFailed).toHaveBeenCalledWith(new Error('Failed to resolve dockerfile path'));
|
||||
});
|
||||
|
||||
test('should handle error in getBuilderAddr with nofallback=false', async () => {
|
||||
test('should handle error in setupStickyDisk with nofallback=false', async () => {
|
||||
(getDockerfilePath as jest.Mock).mockReturnValue('/path/to/Dockerfile');
|
||||
(getBuilderAddr as jest.Mock).mockRejectedValue(new Error('Failed to obtain Blacksmith builder'));
|
||||
(setupBuilder.setupStickyDisk as jest.Mock).mockRejectedValue(new Error('Failed to obtain Blacksmith builder'));
|
||||
|
||||
mockInputs.nofallback = false;
|
||||
const result = await main.startBlacksmithBuilder(mockInputs);
|
||||
|
@ -67,14 +70,80 @@ describe('startBlacksmithBuilder', () => {
|
|||
expect(reporter.reportBuilderCreationFailed).toHaveBeenCalledWith(new Error('Failed to obtain Blacksmith builder'));
|
||||
});
|
||||
|
||||
test('should handle error in getBuilderAddr with nofallback=true', async () => {
|
||||
test('should handle error in setupStickyDisk with nofallback=true', async () => {
|
||||
(getDockerfilePath as jest.Mock).mockReturnValue('/path/to/Dockerfile');
|
||||
const error = new Error('Failed to obtain Blacksmith builder');
|
||||
(getBuilderAddr as jest.Mock).mockRejectedValue(error);
|
||||
(setupBuilder.setupStickyDisk as jest.Mock).mockRejectedValue(error);
|
||||
mockInputs.nofallback = true;
|
||||
|
||||
await expect(main.startBlacksmithBuilder(mockInputs)).rejects.toThrow(error);
|
||||
expect(core.warning).not.toHaveBeenCalled();
|
||||
expect(core.warning).toHaveBeenCalledWith('Error during Blacksmith builder setup: Failed to obtain Blacksmith builder. Failing the build because nofallback is set.');
|
||||
expect(reporter.reportBuilderCreationFailed).toHaveBeenCalledWith(error);
|
||||
});
|
||||
|
||||
test('should successfully start buildkitd when setup succeeds', async () => {
|
||||
const mockBuildkitdAddr = 'unix:///run/buildkit/buildkitd.sock';
|
||||
const mockExposeId = 'test-expose-id';
|
||||
const mockBuildId = 'test-build-id';
|
||||
const mockDevice = '/dev/vdb';
|
||||
const mockParallelism = 4;
|
||||
|
||||
(getDockerfilePath as jest.Mock).mockReturnValue('/path/to/Dockerfile');
|
||||
(setupBuilder.setupStickyDisk as jest.Mock).mockResolvedValue({
|
||||
device: mockDevice,
|
||||
buildId: mockBuildId,
|
||||
exposeId: mockExposeId
|
||||
});
|
||||
(setupBuilder.getNumCPUs as jest.Mock).mockResolvedValue(mockParallelism);
|
||||
(setupBuilder.startAndConfigureBuildkitd as jest.Mock).mockResolvedValue(mockBuildkitdAddr);
|
||||
|
||||
const result = await main.startBlacksmithBuilder(mockInputs);
|
||||
|
||||
expect(result).toEqual({
|
||||
addr: mockBuildkitdAddr,
|
||||
buildId: mockBuildId,
|
||||
exposeId: mockExposeId
|
||||
});
|
||||
expect(setupBuilder.startAndConfigureBuildkitd).toHaveBeenCalledWith(mockParallelism, mockDevice);
|
||||
expect(core.warning).not.toHaveBeenCalled();
|
||||
expect(reporter.reportBuilderCreationFailed).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
test('should handle buildkitd startup failure with nofallback=false', async () => {
|
||||
const mockDevice = '/dev/vdb';
|
||||
const mockParallelism = 4;
|
||||
(getDockerfilePath as jest.Mock).mockReturnValue('/path/to/Dockerfile');
|
||||
(setupBuilder.setupStickyDisk as jest.Mock).mockResolvedValue({
|
||||
device: mockDevice,
|
||||
buildId: 'test-build-id',
|
||||
exposeId: 'test-expose-id'
|
||||
});
|
||||
(setupBuilder.getNumCPUs as jest.Mock).mockResolvedValue(mockParallelism);
|
||||
(setupBuilder.startAndConfigureBuildkitd as jest.Mock).mockRejectedValue(new Error('Failed to start buildkitd'));
|
||||
|
||||
mockInputs.nofallback = false;
|
||||
const result = await main.startBlacksmithBuilder(mockInputs);
|
||||
|
||||
expect(result).toEqual({addr: null, buildId: null, exposeId: ''});
|
||||
expect(core.warning).toHaveBeenCalledWith('Error during buildkitd setup: Failed to start buildkitd. Falling back to a local build.');
|
||||
expect(reporter.reportBuilderCreationFailed).toHaveBeenCalled();
|
||||
});
|
||||
|
||||
test('should throw error when buildkitd fails and nofallback is true', async () => {
|
||||
const mockDevice = '/dev/vdb';
|
||||
const mockParallelism = 4;
|
||||
(getDockerfilePath as jest.Mock).mockReturnValue('/path/to/Dockerfile');
|
||||
(setupBuilder.setupStickyDisk as jest.Mock).mockResolvedValue({
|
||||
device: mockDevice,
|
||||
buildId: 'test-build-id',
|
||||
exposeId: 'test-expose-id'
|
||||
});
|
||||
(setupBuilder.getNumCPUs as jest.Mock).mockResolvedValue(mockParallelism);
|
||||
(setupBuilder.startAndConfigureBuildkitd as jest.Mock).mockRejectedValue(new Error('Failed to start buildkitd'));
|
||||
|
||||
mockInputs.nofallback = true;
|
||||
await expect(main.startBlacksmithBuilder(mockInputs)).rejects.toThrow('Failed to start buildkitd');
|
||||
expect(core.warning).toHaveBeenCalledWith('Error during buildkitd setup: Failed to start buildkitd. Failing the build because nofallback is set.');
|
||||
expect(reporter.reportBuilderCreationFailed).toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue