diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d4f7ade..71b7390 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -65,3 +65,39 @@ jobs: echo "::error::Should have failed" exit 1 fi + + version: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: + - ubuntu-latest + - ubuntu-22.04 + - ubuntu-20.04 + install: + - true + - false + steps: + - + name: Checkout + uses: actions/checkout@v4 + - + name: Install QEMU + if: ${{ matrix.install }} + run: | + sudo apt-get update + sudo apt-get install -y qemu-user-static + - + name: QEMU bins + run: | + echo $PATH | tr ':' '\n' | xargs -I {} find {} -type f -executable -name "qemu*" || true + dpkg -l | grep '^ii' | grep 'qemu' || true + - + name: Set up QEMU + uses: ./ + - + name: QEMU bins + run: | + echo $PATH | tr ':' '\n' | xargs -I {} find {} -type f -executable -name "qemu*" || true + dpkg -l | grep '^ii' | grep 'qemu' || true diff --git a/__tests__/qemu.test.ts b/__tests__/qemu.test.ts new file mode 100644 index 0000000..dc3b70e --- /dev/null +++ b/__tests__/qemu.test.ts @@ -0,0 +1,24 @@ +import {describe, expect, jest, it} from '@jest/globals'; +import * as io from '@actions/io'; +import {Exec} from '@docker/actions-toolkit/lib/exec'; + +import * as qemu from '../src/qemu'; + +describe('isInstalled', () => { + it('bin', async () => { + const ioWhichSpy = jest.spyOn(io, 'which'); + await qemu.isInstalled(); + expect(ioWhichSpy).toHaveBeenCalledTimes(1); + expect(ioWhichSpy).toHaveBeenCalledWith(qemu.bin(), true); + }); +}); + +describe('printVersion', () => { + it('call qemu --version', async () => { + const execSpy = jest.spyOn(Exec, 'exec'); + await qemu.printVersion().catch(() => { + // noop + }); + expect(execSpy).toHaveBeenCalledWith(qemu.bin(), ['--version']); + }); +}); diff --git a/package.json b/package.json index 3cce0e2..5778bbf 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "license": "Apache-2.0", "dependencies": { "@actions/core": "^1.10.1", + "@actions/io": "^1.1.3", "@docker/actions-toolkit": "^0.16.1" }, "devDependencies": { diff --git a/src/main.ts b/src/main.ts index 0026eec..0aadcbb 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,4 +1,5 @@ import * as context from './context'; +import * as qemu from './qemu'; import * as core from '@actions/core'; import * as actionsToolkit from '@docker/actions-toolkit'; import {Docker} from '@docker/actions-toolkit/lib/docker/docker'; @@ -14,6 +15,14 @@ actionsToolkit.run( async () => { const input: context.Inputs = context.getInputs(); + await core.group('QEMU version', async () => { + if (await qemu.isInstalled()) { + await qemu.printVersion(); + } else { + core.warning('QEMU is not installed'); + } + }); + await core.group(`Docker info`, async () => { await Docker.printVersion(); await Docker.printInfo(); diff --git a/src/qemu.ts b/src/qemu.ts new file mode 100644 index 0000000..7359af5 --- /dev/null +++ b/src/qemu.ts @@ -0,0 +1,39 @@ +import os from 'os'; +import * as core from '@actions/core'; +import * as io from '@actions/io'; +import {Exec} from '@docker/actions-toolkit/lib/exec'; + +export async function isInstalled(): Promise { + return await io + .which(bin(), true) + .then(res => { + core.debug(`qemu.isInstalled ok: ${res}`); + return true; + }) + .catch(error => { + core.debug(`qemu.isInstalled error: ${error}`); + return false; + }); +} + +export async function printVersion(): Promise { + await Exec.exec(bin(), ['--version']); +} + +export function bin(): string { + return `qemu-system-${arch()}`; +} + +function arch(): string { + switch (os.arch()) { + case 'x64': { + return 'x86_64'; + } + case 'arm64': { + return 'aarch64'; + } + default: { + return os.arch(); + } + } +}