joplin/Tools/release-android.js

114 lines
4.0 KiB
JavaScript
Raw Normal View History

2018-03-09 17:49:35 +00:00
const fs = require("fs-extra");
const { execCommand, githubRelease, githubOauthToken } = require("./tool-utils.js");
const path = require("path");
const fetch = require("node-fetch");
const uriTemplate = require("uri-template");
2018-03-09 17:49:35 +00:00
const rnDir = __dirname + "/../ReactNativeClient";
const rootDir = path.dirname(__dirname);
2018-03-09 17:49:35 +00:00
const releaseDir = rootDir + "/_releases";
function increaseGradleVersionCode(content) {
const newContent = content.replace(/versionCode\s+(\d+)/, function(a, versionCode, c) {
const n = Number(versionCode);
2018-03-09 17:49:35 +00:00
if (isNaN(n) || !n) throw new Error("Invalid version code: " + versionCode);
return "versionCode " + (n + 1);
});
2018-03-09 17:49:35 +00:00
if (newContent === content) throw new Error("Could not update version code");
return newContent;
}
function increaseGradleVersionName(content) {
const newContent = content.replace(/(versionName\s+"\d+?\.\d+?\.)(\d+)"/, function(match, prefix, buildNum) {
const n = Number(buildNum);
2018-03-09 17:49:35 +00:00
if (isNaN(n) || !n) throw new Error("Invalid version code: " + versionCode);
return prefix + (n + 1) + '"';
});
2018-03-09 17:49:35 +00:00
if (newContent === content) throw new Error("Could not update version name");
return newContent;
}
function updateGradleConfig() {
2018-03-09 17:49:35 +00:00
let content = fs.readFileSync(rnDir + "/android/app/build.gradle", "utf8");
content = increaseGradleVersionCode(content);
content = increaseGradleVersionName(content);
2018-03-09 17:49:35 +00:00
fs.writeFileSync(rnDir + "/android/app/build.gradle", content);
return content;
}
function gradleVersionName(content) {
const matches = content.match(/versionName\s+"(\d+?\.\d+?\.\d+)"/);
2018-03-09 17:49:35 +00:00
if (!matches || matches.length < 1) throw new Error("Cannot get gradle version name");
return matches[1];
}
async function main() {
2018-03-09 17:49:35 +00:00
const projectName = "joplin-android";
const newContent = updateGradleConfig();
const version = gradleVersionName(newContent);
2018-03-09 17:49:35 +00:00
const tagName = "android-v" + version;
const apkFilename = "joplin-v" + version + ".apk";
const apkFilePath = releaseDir + "/" + apkFilename;
const downloadUrl = "https://github.com/laurent22/" + projectName + "/releases/download/" + tagName + "/" + apkFilename;
process.chdir(rootDir);
2018-03-09 17:49:35 +00:00
console.info("Running from: " + process.cwd());
2018-03-09 17:49:35 +00:00
console.info("Building APK file...");
const output = await execCommand('/mnt/c/Windows/System32/cmd.exe /c "cd ReactNativeClient\\android && gradlew.bat assembleRelease -PbuildDir=build --console plain"');
console.info(output);
await fs.mkdirp(releaseDir);
2018-03-09 17:49:35 +00:00
console.info("Copying APK to " + apkFilePath);
await fs.copy("ReactNativeClient/android/app/build/outputs/apk/app-release.apk", apkFilePath);
2018-03-09 17:49:35 +00:00
console.info("Updating Readme URL...");
2018-03-09 17:49:35 +00:00
let readmeContent = await fs.readFile("README.md", "utf8");
2018-02-07 17:54:06 +00:00
readmeContent = readmeContent.replace(/(https:\/\/github.com\/laurent22\/joplin-android\/releases\/download\/.*?\.apk)/, downloadUrl);
2018-03-09 17:49:35 +00:00
await fs.writeFile("README.md", readmeContent);
2018-03-09 17:49:35 +00:00
console.info(await execCommand("git pull"));
console.info(await execCommand("git add -A"));
2018-01-18 22:43:37 +00:00
console.info(await execCommand('git commit -m "Android release v' + version + '"'));
2018-03-09 17:49:35 +00:00
console.info(await execCommand("git tag " + tagName));
console.info(await execCommand("git push"));
console.info(await execCommand("git push --tags"));
2018-03-09 17:49:35 +00:00
console.info("Creating GitHub release " + tagName + "...");
2018-02-07 17:54:06 +00:00
const release = await githubRelease(projectName, tagName, false);
const uploadUrlTemplate = uriTemplate.parse(release.upload_url);
const uploadUrl = uploadUrlTemplate.expand({ name: apkFilename });
const binaryBody = await fs.readFile(apkFilePath);
const oauthToken = await githubOauthToken();
2018-03-09 17:49:35 +00:00
console.info("Uploading " + apkFilename + " to " + uploadUrl);
const uploadResponse = await fetch(uploadUrl, {
2018-03-09 17:49:35 +00:00
method: "POST",
body: binaryBody,
headers: {
2018-03-09 17:49:35 +00:00
"Content-Type": "application/vnd.android.package-archive",
Authorization: "token " + oauthToken,
"Content-Length": binaryBody.length,
},
});
const uploadResponseText = await uploadResponse.text();
console.info(uploadResponseText);
}
2018-03-09 17:49:35 +00:00
main().catch(error => {
console.error("Fatal error");
console.error(error);
2018-03-09 17:49:35 +00:00
});