summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'scripts')
-rwxr-xr-xscripts/publish_binary_size.js133
1 files changed, 133 insertions, 0 deletions
diff --git a/scripts/publish_binary_size.js b/scripts/publish_binary_size.js
new file mode 100755
index 0000000000..c7c1698436
--- /dev/null
+++ b/scripts/publish_binary_size.js
@@ -0,0 +1,133 @@
+#!/usr/bin/env node
+
+const jwt = require('jsonwebtoken');
+const github = require('@octokit/rest')();
+const zlib = require('zlib');
+const AWS = require('aws-sdk');
+
+const SIZE_CHECK_APP_ID = 14028;
+const SIZE_CHECK_APP_INSTALLATION_ID = 229425;
+
+process.on('unhandledRejection', error => {
+ console.log(error);
+ process.exit(1)
+});
+
+const pk = process.env['SIZE_CHECK_APP_PRIVATE_KEY'];
+if (!pk) {
+ console.log('Fork PR; not publishing size.');
+ process.exit(0);
+}
+
+const key = Buffer.from(pk, 'base64').toString('binary');
+const payload = {
+ exp: Math.floor(Date.now() / 1000) + 60,
+ iat: Math.floor(Date.now() / 1000),
+ iss: SIZE_CHECK_APP_ID
+};
+
+const token = jwt.sign(payload, key, {algorithm: 'RS256'});
+github.authenticate({type: 'app', token});
+
+// Must be in sync with the definition in metrics/binary-size/index.html on the gh-pages branch.
+const platforms = [
+ { 'platform': 'iOS', 'arch': 'armv7' },
+ { 'platform': 'iOS', 'arch': 'arm64' },
+ { 'platform': 'Android', 'arch': 'arm-v7' },
+ { 'platform': 'Android', 'arch': 'arm-v8' },
+ { 'platform': 'Android', 'arch': 'x86' },
+ { 'platform': 'Android', 'arch': 'x86_64' }
+];
+
+const rows = [];
+
+function query(after) {
+ return github.request({
+ method: 'POST',
+ url: '/graphql',
+ headers: {
+ // https://developer.github.com/changes/2018-07-11-graphql-checks-preview/
+ accept: 'application/vnd.github.antiope-preview'
+ },
+ query: `query {
+ repository(owner: "mapbox", name: "mapbox-gl-native") {
+ ref(qualifiedName: "master") {
+ target {
+ ... on Commit {
+ history(first: 100, since: "2018-07-01T00:00:00Z" ${after ? `, after: "${after}"` : ''}) {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ edges {
+ node {
+ oid
+ messageHeadline
+ checkSuites(first: 1, filterBy: {appId: ${SIZE_CHECK_APP_ID}}) {
+ nodes {
+ checkRuns(first: 10) {
+ nodes {
+ name
+ conclusion
+ title
+ summary
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }`
+ }).then((result) => {
+ const history = result.data.data.repository.ref.target.history;
+
+ for (const edge of history.edges) {
+ const commit = edge.node;
+ const suite = commit.checkSuites.nodes[0];
+
+ if (!suite)
+ continue;
+
+ const runs = commit.checkSuites.nodes[0].checkRuns.nodes;
+ const row = [`${commit.oid.slice(0, 7)} - ${commit.messageHeadline}`];
+
+ for (let i = 0; i < platforms.length; i++) {
+ const {platform, arch} = platforms[i];
+
+ const run = runs.find((run) => {
+ const [, p, a] = run.name.match(/Size - (\w+) ([\w-]+)/);
+ return platform === p && arch === a;
+ });
+
+ row[i + 1] = run ? +run.summary.match(/is (\d+) bytes/)[1] : undefined;
+ }
+
+ rows.push(row);
+ }
+
+ if (history.pageInfo.hasNextPage) {
+ return query(history.pageInfo.endCursor);
+ } else {
+ return new AWS.S3({region: 'us-east-1'}).putObject({
+ Body: zlib.gzipSync(JSON.stringify(rows.reverse())),
+ Bucket: 'mapbox',
+ Key: 'mapbox-gl-native/metrics/binary-size/data.json',
+ ACL: 'public-read',
+ CacheControl: 'max-age=300',
+ ContentEncoding: 'gzip',
+ ContentType: 'application/json'
+ }).promise();
+ }
+ });
+}
+
+github.apps.createInstallationToken({installation_id: SIZE_CHECK_APP_INSTALLATION_ID})
+ .then(({data}) => {
+ github.authenticate({type: 'token', token: data.token});
+ return query();
+ });