Loading .gitlab-ci.yml +54 −240 Original line number Diff line number Diff line include: - project: 'redmic-project/gitlab-ci-templates' ref: master file: '/license-listing.yml' - project: 'redmic-project/gitlab-ci-templates' ref: master file: '/packaging.yml' - project: 'redmic-project/gitlab-ci-templates' ref: master file: '/deployment.yml' stages: - pre-build - test-code - build - license-list - package - test-package - deploy - test-deploy prepare-unbuilt-version: stage: pre-build image: registry.gitlab.com/redmic-project/docker/web-build:latest variables: STACK: client WEB_BUILD_IMAGE: registry.gitlab.com/redmic-project/docker/web-build:latest .web-build: image: ${WEB_BUILD_IMAGE} cache: paths: - node_modules/ - public/javascript/redmic-widgets/node_modules/ - public/javascript/templates/node_modules/ - public/stylesheets/node_modules/ policy: pull .prepare-dependencies: extends: .web-build variables: GIT_SUBMODULE_STRATEGY: normal script: before_script: - type yarn grunt java - yarn install || yarn install prepare-unbuilt-version: stage: pre-build extends: .prepare-dependencies script: - grunt preBuild only: - branches Loading @@ -22,15 +52,10 @@ prepare-unbuilt-version: - master - schedules cache: key: ${CI_COMMIT_REF_NAME} paths: - node_modules/ - public/javascript/redmic-widgets/node_modules/ - public/javascript/templates/node_modules/ - public/stylesheets/node_modules/ policy: pull-push artifacts: name: ${CI_JOB_NAME}_${CI_COMMIT_REF_NAME} expire_in: 1 day expire_in: 1 week paths: - node_modules/ - public/javascript/proj4js/dist/proj4.js Loading @@ -42,29 +67,21 @@ prepare-unbuilt-version: run-unit-tests: stage: test-code image: registry.gitlab.com/redmic-project/docker/web-build:latest extends: .web-build script: - grunt test | tee test.out - "coverage=$(grep '^All files.*' test.out | cut -d '|' -f 2 | tr -d ' ')" - 'echo "Coverage: ${coverage}%"' - coverage=$(grep '^All files.*' test.out | cut -d '|' -f 2 | tr -d ' ') - echo "Coverage - ${coverage}%" - rm test.out only: - branches except: - master - schedules cache: key: ${CI_COMMIT_REF_NAME} paths: - node_modules/ - public/javascript/redmic-widgets/node_modules/ - public/javascript/templates/node_modules/ - public/stylesheets/node_modules/ policy: pull run-modules-functional-tests: stage: test-code image: registry.gitlab.com/redmic-project/docker/web-build:latest extends: .web-build script: - echo $(head -1 /etc/hosts | cut -f1) redmic.local >> /etc/hosts - npm start -- -p 80 & Loading @@ -74,261 +91,58 @@ run-modules-functional-tests: except: - master - schedules cache: key: ${CI_COMMIT_REF_NAME} paths: - node_modules/ - public/javascript/redmic-widgets/node_modules/ - public/javascript/templates/node_modules/ - public/stylesheets/node_modules/ policy: pull prepare-built-version: stage: build image: registry.gitlab.com/redmic-project/docker/web-build:latest variables: GIT_SUBMODULE_STRATEGY: normal extends: .prepare-dependencies script: - type yarn grunt java - yarn install || yarn install - grunt only: - branches except: - schedules cache: key: ${CI_COMMIT_REF_NAME} paths: - node_modules/ - public/javascript/redmic-widgets/node_modules/ - public/javascript/templates/node_modules/ - public/stylesheets/node_modules/ policy: pull dependencies: [] artifacts: name: ${CI_JOB_NAME}_${CI_COMMIT_REF_NAME} expire_in: 1 week expire_in: 1 month paths: - dist*.tar.gz docker-build-commit-non-master-branches: stage: package image: docker:stable variables: DOCKER_DRIVER: overlay2 services: - docker:dind only: - branches except: - master - schedules script: - docker login -u gitlab-ci-token -p ${CI_JOB_TOKEN} ${CI_REGISTRY} - docker build -t ${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHA} -t ${CI_REGISTRY_IMAGE}:${CI_COMMIT_REF_NAME}-latest . - docker push ${CI_REGISTRY_IMAGE} docker-build-commit-master-branch: stage: package image: docker:stable variables: DOCKER_DRIVER: overlay2 services: - docker:dind only: - master except: - schedules script: - docker login -u gitlab-ci-token -p ${CI_JOB_TOKEN} ${CI_REGISTRY} - docker build -t ${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHA} -t ${CI_REGISTRY_IMAGE}:latest . - docker push ${CI_REGISTRY_IMAGE} docker-tag-already-built-image: stage: package image: docker:stable variables: DOCKER_DRIVER: overlay2 services: - docker:dind only: - tags except: - schedules script: - docker login -u gitlab-ci-token -p ${CI_JOB_TOKEN} ${CI_REGISTRY} - docker pull ${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHA} - docker tag ${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHA} ${CI_REGISTRY_IMAGE}:${CI_COMMIT_TAG} - docker push ${CI_REGISTRY_IMAGE} container-scanning: stage: test-package image: docker:stable variables: DOCKER_DRIVER: overlay2 allow_failure: true services: - docker:stable-dind only: - branches except: - schedules script: - docker run -d --name db arminc/clair-db:latest - docker run -p 6060:6060 --link db:postgres -d --name clair arminc/clair-local-scan:v2.0.1 - apk add -U wget ca-certificates - docker login -u gitlab-ci-token -p ${CI_JOB_TOKEN} ${CI_REGISTRY} - docker pull ${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHA} - wget https://github.com/arminc/clair-scanner/releases/download/v8/clair-scanner_linux_amd64 - mv clair-scanner_linux_amd64 clair-scanner - chmod +x clair-scanner - touch clair-whitelist.yml - > ./clair-scanner -c http://docker:6060 --ip $(hostname -i) -r gl-sast-container-report.json -l clair.log -w clair-whitelist.yml ${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHA} || true artifacts: paths: [gl-sast-container-report.json] deploy-supporting-branch-develop: stage: deploy image: registry.gitlab.com/redmic-project/docker/docker-deploy:latest variables: DOCKER_DRIVER: overlay2 SSH_REMOTE: ${DEV_SSH_REMOTE} STACK: client SERVICES_TO_CHECK: client_${CI_PROJECT_NAME} IMAGE_NAME: ${CI_REGISTRY_IMAGE} IMAGE_TAG: ${CI_COMMIT_SHA} COMPOSE_FILE: docker-compose.tmpl.yml:docker-compose.dev.yml OAUTH_URL: ${DEV_OAUTH_URL} OAUTH_CLIENT_SECRET: ${DEV_OAUTH_CLIENT_SECRET} PUBLIC_HOSTNAME: ${DEV_PUBLIC_HOSTNAME} services: - docker:dind script: - > deploy.sh IMAGE_NAME=${IMAGE_NAME} IMAGE_TAG=${IMAGE_TAG} COMPOSE_FILE=${COMPOSE_FILE} OAUTH_URL=${OAUTH_URL} OAUTH_CLIENT_SECRET=${OAUTH_CLIENT_SECRET} PUBLIC_HOSTNAME=${PUBLIC_HOSTNAME} environment: name: dev url: https://${DEV_PUBLIC_HOSTNAME} only: - branches except: - master - schedules when: manual deploy-stable-branch-develop: stage: deploy image: registry.gitlab.com/redmic-project/docker/docker-deploy:latest variables: DOCKER_DRIVER: overlay2 SSH_REMOTE: ${DEV_SSH_REMOTE} STACK: client SERVICES_TO_CHECK: client_${CI_PROJECT_NAME} IMAGE_NAME: ${CI_REGISTRY_IMAGE} IMAGE_TAG: ${CI_COMMIT_SHA} COMPOSE_FILE: docker-compose.tmpl.yml:docker-compose.dev.yml OAUTH_URL: ${DEV_OAUTH_URL} OAUTH_CLIENT_SECRET: ${DEV_OAUTH_CLIENT_SECRET} PUBLIC_HOSTNAME: ${DEV_PUBLIC_HOSTNAME} services: - docker:dind .deploy: script: - > deploy.sh IMAGE_NAME=${IMAGE_NAME} IMAGE_TAG=${IMAGE_TAG} COMPOSE_FILE=${COMPOSE_FILE} OAUTH_URL=${OAUTH_URL} OAUTH_CLIENT_SECRET=${OAUTH_CLIENT_SECRET} PUBLIC_HOSTNAME=${PUBLIC_HOSTNAME} PUBLIC_HOSTNAME=${PUBLIC_HOSTNAME} OAUTH_URL=${OAUTH_URL} OAUTH_CLIENT_SECRET=${OAUTH_CLIENT_SECRET} API_URL=${API_URL} PRODUCTION=${PRODUCTION} environment: name: dev url: https://${DEV_PUBLIC_HOSTNAME} only: - master except: - schedules when: manual url: https://${PUBLIC_HOSTNAME} deploy-supporting-branch-production: stage: deploy image: registry.gitlab.com/redmic-project/docker/docker-deploy:latest .deploy-development: variables: DOCKER_DRIVER: overlay2 SSH_REMOTE: ${PRO_SSH_REMOTE} STACK: client SERVICES_TO_CHECK: client_${CI_PROJECT_NAME} IMAGE_NAME: ${CI_REGISTRY_IMAGE} IMAGE_TAG: ${CI_COMMIT_SHA} COMPOSE_FILE: docker-compose.tmpl.yml:docker-compose.prod.yml OAUTH_URL: ${PRO_OAUTH_URL} OAUTH_CLIENT_SECRET: ${PRO_OAUTH_CLIENT_SECRET} PUBLIC_HOSTNAME: ${PRO_PUBLIC_HOSTNAME} services: - docker:dind script: - > deploy.sh IMAGE_NAME=${IMAGE_NAME} IMAGE_TAG=${IMAGE_TAG} COMPOSE_FILE=${COMPOSE_FILE} OAUTH_URL=${OAUTH_URL} OAUTH_CLIENT_SECRET=${OAUTH_CLIENT_SECRET} PUBLIC_HOSTNAME=${PUBLIC_HOSTNAME} environment: name: pro url: https://${PRO_PUBLIC_HOSTNAME} only: - branches except: - master - schedules when: manual PRODUCTION: 0 deploy-stable-branch-production: stage: deploy image: registry.gitlab.com/redmic-project/docker/docker-deploy:latest .deploy-production: variables: DOCKER_DRIVER: overlay2 SSH_REMOTE: ${PRO_SSH_REMOTE} STACK: client SERVICES_TO_CHECK: client_${CI_PROJECT_NAME} IMAGE_NAME: ${CI_REGISTRY_IMAGE} IMAGE_TAG: ${CI_COMMIT_SHA} COMPOSE_FILE: docker-compose.tmpl.yml:docker-compose.prod.yml OAUTH_URL: ${PRO_OAUTH_URL} OAUTH_CLIENT_SECRET: ${PRO_OAUTH_CLIENT_SECRET} PUBLIC_HOSTNAME: ${PRO_PUBLIC_HOSTNAME} services: - docker:dind script: - > deploy.sh IMAGE_NAME=${IMAGE_NAME} IMAGE_TAG=${IMAGE_TAG} COMPOSE_FILE=${COMPOSE_FILE} OAUTH_URL=${OAUTH_URL} OAUTH_CLIENT_SECRET=${OAUTH_CLIENT_SECRET} PUBLIC_HOSTNAME=${PUBLIC_HOSTNAME} environment: name: pro url: https://${PRO_PUBLIC_HOSTNAME} only: - master except: - schedules when: manual PRODUCTION: 1 run-functional-tests: stage: test-deploy image: registry.gitlab.com/redmic-project/docker/web-build:latest extends: .prepare-dependencies tags: - functional-testing variables: GIT_SUBMODULE_STRATEGY: normal script: - type yarn grunt java - yarn install || yarn install - > grunt test-functional-local --server-url="https://${DEV_PUBLIC_HOSTNAME}" --user="${REDMIC_TEST_USER}" --pass="${REDMIC_TEST_PASS}" --role=administrator --suitesGroups="${SUITES_GROUPS}" --headless only: - schedules cache: key: ${CI_COMMIT_REF_NAME} paths: - node_modules/ policy: pull dependencies: [] artifacts: name: ${CI_JOB_NAME}_${CI_COMMIT_REF_NAME} expire_in: 1 month when: always paths: - "test_reports/test-functional-local*" - 'test_reports/test-functional-local*' app/exposure.js +11 −17 Original line number Diff line number Diff line Loading @@ -6,7 +6,10 @@ var express = require('express'), var logger, params, version, oauthUrl = process.env.OAUTH_URL, oauthClientSecret = process.env.OAUTH_CLIENT_SECRET; getTokenUrl = oauthUrl + '/token', oauthClientSecret = process.env.OAUTH_CLIENT_SECRET, production = !!parseInt(process.env.PRODUCTION, 10), apiUrl = process.env.API_URL; function getLang(req) { Loading @@ -26,16 +29,9 @@ function onEnvRequest(req, res) { res.send({ version: version, useBuilt: params.useBuilt, debug: params.debug }); } function onResettingRequest(req, res) { res.render('resetting', { useBuilt: params.useBuilt, lang: getLang(req), token: req.param('token') debug: params.debug, apiUrl: apiUrl, production: production }); } Loading @@ -44,7 +40,8 @@ function onActivateAccountRequest(req, res) { res.render('activateAccount', { useBuilt: params.useBuilt, lang: getLang(req), token: req.param('token') apiUrl: apiUrl, token: req.params.token }); } Loading Loading @@ -100,12 +97,11 @@ function onOauthTokenRequest(req, res) { clientCredentials = clientId + ':' + oauthClientSecret, base64ClientCredentials = Buffer.from(clientCredentials).toString('base64'), url = oauthUrl + '/api/oauth/token', authorization = 'Basic ' + base64ClientCredentials, bodyData = "grant_type=password&username=" + username + "&password=" + password + "&scope=write", bodyData = 'grant_type=password&username=' + username + '&password=' + password + '&scope=write', options = { url: url, url: getTokenUrl, method: 'POST', body: bodyData, headers: { Loading Loading @@ -135,8 +131,6 @@ function exposeRoutes(app) { .get('/env', onEnvRequest) .get('/resetting/:token', onResettingRequest) .get('/activateAccount/:token', onActivateAccountRequest) .get('/noSupportBrowser', onNoSupportBrowserRequest) Loading deploy/.env +4 −0 Original line number Diff line number Diff line OAUTH_URL=https://api.domain/oauth OAUTH_CLIENT_SECRET=secret API_URL=https://api.domain PRODUCTION=0 PORT=3050 deploy/docker-compose.tmpl.yml +6 −3 Original line number Diff line number Diff line Loading @@ -6,10 +6,12 @@ services: environment: - OAUTH_URL - OAUTH_CLIENT_SECRET - API_URL - PRODUCTION networks: - traefik-net healthcheck: test: wget --spider -S -t 3 http://localhost:${PORT} test: wget --spider -q http://localhost:${PORT} interval: 30s timeout: 10s retries: 3 Loading @@ -35,11 +37,12 @@ services: window: 1m resources: limits: cpus: '2' cpus: '1' memory: 128M reservations: memory: 103M memory: 64M networks: traefik-net: name: ${TRAEFIK_NET_NAME:-traefik-net} external: true public/javascript/app/base/models/_Persistent.js +40 −24 Original line number Diff line number Diff line define([ "dojo/_base/declare" , "dojo/_base/lang" , "dojo/request" , "dojo/json" 'app/redmicConfig' , 'dojo/_base/declare' , 'dojo/_base/lang' , 'dojo/Deferred' , 'dojo/json' , 'dojo/request' ], function( declare redmicConfig , declare , lang , xhr , Deferred , JSON , request ){ return declare(null, { // summary: Loading @@ -19,10 +23,10 @@ define([ this.config = { headers: { "Content-Type": "application/json", "Accept": "application/javascript, application/json" 'Content-Type': 'application/json', 'Accept': 'application/javascript, application/json' }, handleAs: "json" handleAs: 'json' }; lang.mixin(this, this.config, args); Loading @@ -31,30 +35,42 @@ define([ save: function() { if (!this.isValid) { console.error("Tried to save invalid model '%s' with this schema:", this.get("modelName"), this.get("schema")); console.error('Tried to save invalid model \'%s\' with this schema:', this.get('modelName'), this.get('schema')); return; } if (!this.hasChanged) { console.error("Tried to save unchanged model '%s' with this schema:", this.get("modelName"), this.get("schema")); console.error('Tried to save unchanged model \'%s\' with this schema:', this.get('modelName'), this.get('schema')); return; } var envDfd = window.env, dfd = new Deferred(); if (envDfd) { envDfd.then(lang.hitch(this, function(retDfd, envData) { var id = this.getIdValue(), method = this.get("isNew") ? "POST" : "PUT", method = this.get('isNew') ? 'POST' : 'PUT', data = JSON.stringify(this.serialize()), target = this.target + "/"; target = redmicConfig.getServiceUrl(this.target, envData) + '/'; return xhr(id ? target + id : target, { var reqDfd = request(id ? target + id : target, { headers: this.headers, handleAs: this.handleAs, method: method, data: data }); reqDfd.then(lang.hitch(retDfd, retDfd.resolve), lang.hitch(retDfd, retDfd.reject)); }, dfd)); } return dfd; } }); }); Loading
.gitlab-ci.yml +54 −240 Original line number Diff line number Diff line include: - project: 'redmic-project/gitlab-ci-templates' ref: master file: '/license-listing.yml' - project: 'redmic-project/gitlab-ci-templates' ref: master file: '/packaging.yml' - project: 'redmic-project/gitlab-ci-templates' ref: master file: '/deployment.yml' stages: - pre-build - test-code - build - license-list - package - test-package - deploy - test-deploy prepare-unbuilt-version: stage: pre-build image: registry.gitlab.com/redmic-project/docker/web-build:latest variables: STACK: client WEB_BUILD_IMAGE: registry.gitlab.com/redmic-project/docker/web-build:latest .web-build: image: ${WEB_BUILD_IMAGE} cache: paths: - node_modules/ - public/javascript/redmic-widgets/node_modules/ - public/javascript/templates/node_modules/ - public/stylesheets/node_modules/ policy: pull .prepare-dependencies: extends: .web-build variables: GIT_SUBMODULE_STRATEGY: normal script: before_script: - type yarn grunt java - yarn install || yarn install prepare-unbuilt-version: stage: pre-build extends: .prepare-dependencies script: - grunt preBuild only: - branches Loading @@ -22,15 +52,10 @@ prepare-unbuilt-version: - master - schedules cache: key: ${CI_COMMIT_REF_NAME} paths: - node_modules/ - public/javascript/redmic-widgets/node_modules/ - public/javascript/templates/node_modules/ - public/stylesheets/node_modules/ policy: pull-push artifacts: name: ${CI_JOB_NAME}_${CI_COMMIT_REF_NAME} expire_in: 1 day expire_in: 1 week paths: - node_modules/ - public/javascript/proj4js/dist/proj4.js Loading @@ -42,29 +67,21 @@ prepare-unbuilt-version: run-unit-tests: stage: test-code image: registry.gitlab.com/redmic-project/docker/web-build:latest extends: .web-build script: - grunt test | tee test.out - "coverage=$(grep '^All files.*' test.out | cut -d '|' -f 2 | tr -d ' ')" - 'echo "Coverage: ${coverage}%"' - coverage=$(grep '^All files.*' test.out | cut -d '|' -f 2 | tr -d ' ') - echo "Coverage - ${coverage}%" - rm test.out only: - branches except: - master - schedules cache: key: ${CI_COMMIT_REF_NAME} paths: - node_modules/ - public/javascript/redmic-widgets/node_modules/ - public/javascript/templates/node_modules/ - public/stylesheets/node_modules/ policy: pull run-modules-functional-tests: stage: test-code image: registry.gitlab.com/redmic-project/docker/web-build:latest extends: .web-build script: - echo $(head -1 /etc/hosts | cut -f1) redmic.local >> /etc/hosts - npm start -- -p 80 & Loading @@ -74,261 +91,58 @@ run-modules-functional-tests: except: - master - schedules cache: key: ${CI_COMMIT_REF_NAME} paths: - node_modules/ - public/javascript/redmic-widgets/node_modules/ - public/javascript/templates/node_modules/ - public/stylesheets/node_modules/ policy: pull prepare-built-version: stage: build image: registry.gitlab.com/redmic-project/docker/web-build:latest variables: GIT_SUBMODULE_STRATEGY: normal extends: .prepare-dependencies script: - type yarn grunt java - yarn install || yarn install - grunt only: - branches except: - schedules cache: key: ${CI_COMMIT_REF_NAME} paths: - node_modules/ - public/javascript/redmic-widgets/node_modules/ - public/javascript/templates/node_modules/ - public/stylesheets/node_modules/ policy: pull dependencies: [] artifacts: name: ${CI_JOB_NAME}_${CI_COMMIT_REF_NAME} expire_in: 1 week expire_in: 1 month paths: - dist*.tar.gz docker-build-commit-non-master-branches: stage: package image: docker:stable variables: DOCKER_DRIVER: overlay2 services: - docker:dind only: - branches except: - master - schedules script: - docker login -u gitlab-ci-token -p ${CI_JOB_TOKEN} ${CI_REGISTRY} - docker build -t ${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHA} -t ${CI_REGISTRY_IMAGE}:${CI_COMMIT_REF_NAME}-latest . - docker push ${CI_REGISTRY_IMAGE} docker-build-commit-master-branch: stage: package image: docker:stable variables: DOCKER_DRIVER: overlay2 services: - docker:dind only: - master except: - schedules script: - docker login -u gitlab-ci-token -p ${CI_JOB_TOKEN} ${CI_REGISTRY} - docker build -t ${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHA} -t ${CI_REGISTRY_IMAGE}:latest . - docker push ${CI_REGISTRY_IMAGE} docker-tag-already-built-image: stage: package image: docker:stable variables: DOCKER_DRIVER: overlay2 services: - docker:dind only: - tags except: - schedules script: - docker login -u gitlab-ci-token -p ${CI_JOB_TOKEN} ${CI_REGISTRY} - docker pull ${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHA} - docker tag ${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHA} ${CI_REGISTRY_IMAGE}:${CI_COMMIT_TAG} - docker push ${CI_REGISTRY_IMAGE} container-scanning: stage: test-package image: docker:stable variables: DOCKER_DRIVER: overlay2 allow_failure: true services: - docker:stable-dind only: - branches except: - schedules script: - docker run -d --name db arminc/clair-db:latest - docker run -p 6060:6060 --link db:postgres -d --name clair arminc/clair-local-scan:v2.0.1 - apk add -U wget ca-certificates - docker login -u gitlab-ci-token -p ${CI_JOB_TOKEN} ${CI_REGISTRY} - docker pull ${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHA} - wget https://github.com/arminc/clair-scanner/releases/download/v8/clair-scanner_linux_amd64 - mv clair-scanner_linux_amd64 clair-scanner - chmod +x clair-scanner - touch clair-whitelist.yml - > ./clair-scanner -c http://docker:6060 --ip $(hostname -i) -r gl-sast-container-report.json -l clair.log -w clair-whitelist.yml ${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHA} || true artifacts: paths: [gl-sast-container-report.json] deploy-supporting-branch-develop: stage: deploy image: registry.gitlab.com/redmic-project/docker/docker-deploy:latest variables: DOCKER_DRIVER: overlay2 SSH_REMOTE: ${DEV_SSH_REMOTE} STACK: client SERVICES_TO_CHECK: client_${CI_PROJECT_NAME} IMAGE_NAME: ${CI_REGISTRY_IMAGE} IMAGE_TAG: ${CI_COMMIT_SHA} COMPOSE_FILE: docker-compose.tmpl.yml:docker-compose.dev.yml OAUTH_URL: ${DEV_OAUTH_URL} OAUTH_CLIENT_SECRET: ${DEV_OAUTH_CLIENT_SECRET} PUBLIC_HOSTNAME: ${DEV_PUBLIC_HOSTNAME} services: - docker:dind script: - > deploy.sh IMAGE_NAME=${IMAGE_NAME} IMAGE_TAG=${IMAGE_TAG} COMPOSE_FILE=${COMPOSE_FILE} OAUTH_URL=${OAUTH_URL} OAUTH_CLIENT_SECRET=${OAUTH_CLIENT_SECRET} PUBLIC_HOSTNAME=${PUBLIC_HOSTNAME} environment: name: dev url: https://${DEV_PUBLIC_HOSTNAME} only: - branches except: - master - schedules when: manual deploy-stable-branch-develop: stage: deploy image: registry.gitlab.com/redmic-project/docker/docker-deploy:latest variables: DOCKER_DRIVER: overlay2 SSH_REMOTE: ${DEV_SSH_REMOTE} STACK: client SERVICES_TO_CHECK: client_${CI_PROJECT_NAME} IMAGE_NAME: ${CI_REGISTRY_IMAGE} IMAGE_TAG: ${CI_COMMIT_SHA} COMPOSE_FILE: docker-compose.tmpl.yml:docker-compose.dev.yml OAUTH_URL: ${DEV_OAUTH_URL} OAUTH_CLIENT_SECRET: ${DEV_OAUTH_CLIENT_SECRET} PUBLIC_HOSTNAME: ${DEV_PUBLIC_HOSTNAME} services: - docker:dind .deploy: script: - > deploy.sh IMAGE_NAME=${IMAGE_NAME} IMAGE_TAG=${IMAGE_TAG} COMPOSE_FILE=${COMPOSE_FILE} OAUTH_URL=${OAUTH_URL} OAUTH_CLIENT_SECRET=${OAUTH_CLIENT_SECRET} PUBLIC_HOSTNAME=${PUBLIC_HOSTNAME} PUBLIC_HOSTNAME=${PUBLIC_HOSTNAME} OAUTH_URL=${OAUTH_URL} OAUTH_CLIENT_SECRET=${OAUTH_CLIENT_SECRET} API_URL=${API_URL} PRODUCTION=${PRODUCTION} environment: name: dev url: https://${DEV_PUBLIC_HOSTNAME} only: - master except: - schedules when: manual url: https://${PUBLIC_HOSTNAME} deploy-supporting-branch-production: stage: deploy image: registry.gitlab.com/redmic-project/docker/docker-deploy:latest .deploy-development: variables: DOCKER_DRIVER: overlay2 SSH_REMOTE: ${PRO_SSH_REMOTE} STACK: client SERVICES_TO_CHECK: client_${CI_PROJECT_NAME} IMAGE_NAME: ${CI_REGISTRY_IMAGE} IMAGE_TAG: ${CI_COMMIT_SHA} COMPOSE_FILE: docker-compose.tmpl.yml:docker-compose.prod.yml OAUTH_URL: ${PRO_OAUTH_URL} OAUTH_CLIENT_SECRET: ${PRO_OAUTH_CLIENT_SECRET} PUBLIC_HOSTNAME: ${PRO_PUBLIC_HOSTNAME} services: - docker:dind script: - > deploy.sh IMAGE_NAME=${IMAGE_NAME} IMAGE_TAG=${IMAGE_TAG} COMPOSE_FILE=${COMPOSE_FILE} OAUTH_URL=${OAUTH_URL} OAUTH_CLIENT_SECRET=${OAUTH_CLIENT_SECRET} PUBLIC_HOSTNAME=${PUBLIC_HOSTNAME} environment: name: pro url: https://${PRO_PUBLIC_HOSTNAME} only: - branches except: - master - schedules when: manual PRODUCTION: 0 deploy-stable-branch-production: stage: deploy image: registry.gitlab.com/redmic-project/docker/docker-deploy:latest .deploy-production: variables: DOCKER_DRIVER: overlay2 SSH_REMOTE: ${PRO_SSH_REMOTE} STACK: client SERVICES_TO_CHECK: client_${CI_PROJECT_NAME} IMAGE_NAME: ${CI_REGISTRY_IMAGE} IMAGE_TAG: ${CI_COMMIT_SHA} COMPOSE_FILE: docker-compose.tmpl.yml:docker-compose.prod.yml OAUTH_URL: ${PRO_OAUTH_URL} OAUTH_CLIENT_SECRET: ${PRO_OAUTH_CLIENT_SECRET} PUBLIC_HOSTNAME: ${PRO_PUBLIC_HOSTNAME} services: - docker:dind script: - > deploy.sh IMAGE_NAME=${IMAGE_NAME} IMAGE_TAG=${IMAGE_TAG} COMPOSE_FILE=${COMPOSE_FILE} OAUTH_URL=${OAUTH_URL} OAUTH_CLIENT_SECRET=${OAUTH_CLIENT_SECRET} PUBLIC_HOSTNAME=${PUBLIC_HOSTNAME} environment: name: pro url: https://${PRO_PUBLIC_HOSTNAME} only: - master except: - schedules when: manual PRODUCTION: 1 run-functional-tests: stage: test-deploy image: registry.gitlab.com/redmic-project/docker/web-build:latest extends: .prepare-dependencies tags: - functional-testing variables: GIT_SUBMODULE_STRATEGY: normal script: - type yarn grunt java - yarn install || yarn install - > grunt test-functional-local --server-url="https://${DEV_PUBLIC_HOSTNAME}" --user="${REDMIC_TEST_USER}" --pass="${REDMIC_TEST_PASS}" --role=administrator --suitesGroups="${SUITES_GROUPS}" --headless only: - schedules cache: key: ${CI_COMMIT_REF_NAME} paths: - node_modules/ policy: pull dependencies: [] artifacts: name: ${CI_JOB_NAME}_${CI_COMMIT_REF_NAME} expire_in: 1 month when: always paths: - "test_reports/test-functional-local*" - 'test_reports/test-functional-local*'
app/exposure.js +11 −17 Original line number Diff line number Diff line Loading @@ -6,7 +6,10 @@ var express = require('express'), var logger, params, version, oauthUrl = process.env.OAUTH_URL, oauthClientSecret = process.env.OAUTH_CLIENT_SECRET; getTokenUrl = oauthUrl + '/token', oauthClientSecret = process.env.OAUTH_CLIENT_SECRET, production = !!parseInt(process.env.PRODUCTION, 10), apiUrl = process.env.API_URL; function getLang(req) { Loading @@ -26,16 +29,9 @@ function onEnvRequest(req, res) { res.send({ version: version, useBuilt: params.useBuilt, debug: params.debug }); } function onResettingRequest(req, res) { res.render('resetting', { useBuilt: params.useBuilt, lang: getLang(req), token: req.param('token') debug: params.debug, apiUrl: apiUrl, production: production }); } Loading @@ -44,7 +40,8 @@ function onActivateAccountRequest(req, res) { res.render('activateAccount', { useBuilt: params.useBuilt, lang: getLang(req), token: req.param('token') apiUrl: apiUrl, token: req.params.token }); } Loading Loading @@ -100,12 +97,11 @@ function onOauthTokenRequest(req, res) { clientCredentials = clientId + ':' + oauthClientSecret, base64ClientCredentials = Buffer.from(clientCredentials).toString('base64'), url = oauthUrl + '/api/oauth/token', authorization = 'Basic ' + base64ClientCredentials, bodyData = "grant_type=password&username=" + username + "&password=" + password + "&scope=write", bodyData = 'grant_type=password&username=' + username + '&password=' + password + '&scope=write', options = { url: url, url: getTokenUrl, method: 'POST', body: bodyData, headers: { Loading Loading @@ -135,8 +131,6 @@ function exposeRoutes(app) { .get('/env', onEnvRequest) .get('/resetting/:token', onResettingRequest) .get('/activateAccount/:token', onActivateAccountRequest) .get('/noSupportBrowser', onNoSupportBrowserRequest) Loading
deploy/.env +4 −0 Original line number Diff line number Diff line OAUTH_URL=https://api.domain/oauth OAUTH_CLIENT_SECRET=secret API_URL=https://api.domain PRODUCTION=0 PORT=3050
deploy/docker-compose.tmpl.yml +6 −3 Original line number Diff line number Diff line Loading @@ -6,10 +6,12 @@ services: environment: - OAUTH_URL - OAUTH_CLIENT_SECRET - API_URL - PRODUCTION networks: - traefik-net healthcheck: test: wget --spider -S -t 3 http://localhost:${PORT} test: wget --spider -q http://localhost:${PORT} interval: 30s timeout: 10s retries: 3 Loading @@ -35,11 +37,12 @@ services: window: 1m resources: limits: cpus: '2' cpus: '1' memory: 128M reservations: memory: 103M memory: 64M networks: traefik-net: name: ${TRAEFIK_NET_NAME:-traefik-net} external: true
public/javascript/app/base/models/_Persistent.js +40 −24 Original line number Diff line number Diff line define([ "dojo/_base/declare" , "dojo/_base/lang" , "dojo/request" , "dojo/json" 'app/redmicConfig' , 'dojo/_base/declare' , 'dojo/_base/lang' , 'dojo/Deferred' , 'dojo/json' , 'dojo/request' ], function( declare redmicConfig , declare , lang , xhr , Deferred , JSON , request ){ return declare(null, { // summary: Loading @@ -19,10 +23,10 @@ define([ this.config = { headers: { "Content-Type": "application/json", "Accept": "application/javascript, application/json" 'Content-Type': 'application/json', 'Accept': 'application/javascript, application/json' }, handleAs: "json" handleAs: 'json' }; lang.mixin(this, this.config, args); Loading @@ -31,30 +35,42 @@ define([ save: function() { if (!this.isValid) { console.error("Tried to save invalid model '%s' with this schema:", this.get("modelName"), this.get("schema")); console.error('Tried to save invalid model \'%s\' with this schema:', this.get('modelName'), this.get('schema')); return; } if (!this.hasChanged) { console.error("Tried to save unchanged model '%s' with this schema:", this.get("modelName"), this.get("schema")); console.error('Tried to save unchanged model \'%s\' with this schema:', this.get('modelName'), this.get('schema')); return; } var envDfd = window.env, dfd = new Deferred(); if (envDfd) { envDfd.then(lang.hitch(this, function(retDfd, envData) { var id = this.getIdValue(), method = this.get("isNew") ? "POST" : "PUT", method = this.get('isNew') ? 'POST' : 'PUT', data = JSON.stringify(this.serialize()), target = this.target + "/"; target = redmicConfig.getServiceUrl(this.target, envData) + '/'; return xhr(id ? target + id : target, { var reqDfd = request(id ? target + id : target, { headers: this.headers, handleAs: this.handleAs, method: method, data: data }); reqDfd.then(lang.hitch(retDfd, retDfd.resolve), lang.hitch(retDfd, retDfd.reject)); }, dfd)); } return dfd; } }); });