20 Commits

Author SHA1 Message Date
Drew Heavner
2f949adc6e Removed call to developer api to pull the releaseName for the edit and instead used result from actual update to the track.
Added more debug logging.
2020-12-10 11:36:45 -05:00
Drew Heavner
f9a7fda708 Bumped version for release
Adjusted 'packageName' order in params to be consistent
2020-12-09 14:11:55 -05:00
Drew Heavner
05570869bd Merge pull request #47 from xom9ikk/master
Add missing params
2020-12-09 14:10:53 -05:00
Max Romanyuta
aa45a3257f Merge branch 'patch-1' 2020-12-09 18:41:30 +02:00
Max Romanyuta
fc490c3965 Add auth 2020-12-09 18:41:12 +02:00
Max Romanyuta
d5d1fde18f Merge branch 'patch-1' 2020-12-09 18:30:30 +02:00
Max Romanyuta
df30106c36 Add missing params 2020-12-09 18:29:00 +02:00
Drew Heavner
f8ef4b661c Merge pull request #45 from boswelja/name-output-improvements
Name output improvements
2020-12-08 09:32:42 -05:00
Jack Boswell (boswelja)
264c36bf24 Merge branch 'name-output-improvements' of https://github.com/boswelja/upload-google-play into name-output-improvements 2020-12-08 16:58:08 +13:00
Jack Boswell (boswelja)
8e8abbe013 Add await to getPublishedReleaseName 2020-12-08 16:58:04 +13:00
Jack Boswell (boswelja)
350f04f6ed Add await to getPublishedReleaseName 2020-12-08 16:56:23 +13:00
Jack Boswell (boswelja)
e18996b17e Update README to reflect the added output 2020-12-08 16:55:59 +13:00
Jack Boswell (boswelja)
af37686362 Only fetch release name if the user didn't specify one
This should improve performance when manually setting a release name
2020-12-08 16:52:47 +13:00
Drew Heavner
a899564283 Merge pull request #43 from boswelja/output-release-name
Output published release name on success
2020-12-01 16:19:21 -05:00
Jack Boswell (boswelja)
373fb32d65 Output published release name on success 2020-12-01 17:53:30 +13:00
Drew Heavner
3ea191f69b Merge pull request #37 from AChep/patch-1
Use double-quotes in descriptions
2020-11-11 15:35:38 -05:00
Artem Chepurnoy
09f486f773 Use double-quotes in descrptions 2020-11-11 21:15:32 +02:00
Drew Heavner
6bdd0b899a Added 'releaseFile' back to action to maintain backwards compatibility. 2020-11-11 09:46:26 -05:00
Drew Heavner
e0b7d9bc3e Merge pull request #35 from r0adkll/feature/inappupdatepriority
Release v1.0.6
2020-11-11 09:20:50 -05:00
Drew Heavner
e8f8537caf Fixed typo in inAppUpdatePriority input check 2020-11-11 09:19:29 -05:00
7 changed files with 118 additions and 34 deletions

View File

@@ -18,9 +18,14 @@ The service account json in plain text, provided via a secret, etc.
**Required:** The package name, or Application Id, of the app you are uploading
### `releaseFiles`
### `releaseFile`
**DEPRECATED:** Please switch to using `releaseFiles` as this will be removed in the future
The Android release file to upload (.apk or .aab)
**Required:** The Android release file(s) to upload (.apk or .aab). Multiple files are separated by ','.
### `releaseFiles`
**CAVEAT:** Either this or `releaseFile` are required
The Android release file(s) to upload (.apk or .aab). Multiple files are separated by ','.
### `releaseName`
@@ -29,14 +34,14 @@ The release name. Not required to be unique. If not set, the name is generated f
### `track`
**Required:** The track in which you want to assign the uploaded app.
**Default:** `production`
**Default:** `production`
_Values:_ `alpha`, `beta`, `internal`, `production`, `internalsharing`
### `inAppUpdatePriority`
In-app update priority of the release. All newly added APKs in the release will be considered at this priority. Can take values in the range [0, 5], with 5 the highest priority.
**Default:** `0`
**Default:** `0`
_Values:_ `[0, 5]`
### `userFraction`
@@ -67,6 +72,10 @@ The mapping.txt file used to de-obfuscate your stack traces from crash reports
## Outputs
### `releaseName`
The name of the release published to Google Play, which is generated on commit by default
### `internalSharingDownloadUrl`
The download url for an app that was uploaded using the `track` `internalsharing`

View File

@@ -1,41 +1,44 @@
name: 'Upload Android Release to Play Store'
description: 'An action to upload a signed Android release (.apk or .aab) to the Google Play Store Developer Console'
description: "An action to upload a signed Android release (.apk or .aab) to the Google Play Store Developer Console"
author: 'r0adkll'
branding:
icon: 'truck'
color: 'orange'
inputs:
serviceAccountJson:
description: 'The service account json private key file to authorize the upload request'
description: "The service account json private key file to authorize the upload request"
required: false
serviceAccountJsonPlainText:
description: 'The raw json text of the service account private key to authorize the upload request'
description: "The raw json text of the service account private key to authorize the upload request"
required: false
packageName:
description: 'The package name, or Application Id, of the app you are uploading'
description: "The package name, or Application Id, of the app you are uploading"
required: true
releaseFile:
description: "The Android release file to upload (.apk or .aab)"
required: false
releaseFiles:
description: "The Android release file(s) to upload (.apk or .aab). Separated by a ',' for multiple artifacts"
required: true
required: false
releaseName:
description: 'The name of this release. If not set it's generated automatically from the APKs versionName'
description: "The name of this release. If not set it's generated automatically from the APKs versionName"
required: false
track:
description: 'The track in which you want to assign the uploaded app.'
description: "The track in which you want to assign the uploaded app."
default: 'production'
required: true
inAppUpdatePriority:
description: 'In-app update priority of the release. All newly added APKs in the release will be considered at this priority. Can take values in the range [0, 5], with 5 the highest priority. Defaults to 0.'
description: "In-app update priority of the release. All newly added APKs in the release will be considered at this priority. Can take values in the range [0, 5], with 5 the highest priority. Defaults to 0."
default: '0'
required: false
userFraction:
description: 'Portion of users who should get the staged version of the app. Accepts values between 0.0 and 1.0 (exclusive-exclusive).'
description: "Portion of users who should get the staged version of the app. Accepts values between 0.0 and 1.0 (exclusive-exclusive)."
required: false
whatsNewDirectory:
description: 'The directory of localized whats new files'
description: "The directory of localized whats new files"
required: false
mappingFile:
description: 'The mapping.txt file used to de-obfuscate your stack traces from crash reports'
description: "The mapping.txt file used to de-obfuscate your stack traces from crash reports"
required: false
outputs:
internalSharingDownloadUrl:

View File

@@ -60,7 +60,7 @@ function uploadToPlayStore(options, releaseFiles) {
return Promise.reject(reason);
});
// Upload artifacts to Google Play, and store their version codes
var versionCodes = new Array();
const versionCodes = new Array();
for (const releaseFile of releaseFiles) {
core.debug(`Uploading ${releaseFile}`);
const versionCode = yield uploadRelease(appEdit.data, options, releaseFile).catch(reason => {
@@ -71,6 +71,14 @@ function uploadToPlayStore(options, releaseFiles) {
}
// Add the uploaded artifacts to the Edit track
const track = yield addReleasesToTrack(appEdit.data, options, versionCodes);
core.debug(`Track: ${track}`);
// Extract the release name for the response
let trackReleaseName;
if (track.releases && track.releases.length > 0) {
const trackRelease = track.releases[0];
trackReleaseName = trackRelease.name;
core.debug(`Pulled track release name from update: ${trackReleaseName}`);
}
// Commit the pending Edit
const res = yield androidPublisher.edits.commit({
auth: options.auth,
@@ -80,6 +88,13 @@ function uploadToPlayStore(options, releaseFiles) {
// Simple check to see whether commit was successful
if (res.data.id != null) {
core.debug(`Successfully committed ${res.data.id}`);
const name = options.name || trackReleaseName;
if (name) {
core.setOutput("releaseName", name);
}
else {
core.debug("Unable to set 'releaseName' output.");
}
return Promise.resolve(res.data.id);
}
else {

View File

@@ -36,12 +36,14 @@ const auth = new google.auth.GoogleAuth({
scopes: ['https://www.googleapis.com/auth/androidpublisher']
});
function run() {
var _a, _b;
return __awaiter(this, void 0, void 0, function* () {
try {
const serviceAccountJson = core.getInput('serviceAccountJson', { required: false });
const serviceAccountJsonRaw = core.getInput('serviceAccountJsonPlainText', { required: false });
const packageName = core.getInput('packageName', { required: true });
const releaseFiles = core.getInput('releaseFiles', { required: true }).split(',').filter(x => x !== '');
const releaseFile = core.getInput('releaseFile', { required: false });
const releaseFiles = ((_b = (_a = core.getInput('releaseFiles', { required: false })) === null || _a === void 0 ? void 0 : _a.split(',')) === null || _b === void 0 ? void 0 : _b.filter(x => x !== '')) || [];
const releaseName = core.getInput('releaseName', { required: false });
const track = core.getInput('track', { required: true });
const inAppUpdatePriority = core.getInput('inAppUpdatePriority', { required: false });
@@ -52,6 +54,7 @@ function run() {
if (!serviceAccountJson && !serviceAccountJsonRaw) {
console.log("No service account json key provided!");
core.setFailed("You must provide one of 'serviceAccountJson' or 'serviceAccountJsonPlainText' to use this action");
return;
}
// If the user has provided the raw plain text via secrets, or w/e, then write to file and
// set appropriate env variable for the auth
@@ -80,7 +83,7 @@ function run() {
}
// Validate the inAppUpdatePriority to be a valid number in within [0, 5]
let inAppUpdatePriorityInt = parseInt(inAppUpdatePriority);
if (~isNaN(inAppUpdatePriorityInt)) {
if (!isNaN(inAppUpdatePriorityInt)) {
if (inAppUpdatePriorityInt < 0 || inAppUpdatePriorityInt > 5) {
core.setFailed('inAppUpdatePriority must be between 0 and 5, inclusive-inclusive');
return;
@@ -89,13 +92,32 @@ function run() {
else {
inAppUpdatePriorityInt = undefined;
}
// Check release files
for (const releaseFile of releaseFiles) {
// Check release files while maintaining backward compatibility
let validatedReleaseFiles = [];
if (releaseFiles.length == 0 && !releaseFile) {
core.setFailed(`You must provide either 'releaseFile' or 'releaseFiles' in your configuration.`);
return;
}
else if (releaseFiles.length == 0 && releaseFile) {
core.warning(`WARNING!! 'releaseFile' is deprecated and will be removed in a future release. Please migrate to 'releaseFiles'.`);
core.debug(`Validating ${releaseFile} exists`);
if (!fs.existsSync(releaseFile)) {
core.setFailed(`Unable to find release file @ ${releaseFile}`);
return;
}
else {
validatedReleaseFiles = [releaseFile];
}
}
else if (releaseFiles.length > 0) {
for (const file of releaseFiles) {
core.debug(`Validating ${file} exists`);
if (!fs.existsSync(file)) {
core.setFailed(`Unable to find release file @ ${file}`);
return;
}
}
validatedReleaseFiles = releaseFiles;
}
if (whatsNewDir != undefined && whatsNewDir.length > 0 && !fs.existsSync(whatsNewDir)) {
core.setFailed(`Unable to find 'whatsnew' directory @ ${whatsNewDir}`);
@@ -106,7 +128,7 @@ function run() {
return;
}
const authClient = yield auth.getClient();
yield edits_1.uploadToPlayStore({
const result = yield edits_1.uploadToPlayStore({
auth: authClient,
applicationId: packageName,
track: track,
@@ -115,8 +137,8 @@ function run() {
whatsNewDir: whatsNewDir,
mappingFile: mappingFile,
name: releaseName
}, releaseFiles);
console.log(`Finished uploading to the Play Store`);
}, validatedReleaseFiles);
console.log(`Finished uploading to the Play Store: ${result}`);
}
catch (error) {
core.setFailed(error.message);

View File

@@ -1,6 +1,6 @@
{
"name": "upload-google-play",
"version": "1.0.6",
"version": "1.0.10",
"private": true,
"description": "Upload an Android release (.apk or .aab) to Google Play Console",
"main": "lib/main.js",

View File

@@ -54,7 +54,7 @@ export async function uploadToPlayStore(options: EditOptions, releaseFiles: stri
});
// Upload artifacts to Google Play, and store their version codes
var versionCodes = new Array<number>();
const versionCodes = new Array<number>();
for (const releaseFile of releaseFiles) {
core.debug(`Uploading ${releaseFile}`);
const versionCode = await uploadRelease(appEdit.data, options, releaseFile).catch(reason => {
@@ -66,6 +66,15 @@ export async function uploadToPlayStore(options: EditOptions, releaseFiles: stri
// Add the uploaded artifacts to the Edit track
const track = await addReleasesToTrack(appEdit.data, options, versionCodes);
core.debug(`Track: ${track}`);
// Extract the release name for the response
let trackReleaseName: string | undefined | null;
if (track.releases && track.releases.length > 0) {
const trackRelease = track.releases[0];
trackReleaseName = trackRelease.name;
core.debug(`Pulled track release name from update: ${trackReleaseName}`)
}
// Commit the pending Edit
const res = await androidPublisher.edits.commit({
@@ -77,6 +86,12 @@ export async function uploadToPlayStore(options: EditOptions, releaseFiles: stri
// Simple check to see whether commit was successful
if (res.data.id != null) {
core.debug(`Successfully committed ${res.data.id}`);
const name = options.name || trackReleaseName;
if (name) {
core.setOutput("releaseName", name);
} else {
core.debug("Unable to set 'releaseName' output.");
}
return Promise.resolve(res.data.id!);
} else {
core.setFailed(`Error ${res.status}: ${res.statusText}`);
@@ -237,4 +252,4 @@ async function uploadBundle(appEdit: AppEdit, options: EditOptions, bundleReleas
});
return res.data
}
}

View File

@@ -12,7 +12,10 @@ async function run() {
const serviceAccountJson = core.getInput('serviceAccountJson', { required: false });
const serviceAccountJsonRaw = core.getInput('serviceAccountJsonPlainText', { required: false});
const packageName = core.getInput('packageName', { required: true });
const releaseFiles = core.getInput('releaseFiles', { required: true }).split(',').filter(x => x !== '');
const releaseFile = core.getInput('releaseFile', { required: false });
const releaseFiles = core.getInput('releaseFiles', { required: false })
?.split(',')
?.filter(x => x !== '') || [];
const releaseName = core.getInput('releaseName', { required: false });
const track = core.getInput('track', { required: true });
const inAppUpdatePriority = core.getInput('inAppUpdatePriority', { required: false });
@@ -24,6 +27,7 @@ async function run() {
if (!serviceAccountJson && !serviceAccountJsonRaw) {
console.log("No service account json key provided!");
core.setFailed("You must provide one of 'serviceAccountJson' or 'serviceAccountJsonPlainText' to use this action");
return;
}
// If the user has provided the raw plain text via secrets, or w/e, then write to file and
@@ -56,7 +60,7 @@ async function run() {
// Validate the inAppUpdatePriority to be a valid number in within [0, 5]
let inAppUpdatePriorityInt: number | undefined = parseInt(inAppUpdatePriority);
if (~isNaN(inAppUpdatePriorityInt)) {
if (!isNaN(inAppUpdatePriorityInt)) {
if (inAppUpdatePriorityInt < 0 || inAppUpdatePriorityInt > 5) {
core.setFailed('inAppUpdatePriority must be between 0 and 5, inclusive-inclusive');
return;
@@ -65,13 +69,29 @@ async function run() {
inAppUpdatePriorityInt = undefined;
}
// Check release files
for (const releaseFile of releaseFiles) {
// Check release files while maintaining backward compatibility
let validatedReleaseFiles: string[] = [];
if (releaseFiles.length == 0 && !releaseFile) {
core.setFailed(`You must provide either 'releaseFile' or 'releaseFiles' in your configuration.`);
return;
} else if (releaseFiles.length == 0 && releaseFile) {
core.warning(`WARNING!! 'releaseFile' is deprecated and will be removed in a future release. Please migrate to 'releaseFiles'.`);
core.debug(`Validating ${releaseFile} exists`)
if (!fs.existsSync(releaseFile)) {
core.setFailed(`Unable to find release file @ ${releaseFile}`);
return
return;
} else {
validatedReleaseFiles = [releaseFile];
}
} else if (releaseFiles.length > 0) {
for (const file of releaseFiles) {
core.debug(`Validating ${file} exists`)
if (!fs.existsSync(file)) {
core.setFailed(`Unable to find release file @ ${file}`);
return;
}
}
validatedReleaseFiles = releaseFiles;
}
if (whatsNewDir != undefined && whatsNewDir.length > 0 && !fs.existsSync(whatsNewDir)) {
@@ -86,7 +106,7 @@ async function run() {
const authClient = await auth.getClient();
await uploadToPlayStore({
const result = await uploadToPlayStore({
auth: authClient,
applicationId: packageName,
track: track,
@@ -95,9 +115,9 @@ async function run() {
whatsNewDir: whatsNewDir,
mappingFile: mappingFile,
name: releaseName
}, releaseFiles);
}, validatedReleaseFiles);
console.log(`Finished uploading to the Play Store`)
console.log(`Finished uploading to the Play Store: ${result}`)
} catch (error) {
core.setFailed(error.message)
}