diff --git a/.github/workflows/budibase_ci.yml b/.github/workflows/budibase_ci.yml index 96db14b77a..0380f92253 100644 --- a/.github/workflows/budibase_ci.yml +++ b/.github/workflows/budibase_ci.yml @@ -7,12 +7,10 @@ on: branches: - master - develop - - next pull_request: branches: - master - develop - - next jobs: build: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1f2cb80d1d..dc1bfc3f4e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,34 +1,23 @@ name: Budibase Release on: - workflow_dispatch: - inputs: - name: - description: 'Version' - required: false - default: '0.8' - - # Trigger the workflow on push with tags, - # but only for the master branch push: - tags: - - 'v*' + branches: + - master + pull_request: + branches: + - master + jobs: release: - runs-on: ${{ matrix.os }} - - # Platforms to build on/for - strategy: - matrix: - os: [macos-latest, ubuntu-latest, windows-latest] - node-version: [12.x] + runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: actions/setup-node@v1 with: - node-version: ${{ matrix.node-version }} + node-version: 12.x - run: yarn - run: yarn lint - run: yarn bootstrap @@ -39,42 +28,15 @@ jobs: SENTRY_DSN: ${{ secrets.SENTRY_DSN }} - run: yarn test - - name: Prepare for app notarization (macOS) - if: startsWith(matrix.os, 'macos') - # Import Apple API key for app notarization on macOS - run: | - xattr -cr * - mkdir -p ~/private_keys/ - echo '${{ secrets.api_key }}' > ~/private_keys/AuthKey_${{ secrets.api_key_id }}.p8 - - - - name: Build/release Electron app - uses: samuelmeuli/action-electron-builder@v1 - with: - package_root: packages/server - - # GitHub token, automatically provided to the action - # (No need to define this secret in the repo settings) - github_token: ${{ secrets.github_token }} - - mac_certs: ${{ secrets.mac_certs }} - mac_certs_password: ${{ secrets.mac_certs_password }} - windows_certs: ${{ secrets.windows_certs }} - windows_certs_password: ${{ secrets.windows_certs_password }} - - # release the app after building - release: ${{ startsWith(github.ref, 'refs/tags/v') }} - env: - # macOS notarization API key - API_KEY_ID: ${{ secrets.api_key_id }} - API_KEY_ISSUER_ID: ${{ secrets.api_key_issuer_id }} + # - name: Publish budibase packages to NPM + # env: + # NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + # run: yarn release - name: Build/release Docker images - # only run the docker image build on linux, easiest way - if: startsWith(matrix.os, 'ubuntu') + run: | + docker login -u $DOCKER_USER -p $DOCKER_PASSWORD + yarn build:docker env: DOCKER_USER: ${{ secrets.DOCKER_USERNAME }} DOCKER_PASSWORD: ${{ secrets.DOCKER_API_KEY }} - run: | - docker login -u $DOCKER_USER -p $DOCKER_PASSWORD - yarn build:docker diff --git a/hosting/bootstrap.sh b/hosting/bootstrap.sh deleted file mode 100755 index 4e15481e64..0000000000 --- a/hosting/bootstrap.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env bash - -GITHUB_BASE_URL=https://raw.githubusercontent.com/Budibase/budibase/master/hosting - -if ! [ -x "$(command -v wget)" ]; then - echo 'Error: wget is not installed. Please install it for your operating system.' >&2 - exit 1 -fi - -fetch_config_files() { - wget $GITHUB_BASE_URL/docker-compose.yaml - wget $GITHUB_BASE_URL/envoy.yaml - wget $GITHUB_BASE_URL/hosting.properties - wget $GITHUB_BASE_URL/start.sh -} - -fetch_config_files - -# Start budibase -docker-compose --env-file hosting.properties up -d diff --git a/hosting/docker-compose.yaml b/hosting/docker-compose.yaml index 00c93ca1c6..73bbcfc39b 100644 --- a/hosting/docker-compose.yaml +++ b/hosting/docker-compose.yaml @@ -48,6 +48,7 @@ services: REDIS_URL: redis-service:6379 REDIS_PASSWORD: ${REDIS_PASSWORD} depends_on: + - redis-service - minio-service - couch-init diff --git a/hosting/scripts/linux/release-to-docker-hub.sh b/hosting/scripts/linux/release-to-docker-hub.sh index 1661fed9f0..c66faf1b89 100755 --- a/hosting/scripts/linux/release-to-docker-hub.sh +++ b/hosting/scripts/linux/release-to-docker-hub.sh @@ -3,13 +3,20 @@ tag=$1 tag=${tag:-latest} + pushd ../../build docker-compose build --force app-service docker-compose build --force worker-service -docker tag build_app-service budibase/budibase-apps:$tag -docker tag build_worker-service budibase/budibase-worker:$tag +echo "Tagging images with SHA: $GITHUB_SHA and version: $BUDIBASE_VERSION" -docker push budibase/budibase-apps -docker push budibase/budibase-worker +docker tag build_app-service budibase/apps:$tag +docker tag build_worker-service budibase/worker:$tag + +# Tag with git sha +docker tag build_app-service budibase/apps:$GITHUB_SHA +docker tag build_worker-service budibase/worker:$GITHUB_SHA + +docker push budibase/apps +docker push budibase/worker popd diff --git a/hosting/start.sh b/hosting/start.sh deleted file mode 100755 index b32098a3b7..0000000000 --- a/hosting/start.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -docker-compose --env-file hosting.properties up diff --git a/hosting/update.sh b/hosting/update.sh deleted file mode 100644 index 3ccd5e59d0..0000000000 --- a/hosting/update.sh +++ /dev/null @@ -1 +0,0 @@ -docker-compose --env-file hosting.properties pull && ./start.sh diff --git a/lerna.json b/lerna.json index bf193f9a81..90690dbf98 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "0.8.16", + "version": "0.8.18", "npmClient": "yarn", "packages": [ "packages/*" diff --git a/package.json b/package.json index 4d26be9941..e2ca53a5dc 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "initialise": "lerna run initialise", "publishdev": "lerna run publishdev", "publishnpm": "yarn build && lerna publish --force-publish", + "release": "lerna publish --force-publish --yes", "restore": "yarn run clean && yarn run bootstrap && yarn run build", "nuke": "yarn run nuke:packages && yarn run nuke:docker", "nuke:packages": "yarn run restore", diff --git a/packages/builder/package.json b/packages/builder/package.json index 6422d8f686..7d86c79c70 100644 --- a/packages/builder/package.json +++ b/packages/builder/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/builder", - "version": "0.8.16", + "version": "0.8.18", "license": "AGPL-3.0", "private": true, "scripts": { @@ -66,9 +66,9 @@ }, "dependencies": { "@budibase/bbui": "^1.58.13", - "@budibase/client": "^0.8.16", + "@budibase/client": "^0.8.18", "@budibase/colorpicker": "1.1.2", - "@budibase/string-templates": "^0.8.16", + "@budibase/string-templates": "^0.8.18", "@sentry/browser": "5.19.1", "@spectrum-css/page": "^3.0.1", "@spectrum-css/vars": "^3.0.1", diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/EventsEditor/actions/ExecuteQuery.svelte b/packages/builder/src/components/design/PropertiesPanel/PropertyControls/EventsEditor/actions/ExecuteQuery.svelte index a8b90a52d6..1c0c133cc3 100644 --- a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/EventsEditor/actions/ExecuteQuery.svelte +++ b/packages/builder/src/components/design/PropertiesPanel/PropertyControls/EventsEditor/actions/ExecuteQuery.svelte @@ -56,6 +56,7 @@ {query} schema={fetchQueryDefinition(query)} editable={false} + {datasource} /> {/if} diff --git a/packages/builder/src/stores/portal/auth.js b/packages/builder/src/stores/portal/auth.js index baf5f1bfb4..c642a5708d 100644 --- a/packages/builder/src/stores/portal/auth.js +++ b/packages/builder/src/stores/portal/auth.js @@ -8,11 +8,11 @@ export function createAuthStore() { subscribe: store.subscribe, checkAuth: async () => { const response = await api.get("/api/admin/users/self") - const user = await response.json() - if (response.status === 200) { - store.update(state => ({ ...state, user })) - } else { + if (response.status !== 200) { store.update(state => ({ ...state, user: null })) + } else { + const user = await response.json() + store.update(state => ({ ...state, user })) } }, login: async creds => { diff --git a/packages/cli/package.json b/packages/cli/package.json index 65513ae33c..0630d0b0c9 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "cli", - "version": "0.8.15", + "version": "0.8.18", "description": "Budibase CLI, for developers, self hosting and migrations.", "main": "src/index.js", "bin": { diff --git a/packages/cli/src/analytics/Client.js b/packages/cli/src/analytics/Client.js index d97fb1abfa..a3b43b5ea1 100644 --- a/packages/cli/src/analytics/Client.js +++ b/packages/cli/src/analytics/Client.js @@ -15,7 +15,7 @@ class AnalyticsClient { } capture(event) { - if (this.manager.config.analyticsDisabled) return + if (this.configManager.config.analyticsDisabled) return this.client.capture(event) } diff --git a/packages/cli/src/analytics/index.js b/packages/cli/src/analytics/index.js index 3d8ea8c5a7..d85323d1d0 100644 --- a/packages/cli/src/analytics/index.js +++ b/packages/cli/src/analytics/index.js @@ -11,13 +11,13 @@ async function optOut() { client.disable() console.log( success( - "Successfully opted out of budibase analytics. You can opt in at any time by running 'budi analytics opt-in'" + "Successfully opted out of Budibase analytics. You can opt in at any time by running 'budi analytics opt-in'" ) ) } catch (err) { console.log( error( - "Error opting out of budibase analytics. Please try again later.", + "Error opting out of Budibase analytics. Please try again later.", err ) ) @@ -30,12 +30,12 @@ async function optIn() { client.enable() console.log( success( - "Successfully opted in to budibase analytics. Thank you for helping us make budibase better!" + "Successfully opted in to Budibase analytics. Thank you for helping us make Budibase better!" ) ) } catch (err) { console.log( - error("Error opting in to budibase analytics. Please try again later.") + error("Error opting in to Budibase analytics. Please try again later.") ) } } @@ -51,12 +51,12 @@ async function status() { } const command = new Command(`${CommandWords.ANALYTICS}`) - .addHelp("Control the analytics you send to budibase.") - .addSubOption("--optin", "Opt in to sending analytics to budibase", optIn) - .addSubOption("--optout", "Opt out of sending analytics to budibase.", optOut) + .addHelp("Control the analytics you send to Budibase.") + .addSubOption("--optin", "Opt in to sending analytics to Budibase", optIn) + .addSubOption("--optout", "Opt out of sending analytics to Budibase.", optOut) .addSubOption( "--status", - "Check whether you are currently opted in to budibase analytics.", + "Check whether you are currently opted in to Budibase analytics.", status ) diff --git a/packages/cli/src/constants.js b/packages/cli/src/constants.js index a5d24514b8..fe7c61f4fa 100644 --- a/packages/cli/src/constants.js +++ b/packages/cli/src/constants.js @@ -16,4 +16,4 @@ exports.AnalyticsEvents = { } exports.BUDIBASE_POSTHOG_URL = "https://posthog.budi.live" -exports.BUDIBASE_POSTHOG_TOKEN = process.env.BUDIBASE_POSTHOG_TOKEN +exports.BUDIBASE_POSTHOG_TOKEN = "Oeq9KzIpZYaNsXIvHw5QTZWNpfiG_EOjAOpjTyAiitY" diff --git a/packages/client/package.json b/packages/client/package.json index b96c20a2f2..f5f4632de9 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/client", - "version": "0.8.16", + "version": "0.8.18", "license": "MPL-2.0", "module": "dist/budibase-client.js", "main": "dist/budibase-client.js", @@ -18,7 +18,7 @@ "dev:builder": "rollup -cw" }, "dependencies": { - "@budibase/string-templates": "^0.8.16", + "@budibase/string-templates": "^0.8.18", "regexparam": "^1.3.0", "shortid": "^2.2.15", "svelte-spa-router": "^3.0.5" @@ -26,7 +26,7 @@ "devDependencies": { "@rollup/plugin-commonjs": "^18.0.0", "@rollup/plugin-node-resolve": "^11.2.1", - "@budibase/standard-components": "^0.8.16", + "@budibase/standard-components": "^0.8.18", "fs-extra": "^8.1.0", "jsdom": "^16.0.1", "postcss": "^8.2.9", diff --git a/packages/server/package.json b/packages/server/package.json index cc2f642792..d16368a144 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/server", "email": "hi@budibase.com", - "version": "0.8.16", + "version": "0.8.18", "description": "Budibase Web Server", "main": "src/electron.js", "repository": { @@ -80,8 +80,8 @@ "license": "AGPL-3.0-or-later", "dependencies": { "@budibase/auth": "^0.18.6", - "@budibase/client": "^0.8.16", - "@budibase/string-templates": "^0.8.16", + "@budibase/client": "^0.8.18", + "@budibase/string-templates": "^0.8.18", "@elastic/elasticsearch": "7.10.0", "@koa/router": "8.0.0", "@sendgrid/mail": "7.1.1", @@ -131,7 +131,7 @@ "zlib": "1.0.5" }, "devDependencies": { - "@budibase/standard-components": "^0.8.16", + "@budibase/standard-components": "^0.8.18", "@jest/test-sequencer": "^24.8.0", "docker-compose": "^0.23.6", "eslint": "^6.8.0", diff --git a/packages/server/src/api/controllers/dev.js b/packages/server/src/api/controllers/dev.js index 86b9a11c23..2e90fb83e7 100644 --- a/packages/server/src/api/controllers/dev.js +++ b/packages/server/src/api/controllers/dev.js @@ -16,7 +16,9 @@ async function redirect(ctx, method) { body: ctx.request.body, }) ) - ctx.body = await response.json() + if (response.status !== 200) { + ctx.throw(response.status, response.statusText) + } const cookie = response.headers.get("set-cookie") if (cookie) { ctx.set("set-cookie", cookie) diff --git a/packages/server/src/api/controllers/query.js b/packages/server/src/api/controllers/query.js index d239ac0177..cd3dcbd305 100644 --- a/packages/server/src/api/controllers/query.js +++ b/packages/server/src/api/controllers/query.js @@ -119,9 +119,8 @@ exports.preview = async function (ctx) { const enrichedQuery = await enrichQueryFields(fields, parameters) - const rows = formatResponse( - await new Integration(datasource.config)[queryVerb](enrichedQuery) - ) + const integration = new Integration(datasource.config) + const rows = formatResponse(await integration[queryVerb](enrichedQuery)) // get all the potential fields in the schema const keys = rows.flatMap(Object.keys) @@ -130,6 +129,10 @@ exports.preview = async function (ctx) { rows, schemaFields: [...new Set(keys)], } + // cleanup + if (integration.end) { + integration.end() + } } exports.execute = async function (ctx) { @@ -149,10 +152,13 @@ exports.execute = async function (ctx) { ctx.request.body.parameters ) + const integration = new Integration(datasource.config) // call the relevant CRUD method on the integration class - ctx.body = formatResponse( - await new Integration(datasource.config)[query.queryVerb](enrichedQuery) - ) + ctx.body = formatResponse(await integration[query.queryVerb](enrichedQuery)) + // cleanup + if (integration.end) { + integration.end() + } } exports.destroy = async function (ctx) { diff --git a/packages/server/src/db/dynamoClient.js b/packages/server/src/db/dynamoClient.js index 19924b1a7e..58e469f80d 100644 --- a/packages/server/src/db/dynamoClient.js +++ b/packages/server/src/db/dynamoClient.js @@ -2,6 +2,7 @@ let { merge } = require("lodash") let env = require("../environment") const AWS_REGION = env.AWS_REGION ? env.AWS_REGION : "eu-west-1" +exports.AWS_REGION = AWS_REGION const TableInfo = { API_KEYS: { diff --git a/packages/server/src/integrations/dynamodb.js b/packages/server/src/integrations/dynamodb.js index 4897690075..8e74b84c6d 100644 --- a/packages/server/src/integrations/dynamodb.js +++ b/packages/server/src/integrations/dynamodb.js @@ -1,5 +1,6 @@ const AWS = require("aws-sdk") const { FIELD_TYPES, QUERY_TYPES } = require("./Integration") +const { AWS_REGION } = require("../db/dynamoClient") const SCHEMA = { docs: "https://github.com/dabit3/dynamodb-documentclient-cheat-sheet", @@ -16,7 +17,7 @@ const SCHEMA = { type: FIELD_TYPES.PASSWORD, required: true, }, - secretKey: { + secretAccessKey: { type: FIELD_TYPES.PASSWORD, required: true, }, @@ -114,10 +115,22 @@ class DynamoDBIntegration { }) } - async connect() { + end() { + this.disconnect() + } + + connect() { AWS.config.update(this.config) } + disconnect() { + AWS.config.update({ + secretAccessKey: undefined, + accessKeyId: undefined, + region: AWS_REGION, + }) + } + async create(query) { const params = { TableName: query.table, diff --git a/packages/server/src/tests/utilities/TestConfiguration.js b/packages/server/src/tests/utilities/TestConfiguration.js index ac26600681..60e503c128 100644 --- a/packages/server/src/tests/utilities/TestConfiguration.js +++ b/packages/server/src/tests/utilities/TestConfiguration.js @@ -306,11 +306,7 @@ class TestConfiguration { return await this._req(config, null, controllers.layout.save) } - async createUser( - email = EMAIL, - password = PASSWORD, - roleId = BUILTIN_ROLE_IDS.POWER - ) { + async createUser(roleId = BUILTIN_ROLE_IDS.POWER) { const globalId = `us_${Math.random()}` const resp = await this.globalUser( globalId, diff --git a/packages/server/src/utilities/queue/inMemoryQueue.js b/packages/server/src/utilities/queue/inMemoryQueue.js index 6c1d73801d..d4b1d297d8 100644 --- a/packages/server/src/utilities/queue/inMemoryQueue.js +++ b/packages/server/src/utilities/queue/inMemoryQueue.js @@ -73,6 +73,15 @@ class InMemoryQueue { this._messages.push(newJob(this._name, msg)) this._emitter.emit("message") } + + /** + * This removes a cron which has been implemented, this is part of Bull API. + * @param {string} cronJobId The cron which is to be removed. + */ + removeRepeatableByKey(cronJobId) { + // TODO: implement for testing + console.log(cronJobId) + } } module.exports = InMemoryQueue diff --git a/packages/standard-components/package.json b/packages/standard-components/package.json index 48c966f558..6d58d25144 100644 --- a/packages/standard-components/package.json +++ b/packages/standard-components/package.json @@ -29,7 +29,7 @@ "keywords": [ "svelte" ], - "version": "0.8.16", + "version": "0.8.18", "license": "MIT", "gitHead": "4b6efc42ed3273595c7a129411f4d883733d3321", "dependencies": { diff --git a/packages/string-templates/package.json b/packages/string-templates/package.json index c5ebe0f995..5e8e06bc33 100644 --- a/packages/string-templates/package.json +++ b/packages/string-templates/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/string-templates", - "version": "0.8.16", + "version": "0.8.18", "description": "Handlebars wrapper for Budibase templating.", "main": "src/index.cjs", "module": "dist/bundle.mjs", diff --git a/packages/worker/package.json b/packages/worker/package.json index 6d68f3ff1b..45d2ea7311 100644 --- a/packages/worker/package.json +++ b/packages/worker/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/worker", "email": "hi@budibase.com", - "version": "0.8.16", + "version": "0.8.18", "description": "Budibase background service", "main": "src/index.js", "repository": {