mirror of
https://github.com/hoverkraft-tech/compose-action.git
synced 2026-03-06 08:13:10 +08:00
Fix Docker Compose installation when not present on self-hosted runners
Co-authored-by: neilime <314088+neilime@users.noreply.github.com>
This commit is contained in:
parent
89658aac24
commit
e2af797539
24
dist/index.js
generated
vendored
24
dist/index.js
generated
vendored
@ -47951,6 +47951,10 @@ class DockerComposeInstallerService {
|
|||||||
async install({ composeVersion, cwd, githubToken }) {
|
async install({ composeVersion, cwd, githubToken }) {
|
||||||
const currentVersion = await this.version({ cwd });
|
const currentVersion = await this.version({ cwd });
|
||||||
if (!composeVersion) {
|
if (!composeVersion) {
|
||||||
|
// If no version is specified and Docker Compose is not installed, throw an error
|
||||||
|
if (!currentVersion) {
|
||||||
|
throw new Error("Docker Compose is not installed and no compose-version was specified. Please specify a compose-version to install.");
|
||||||
|
}
|
||||||
return currentVersion;
|
return currentVersion;
|
||||||
}
|
}
|
||||||
if (currentVersion === composeVersion) {
|
if (currentVersion === composeVersion) {
|
||||||
@ -47963,13 +47967,23 @@ class DockerComposeInstallerService {
|
|||||||
composeVersion = await this.getLatestVersion(githubToken);
|
composeVersion = await this.getLatestVersion(githubToken);
|
||||||
}
|
}
|
||||||
await this.installVersion(composeVersion);
|
await this.installVersion(composeVersion);
|
||||||
return this.version({ cwd });
|
const installedVersion = await this.version({ cwd });
|
||||||
|
if (!installedVersion) {
|
||||||
|
throw new Error("Failed to verify Docker Compose installation");
|
||||||
|
}
|
||||||
|
return installedVersion;
|
||||||
}
|
}
|
||||||
async version({ cwd }) {
|
async version({ cwd }) {
|
||||||
const result = await (0,dist.version)({
|
try {
|
||||||
cwd,
|
const result = await (0,dist.version)({
|
||||||
});
|
cwd,
|
||||||
return result.data.version;
|
});
|
||||||
|
return result.data.version;
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
// If version check fails (e.g., Docker Compose not installed), return null
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
async getLatestVersion(githubToken) {
|
async getLatestVersion(githubToken) {
|
||||||
const octokit = getOctokit(githubToken);
|
const octokit = getOctokit(githubToken);
|
||||||
|
|||||||
@ -57,6 +57,107 @@ describe("DockerComposeInstallerService", () => {
|
|||||||
expect(manualInstallerAdapterMock.install).not.toHaveBeenCalled();
|
expect(manualInstallerAdapterMock.install).not.toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("should throw an error when Docker Compose is not installed and no version is provided", async () => {
|
||||||
|
// Arrange
|
||||||
|
versionMock.mockRejectedValue(new Error("Docker Compose not found"));
|
||||||
|
|
||||||
|
// Act & Assert
|
||||||
|
await expect(
|
||||||
|
service.install({
|
||||||
|
composeVersion: null,
|
||||||
|
cwd: "/path/to/cwd",
|
||||||
|
githubToken: null,
|
||||||
|
})
|
||||||
|
).rejects.toThrow(
|
||||||
|
"Docker Compose is not installed and no compose-version was specified. Please specify a compose-version to install."
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(manualInstallerAdapterMock.install).not.toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should install Docker Compose when it is not installed and a version is specified", async () => {
|
||||||
|
// Arrange
|
||||||
|
versionMock.mockRejectedValueOnce(new Error("Docker Compose not found"));
|
||||||
|
|
||||||
|
const expectedVersion = "v2.20.0";
|
||||||
|
versionMock.mockResolvedValueOnce({
|
||||||
|
exitCode: 0,
|
||||||
|
out: "",
|
||||||
|
err: "",
|
||||||
|
data: {
|
||||||
|
version: expectedVersion,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
Object.defineProperty(process, "platform", {
|
||||||
|
value: "linux",
|
||||||
|
});
|
||||||
|
|
||||||
|
// Act
|
||||||
|
const result = await service.install({
|
||||||
|
composeVersion: expectedVersion,
|
||||||
|
cwd: "/path/to/cwd",
|
||||||
|
githubToken: null,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
expect(result).toBe(expectedVersion);
|
||||||
|
expect(manualInstallerAdapterMock.install).toHaveBeenCalledWith(expectedVersion);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should install Docker Compose when it is not installed and latest version is requested", async () => {
|
||||||
|
// Arrange
|
||||||
|
versionMock.mockRejectedValueOnce(new Error("Docker Compose not found"));
|
||||||
|
|
||||||
|
const latestVersion = "v2.30.0";
|
||||||
|
|
||||||
|
const mockClient = mockAgent.get("https://api.github.com");
|
||||||
|
mockClient
|
||||||
|
.intercept({
|
||||||
|
path: "/repos/docker/compose/releases/latest",
|
||||||
|
method: "GET",
|
||||||
|
})
|
||||||
|
.reply(
|
||||||
|
200,
|
||||||
|
{
|
||||||
|
tag_name: latestVersion,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
headers: {
|
||||||
|
"content-type": "application/json",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
);
|
||||||
|
setGlobalDispatcher(mockClient);
|
||||||
|
|
||||||
|
versionMock.mockResolvedValueOnce({
|
||||||
|
exitCode: 0,
|
||||||
|
out: "",
|
||||||
|
err: "",
|
||||||
|
data: {
|
||||||
|
version: latestVersion,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
Object.defineProperty(process, "platform", {
|
||||||
|
value: "linux",
|
||||||
|
});
|
||||||
|
Object.defineProperty(globalThis, "fetch", {
|
||||||
|
value: jest.fn(),
|
||||||
|
});
|
||||||
|
|
||||||
|
// Act
|
||||||
|
const result = await service.install({
|
||||||
|
composeVersion: "latest",
|
||||||
|
cwd: "/path/to/cwd",
|
||||||
|
githubToken: "token",
|
||||||
|
});
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
expect(result).toBe(latestVersion);
|
||||||
|
expect(manualInstallerAdapterMock.install).toHaveBeenCalledWith(latestVersion);
|
||||||
|
});
|
||||||
|
|
||||||
it("should not install anything when expected version is already installed", async () => {
|
it("should not install anything when expected version is already installed", async () => {
|
||||||
// Arrange
|
// Arrange
|
||||||
versionMock.mockResolvedValue({
|
versionMock.mockResolvedValue({
|
||||||
|
|||||||
@ -20,6 +20,12 @@ export class DockerComposeInstallerService {
|
|||||||
const currentVersion = await this.version({ cwd });
|
const currentVersion = await this.version({ cwd });
|
||||||
|
|
||||||
if (!composeVersion) {
|
if (!composeVersion) {
|
||||||
|
// If no version is specified and Docker Compose is not installed, throw an error
|
||||||
|
if (!currentVersion) {
|
||||||
|
throw new Error(
|
||||||
|
"Docker Compose is not installed and no compose-version was specified. Please specify a compose-version to install."
|
||||||
|
);
|
||||||
|
}
|
||||||
return currentVersion;
|
return currentVersion;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -36,14 +42,23 @@ export class DockerComposeInstallerService {
|
|||||||
|
|
||||||
await this.installVersion(composeVersion);
|
await this.installVersion(composeVersion);
|
||||||
|
|
||||||
return this.version({ cwd });
|
const installedVersion = await this.version({ cwd });
|
||||||
|
if (!installedVersion) {
|
||||||
|
throw new Error("Failed to verify Docker Compose installation");
|
||||||
|
}
|
||||||
|
return installedVersion;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async version({ cwd }: VersionInputs): Promise<string> {
|
private async version({ cwd }: VersionInputs): Promise<string | null> {
|
||||||
const result = await version({
|
try {
|
||||||
cwd,
|
const result = await version({
|
||||||
});
|
cwd,
|
||||||
return result.data.version;
|
});
|
||||||
|
return result.data.version;
|
||||||
|
} catch {
|
||||||
|
// If version check fails (e.g., Docker Compose not installed), return null
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async getLatestVersion(githubToken: string): Promise<string> {
|
private async getLatestVersion(githubToken: string): Promise<string> {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user