[AAE-6455] use tpl format instead of json and replace values (#2374)

* Use the tpl instead of json and replace values for build start and e2e

* Use different license file name to avoid conflicts

* use the travis value

* Use the general ng build and add doc
This commit is contained in:
Maurizio Vitale 2021-12-07 15:38:01 +00:00 committed by GitHub
parent c78e338285
commit 056ff4b011
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 249 additions and 49 deletions

2
.gitignore vendored
View File

@ -3,6 +3,8 @@
# compiled output
/dist
/tmp
/.tmp
/src/.tmp
/out-tsc
# dependencies

View File

@ -44,6 +44,16 @@ env:
- ADMIN_EMAIL=$ADMIN_EMAIL_REMOTE
- ADMIN_PASSWORD=$ADMIN_PASSWORD_REMOTE
- CONTENT_CE_DIST_PATH="./dist/content-ce"
# APP CONFIG DEFAULTS
- APP_CONFIG_PROVIDER=ECM
- APP_CONFIG_AUTH_TYPE=BASIC
- APP_CONFIG_OAUTH2_HOST=http://localhost:4200/auth/realms/alfresco
- APP_CONFIG_OAUTH2_CLIENTID=alfresco
- APP_CONFIG_OAUTH2_IMPLICIT_FLOW=true
- APP_CONFIG_OAUTH2_SILENT_LOGIN=true
- APP_CONFIG_OAUTH2_REDIRECT_LOGOUT=/
- APP_CONFIG_OAUTH2_REDIRECT_LOGIN=/
- APP_CONFIG_OAUTH2_REDIRECT_SILENT_IFRAME_URI="{protocol}//{hostname}{:port}/assets/silent-refresh.html"
jobs:
include:
@ -54,7 +64,7 @@ jobs:
- stage: Quality and Unit tests
name: 'Build (without animation)'
before_script: npx @alfresco/adf-cli update-commit-sha --pointer "HEAD" --pathPackage "$(pwd)"
script: npm ci && npm run build.e2e
script: npm ci && npm run build -- --prod --configuration=e2e
after_success: ./scripts/ci/utils/artifact-to-s3.sh -a $CONTENT_CE_DIST_PATH -o "$S3_DBP_FOLDER/alfresco-content-app.tar.bz2" || travis_terminate 1
cache: false

View File

@ -39,7 +39,11 @@
},
"src/assets",
"src/favicon-96x96.png",
"src/app.config.json",
{
"input": "src/.tmp",
"output": "/",
"glob": "app.config.json"
},
{
"glob": "**/*",
"input": "node_modules/@alfresco/adf-core/prebuilt-themes",
@ -236,7 +240,11 @@
"assets": [
"src/assets",
"src/favicon-96x96.png",
"src/app.config.json",
{
"input": "src/.tmp",
"output": "/",
"glob": "app.config.json"
},
{
"glob": "**/*",
"input": "node_modules/@alfresco/adf-core/prebuilt-themes",

View File

@ -29,11 +29,20 @@ The application runs at port `4200` by default, and should automatically open in
## Setting up environment variables
You might need to set some environment variables to be able to run the local dev server. In the project's root folder, create a `.env` file (this is gitignored) with the following data:
We need to set some environment variable to be able to run the local dev server. In the project root folder, create an `.env` file (this is gitignored) with the following data:
```bash
API_CONTENT_HOST="http://your-url-here"
```
# App config settings
APP_CONFIG_ECM_HOST="<url>"
APP_CONFIG_OAUTH2_HOST="<url>"
APP_CONFIG_PROVIDER="BPM"
APP_CONFIG_AUTH_TYPE="BASIC"
APP_CONFIG_OAUTH2_CLIENTID="clientid"
APP_CONFIG_OAUTH2_IMPLICIT_FLOW=true
APP_CONFIG_OAUTH2_SILENT_LOGIN=true
APP_CONFIG_OAUTH2_REDIRECT_SILENT_IFRAME_URI="{protocol}//{hostname}{:port}/assets/silent-refresh.html"
APP_CONFIG_OAUTH2_REDIRECT_LOGIN=/
APP_CONFIG_OAUTH2_REDIRECT_LOGOUT=/
## Proxy settings

View File

@ -1,5 +1,43 @@
let fallback = require('connect-history-api-fallback');
require('@alfresco/adf-cli/tooling').dotenvConfig();
var proxyMiddleware = require('http-proxy-middleware');
function getProxy(contentHost) {
return {
'/alfresco': {
target: contentHost,
secure: false,
changeOrigin: true,
// workaround for REPO-2260
onProxyRes: function (proxyRes, req, res) {
const header = proxyRes.headers['www-authenticate'];
if (header && header.startsWith('Basic')) {
proxyRes.headers['www-authenticate'] = 'x' + header;
}
},
}
}
}
function getMiddleWares() {
var counter = 0;
const proxies = {
...getProxy(process.env.APP_CONFIG_ECM_HOST),
};
const appMiddlewares = Object.keys(proxies).reduce((accumulator, proxyName) => {
counter++;
return {
...accumulator,
[counter]: proxyMiddleware(proxyName, proxies[proxyName]),
}
}, {});
counter++;
return {
...appMiddlewares,
[counter]: fallback({ index: '/index.html', verbose: true }),
};
}
module.exports = {
injectChanges: false, // workaround for Angular 2 styleUrls loading
files: ['./**/*.{html,htm,css,js}'],
@ -11,8 +49,6 @@ module.exports = {
port: 4200,
open: false,
server: {
middleware: {
1: fallback({ index: '/index.html', verbose: true })
}
middleware: getMiddleWares(),
}
};

118
package-lock.json generated
View File

@ -6563,6 +6563,12 @@
"integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==",
"dev": true
},
"dotenv-expand": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz",
"integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==",
"dev": true
},
"duplexify": {
"version": "3.7.1",
"resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
@ -6832,6 +6838,78 @@
"integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
"dev": true
},
"envsub": {
"version": "4.0.7",
"resolved": "https://registry.npmjs.org/envsub/-/envsub-4.0.7.tgz",
"integrity": "sha512-Vr2qsbaTeJEstIoT0GlKnoySmvL91b8LI3D/aicuo1styWcNUvfYv3oeFD2lhB1+S6H/e2TvEkZbmhzDM73Okw==",
"dev": true,
"requires": {
"bluebird": "^3.7.2",
"chalk": "^3.0.0",
"commander": "^4.0.1",
"diff": "^4.0.1",
"handlebars": "^4.5.3",
"lodash": "^4.17.15",
"replace-last": "^1.2.6"
},
"dependencies": {
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"requires": {
"color-convert": "^2.0.1"
}
},
"chalk": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
"integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
"dev": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
"commander": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
"integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
"dev": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"requires": {
"has-flag": "^4.0.0"
}
}
}
},
"err-code": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz",
@ -8061,6 +8139,27 @@
"integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==",
"dev": true
},
"handlebars": {
"version": "4.7.7",
"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz",
"integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==",
"dev": true,
"requires": {
"minimist": "^1.2.5",
"neo-async": "^2.6.0",
"source-map": "^0.6.1",
"uglify-js": "^3.1.4",
"wordwrap": "^1.0.0"
},
"dependencies": {
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true
}
}
},
"har-schema": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
@ -13973,6 +14072,12 @@
"integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
"dev": true
},
"replace-last": {
"version": "1.2.6",
"resolved": "https://registry.npmjs.org/replace-last/-/replace-last-1.2.6.tgz",
"integrity": "sha512-Cj+MK38VtNu1S5J73mEZY3ciQb9dJajNq1Q8inP4dn/MhJMjHwoAF3Z3FjspwAEV9pfABl565MQucmrjOkty4g==",
"dev": true
},
"request": {
"version": "2.88.2",
"resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
@ -16793,6 +16898,13 @@
"integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==",
"dev": true
},
"uglify-js": {
"version": "3.14.4",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.4.tgz",
"integrity": "sha512-AbiSR44J0GoCeV81+oxcy/jDOElO2Bx3d0MfQCUShq7JRXaM4KtQopZsq2vFv8bCq2yMaGrw1FgygUd03RyRDA==",
"dev": true,
"optional": true
},
"unbox-primitive": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz",
@ -18580,6 +18692,12 @@
}
}
},
"wordwrap": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
"integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
"dev": true
},
"worker-farm": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz",

View File

@ -6,21 +6,23 @@
"scripts": {
"postinstall": "ngcc",
"ng": "ng",
"start": "npm run validate-config && ng serve --open",
"start:prod": "npm run validate-config && node --max-old-space-size=8192 node_modules/@angular/cli/bin/ng serve --prod --open",
"validate-app-config": "ajv validate -s ./node_modules/@alfresco/adf-core/app.config.schema.json -d ./src/.tmp/app.config.json --errors=text --verbose",
"assemble-app-config": "envsub --env-file ./.env --env APP_CONFIG_ECM_HOST={protocol}//{hostname}{:port} --env APP_CONFIG_PROVIDER=ECM --env APP_CONFIG_AUTH_TYPE=BASIC --env APP_CONFIG_OAUTH2_HOST=http://localhost:4200/auth/realms/alfresco --env APP_CONFIG_OAUTH2_CLIENTID=alfresco --env APP_CONFIG_OAUTH2_IMPLICIT_FLOW=true --env APP_CONFIG_OAUTH2_SILENT_LOGIN=true --env APP_CONFIG_OAUTH2_REDIRECT_SILENT_IFRAME_URI={protocol}//{hostname}{:port}/assets/silent-refresh.html --env APP_CONFIG_OAUTH2_REDIRECT_LOGIN=/ --env APP_CONFIG_OAUTH2_REDIRECT_LOGOUT=/logout --all ./src/app.config.json.tpl ./src/.tmp/app.config.json",
"prestart": "mkdir -p ./src/.tmp && npm run assemble-app-config && npm run validate-app-config",
"start": "ng serve",
"start:prod": "npm run validate-app-config && node --max-old-space-size=8192 node_modules/@angular/cli/bin/ng serve --prod --open",
"build.app": "node --max-old-space-size=8192 node_modules/@angular/cli/bin/ng build app",
"build": "npm run validate-config && npm run build.app -- --prod",
"build.e2e": "npm run build.app -- --prod --configuration=e2e",
"prebuild": "mkdir -p ./src/.tmp && cp ./src/app.config.json.tpl ./src/.tmp/app.config.json",
"build": "ng build",
"build.release": "npm run build.app -- --configuration=production,release",
"test": "ng test app --code-coverage",
"test": "ng test",
"test:ci": "ng test adf-office-services-ext --watch=false && ng test app --code-coverage --watch=false",
"lint": "ng lint && npm run spellcheck && npm run e2e.typecheck",
"update-webdriver": "./scripts/update-webdriver.sh",
"e2e.typecheck": "tsc -p ./e2e/tsconfig.e2e.typecheck.json",
"e2e": "npm run update-webdriver && protractor $SUITE",
"spellcheck": "cspell '{src,e2e,projects}/**/*.ts'",
"inspect.bundle": "ng build app --prod --stats-json && npx webpack-bundle-analyzer dist/content-ce/stats.json",
"validate-config": "ajv validate -s ./node_modules/@alfresco/adf-core/app.config.schema.json -d ./src/app.config.json --errors=text --verbose"
"inspect.bundle": "ng build app --prod --stats-json && npx webpack-bundle-analyzer dist/app/stats.json"
},
"private": true,
"dependencies": {
@ -79,6 +81,8 @@
"connect-history-api-fallback": "^1.6.0",
"cspell": "^5.13.1",
"dotenv": "^8.2.0",
"dotenv-expand": "^5.1.0",
"envsub": "^4.0.7",
"http-server": "^14.0.0",
"husky": "^7.0.2",
"inquirer": "^8.1.5",

View File

@ -1,5 +1,20 @@
#!/usr/bin/env bash
# ---------------------------------------------------------------
# Validating replaced app.config.json
# ---------------------------------------------------------------
app_config_checker(){
APP_CONFIG_FILE_PATH=$1;
echo -n " \_ Validating replaced config file ... ";
$(npm bin)/ajv validate -s ./node_modules/@alfresco/adf-core/app.config.schema.json -d $APP_CONFIG_FILE_PATH --errors=text --verbose || exit 4
if grep -E -q '\$\{[A-Z0-9_]*\}' $APP_CONFIG_FILE_PATH; then
echo -e "\e[31m \_ ERROR: Variables are still present in the app.config.json file. Some of them might not have default value set.\e[0m";
exit 5;
fi
}
FROM=$1;
TO=$2;
PARAMS=$3;
@ -11,7 +26,13 @@ echo "====== Check content UP ====="
echo "====== Download artifacts ====="
# Download built application artifact from S3
./scripts/ci/utils/artifact-from-s3.sh -a "$FROM" -o "$TO"
node "./scripts/app-config-replace.js" --config="$TO/app.config.json" $PARAMS
APP_CONFIG_FILE_PATH="$TO/app.config.json"
EXTRA_ENV_SETTINGS=""
# Replace variables in app.config.json
envsub $EXTRA_ENV_SETTINGS --all $APP_CONFIG_FILE_PATH $APP_CONFIG_FILE_PATH || exit 1
app_config_checker $APP_CONFIG_FILE_PATH
# Download protractor-smartrunner artifact related to this particular job from S3, if exists
./scripts/ci/utils/artifact-from-s3.sh -a "$S3_DBP_FOLDER/protractor-smartrunner-$TRAVIS_JOB_ID.tar.bz2" -o "$SMART_RUNNER_DIRECTORY"

View File

@ -1,22 +1,22 @@
{
"$schema": "../node_modules/@alfresco/adf-core/app.config.schema.json",
"ecmHost": "{protocol}//{hostname}{:port}",
"aosHost": "{protocol}//{hostname}{:port}/alfresco/aos",
"baseShareUrl": "{protocol}//{hostname}{:port}/#/preview/s",
"providers": "ECM",
"authType": "BASIC",
"ecmHost": "${APP_CONFIG_ECM_HOST}",
"aosHost": "${APP_CONFIG_ECM_HOST}/alfresco/aos",
"baseShareUrl": "${APP_CONFIG_ECM_HOST}/#/preview/s",
"providers": "${APP_CONFIG_PROVIDER}",
"authType": "${APP_CONFIG_AUTH_TYPE}",
"loginRoute": "login",
"oauth2": {
"host": "http://localhost:4200/auth/realms/alfresco",
"clientId": "alfresco",
"host": "${APP_CONFIG_OAUTH2_HOST}",
"clientId": "${APP_CONFIG_OAUTH2_CLIENTID}",
"scope": "openid",
"secret": "",
"implicitFlow": true,
"silentLogin": true,
"implicitFlow": ${APP_CONFIG_OAUTH2_IMPLICIT_FLOW},
"silentLogin": ${APP_CONFIG_OAUTH2_SILENT_LOGIN},
"publicUrls": ["**/preview/s/*", "**/settings", "**/blank"],
"redirectSilentIframeUri": "{protocol}//{hostname}{:port}/assets/silent-refresh.html",
"redirectUri": "/",
"redirectUriLogout": "/logout"
"redirectSilentIframeUri": "${APP_CONFIG_OAUTH2_REDIRECT_SILENT_IFRAME_URI}",
"redirectUri": "${APP_CONFIG_OAUTH2_REDIRECT_LOGIN}",
"redirectUriLogout": "${APP_CONFIG_OAUTH2_REDIRECT_LOGOUT}"
},
"locale": "en",
"application": {

View File

@ -1,23 +1,15 @@
require('dotenv').config();
require('@alfresco/adf-cli/tooling').dotenvConfig({ path: process.env.ENV_FILE });
const APP_CONFIG_ECM_HOST = process.env.APP_CONFIG_ECM_HOST || 'http://0.0.0.0:8080';
const APP_CONFIG_ECM_HOST = process.env.APP_CONFIG_ECM_HOST;
module.exports = {
'/alfresco': {
target: APP_CONFIG_ECM_HOST,
secure: false,
changeOrigin: true,
// workaround for REPO-2260
onProxyRes: function (proxyRes) {
const header = proxyRes.headers['www-authenticate'];
if (header && header.startsWith('Basic')) {
proxyRes.headers['www-authenticate'] = 'x' + header;
}
}
"/alfresco": {
"target": APP_CONFIG_ECM_HOST,
"secure": false,
"pathRewrite": {
"^/alfresco/alfresco": ""
},
'/auth': {
target: APP_CONFIG_ECM_HOST,
secure: false,
changeOrigin: true
"changeOrigin": true,
'logLevel': 'debug'
}
};

View File

@ -11,7 +11,7 @@
],
"rules": {
"prettier": true,
"adf-license-banner": [true, "**/*.ts", "./license-header.txt"],
"adf-license-banner": [true, "**/*.ts", "./license-header-aca.txt"],
"ban": [
true,
"eval",