UNPKG

terriajs

Version:

Geospatial data visualization platform.

136 lines (119 loc) 4.91 kB
const childProcess = require('child_process'); const fs = require('fs'); const request = require('request'); function requestPromise(options) { return new Promise((resolve, reject) => { request(options, (error, response, body) => { if (error) { reject(error); } else { resolve(response); } }); }); } function getAllBranches(repo) { const baseUrl = 'https://api.github.com/repos/' + repo + '/branches'; const result = []; let page = 0; function getNextPage() { ++page; let url = baseUrl + '?page=' + page; if (process.env.GITHUB_CLIENT_ID) { url += '&client_id=' + process.env.GITHUB_CLIENT_ID; } if (process.env.GITHUB_CLIENT_SECRET) { url += '&client_secret=' + process.env.GITHUB_CLIENT_SECRET; } return requestPromise({ url: url, headers: { 'User-Agent': 'TerriaJS CI' } }).then(pageResponse => { const pageOfBranches = JSON.parse(pageResponse.body); result.push(...pageOfBranches.filter(branch => branch.name.indexOf('greenkeeper/') !== 0)); if (pageOfBranches.length > 0) { return getNextPage(); } }); } return getNextPage().then(() => result); } function makeSafeName(name) { return name.toLowerCase().replace(/[^-a-z0-9]/g, '-').substring(0, 40); } function createIngress(branches) { return { apiVersion: 'extensions/v1beta', kind: 'Ingress', metadata: { name: 'terriajs-ci', annotations: { 'kubernetes.io/ingress.class': 'nginx', 'ingress.kubernetes.io/ssl-redirect': 'false', 'ingress.kubernetes.io/force-ssl-redirect': 'false', 'ingress.kubernetes.io/rewrite-target': '/' } }, spec: { rules: [ { http: { paths: branches.map(branch => ({ path: '/' + branch.name + '/', backend: { serviceName: 'terriajs-' + makeSafeName(branch.name) + '-terriamap', servicePort: 'http' } })) } } ] } }; } getAllBranches('TerriaJS/terriajs').then(branches => { // Update the ingress resource const ingress = createIngress(branches); fs.writeFileSync('ingress.json', JSON.stringify(ingress, undefined, ' '), 'utf8'); const kubectlResult = childProcess.spawnSync('kubectl', ['apply', '-f', 'ingress.json'], { stdio: 'inherit' }); console.log('kubectl status: ' + kubectlResult.status); // Delete helm releases for branches that no longer exist. const helmLsResult = childProcess.spawnSync('helm', ['ls', '-q', '-a']); console.log('helm ls status: ' + helmLsResult.status); const releases = helmLsResult.stdout.toString().split(/[\r\n]/).filter(l => l.indexOf('terriajs-') === 0); releases.forEach(release => { const branchName = release.substring(9); if (!branches.find(b => makeSafeName(b.name) === branchName)) { console.log('Deleting old release ' + release); const helmDeleteResult = childProcess.spawnSync('helm', ['delete', '--purge', release], { stdio: 'inherit' }); console.log('helm delete status: ' + helmDeleteResult.status); } }); // Delete old images that are no longer tagged with valid branches const imagesResult = childProcess.spawnSync('gcloud', [ 'container', 'images', 'list-tags', 'asia.gcr.io/terriajs-automated-deployment/terria-ci', '--limit', '999', '--format=json' ]); console.log('images list status: ' + imagesResult.status); const images = JSON.parse(imagesResult.stdout.toString()); images.forEach(image => { if (!image.tags.some(tag => branches.find(b => makeSafeName(b.name) === tag))) { console.log('Deleting old docker image ' + image.digest); const deleteResult = childProcess.spawnSync('gcloud', [ 'container', 'images', 'delete', '-q', '--force-delete-tags', 'asia.gcr.io/terriajs-automated-deployment/terria-ci@' + image.digest ], { stdio: 'inherit' }); console.log('delete status: ' + deleteResult.status); } }); // gcloud container images list-tags asia.gcr.io/terriajs-automated-deployment/terria-ci --limit 999 --format=json });