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

Bump Ubuntu to 20.04 #81

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

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: "Test hypervisor support on ubuntu"
on: push
jobs:
test:
runs-on: ubuntu-18.04
runs-on: ubuntu-20.04
steps:
- run: cat /sys/hypervisor/properties/capabilities || true
name: xen
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/test-linux.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: "Test Linux"
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-18.04
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v1
- name: test install-sdk
Expand Down
120 changes: 120 additions & 0 deletions emulator-run-cmd/lib/emulator.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Emulator = void 0;
const exec_with_result_1 = require("./exec-with-result");
class Emulator {
constructor(sdk, name, api, abi, tag, adbPort, telnetPort) {
this.sdk = sdk;
this.name = name;
this.api = api;
this.abi = abi;
this.tag = tag;
this.adbPort = adbPort;
this.telnetPort = telnetPort;
}
start(cmdOptions, bootTimeout) {
return __awaiter(this, void 0, void 0, function* () {
yield (0, exec_with_result_1.execIgnoreFailure)(`bash -c \\\"${this.sdk.emulatorCmd()} @${this.name} ${cmdOptions} &\"`);
let booted = yield this.waitForBoot(bootTimeout);
console.log(`booted=${booted}`);
return booted;
});
}
stop() {
return __awaiter(this, void 0, void 0, function* () {
yield (0, exec_with_result_1.execIgnoreFailure)(`bash -c \\\"${this.sdk.androidHome()}/platform-tools/adb -s emulator-${this.adbPort} emu kill\"`);
console.log("emu kill finished");
return;
});
}
waitForBoot(timeout) {
return __awaiter(this, void 0, void 0, function* () {
for (let countdown = timeout; countdown > 0; countdown--) {
if (countdown == 0) {
console.error("Timeout waiting for the emulator");
return false;
}
try {
let output = yield this.execAdbCommand("shell getprop sys.boot_completed");
if (output.trim() == '1') {
countdown = 0;
console.log("Emulator booted");
return true;
}
}
catch (e) {
if (e instanceof Error) {
console.error(e.message);
}
else {
console.error(e);
}
}
console.log("Sleeping for 1s");
yield sleep(1000);
countdown--;
}
console.log("Timeout waiting for emulator to boot. Exiting");
return false;
});
}
unlock() {
return __awaiter(this, void 0, void 0, function* () {
yield this.execAdbCommand("shell input keyevent 82");
});
}
disableAnimations() {
return __awaiter(this, void 0, void 0, function* () {
console.log('Disabling animations');
try {
yield this.execAdbCommand("shell settings put global window_animation_scale 0.0");
yield this.execAdbCommand("shell settings put global transition_animation_scale 0.0");
yield this.execAdbCommand("shell settings put global animator_duration_scale 0.0");
}
catch (e) {
console.warn("error disabling animations. skipping");
}
});
}
execAdbCommand(args) {
return __awaiter(this, void 0, void 0, function* () {
return yield (0, exec_with_result_1.execIgnoreFailure)(`${this.sdk.androidHome()}/platform-tools/adb -s emulator-${this.adbPort} ${args}`);
});
}
startLogcat() {
return __awaiter(this, void 0, void 0, function* () {
console.log('Starting logcat read process');
try {
yield (0, exec_with_result_1.execIgnoreFailure)(`mkdir -p artifacts`);
yield (0, exec_with_result_1.execIgnoreFailure)(`bash -c \\\"${this.sdk.androidHome()}/platform-tools/adb -s emulator-${this.adbPort} logcat -dv time > artifacts/logcat.log &\"`);
}
catch (e) {
console.warn("can't start logcat read process. skipping");
}
});
}
stopLogcat() {
return __awaiter(this, void 0, void 0, function* () {
console.log('Stopping logcat read process');
try {
yield (0, exec_with_result_1.execIgnoreFailure)(`kill $(jobs -p)`);
}
catch (e) {
console.warn("can't stop logcat read process. skipping");
}
});
}
}
exports.Emulator = Emulator;
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
46 changes: 46 additions & 0 deletions emulator-run-cmd/lib/exec-with-result.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Result = exports.execIgnoreFailure = void 0;
const exec_1 = require("@actions/exec");
function execWithResult(commandLine, args, options) {
return __awaiter(this, void 0, void 0, function* () {
let result = new Result();
let exitCode = yield (0, exec_1.exec)(commandLine, args, Object.assign(Object.assign({}, options), { listeners: {
stdout: (data) => {
result.stdout += data.toString();
},
stderr: (data) => {
result.stderr += data.toString();
}
} }));
result.stdout = result.stdout.trim();
result.stderr = result.stderr.trim();
result.exitCode = exitCode;
return result;
});
}
exports.default = execWithResult;
function execIgnoreFailure(commandLine, args, options) {
return __awaiter(this, void 0, void 0, function* () {
let result = yield execWithResult(commandLine, args, options);
return result.stdout;
});
}
exports.execIgnoreFailure = execIgnoreFailure;
class Result {
constructor() {
this.exitCode = 0;
this.stdout = '';
this.stderr = '';
}
}
exports.Result = Result;
155 changes: 155 additions & 0 deletions emulator-run-cmd/lib/main.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const core = __importStar(require("@actions/core"));
const sdk_1 = require("./sdk");
const exec_with_result_1 = __importDefault(require("./exec-with-result"));
function run() {
return __awaiter(this, void 0, void 0, function* () {
try {
let api = core.getInput('api', { required: false });
if (api == null || api == "") {
console.log(`API not set. Using 25`);
api = '25';
}
let abi = core.getInput('abi', { required: false });
if (abi == null || abi == "") {
console.log(`ABI not set. Using armeabi-v7a`);
abi = 'armeabi-v7a';
}
let tag = core.getInput('tag', { required: false });
if (tag !== "default" && tag !== "google_apis") {
console.log(`Unknown tag ${tag}. Using default`);
tag = 'default';
}
let verbose = false;
if (core.getInput('verbose') == "true") {
verbose = true;
}
let cmd = core.getInput('cmd', { required: true });
if (cmd === "") {
console.error("Please specify cmd to execute in parallel with emulator");
return;
}
let cmdOptions = core.getInput('cmdOptions');
if (cmdOptions == null) {
cmdOptions = "-no-snapshot-save -noaudio -no-boot-anim";
}
let hardwareProfile = core.getInput('hardwareProfile');
if (hardwareProfile == null) {
hardwareProfile = "";
}
let disableAnimations = false;
if (core.getInput('disableAnimations') == "true") {
disableAnimations = true;
}
let bootTimeout = core.getInput('bootTimeout');
if (bootTimeout == null) {
bootTimeout = '600';
}
console.log(`Starting emulator with API=${api}, TAG=${tag} and ABI=${abi}...`);
const androidHome = process.env.ANDROID_HOME;
console.log(`ANDROID_HOME is ${androidHome}`);
console.log(`PATH is ${process.env.PATH}`);
let sdk = new sdk_1.SdkFactory().getAndroidSdk();
try {
yield sdk.installEmulatorPackage(api, tag, abi, verbose);
yield sdk.installPlatform(api, verbose);
let supportsHardwareAcceleration = yield sdk.verifyHardwareAcceleration();
if (!supportsHardwareAcceleration && abi == "x86") {
core.setFailed('Hardware acceleration is not supported');
return;
}
let emulator = yield sdk.createEmulator("emulator", api, tag, abi, hardwareProfile);
console.log("starting adb server");
yield sdk.startAdbServer();
let booted = yield emulator.start(cmdOptions, +bootTimeout);
if (!booted) {
core.setFailed("emulator boot failed");
yield emulator.stop();
return;
}
//Pre-setup
yield emulator.unlock();
if (disableAnimations) {
yield emulator.disableAnimations();
}
yield emulator.startLogcat();
console.log("emulator started and booted");
try {
let result = yield (0, exec_with_result_1.default)(`${cmd}`);
let code = result.exitCode;
if (code != 0) {
core.setFailed(`process exited with code ${code}`);
}
}
catch (e) {
if (e instanceof Error) {
core.setFailed(e.message);
}
else {
core.setFailed("unknown (error !instanceof Error) occurred");
}
}
console.log("stopping emulator");
yield emulator.stop();
yield emulator.stopLogcat();
console.log("emulator is stopped");
}
catch (error) {
console.error(error);
if (error instanceof Error) {
core.setFailed(error.message);
}
else {
core.setFailed("unknown (error !instanceof Error) occurred");
}
return;
}
}
catch (error) {
if (error instanceof Error) {
core.setFailed(error.message);
}
else {
core.setFailed("unknown (error !instanceof Error) occurred");
}
return;
}
});
}
run();
Loading