Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

display QEMU version installed on the runner #116

Draft
wants to merge 2 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
36 changes: 36 additions & 0 deletions .github/workflows/ci.yml
Expand Up @@ -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
24 changes: 24 additions & 0 deletions __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']);
});
});
6 changes: 3 additions & 3 deletions dist/index.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dist/index.js.map

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions package.json
Expand Up @@ -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": {
Expand Down
9 changes: 9 additions & 0 deletions 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';
Expand All @@ -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();
Expand Down
39 changes: 39 additions & 0 deletions 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<boolean> {
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<void> {
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();
}
}
}