autoconfig-partial-build.js 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. 'use strict'
  2. const execFile = require('node:util').promisify(require('node:child_process').execFile)
  3. const { promises: fsp } = require('node:fs')
  4. module.exports.register = function () {
  5. if (!process.env.BUILD_REFNAME) return
  6. this.once('playbookBuilt', async ({ playbook }) => {
  7. const { concat: get } = this.require('simple-get')
  8. const asciidocAttrs = ((playbook.asciidoc ||= {}).attributes ||= {})
  9. const siteManifestUrl = asciidocAttrs['primary-site-manifest-url'] || `${playbook.site.url}/site-manifest.json`
  10. const siteManifestData = await (siteManifestUrl.startsWith('https://')
  11. ? download(get, siteManifestUrl)
  12. : fsp.readFile(siteManifestUrl)
  13. ).then(JSON.parse)
  14. let { BUILD_REFNAME: refname, BUILD_VERSION: version } = process.env
  15. const isBranch = /[a-z]$/.test(refname)
  16. if (!version) {
  17. const repoUrl = await execFile('git', ['remote', 'get-url', 'origin']).then(({ stdout: output }) => output.trim())
  18. const propertiesUrl = `${repoUrl.replace('github.com', 'raw.githubusercontent.com')}/${refname}/gradle.properties`
  19. version = await download(get, propertiesUrl)
  20. .then((contents) => contents.toString().split('\n').find((it) => it.startsWith('version='))?.slice(8))
  21. }
  22. if (isBranch && version.endsWith('-SNAPSHOT')) version = version.slice(0, -9)
  23. const versionsInManifest = siteManifestData.components.ROOT.versions
  24. if (!(version in versionsInManifest && isBranch === !!versionsInManifest[version].prerelease)) {
  25. const category = require('path').basename(module.id, '.js')
  26. this.getLogger(category).info(`version ${version} not previously built; reverting to full build`)
  27. return
  28. }
  29. Object.assign(
  30. playbook.content.sources[0],
  31. isBranch ? { branches: [refname], tags: [] } : { branches: [], tags: [refname] }
  32. )
  33. Object.assign(
  34. asciidocAttrs,
  35. { 'primary-site-url': '.', 'primary-site-manifest-url': siteManifestUrl }
  36. )
  37. this.updateVariables({ playbook })
  38. })
  39. }
  40. function download (get, url) {
  41. return new Promise((resolve, reject) =>
  42. get({ url }, (err, response, contents) => {
  43. if (err) reject(err)
  44. if (response.statusCode !== 200) {
  45. const message = `Response code ${response.statusCode} (${response.statusMessage})`
  46. return reject(Object.assign(new Error(message), { name: 'HTTPError' }))
  47. }
  48. resolve(contents)
  49. })
  50. )
  51. }