[build] Push binary size history to S3 (#12538)

This commit is contained in:
John Firebaugh
2018-08-06 13:10:54 -07:00
committed by GitHub
parent eb153a7d04
commit e31f2ecb67
4 changed files with 142 additions and 1 deletions

View File

@@ -19,7 +19,7 @@
},
"devDependencies": {
"@octokit/rest": "^15.9.2",
"aws-sdk": "^2.3.5",
"aws-sdk": "^2.285.1",
"csscolorparser": "^1.0.2",
"ejs": "^2.4.1",
"express": "^4.11.1",

View File

@@ -11,3 +11,7 @@ scripts/check_binary_size.js "platform/android/MapboxGLAndroidSDK/build/intermed
# Track overall library size
scripts/check_binary_size.js "platform/android/MapboxGLAndroidSDK/build/outputs/aar/MapboxGLAndroidSDK-release.aar" "Android AAR"
if [[ $CIRCLE_BRANCH == master ]]; then
scripts/publish_binary_size.js
fi

View File

@@ -17,3 +17,7 @@ scripts/check_binary_size.js "build/ios/pkg/dynamic/Mapbox-stripped-x86_64" "iO
# Track overall library size
scripts/check_binary_size.js "build/ios/pkg/dynamic/Mapbox-stripped" "iOS Dynamic"
if [[ $CIRCLE_BRANCH == master ]]; then
scripts/publish_binary_size.js
fi

133
scripts/publish_binary_size.js Executable file
View File

@@ -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();
});