Skip to content

Commit 7e407d2

Browse files
authored
Merge pull request #506 from DevKor-github/release/1.0.0
[release] Fix Google Play draft uploads
2 parents 3a3ce8b + cef39c1 commit 7e407d2

3 files changed

Lines changed: 138 additions & 40 deletions

File tree

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
const fs = require('fs');
2+
const { google } = require('googleapis');
3+
4+
const requiredEnv = (name) => {
5+
const value = process.env[name];
6+
if (!value) {
7+
throw new Error(`${name} is required.`);
8+
}
9+
return value;
10+
};
11+
12+
const readReleaseNotes = (filePath) => {
13+
if (!filePath || !fs.existsSync(filePath)) {
14+
return undefined;
15+
}
16+
17+
const text = fs.readFileSync(filePath, 'utf8').trimEnd();
18+
if (!text) {
19+
return undefined;
20+
}
21+
22+
return [{ language: 'en-US', text }];
23+
};
24+
25+
const deleteEdit = async (publisher, packageName, editId) => {
26+
try {
27+
await publisher.edits.delete({ packageName, editId });
28+
} catch (error) {
29+
console.warn(`Unable to delete failed edit ${editId}: ${error.message}`);
30+
}
31+
};
32+
33+
const main = async () => {
34+
const packageName = requiredEnv('PACKAGE_NAME');
35+
const track = requiredEnv('PLAY_TRACK');
36+
const releaseFile = requiredEnv('RELEASE_FILE');
37+
const serviceAccount = JSON.parse(requiredEnv('GOOGLE_PLAY_SERVICE_ACCOUNT_JSON'));
38+
39+
if (!fs.existsSync(releaseFile)) {
40+
throw new Error(`Release file does not exist: ${releaseFile}`);
41+
}
42+
43+
const auth = new google.auth.GoogleAuth({
44+
credentials: serviceAccount,
45+
scopes: ['https://www.googleapis.com/auth/androidpublisher'],
46+
});
47+
const publisher = google.androidpublisher({ version: 'v3', auth });
48+
const insertResponse = await publisher.edits.insert({ packageName });
49+
const editId = insertResponse.data.id;
50+
51+
if (!editId) {
52+
throw new Error('New Google Play edit has no id.');
53+
}
54+
55+
console.log(`Created Google Play edit ${editId}`);
56+
57+
try {
58+
const tracksResponse = await publisher.edits.tracks.list({
59+
packageName,
60+
editId,
61+
});
62+
const availableTracks = (tracksResponse.data.tracks || []).map((item) => item.track);
63+
if (!availableTracks.includes(track)) {
64+
throw new Error(
65+
`Track "${track}" is not available. Available tracks: ${availableTracks.join(', ')}`
66+
);
67+
}
68+
69+
console.log(`Uploading ${releaseFile} to track "${track}"`);
70+
const bundleResponse = await publisher.edits.bundles.upload({
71+
packageName,
72+
editId,
73+
media: {
74+
mimeType: 'application/octet-stream',
75+
body: fs.createReadStream(releaseFile),
76+
},
77+
});
78+
const versionCode = bundleResponse.data.versionCode;
79+
80+
if (!versionCode) {
81+
throw new Error('Uploaded Android App Bundle did not return a versionCode.');
82+
}
83+
84+
const release = {
85+
status: 'draft',
86+
versionCodes: [String(versionCode)],
87+
};
88+
const releaseNotes = readReleaseNotes(process.env.RELEASE_NOTES_FILE);
89+
if (releaseNotes) {
90+
release.releaseNotes = releaseNotes;
91+
}
92+
93+
await publisher.edits.tracks.update({
94+
packageName,
95+
editId,
96+
track,
97+
requestBody: {
98+
track,
99+
releases: [release],
100+
},
101+
});
102+
103+
const commitResponse = await publisher.edits.commit({
104+
packageName,
105+
editId,
106+
});
107+
108+
console.log(`Committed Google Play edit ${commitResponse.data.id}`);
109+
console.log(`Uploaded draft release versionCode ${versionCode}`);
110+
} catch (error) {
111+
await deleteEdit(publisher, packageName, editId);
112+
const details = error.response?.data ? JSON.stringify(error.response.data) : error.message;
113+
throw new Error(details);
114+
}
115+
};
116+
117+
main().catch((error) => {
118+
console.error(error.message);
119+
process.exit(1);
120+
});

.github/workflows/android-play-closed.yml

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -149,25 +149,14 @@ jobs:
149149
if-no-files-found: error
150150
retention-days: 14
151151

152-
- name: Upload closed testing draft with release notes
153-
if: ${{ inputs.release_notes != '' }}
154-
uses: r0adkll/upload-google-play@v1
155-
with:
156-
serviceAccountJsonPlainText: ${{ secrets.GOOGLE_PLAY_SERVICE_ACCOUNT_JSON }}
157-
packageName: club.devkor.ontime
158-
releaseFiles: build/app/outputs/bundle/release/app-release.aab
159-
tracks: alpha
160-
status: draft
161-
changesNotSentForReview: true
162-
whatsNewDirectory: distribution/whatsnew
152+
- name: Install Google Play upload dependencies
153+
run: npm install --no-save --no-package-lock googleapis
163154

164155
- name: Upload closed testing draft
165-
if: ${{ inputs.release_notes == '' }}
166-
uses: r0adkll/upload-google-play@v1
167-
with:
168-
serviceAccountJsonPlainText: ${{ secrets.GOOGLE_PLAY_SERVICE_ACCOUNT_JSON }}
169-
packageName: club.devkor.ontime
170-
releaseFiles: build/app/outputs/bundle/release/app-release.aab
171-
tracks: alpha
172-
status: draft
173-
changesNotSentForReview: true
156+
env:
157+
GOOGLE_PLAY_SERVICE_ACCOUNT_JSON: ${{ secrets.GOOGLE_PLAY_SERVICE_ACCOUNT_JSON }}
158+
PACKAGE_NAME: club.devkor.ontime
159+
PLAY_TRACK: alpha
160+
RELEASE_FILE: build/app/outputs/bundle/release/app-release.aab
161+
RELEASE_NOTES_FILE: distribution/whatsnew/whatsnew-en-US
162+
run: node .github/scripts/upload_google_play_draft.js

.github/workflows/android-play-internal.yml

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -145,25 +145,14 @@ jobs:
145145
if-no-files-found: error
146146
retention-days: 14
147147

148-
- name: Upload internal testing draft with release notes
149-
if: ${{ inputs.release_notes != '' }}
150-
uses: r0adkll/upload-google-play@v1
151-
with:
152-
serviceAccountJsonPlainText: ${{ secrets.GOOGLE_PLAY_SERVICE_ACCOUNT_JSON }}
153-
packageName: club.devkor.ontime
154-
releaseFiles: build/app/outputs/bundle/release/app-release.aab
155-
tracks: internal
156-
status: draft
157-
changesNotSentForReview: true
158-
whatsNewDirectory: distribution/whatsnew
148+
- name: Install Google Play upload dependencies
149+
run: npm install --no-save --no-package-lock googleapis
159150

160151
- name: Upload internal testing draft
161-
if: ${{ inputs.release_notes == '' }}
162-
uses: r0adkll/upload-google-play@v1
163-
with:
164-
serviceAccountJsonPlainText: ${{ secrets.GOOGLE_PLAY_SERVICE_ACCOUNT_JSON }}
165-
packageName: club.devkor.ontime
166-
releaseFiles: build/app/outputs/bundle/release/app-release.aab
167-
tracks: internal
168-
status: draft
169-
changesNotSentForReview: true
152+
env:
153+
GOOGLE_PLAY_SERVICE_ACCOUNT_JSON: ${{ secrets.GOOGLE_PLAY_SERVICE_ACCOUNT_JSON }}
154+
PACKAGE_NAME: club.devkor.ontime
155+
PLAY_TRACK: internal
156+
RELEASE_FILE: build/app/outputs/bundle/release/app-release.aab
157+
RELEASE_NOTES_FILE: distribution/whatsnew/whatsnew-en-US
158+
run: node .github/scripts/upload_google_play_draft.js

0 commit comments

Comments
 (0)