From f5d209bc1a74bf532493b0e6283aa198175ca204 Mon Sep 17 00:00:00 2001 From: Moe Abushawish Date: Mon, 20 Jul 2020 15:58:21 -0400 Subject: [PATCH] Support signing multiple release files (#1) --- __tests__/io-utils.test.ts | 14 +++-------- lib/io-utils.js | 17 ++++++-------- lib/main.js | 48 ++++++++++++++++++++------------------ src/io-utils.ts | 14 +++++------ src/main.ts | 48 +++++++++++++++++++------------------- 5 files changed, 65 insertions(+), 76 deletions(-) diff --git a/__tests__/io-utils.test.ts b/__tests__/io-utils.test.ts index 5d9df586..4a0fdbdb 100644 --- a/__tests__/io-utils.test.ts +++ b/__tests__/io-utils.test.ts @@ -1,12 +1,4 @@ -import { Dirent } from "fs"; -import { getReleaseFile } from "../src/io-utils"; - -describe("getReleaseFile", () => { - it("should return undefined when the given release files is an empty array", () => - expect(getReleaseFile([])).toEqual(undefined)); - - it("should return the first release file", () => { - const file = { name: "file" } as Dirent; - expect(getReleaseFile([file])).toEqual(file); - }); +describe("exampleTest", () => { + it("this is a dummy test demonstrating unit testing", () => + expect("hello").toEqual("hello")); }); diff --git a/lib/io-utils.js b/lib/io-utils.js index acfa7bfe..dd63fb84 100644 --- a/lib/io-utils.js +++ b/lib/io-utils.js @@ -3,18 +3,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.findReleaseFile = exports.getReleaseFile = void 0; +exports.findReleaseFiles = void 0; const fs_1 = __importDefault(require("fs")); -function getReleaseFile(files) { - if (files.length > 0) { - return files[0]; - } -} -exports.getReleaseFile = getReleaseFile; -function findReleaseFile(releaseDir) { +function findReleaseFiles(releaseDir) { const releaseFiles = fs_1.default.readdirSync(releaseDir, { withFileTypes: true }) .filter(item => !item.isDirectory()) .filter(item => item.name.endsWith(".apk") || item.name.endsWith(".aab")); - return getReleaseFile(releaseFiles); + console.log("Found " + releaseFiles.length + " release files."); + if (releaseFiles.length > 0) { + return releaseFiles; + } } -exports.findReleaseFile = findReleaseFile; +exports.findReleaseFiles = findReleaseFiles; diff --git a/lib/main.js b/lib/main.js index 6dc13601..c11e8a72 100644 --- a/lib/main.js +++ b/lib/main.js @@ -49,34 +49,36 @@ function run() { const keyStorePassword = core.getInput('keyStorePassword'); const keyPassword = core.getInput('keyPassword'); console.log(`Preparing to sign key @ ${releaseDir} with signing key`); - // 1. Find release file - const releaseFile = io.findReleaseFile(releaseDir); - if (releaseFile !== undefined) { - core.debug(`Found release to sign: ${releaseFile.name}`); - // 3. Now that we have a release file, decode and save the signing key + // 1. Find release files + const releaseFiles = io.findReleaseFiles(releaseDir); + if (releaseFiles !== undefined) { + // 3. Now that we have a release files, decode and save the signing key const signingKey = path_1.default.join(releaseDir, 'signingKey.jks'); fs_1.default.writeFileSync(signingKey, signingKeyBase64, 'base64'); - // 4. Now zipalign the release file - const releaseFilePath = path_1.default.join(releaseDir, releaseFile.name); - let signedReleaseFile = ''; - if (releaseFile.name.endsWith('.apk')) { - signedReleaseFile = yield signing_1.signApkFile(releaseFilePath, signingKey, alias, keyStorePassword, keyPassword); + // 4. Now zipalign and sign each one of the the release files + for (let releaseFile of releaseFiles) { + core.debug(`Found release to sign: ${releaseFile.name}`); + const releaseFilePath = path_1.default.join(releaseDir, releaseFile.name); + let signedReleaseFile = ''; + if (releaseFile.name.endsWith('.apk')) { + signedReleaseFile = yield signing_1.signApkFile(releaseFilePath, signingKey, alias, keyStorePassword, keyPassword); + } + else if (releaseFile.name.endsWith('.aab')) { + signedReleaseFile = yield signing_1.signAabFile(releaseFilePath, signingKey, alias, keyStorePassword, keyPassword); + } + else { + core.error('No valid release file to sign, abort.'); + core.setFailed('No valid release file to sign.'); + } + core.debug('Release signed! Setting outputs.'); + core.exportVariable("SIGNED_RELEASE_FILE", signedReleaseFile); + core.setOutput('signedReleaseFile', signedReleaseFile); } - else if (releaseFile.name.endsWith('.aab')) { - signedReleaseFile = yield signing_1.signAabFile(releaseFilePath, signingKey, alias, keyStorePassword, keyPassword); - } - else { - core.error('No valid release file to sign, abort.'); - core.setFailed('No valid release file to sign.'); - } - console.log('Release signed!'); - core.debug('Release signed! Setting outputs'); - core.exportVariable("SIGNED_RELEASE_FILE", signedReleaseFile); - core.setOutput('signedReleaseFile', signedReleaseFile); + console.log('Releases signed!'); } else { - core.error("No release file (.apk or .aab) could be found. Abort."); - core.setFailed('No release file (.apk or .aab) could be found.'); + core.error("No release files (.apk or .aab) could be found. Abort."); + core.setFailed('No release files (.apk or .aab) could be found.'); } } catch (error) { diff --git a/src/io-utils.ts b/src/io-utils.ts index 2d661cfd..d997a6a4 100644 --- a/src/io-utils.ts +++ b/src/io-utils.ts @@ -1,17 +1,15 @@ import {Dirent} from "fs"; import fs from "fs"; -export function getReleaseFile(files: Dirent[]): Dirent | undefined { - if (files.length > 0) { - return files[0] - } -} - -export function findReleaseFile(releaseDir: string): Dirent | undefined { +export function findReleaseFiles(releaseDir: string): Dirent[] | undefined { const releaseFiles = fs.readdirSync(releaseDir, {withFileTypes: true}) .filter(item => !item.isDirectory()) .filter(item => item.name.endsWith(".apk") || item.name.endsWith(".aab")); - return getReleaseFile(releaseFiles) + console.log("Found " + releaseFiles.length + " release files.") + + if (releaseFiles.length > 0) { + return releaseFiles + } } diff --git a/src/main.ts b/src/main.ts index 9d7d8918..a0c4cc1d 100644 --- a/src/main.ts +++ b/src/main.ts @@ -19,35 +19,35 @@ async function run() { console.log(`Preparing to sign key @ ${releaseDir} with signing key`); - // 1. Find release file - const releaseFile = io.findReleaseFile(releaseDir); - if (releaseFile !== undefined) { - core.debug(`Found release to sign: ${releaseFile.name}`); - - // 3. Now that we have a release file, decode and save the signing key + // 1. Find release files + const releaseFiles = io.findReleaseFiles(releaseDir); + if (releaseFiles !== undefined) { + // 3. Now that we have a release files, decode and save the signing key const signingKey = path.join(releaseDir, 'signingKey.jks'); fs.writeFileSync(signingKey, signingKeyBase64, 'base64'); - // 4. Now zipalign the release file - const releaseFilePath = path.join(releaseDir, releaseFile.name); - let signedReleaseFile = ''; - if (releaseFile.name.endsWith('.apk')) { - signedReleaseFile = await signApkFile(releaseFilePath, signingKey, alias, keyStorePassword, keyPassword); - } else if (releaseFile.name.endsWith('.aab')) { - signedReleaseFile = await signAabFile(releaseFilePath, signingKey, alias, keyStorePassword, keyPassword); - } else { - core.error('No valid release file to sign, abort.'); - core.setFailed('No valid release file to sign.'); + // 4. Now zipalign and sign each one of the the release files + for (let releaseFile of releaseFiles) { + core.debug(`Found release to sign: ${releaseFile.name}`); + const releaseFilePath = path.join(releaseDir, releaseFile.name); + let signedReleaseFile = ''; + if (releaseFile.name.endsWith('.apk')) { + signedReleaseFile = await signApkFile(releaseFilePath, signingKey, alias, keyStorePassword, keyPassword); + } else if (releaseFile.name.endsWith('.aab')) { + signedReleaseFile = await signAabFile(releaseFilePath, signingKey, alias, keyStorePassword, keyPassword); + } else { + core.error('No valid release file to sign, abort.'); + core.setFailed('No valid release file to sign.'); + } + + core.debug('Release signed! Setting outputs.'); + core.exportVariable("SIGNED_RELEASE_FILE", signedReleaseFile); + core.setOutput('signedReleaseFile', signedReleaseFile); } - - console.log('Release signed!'); - core.debug('Release signed! Setting outputs'); - - core.exportVariable("SIGNED_RELEASE_FILE", signedReleaseFile); - core.setOutput('signedReleaseFile', signedReleaseFile); + console.log('Releases signed!'); } else { - core.error("No release file (.apk or .aab) could be found. Abort."); - core.setFailed('No release file (.apk or .aab) could be found.'); + core.error("No release files (.apk or .aab) could be found. Abort."); + core.setFailed('No release files (.apk or .aab) could be found.'); } } catch (error) { core.setFailed(error.message);