Merge pull request #1329 from Budibase/single-stack-dev

Single stack dev
This commit is contained in:
Martin McKeaveney 2021-03-25 10:32:17 +00:00 committed by GitHub
commit 43a2e8ba10
11 changed files with 176 additions and 200 deletions

View File

@ -61,9 +61,6 @@ services:
container_name: budi-redis-dev
restart: always
image: redis
environment:
- COUCHDB_PASSWORD=${COUCH_DB_PASSWORD}
- COUCHDB_USER=${COUCH_DB_USER}
ports:
- "${REDIS_PORT}:6379"
volumes:

View File

@ -99,8 +99,18 @@ services:
- couchdb-service
command: ["sh","-c","sleep 10 && $${PUT_CALL}/_users && $${PUT_CALL}/_replicator; fg;"]
redis-service:
restart: always
image: redis
ports:
- "${REDIS_PORT}:6379"
volumes:
- redis_data:/data
volumes:
couchdb_data:
driver: local
minio_data:
driver: local
redis_data:
driver: local

View File

@ -36,6 +36,11 @@ static_resources:
cluster: worker-service
prefix_rewrite: "/"
- match: { prefix: "/cache/" }
route:
cluster: redis-service
prefix_rewrite: "/"
- match: { prefix: "/db/" }
route:
cluster: couchdb-service
@ -107,3 +112,18 @@ static_resources:
address: couchdb-service
port_value: 5984
- name: redis-service
connect_timeout: 0.25s
type: strict_dns
lb_policy: round_robin
load_assignment:
cluster_name: redis-service
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: redis-service
port_value: 6379

View File

@ -3,6 +3,7 @@
"video": true,
"projectId": "bmbemn",
"env": {
"PORT": "4001"
"PORT": "4001",
"JWT_SECRET": "test"
}
}

View File

@ -1,25 +1,26 @@
// What this script does:
// 1. Removes the old test folder if it exists (.budibase)
// 2. Initialises using `.budibase`
// 3. Runs the server using said folder
const { join, resolve } = require("path")
const initialiseBudibase = require("../../server/src/utilities/initialiseBudibase")
const cypressConfig = require("../cypress.json")
const path = require("path")
const homedir = join(require("os").homedir(), ".budibase")
const tmpdir = path.join(require("os").tmpdir(), ".budibase")
process.env.BUDIBASE_API_KEY = "6BE826CB-6B30-4AEC-8777-2E90464633DE"
process.env.NODE_ENV = "cypress"
process.env.ENABLE_ANALYTICS = "false"
process.env.PORT = cypressConfig.env.PORT
process.env.JWT_SECRET = cypressConfig.env.JWT_SECRET
process.env.COUCH_URL = `leveldb://${tmpdir}/.data/`
process.env.SELF_HOSTED = 1
process.env.MINIO_URL = "http://localhost:10000/"
process.env.MINIO_ACCESS_KEY = "budibase"
process.env.MINIO_SECRET_KEY = "budibase"
process.env.COUCH_DB_USER = "budibase"
process.env.COUCH_DB_PASSWORD = "budibase"
// Stop info logs polluting test outputs
process.env.LOG_LEVEL = "error"
async function run(dir) {
process.env.BUDIBASE_DIR = resolve(dir)
require("dotenv").config({ path: resolve(dir, ".env") })
async function run() {
// require("dotenv").config({ path: resolve(dir, ".env") })
// dont make this a variable or top level require
// it will cause environment module to be loaded prematurely
@ -27,12 +28,15 @@ async function run(dir) {
server.on("close", () => console.log("Server Closed"))
}
initialiseBudibase({ dir: homedir, clientId: "cypress-test" })
.then(() => {
delete require.cache[require.resolve("../../server/src/environment")]
const xPlatHomeDir = homedir.startsWith("~")
? join(homedir(), homedir.substring(1))
: homedir
run(xPlatHomeDir)
})
.catch(e => console.error(e))
run()
// TODO: ensure that this still works
// initialiseBudibase({ dir: homedir, clientId: "cypress-test" })
// .then(() => {
// delete require.cache[require.resolve("../../server/src/environment")]
// const xPlatHomeDir = homedir.startsWith("~")
// ? join(homedir(), homedir.substring(1))
// : homedir
// run(xPlatHomeDir)
// })
// .catch(e => console.error(e))

View File

@ -65,6 +65,7 @@
"!src/db/tests/**/*",
"!src/tests/**/*",
"!src/automations/tests/**/*",
"!src/utilities/fileProcessor.js",
"!src/utilities/fileSystem/**/*"
],
"coverageReporters": [

View File

@ -16,17 +16,6 @@ const Commands = {
Nuke: "nuke",
}
const managementCommand = process.argv.slice(2)[0]
if (
!managementCommand ||
!Object.values(Commands).some(command => managementCommand === command)
) {
throw new Error(
"You must supply either an 'up' or 'down' commmand to manage the budibase dev env."
)
}
async function init() {
const envFilePath = path.join(process.cwd(), ".env")
if (fs.existsSync(envFilePath)) {
@ -54,31 +43,30 @@ async function init() {
async function up() {
console.log("Spinning up your budibase dev environment... 🔧✨")
await init()
try {
await compose.upAll(CONFIG)
} catch (err) {
console.log("Something went wrong:", err.message)
}
}
async function down() {
console.log("Spinning down your budibase dev environment... 🌇")
try {
await compose.stop(CONFIG)
} catch (err) {
console.log("Something went wrong:", err.message)
}
}
async function nuke() {
console.log(
"Clearing down your budibase dev environment, including all containers and volumes... 💥"
)
try {
await compose.down(CONFIG)
} catch (err) {
console.log("Something went wrong:", err.message)
}
const managementCommand = process.argv.slice(2)[0]
if (
!managementCommand ||
!Object.values(Commands).some(command => managementCommand === command)
) {
throw new Error(
"You must supply either an 'up', 'down' or 'nuke' commmand to manage the budibase development environment."
)
}
let command
@ -100,6 +88,9 @@ command()
.then(() => {
console.log("Done! 🎉")
})
.catch(() => {
console.log("Error while managing budibase dev environment.")
.catch(err => {
console.error(
"Something went wrong while managing budibase dev environment:",
err.message
)
})

View File

@ -1,17 +0,0 @@
// const { join } = require("path")
// const { homedir } = require("os")
// // const initialiseBudibase = require("../src/utilities/initialiseBudibase")
// // const DIRECTORY = "~/.budibase"
// function run() {
// let opts = {}
// // let dir = DIRECTORY
// opts.quiet = true
// // opts.dir = dir.startsWith("~") ? join(homedir(), dir.substring(1)) : dir
// return initialiseBudibase(opts)
// }
// run().then(() => {
// console.log("Init complete.")
// })

View File

@ -1,10 +1,10 @@
const Router = require("@koa/router")
const controller = require("../controllers/static")
const { budibaseTempDir } = require("../../utilities/budibaseDir")
const env = require("../../environment")
const authorized = require("../../middleware/authorized")
const { BUILDER } = require("../../utilities/security/permissions")
const usage = require("../../middleware/usageQuota")
const env = require("../../environment")
const router = Router()

View File

@ -1,106 +1,112 @@
const { app, BrowserWindow, shell, dialog } = require("electron")
const { join } = require("./utilities/centralPath")
const isDev = require("electron-is-dev")
const { autoUpdater } = require("electron-updater")
const unhandled = require("electron-unhandled")
const { existsSync } = require("fs-extra")
const initialiseBudibase = require("./utilities/initialiseBudibase")
const { budibaseAppsDir } = require("./utilities/budibaseDir")
const { openNewGitHubIssue, debugInfo } = require("electron-util")
const eventEmitter = require("./events")
// const { app, BrowserWindow, shell, dialog } = require("electron")
// const { join } = require("./utilities/centralPath")
// const isDev = require("electron-is-dev")
// const { autoUpdater } = require("electron-updater")
// const unhandled = require("electron-unhandled")
// const { existsSync } = require("fs-extra")
// const initialiseBudibase = require("./utilities/initialiseBudibase")
// const { budibaseAppsDir } = require("./utilities/budibaseDir")
// const { openNewGitHubIssue, debugInfo } = require("electron-util")
// const eventEmitter = require("./events")
const budibaseDir = budibaseAppsDir()
const envFile = join(budibaseDir, ".env")
// const budibaseDir = budibaseAppsDir()
// const envFile = join(budibaseDir, ".env")
async function startApp() {
if (!existsSync(envFile)) {
await initialiseBudibase({ dir: budibaseDir })
}
// evict environment from cache, so it reloads when next asked
delete require.cache[require.resolve("./environment")]
unhandled({
showDialog: true,
reportButton: error => {
openNewGitHubIssue({
title: error.message,
user: "Budibase",
labels: ["error-report"],
repo: "budibase",
body: `### Error that occurred when using the budibase builder:\n\`\`\`\n${
error.stack
}\n\`\`\`\n### Operating System Information:\n---\n\n${debugInfo()}`,
})
},
})
// async function startApp() {
// if (!existsSync(envFile)) {
// await initialiseBudibase({ dir: budibaseDir })
// }
// // evict environment from cache, so it reloads when next asked
// delete require.cache[require.resolve("./environment")]
// // store the port incase its going to get overridden
// const port = process.env.PORT
// require("dotenv").config({ path: envFile })
// // overwrite the port - don't want to use dotenv for the port
// require("./environment")._set("PORT", port)
let win
// unhandled({
// showDialog: true,
// reportButton: error => {
// openNewGitHubIssue({
// title: error.message,
// user: "Budibase",
// labels: ["error-report"],
// repo: "budibase",
// body: `### Error that occurred when using the budibase builder:\n\`\`\`\n${
// error.stack
// }\n\`\`\`\n### Operating System Information:\n---\n\n${debugInfo()}`,
// })
// },
// })
function handleRedirect(e, url) {
e.preventDefault()
shell.openExternal(url)
}
// let win
async function createWindow() {
app.server = require("./app")
eventEmitter.on("internal:port", port => {
const APP_URL = `http://localhost:${port}/_builder`
const APP_TITLE = "Budibase Builder"
win = new BrowserWindow({
width: 1920,
height: 1080,
icon: join(__dirname, "..", "build", "icons", "512x512.png"),
})
win.setTitle(APP_TITLE)
win.loadURL(APP_URL)
if (isDev) {
win.webContents.openDevTools()
} else {
autoUpdater.checkForUpdatesAndNotify()
}
// function handleRedirect(e, url) {
// e.preventDefault()
// shell.openExternal(url)
// }
// open _blank in default browser
win.webContents.on("new-window", handleRedirect)
win.webContents.on("will-navigate", handleRedirect)
})
}
// async function createWindow() {
// app.server = require("./app")
// eventEmitter.on("internal:port", port => {
// const APP_URL = `http://localhost:${port}/_builder`
// const APP_TITLE = "Budibase Builder"
// win = new BrowserWindow({
// width: 1920,
// height: 1080,
// icon: join(__dirname, "..", "build", "icons", "512x512.png"),
// })
// win.setTitle(APP_TITLE)
// win.loadURL(APP_URL)
// if (isDev) {
// win.webContents.openDevTools()
// } else {
// autoUpdater.checkForUpdatesAndNotify()
// }
app.whenReady().then(createWindow)
// // open _blank in default browser
// win.webContents.on("new-window", handleRedirect)
// win.webContents.on("will-navigate", handleRedirect)
// })
// }
// Quit when all windows are closed.
app.on("window-all-closed", () => {
// On macOS it is common for applications and their menu bar
// to stay active until the user quits explicitly with Cmd + Q
if (process.platform !== "darwin") {
app.server.close()
app.quit()
}
})
// app.whenReady().then(createWindow)
app.on("activate", () => {
// On macOS it's common to re-create a window in the app when the
// dock icon is clicked and there are no other windows open.
if (win === null) createWindow()
})
}
// // Quit when all windows are closed.
// app.on("window-all-closed", () => {
// // On macOS it is common for applications and their menu bar
// // to stay active until the user quits explicitly with Cmd + Q
// if (process.platform !== "darwin") {
// app.server.close()
// app.quit()
// }
// })
autoUpdater.on("update-downloaded", (event, releaseNotes, releaseName) => {
const dialogOpts = {
type: "info",
buttons: ["Restart", "Later"],
title: "Budibase Update Available",
message: process.platform === "win32" ? releaseNotes : releaseName,
detail:
"A new version of the budibase builder has been downloaded. Restart the application to apply the updates.",
}
// app.on("activate", () => {
// // On macOS it's common to re-create a window in the app when the
// // dock icon is clicked and there are no other windows open.
// if (win === null) createWindow()
// })
// }
dialog.showMessageBox(dialogOpts).then(returnValue => {
if (returnValue.response === 0) autoUpdater.quitAndInstall()
})
})
// autoUpdater.on("update-downloaded", (event, releaseNotes, releaseName) => {
// const dialogOpts = {
// type: "info",
// buttons: ["Restart", "Later"],
// title: "Budibase Update Available",
// message: process.platform === "win32" ? releaseNotes : releaseName,
// detail:
// "A new version of the budibase builder has been downloaded. Restart the application to apply the updates.",
// }
autoUpdater.on("error", message => {
console.error("There was a problem updating the application")
console.error(message)
})
// dialog.showMessageBox(dialogOpts).then(returnValue => {
// if (returnValue.response === 0) autoUpdater.quitAndInstall()
// })
// })
startApp()
// autoUpdater.on("error", message => {
// console.error("There was a problem updating the application")
// console.error(message)
// })
// startApp()

View File

@ -1,37 +0,0 @@
// const { existsSync, readFile, writeFile, ensureDir } = require("fs-extra")
// const { join, resolve } = require("./centralPath")
// const { processString } = require("@budibase/string-templates")
// const uuid = require("uuid")
// module.exports = async opts => {
// // await ensureDir(opts.dir)
// await setCouchDbUrl(opts)
// // need an env file
// await createDevEnvFile(opts)
// }
// const setCouchDbUrl = async opts => {
// if (!opts.couchDbUrl) {
// const dataDir = join(opts.dir, ".data")
// await ensureDir(dataDir)
// opts.couchDbUrl =
// dataDir + (dataDir.endsWith("/") || dataDir.endsWith("\\") ? "" : "/")
// }
// }
// const createDevEnvFile = async opts => {
// const destConfigFile = join(opts.dir, "./.env")
// let createConfig = !existsSync(destConfigFile) || opts.quiet
// if (createConfig) {
// const template = await readFile(
// resolve(__dirname, "..", "..", ".env.template"),
// {
// encoding: "utf8",
// }
// )
// opts.cookieKey1 = opts.cookieKey1 || uuid.v4()
// const config = await processString(template, opts)
// await writeFile(destConfigFile, config, { flag: "w+" })
// }
// }