@sap/cds-dk
Version:
Command line client and development toolkit for the SAP Cloud Application Programming Model
111 lines (95 loc) • 3.36 kB
JavaScript
module.exports = Object.assign(up, {
options: ['--to'],
shortcuts: ['-2'],
flags: [],
help: `
# SYNOPSIS
*cds up*
Builds and deploys the application to Cloud Foundry or Kubernetes.
# OPTIONS
*-2* | *--to* cf|k8s
The platform to deploy to. Default is 'cf'.
# EXAMPLES
*cds up*
*cds up --to k8s*
`})
const { execSync, spawn } = require('node:child_process')
const cds = require('../lib/cds')
const { highlight, bold } = require('../lib/util/term')
const { exists, fs, path } = cds.utils
const { readProject } = require('../lib/init/projectReader')
const run = cmd => {
console.log(highlight(cmd))
try {
return execSync(cmd, {
stdio: 'inherit',
env: { ...process.env, FORCE_COLOR: cds.utils.colors.enabled }
})
} catch (error) {
throw error.message
}
}
const runDetectingError = async (cmd, errorRegex) => {
console.log(highlight(cmd))
return new Promise((resolve, reject) => {
const child = spawn(cmd, { shell: true, stdio: 'pipe' })
let out = '';
['stdout', 'stderr'].forEach(key => {
child[key].on('data', data => {
process[key].write(data.toString())
out += data.toString()
})
})
child.on('close', () => {
const error = out.match(errorRegex)
if (error) {
return reject('Error in command: ' + bold(cmd) + ' → exiting')
}
resolve(out)
})
})
}
async function up() {
const { apps, appName, hasApprouter, hasXsuaa } = readProject()
for (const { app } of apps) {
const appPath = path.join(cds.root, cds.env.folders.app, app)
if (exists(path.join(appPath, 'package.json')) && !exists(path.join(appPath, 'package-lock.json'))) {
run(`npm i --package-lock-only --prefix ${appPath}`)
}
}
if (exists('mtx/sidecar') && !exists('mtx/sidecar/package-lock.json')) {
run('npm i --package-lock-only --prefix mtx/sidecar')
}
if (cds.cli.options.to === 'k8s') {
if (!exists('chart')) run('cds add helm')
if (!exists('containerize.yaml')) run('cds add containerize')
} else {
if (!exists('mta.yaml')) {
run('cds add mta')
}
if (!exists('package-lock.json')) {
run('npm i --package-lock-only')
}
}
const prefix = execSync('npm prefix', { encoding: 'utf8' }).trim()
if (prefix !== cds.root) {
const source = path.join(prefix, 'package-lock.json')
const target = path.join(process.cwd(), 'package-lock.json')
if (exists(target) || fs.lstatSync(target).isSymbolicLink()) fs.unlinkSync(target)
const relative = path.relative(process.cwd(), source)
fs.symlinkSync(relative, target, 'junction')
}
if (cds.cli.options.to === 'k8s') {
run('npm i --package-lock')
await runDetectingError('ctz containerize.yaml --log --push', /^\[?ERROR\]?.*/m)
let helmUpgrade = `helm upgrade --install ${appName} ./gen/chart --wait --wait-for-jobs`
if (hasXsuaa) helmUpgrade += ' --set-file xsuaa.jsonParameters=xs-security.json'
run(helmUpgrade)
run(`kubectl rollout status deployment ${appName}-srv --timeout=8m`)
if (hasApprouter) run(`kubectl rollout status deployment ${appName}-approuter --timeout=8m`)
if (exists('mtx/sidecar')) run(`kubectl rollout status deployment ${appName}-sidecar --timeout=8m`)
} else {
run('mbt build -t gen --mtar mta.tar')
run('cf deploy gen/mta.tar -f')
}
}