diff --git a/Dockerfile b/Dockerfile index 130436268..e3d0a5512 100755 --- a/Dockerfile +++ b/Dockerfile @@ -33,6 +33,8 @@ ENV S3_KEY="" ENV S3_SECRET="" ENV S3_BUCKET="" +# CDN distribution tag used to fetch the latest version of the component libraries (openstad-components and react-admin) +ENV CDN_DIST_TAG="latest" # Install all base dependencies. RUN apk add --no-cache --update openssl g++ make python3 musl-dev git bash diff --git a/packages/cms/services/cdns.js b/packages/cms/services/cdns.js index 567c6294c..c908b057e 100755 --- a/packages/cms/services/cdns.js +++ b/packages/cms/services/cdns.js @@ -1,79 +1,103 @@ -exports.contructComponentsCdn = async function() { - +const fs = require('fs').promises; +const util = require('util'); +const exec = util.promisify(require('child_process').exec); + +exports.contructComponentsCdn = async function () { // construct cdn urls - let openstadComponentsCdn = process.env.OPENSTAD_COMPONENTS_CDN || 'https://cdn.jsdelivr.net/npm/openstad-components@{version}/dist'; + let openstadComponentsCdn = + process.env.OPENSTAD_COMPONENTS_CDN || + 'https://cdn.jsdelivr.net/npm/openstad-components@{version}/dist'; if (openstadComponentsCdn.match('{version}')) { - try { - const fs = require('fs').promises; - const util = require('util'); - const exec = util.promisify(require('child_process').exec); - - let { stdout, stderr } = await exec('git rev-parse --abbrev-ref HEAD'); - let branch = stdout && stdout.toString(); - branch = branch.trim(); + let tag = await getTag(); - let tag = 'alpha'; - if (branch == 'release') tag = 'beta'; - if (branch == 'master') tag = 'latest'; - // get current published version ({ stdout, stderr } = await exec('npm view --json openstad-components')); let info = stdout && stdout.toString(); - info = JSON.parse(info) + info = JSON.parse(info); let version = info['dist-tags'][tag]; if (!version) { // fallback - let packageFile = fs.readFileSync(`${__dirname}/package.json`).toString() || ''; - let match = packageFile && packageFile.match(/"openstad-components":\s*"(?:[^"\d]*)((?:\d+\.)*\d+)"/); - version = match && match[1] || null; + let packageFile = + await fs.readFile(`${__dirname}/../package.json`).toString() || ''; + let match = + packageFile && + packageFile.match( + /"openstad-components":\s*"(?:[^"\d]*)((?:\d+\.)*\d+)"/ + ); + version = (match && match[1]) || ''; } - openstadComponentsCdn = openstadComponentsCdn.replace('{version}', version); + openstadComponentsCdn = openstadComponentsCdn.replace( + '@{version}', + version ? `@${version}` : '' + ); console.log('Using cdn', openstadComponentsCdn); - } catch (err) {console.log('Error constructing cdn url', err);} - + } catch (err) { + console.log('Error constructing cdn url', err); + } } return openstadComponentsCdn; - -} - -exports.contructReactAdminCdn = async function() { +}; +exports.contructReactAdminCdn = async function () { // construct cdn urls - let openstadReactAdminCdn = process.env.OPENSTAD_REACT_ADMIN_CDN || 'https://cdn.jsdelivr.net/npm/openstad-react-admin@{version}/dist'; + let openstadReactAdminCdn = + process.env.OPENSTAD_REACT_ADMIN_CDN || + 'https://cdn.jsdelivr.net/npm/openstad-react-admin@{version}/dist'; if (openstadReactAdminCdn.match('{version}')) { - try { - const fs = require('fs').promises; - const util = require('util'); - const exec = util.promisify(require('child_process').exec); - - let { stdout, stderr } = await exec('git rev-parse --abbrev-ref HEAD'); - let branch = stdout && stdout.toString(); - branch = branch.trim(); + let tag = await getTag(); - let tag = 'alpha'; - if (branch == 'release') tag = 'beta'; - if (branch == 'master') tag = 'latest'; - // get current published version ({ stdout, stderr } = await exec('npm view --json openstad-react-admin')); let info = stdout && stdout.toString(); - info = JSON.parse(info) + info = JSON.parse(info); let version = info['dist-tags'][tag]; if (!version) { // fallback - let packageFile = fs.readFileSync(`${__dirname}/package.json`).toString() || ''; - let match = packageFile && packageFile.match(/"openstad-react-openstadComponentsCdn":\s*"(?:[^"\d]*)((?:\d+\.)*\d+)"/); - version = match && match[1] || null; + let packageFile = + await fs.readFile(`${__dirname}/../package.json`).toString() || ''; + let match = + packageFile && + packageFile.match( + /"openstad-react-openstadComponentsCdn":\s*"(?:[^"\d]*)((?:\d+\.)*\d+)"/ + ); + version = (match && match[1]) || ''; } - openstadReactAdminCdn = openstadReactAdminCdn.replace('{version}', version); + openstadReactAdminCdn = openstadReactAdminCdn.replace( + '@{version}', + version ? `@${version}` : '' + ); console.log('Using cdn', openstadReactAdminCdn); - } catch (err) {console.log('Error constructing cdn url', err);} - + } catch (err) { + console.log('Error constructing cdn url', err); + } } return openstadReactAdminCdn; - +}; + +async function getTag() { + const util = require('util'); + const exec = util.promisify(require('child_process').exec); + + let branch = ''; + let tag = 'alpha'; + + try { + let { stdout, stderr } = await exec('git rev-parse --abbrev-ref HEAD'); + branch = stdout && stdout.toString().trim(); + } catch (error) { + // As a fallback we check for the CDN_DIST_TAG env variable + if (process.env.CDN_DIST_TAG) { + tag = process.env.CDN_DIST_TAG; + } + console.warn(`Could not get branch via git; fallback to ${tag}`); + } + + if (branch == 'release') tag = 'beta'; + if (branch == 'master') tag = 'latest'; + + return tag; }