7 Commits

Author SHA1 Message Date
Drew Heavner
ca061d798d Merge pull request #53 from lriccardo/master
Add internal sharing download url to outputs and env
2020-12-30 15:29:09 -05:00
Riccardo Lattarulo
21e00b9d69 Update documentation to address the addition of multiple urls as output for internal sharing 2020-12-29 17:39:10 +01:00
Riccardo Lattarulo
e9a4446395 Add multiple urls to internal sharing outputs 2020-12-23 10:16:35 +01:00
Riccardo Lattarulo
b06f374506 Add internal sharing download url to output 2020-12-22 16:57:37 +01:00
Drew Heavner
84d17e8c1c Merge pull request #50 from boswelja/add-console-output
Add some output for the user to read while the action is running
2020-12-16 10:23:49 -05:00
Jack Boswell (boswelja)
40448bb1bb Add some output for the user to read while the action is running 2020-12-12 18:38:17 +13:00
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
7 changed files with 98 additions and 48 deletions

View File

@@ -76,9 +76,17 @@ The mapping.txt file used to de-obfuscate your stack traces from crash reports
The name of the release published to Google Play, which is generated on commit by default The name of the release published to Google Play, which is generated on commit by default
### `internalSharingDownloadUrls`
A JSON list containing the download urls for every release file uploaded using the `track` `internalsharing`
### ENV VAR: `INTERNAL_SHARING_DOWNLOAD_URLS`
The environment variable that is set when using the `track` `internalsharing`
### `internalSharingDownloadUrl` ### `internalSharingDownloadUrl`
The download url for an app that was uploaded using the `track` `internalsharing` The download url for the last release file uploaded using the `track` `internalsharing`, useful when a single release file is uploaded
### ENV VAR: `INTERNAL_SHARING_DOWNLOAD_URL` ### ENV VAR: `INTERNAL_SHARING_DOWNLOAD_URL`

View File

@@ -14,7 +14,7 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
var __importStar = (this && this.__importStar) || function (mod) { var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod; if (mod && mod.__esModule) return mod;
var result = {}; var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod); __setModuleDefault(result, mod);
return result; return result;
}; };
@@ -40,38 +40,61 @@ function uploadToPlayStore(options, releaseFiles) {
// Check the 'track' for 'internalsharing', if so switch to a non-track api // Check the 'track' for 'internalsharing', if so switch to a non-track api
if (options.track === 'internalsharing') { if (options.track === 'internalsharing') {
core.debug("Track is Internal app sharing, switch to special upload api"); core.debug("Track is Internal app sharing, switch to special upload api");
let downloadUrls = []
for (const releaseFile of releaseFiles) { for (const releaseFile of releaseFiles) {
core.debug(`Uploading ${releaseFile}`); core.debug(`Uploading ${releaseFile}`);
yield uploadInternalSharingRelease(options, releaseFile).catch(reason => { yield uploadInternalSharingRelease(options, releaseFile)
core.setFailed(reason); .then(downloadUrl => {
return Promise.reject(reason); downloadUrls.push(downloadUrl)
}); })
.catch(reason => {
core.setFailed(reason);
return Promise.reject(reason);
});
} }
core.setOutput("internalSharingDownloadUrls", downloadUrls);
core.exportVariable("INTERNAL_SHARING_DOWNLOAD_URLS", downloadUrls);
} }
else { else {
// Create a new Edit // Create a new Edit
core.info(`Creating a new Edit for this release`);
const appEdit = yield androidPublisher.edits.insert({ const appEdit = yield androidPublisher.edits.insert({
auth: options.auth, auth: options.auth,
packageName: options.applicationId packageName: options.applicationId
}); });
// Validate the given track // Validate the given track
core.info(`Validating track '${options.track}'`);
yield validateSelectedTrack(appEdit.data, options).catch(reason => { yield validateSelectedTrack(appEdit.data, options).catch(reason => {
core.setFailed(reason); core.setFailed(reason);
return Promise.reject(reason); return Promise.reject(reason);
}); });
// Upload artifacts to Google Play, and store their version codes // Upload artifacts to Google Play, and store their version codes
var versionCodes = new Array(); const versionCodes = new Array();
for (const releaseFile of releaseFiles) { for (const releaseFile of releaseFiles) {
core.debug(`Uploading ${releaseFile}`); core.info(`Uploading ${releaseFile}`);
const versionCode = yield uploadRelease(appEdit.data, options, releaseFile).catch(reason => { const versionCode = yield uploadRelease(appEdit.data, options, releaseFile).catch(reason => {
core.setFailed(reason); core.setFailed(reason);
return Promise.reject(reason); return Promise.reject(reason);
}); });
versionCodes.push(versionCode); versionCodes.push(versionCode);
} }
core.info(`Successfully uploaded ${versionCodes.length} artifacts`);
// Add the uploaded artifacts to the Edit track // Add the uploaded artifacts to the Edit track
core.info(`Adding ${versionCodes.length} artifacts to release on '${options.track}' track`);
const track = yield addReleasesToTrack(appEdit.data, options, versionCodes); 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}`);
}
else {
core.debug(`Didn't find any releases on the track`);
}
// Commit the pending Edit // Commit the pending Edit
core.info(`Committing the Edit`);
const res = yield androidPublisher.edits.commit({ const res = yield androidPublisher.edits.commit({
auth: options.auth, auth: options.auth,
editId: appEdit.data.id, editId: appEdit.data.id,
@@ -80,8 +103,14 @@ function uploadToPlayStore(options, releaseFiles) {
// Simple check to see whether commit was successful // Simple check to see whether commit was successful
if (res.data.id != null) { if (res.data.id != null) {
core.debug(`Successfully committed ${res.data.id}`); core.debug(`Successfully committed ${res.data.id}`);
const name = options.name || (yield getPublishedReleaseName(res.data, options)); const name = options.name || trackReleaseName;
core.setOutput("releaseName", name); core.info(`Successfully committed release ${name}`);
if (name) {
core.setOutput("releaseName", name);
}
else {
core.debug("Unable to set 'releaseName' output.");
}
return Promise.resolve(res.data.id); return Promise.resolve(res.data.id);
} }
else { else {
@@ -96,11 +125,15 @@ function uploadInternalSharingRelease(options, releaseFile) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
if (releaseFile.endsWith('.apk')) { if (releaseFile.endsWith('.apk')) {
const res = yield internalSharingUploadApk(options, releaseFile); const res = yield internalSharingUploadApk(options, releaseFile);
core.setOutput("internalSharingDownloadUrl", res.downloadUrl);
core.exportVariable("INTERNAL_SHARING_DOWNLOAD_URL", res.downloadUrl);
console.log(`${releaseFile} uploaded to Internal Sharing, download it with ${res.downloadUrl}`); console.log(`${releaseFile} uploaded to Internal Sharing, download it with ${res.downloadUrl}`);
return Promise.resolve(res.downloadUrl); return Promise.resolve(res.downloadUrl);
} }
else if (releaseFile.endsWith('.aab')) { else if (releaseFile.endsWith('.aab')) {
const res = yield internalSharingUploadBundle(options, releaseFile); const res = yield internalSharingUploadBundle(options, releaseFile);
core.setOutput("internalSharingDownloadUrl", res.downloadUrl);
core.exportVariable("INTERNAL_SHARING_DOWNLOAD_URL", res.downloadUrl);
console.log(`${releaseFile} uploaded to Internal Sharing, download it with ${res.downloadUrl}`); console.log(`${releaseFile} uploaded to Internal Sharing, download it with ${res.downloadUrl}`);
return Promise.resolve(res.downloadUrl); return Promise.resolve(res.downloadUrl);
} }
@@ -251,15 +284,3 @@ function uploadBundle(appEdit, options, bundleReleaseFile) {
return res.data; return res.data;
}); });
} }
function getPublishedReleaseName(appEdit, options) {
return __awaiter(this, void 0, void 0, function* () {
const track = yield androidPublisher.edits.tracks.get({
auth: options.auth,
packageName: options.applicationId,
editId: appEdit.id,
track: options.track
});
const release = track.data.releases[0]; // We only ever create one release, so grab the first one
return release.name;
});
}

View File

@@ -14,7 +14,7 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
var __importStar = (this && this.__importStar) || function (mod) { var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod; if (mod && mod.__esModule) return mod;
var result = {}; var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod); __setModuleDefault(result, mod);
return result; return result;
}; };
@@ -128,7 +128,7 @@ function run() {
return; return;
} }
const authClient = yield auth.getClient(); const authClient = yield auth.getClient();
yield edits_1.uploadToPlayStore({ const result = yield edits_1.uploadToPlayStore({
auth: authClient, auth: authClient,
applicationId: packageName, applicationId: packageName,
track: track, track: track,
@@ -138,7 +138,7 @@ function run() {
mappingFile: mappingFile, mappingFile: mappingFile,
name: releaseName name: releaseName
}, validatedReleaseFiles); }, validatedReleaseFiles);
console.log(`Finished uploading to the Play Store`); console.log(`Finished uploading to the Play Store: ${result}`);
} }
catch (error) { catch (error) {
core.setFailed(error.message); core.setFailed(error.message);

View File

@@ -14,7 +14,7 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
var __importStar = (this && this.__importStar) || function (mod) { var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod; if (mod && mod.__esModule) return mod;
var result = {}; var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod); __setModuleDefault(result, mod);
return result; return result;
}; };

View File

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

View File

@@ -33,41 +33,64 @@ export async function uploadToPlayStore(options: EditOptions, releaseFiles: stri
// Check the 'track' for 'internalsharing', if so switch to a non-track api // Check the 'track' for 'internalsharing', if so switch to a non-track api
if (options.track === 'internalsharing') { if (options.track === 'internalsharing') {
core.debug("Track is Internal app sharing, switch to special upload api") core.debug("Track is Internal app sharing, switch to special upload api")
let downloadUrls: string[] = []
for (const releaseFile of releaseFiles) { for (const releaseFile of releaseFiles) {
core.debug(`Uploading ${releaseFile}`); core.debug(`Uploading ${releaseFile}`);
await uploadInternalSharingRelease(options, releaseFile).catch(reason => { await uploadInternalSharingRelease(options, releaseFile)
core.setFailed(reason); .then(downloadUrl => {
return Promise.reject(reason); downloadUrls.push(downloadUrl as string)
}); })
.catch(reason => {
core.setFailed(reason);
return Promise.reject(reason);
});
} }
core.setOutput("internalSharingDownloadUrls", downloadUrls);
core.exportVariable("INTERNAL_SHARING_DOWNLOAD_URLS", downloadUrls);
} else { } else {
// Create a new Edit // Create a new Edit
core.info(`Creating a new Edit for this release`)
const appEdit = await androidPublisher.edits.insert({ const appEdit = await androidPublisher.edits.insert({
auth: options.auth, auth: options.auth,
packageName: options.applicationId packageName: options.applicationId
}); });
// Validate the given track // Validate the given track
core.info(`Validating track '${options.track}'`)
await validateSelectedTrack(appEdit.data, options).catch(reason => { await validateSelectedTrack(appEdit.data, options).catch(reason => {
core.setFailed(reason); core.setFailed(reason);
return Promise.reject(reason); return Promise.reject(reason);
}); });
// Upload artifacts to Google Play, and store their version codes // 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) { for (const releaseFile of releaseFiles) {
core.debug(`Uploading ${releaseFile}`); core.info(`Uploading ${releaseFile}`);
const versionCode = await uploadRelease(appEdit.data, options, releaseFile).catch(reason => { const versionCode = await uploadRelease(appEdit.data, options, releaseFile).catch(reason => {
core.setFailed(reason); core.setFailed(reason);
return Promise.reject(reason); return Promise.reject(reason);
}); });
versionCodes.push(versionCode!); versionCodes.push(versionCode!);
} }
core.info(`Successfully uploaded ${versionCodes.length} artifacts`)
// Add the uploaded artifacts to the Edit track // Add the uploaded artifacts to the Edit track
core.info(`Adding ${versionCodes.length} artifacts to release on '${options.track}' track`)
const track = await addReleasesToTrack(appEdit.data, options, versionCodes); 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}`)
} else {
core.debug(`Didn't find any releases on the track`)
}
// Commit the pending Edit // Commit the pending Edit
core.info(`Committing the Edit`)
const res = await androidPublisher.edits.commit({ const res = await androidPublisher.edits.commit({
auth: options.auth, auth: options.auth,
editId: appEdit.data.id!, editId: appEdit.data.id!,
@@ -77,8 +100,13 @@ export async function uploadToPlayStore(options: EditOptions, releaseFiles: stri
// Simple check to see whether commit was successful // Simple check to see whether commit was successful
if (res.data.id != null) { if (res.data.id != null) {
core.debug(`Successfully committed ${res.data.id}`); core.debug(`Successfully committed ${res.data.id}`);
const name = options.name || (await getPublishedReleaseName(res.data, options)); const name = options.name || trackReleaseName;
core.setOutput("releaseName", name) core.info(`Successfully committed release ${name}`)
if (name) {
core.setOutput("releaseName", name);
} else {
core.debug("Unable to set 'releaseName' output.");
}
return Promise.resolve(res.data.id!); return Promise.resolve(res.data.id!);
} else { } else {
core.setFailed(`Error ${res.status}: ${res.statusText}`); core.setFailed(`Error ${res.status}: ${res.statusText}`);
@@ -90,10 +118,14 @@ export async function uploadToPlayStore(options: EditOptions, releaseFiles: stri
async function uploadInternalSharingRelease(options: EditOptions, releaseFile: string): Promise<string | undefined | null> { async function uploadInternalSharingRelease(options: EditOptions, releaseFile: string): Promise<string | undefined | null> {
if (releaseFile.endsWith('.apk')) { if (releaseFile.endsWith('.apk')) {
const res = await internalSharingUploadApk(options, releaseFile) const res = await internalSharingUploadApk(options, releaseFile)
core.setOutput("internalSharingDownloadUrl", res.downloadUrl);
core.exportVariable("INTERNAL_SHARING_DOWNLOAD_URL", res.downloadUrl);
console.log(`${releaseFile} uploaded to Internal Sharing, download it with ${res.downloadUrl}`) console.log(`${releaseFile} uploaded to Internal Sharing, download it with ${res.downloadUrl}`)
return Promise.resolve(res.downloadUrl) return Promise.resolve(res.downloadUrl)
} else if (releaseFile.endsWith('.aab')) { } else if (releaseFile.endsWith('.aab')) {
const res = await internalSharingUploadBundle(options, releaseFile) const res = await internalSharingUploadBundle(options, releaseFile)
core.setOutput("internalSharingDownloadUrl", res.downloadUrl);
core.exportVariable("INTERNAL_SHARING_DOWNLOAD_URL", res.downloadUrl);
console.log(`${releaseFile} uploaded to Internal Sharing, download it with ${res.downloadUrl}`) console.log(`${releaseFile} uploaded to Internal Sharing, download it with ${res.downloadUrl}`)
return Promise.resolve(res.downloadUrl) return Promise.resolve(res.downloadUrl)
} else { } else {
@@ -239,15 +271,4 @@ async function uploadBundle(appEdit: AppEdit, options: EditOptions, bundleReleas
}); });
return res.data return res.data
}
async function getPublishedReleaseName(appEdit: AppEdit, options: EditOptions): Promise<String | null | undefined> {
const track = await androidPublisher.edits.tracks.get({
auth: options.auth,
packageName: options.applicationId,
editId: appEdit.id!,
track: options.track
})
const release = track.data.releases![0] // We only ever create one release, so grab the first one
return release.name
} }

View File

@@ -106,7 +106,7 @@ async function run() {
const authClient = await auth.getClient(); const authClient = await auth.getClient();
await uploadToPlayStore({ const result = await uploadToPlayStore({
auth: authClient, auth: authClient,
applicationId: packageName, applicationId: packageName,
track: track, track: track,
@@ -117,7 +117,7 @@ async function run() {
name: releaseName name: releaseName
}, validatedReleaseFiles); }, validatedReleaseFiles);
console.log(`Finished uploading to the Play Store`) console.log(`Finished uploading to the Play Store: ${result}`)
} catch (error) { } catch (error) {
core.setFailed(error.message) core.setFailed(error.message)
} }