Skip to content
Snippets Groups Projects
Commit f4b2dd83 authored by OZGCloud's avatar OZGCloud
Browse files

Merge pull request 'OZG-6368-Jenkins' (#789) from OZG-6368-Jenkins into master

parents ecbcb80e 0dfaad64
No related branches found
No related tags found
No related merge requests found
Showing
with 415 additions and 162 deletions
......@@ -23,7 +23,10 @@ pipeline {
FAILED_PARALLEL_STAGE = " "
EA_BEZEICHNER = generateBezeichner("e2e-ea")
MAIN_BEZEICHNER = generateBezeichner("e2e-main")
ADMIN_BEZEICHNER = generateBezeichner("e2e-admin")
SH_SUCCESS_STATUS_CODE = 0
KEYCLOAK_CLIENT_ADMIN_APP = "admin"
KEYCLOAK_CLIENT_ALFA_APP = "alfa"
}
options {
......@@ -98,6 +101,7 @@ pipeline {
script {
FAILED_STAGE = env.STAGE_NAME
initEnvAdminDefaultVersions()
initEnvAlfaDefaultVersions()
initEnvVorgangManagerDefaultVersions()
initEnvUserManagerDefaultVersions()
......@@ -122,6 +126,12 @@ pipeline {
string(name: "AlfaImageTag", defaultValue: env.ALFA_IMAGE_TAG, trim: true),
string(name: "AlfaHelmChartVersion", defaultValue: env.ALFA_HELM_CHART_VERSION, trim: true),
string(name: "AlfaHelmRepoUrl", defaultValue: env.ALFA_HELM_REPO_URL, trim: true),
string(name: "AdministrationImageTag", defaultValue: env.ADMINISTRATION_IMAGE_TAG, trim: true),
string(name: "AdministrationHelmChartVersion", defaultValue: env.ADMINISTRATION_HELM_CHART_VERSION, trim: true),
string(name: "AdministrationHelmRepoUrl", defaultValue: env.ADMINISTRATION_HELM_REPO_URL, trim: true),
string(name: "AdminClientImageTag", defaultValue: env.ADMIN_CLIENT_IMAGE_TAG, trim: true),
string(name: "AdminClientHelmChartVersion", defaultValue: env.ADMIN_CLIENT_HELM_CHART_VERSION, trim: true),
string(name: "AdminClientHelmRepoUrl", defaultValue: env.ADMIN_CLIENT_HELM_REPO_URL, trim: true),
string(name: "VorgangManagerImageTag", defaultValue: env.VORGANG_MANAGER_IMAGE_TAG, trim: true),
string(name: "VorgangManagerHelmChartVersion", defaultValue: env.VORGANG_MANAGER_HELM_CHART_VERSION, trim: true),
string(name: "VorgangManagerHelmRepoUrl", defaultValue: env.VORGANG_MANAGER_HELM_REPO_URL, trim: true),
......@@ -165,10 +175,9 @@ pipeline {
checkoutGitopsE2eBranch()
deleteOzgCloudStack([env.EA_BEZEICHNER, env.MAIN_BEZEICHNER])
deleteNamespaces([env.EA_BEZEICHNER, env.MAIN_BEZEICHNER, env.ADMIN_BEZEICHNER])
generateMainNamespaceYaml()
generateEaNamespaceYaml()
generateNamespaces()
pushGitopsRepo()
}
......@@ -176,7 +185,7 @@ pipeline {
post {
failure {
script {
deleteOzgCloudStack([env.EA_BEZEICHNER, env.MAIN_BEZEICHNER])
deleteNamespaces([env.EA_BEZEICHNER, env.MAIN_BEZEICHNER, env.ADMIN_BEZEICHNER])
}
}
}
......@@ -211,13 +220,14 @@ pipeline {
script {
FAILED_STAGE = env.STAGE_NAME
waitForOzgCloudStackRollout([env.EA_BEZEICHNER, env.MAIN_BEZEICHNER])
waitForAdminRollout(env.ADMIN_BEZEICHNER)
waitForAlfaRollout([env.EA_BEZEICHNER, env.MAIN_BEZEICHNER])
}
}
post {
failure {
script {
deleteOzgCloudStack([env.EA_BEZEICHNER, env.MAIN_BEZEICHNER])
deleteNamespaces([env.EA_BEZEICHNER, env.MAIN_BEZEICHNER, env.ADMIN_BEZEICHNER])
}
}
}
......@@ -236,14 +246,14 @@ pipeline {
}
}
// stage('Run E2E-Tests') {
// when {
// expression { !SKIP_RUN }
// }
// failFast false
stage('Run E2E-Tests') {
when {
expression { !SKIP_RUN }
}
failFast false
// parallel {
stage('E2E-EA') {
parallel {
stage('E2E-Alfa-EA') {
when {
expression { !SKIP_RUN }
}
......@@ -254,7 +264,7 @@ pipeline {
Integer mongoDbPort = forwardMongoDbPort(generateNamespace(bezeichner))
runTests(bezeichner, 'einheitlicher-ansprechpartner', mongoDbPort, env.STAGE_NAME)
runTests(bezeichner, 'alfa-e2e', 'einheitlicher-ansprechpartner', env.KEYCLOAK_CLIENT_ALFA_APP, mongoDbPort, env.STAGE_NAME)
stopForwardMongoDbPort(generateNamespace(bezeichner))
}
......@@ -268,13 +278,13 @@ pipeline {
}
always {
script {
publishE2ETestResult("einheitlicher-ansprechpartner", "Alfa E2E-Tests EA")
publishAlfaE2ETestResult("einheitlicher-ansprechpartner", "Alfa E2E-Tests EA")
}
}
}
}
stage('E2E-Main') {
stage('E2E-Alfa-Main') {
when {
expression { !SKIP_RUN }
}
......@@ -285,7 +295,37 @@ pipeline {
Integer mongoDbPort = forwardMongoDbPort(generateNamespace(bezeichner))
runTests(bezeichner, 'main-tests', mongoDbPort, env.STAGE_NAME)
runTests(bezeichner, 'alfa-e2e', 'main-tests', env.KEYCLOAK_CLIENT_ALFA_APP, mongoDbPort, env.STAGE_NAME)
stopForwardMongoDbPort(generateNamespace(bezeichner))
}
}
}
post {
failure {
script {
FAILED_PARALLEL_STAGE += "${env.STAGE_NAME} "
}
}
always {
script {
publishAlfaE2ETestResult("main-tests", "Alfa E2E-Tests main")
}
}
}
}
stage('E2E-Admin-Main') {
when {
expression { !SKIP_RUN }
}
steps {
catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') {
script {
String bezeichner = env.ADMIN_BEZEICHNER
Integer mongoDbPort = forwardMongoDbPort(generateNamespace(bezeichner))
runTests(bezeichner, 'admin-e2e', 'main-tests', env.KEYCLOAK_CLIENT_ADMIN_APP, mongoDbPort, env.STAGE_NAME)
stopForwardMongoDbPort(generateNamespace(bezeichner))
}
......@@ -299,13 +339,13 @@ pipeline {
}
always {
script {
publishE2ETestResult("main-tests", "Alfa E2E-Tests main")
publishAdminE2ETestResult()
}
}
}
}
}
}
// }
// }
stage('Delete E2E Namespaces') {
when {
......@@ -315,7 +355,7 @@ pipeline {
script {
FAILED_STAGE = env.STAGE_NAME
deleteOzgCloudStack([env.EA_BEZEICHNER, env.MAIN_BEZEICHNER])
deleteNamespaces([env.EA_BEZEICHNER, env.MAIN_BEZEICHNER, env.ADMIN_BEZEICHNER])
}
}
}
......@@ -376,21 +416,6 @@ String getHelmChartVersion(Map applicationValues) {
return applicationValues.helm.version
}
Void initEnvAlfaDefaultVersions() {
if (isMasterBranch() || isReleaseBranch()) {
values = getApplicationValues('alfa')
env.ALFA_IMAGE_TAG = getImageTag(values)
env.ALFA_HELM_CHART_VERSION = getHelmChartVersion(values)
}
else {
env.ALFA_IMAGE_TAG = getFeatureBranchImageTag()
env.ALFA_HELM_CHART_VERSION = getFeatureBranchHelmChartVersion()
}
env.ALFA_HELM_REPO_URL = getHelmRepoUrl()
}
Boolean isMasterBranch() {
return env.BRANCH_NAME == 'master'
}
......@@ -417,6 +442,33 @@ String getRootPomVersion() {
return rootPom.version
}
Void initEnvAdminDefaultVersions() {
def values = getApplicationValues('administration')
env.ADMINISTRATION_IMAGE_TAG = getImageTag(values)
env.ADMINISTRATION_HELM_CHART_VERSION = getHelmChartVersion(values)
env.ADMINISTRATION_HELM_REPO_URL = getHelmRepoUrl()
values = getApplicationValues('admin-client')
env.ADMIN_CLIENT_IMAGE_TAG = getImageTag(values)
env.ADMIN_CLIENT_HELM_CHART_VERSION = getHelmChartVersion(values)
env.ADMIN_CLIENT_HELM_REPO_URL = getHelmRepoUrl()
}
Void initEnvAlfaDefaultVersions() {
if (isMasterBranch() || isReleaseBranch()) {
values = getApplicationValues('alfa')
env.ALFA_IMAGE_TAG = getImageTag(values)
env.ALFA_HELM_CHART_VERSION = getHelmChartVersion(values)
}
else {
env.ALFA_IMAGE_TAG = getFeatureBranchImageTag()
env.ALFA_HELM_CHART_VERSION = getFeatureBranchHelmChartVersion()
}
env.ALFA_HELM_REPO_URL = getHelmRepoUrl()
}
Void initEnvVorgangManagerDefaultVersions() {
def values = getApplicationValues('vorgang-manager')
......@@ -437,6 +489,12 @@ Void initEnvUserVersions(userVersions) {
env.ALFA_IMAGE_TAG = userVersions.AlfaImageTag
env.ALFA_HELM_CHART_VERSION = userVersions.AlfaHelmChartVersion
env.ALFA_HELM_REPO_URL = userVersions.AlfaHelmRepoUrl
env.ADMINISTRATION_IMAGE_TAG = userVersions.AdministrationImageTag
env.ADMINISTRATION_HELM_CHART_VERSION = userVersions.AdministrationHelmChartVersion
env.ADMINISTRATION_HELM_REPO_URL = userVersions.AdministrationHelmRepoUrl
env.ADMIN_CLIENT_IMAGE_TAG = userVersions.AdminClientImageTag
env.ADMIN_CLIENT_HELM_CHART_VERSION = userVersions.AdminClientHelmChartVersion
env.ADMIN_CLIENT_HELM_REPO_URL = userVersions.AdminClientHelmRepoUrl
env.VORGANG_MANAGER_IMAGE_TAG = userVersions.VorgangManagerImageTag
env.VORGANG_MANAGER_HELM_CHART_VERSION = userVersions.VorgangManagerHelmChartVersion
env.VORGANG_MANAGER_HELM_REPO_URL = userVersions.VorgangManagerHelmRepoUrl
......@@ -468,15 +526,43 @@ Void checkoutGitopsE2eBranch() {
}
}
Void generateEaNamespaceYaml() {
generateNamespaceYaml(env.EA_BEZEICHNER, "by-ea-dev.yaml");
Void generateNamespaces() {
def y1 = generateAdminNamespaceYaml()
def y2 = generateEaNamespaceYaml()
def y3 = generateMainNamespaceYaml()
dir("gitops") {
sh "git add ${y1} ${y2} ${y3}"
sh "git commit -m 'add e2e namespaces for testrun'"
}
Void generateMainNamespaceYaml() {
generateNamespaceYaml(env.MAIN_BEZEICHNER, "by-main-dev.yaml");
}
Void generateNamespaceYaml(String bezeichner, String valuesPathSuffix) {
Void generateAdminNamespaceYaml() {
def bezeichner = env.ADMIN_BEZEICHNER
def envValues
dir("alfa-client/apps/admin-e2e/") {
envValues = readYaml file: "src/fixtures/argocd/by-admin-dev.yaml";
envValues.ozgcloud.bezeichner = bezeichner
envValues.administration.put("image", ['tag': env.ADMINISTRATION_IMAGE_TAG])
envValues.administration.put("helm", ['version': env.ADMINISTRATION_HELM_CHART_VERSION, 'repoUrl': env.ADMINISTRATION_HELM_REPO_URL])
envValues.admin_client.put("image", ['tag': env.ADMIN_CLIENT_IMAGE_TAG])
envValues.admin_client.put("helm", ['version': env.ADMIN_CLIENT_HELM_CHART_VERSION, 'repoUrl': env.ADMIN_CLIENT_HELM_REPO_URL])
}
return writeYamlToGitOps(bezeichner, envValues);
}
String generateEaNamespaceYaml() {
return generateNamespaceYaml(env.EA_BEZEICHNER, "by-ea-dev.yaml");
}
String generateMainNamespaceYaml() {
return generateNamespaceYaml(env.MAIN_BEZEICHNER, "by-main-dev.yaml");
}
String generateNamespaceYaml(String bezeichner, String valuesPathSuffix) {
def envValues
dir('alfa-client/apps/alfa-e2e/') {
envValues = readYaml file: "src/fixtures/argocd/" + valuesPathSuffix;
......@@ -491,18 +577,20 @@ Void generateNamespaceYaml(String bezeichner, String valuesPathSuffix) {
envValues.user_manager.put("image", ['tag': env.USER_MANAGER_IMAGE_TAG])
envValues.user_manager.put("helm", ['version': env.USER_MANAGER_HELM_CHART_VERSION, 'repoUrl': env.USER_MANAGER_HELM_REPO_URL])
}
return writeYamlToGitOps(bezeichner, envValues);
}
writeYaml file: "gitops/dev/namespace/namespaces/by-${bezeichner}-dev.yaml", data: envValues, overwrite: true
String writeYamlToGitOps(String bezeichner, Object envValues){
def bezeichnerYaml = "dev/namespace/namespaces/by-${bezeichner}-dev.yaml"
sh "cat gitops/dev/namespace/namespaces/by-${bezeichner}-dev.yaml"
writeYaml file: "gitops/${bezeichnerYaml}", data: envValues, overwrite: true
dir("gitops") {
sh "git add dev/namespace/namespaces/by-${bezeichner}-dev.yaml"
sh "git commit -m 'add e2e by-${bezeichner}-dev'"
}
sh "cat gitops/${bezeichnerYaml}"
return bezeichnerYaml;
}
Void deleteOzgCloudStack(ozgCloudBezeichner) {
Void deleteNamespaces(ozgCloudBezeichner) {
for(bezeichner in ozgCloudBezeichner) {
if (hasNamespaceFile(bezeichner)) {
removeNamespaceFile(bezeichner)
......@@ -536,13 +624,19 @@ Void waitForDeletion(String bezeichner) {
}
}
Void waitForOzgCloudStackRollout(ozgCloudBezeichner) {
Void waitForAlfaRollout(ozgCloudBezeichner) {
for(bezeichner in ozgCloudBezeichner) {
waitForRollout(bezeichner)
waitForAlfaRollout(bezeichner)
}
}
Void waitForRollout(String bezeichner) {
Void waitForAdminRollout(String bezeichner) {
waitForAlfaRollout([bezeichner])
waitForHealthyApplication(bezeichner, 'administration')
waitForHealthyApplication(bezeichner, 'admin-client')
}
Void waitForAlfaRollout(String bezeichner) {
waitForHealthyApplication(bezeichner, 'application')
waitForHealthyApplication(bezeichner, 'vorgang-manager')
waitForHealthyApplication(bezeichner, 'user-manager')
......@@ -580,26 +674,35 @@ Void waitForHealthyStatus(String bezeichner, String application) {
sh "kubectl wait --for=jsonpath='{.status.health.status}'=Healthy applications/by-${bezeichner}-dev-${application} -n argocd --timeout=900s"
}
Void publishE2ETestResult(String reportFolder, String reportName) {
Void publishAlfaE2ETestResult(String appVariant, String reportName) {
publishE2ETestResult("alfa-e2e", appVariant, reportName);
}
Void publishAdminE2ETestResult() {
publishE2ETestResult("admin-e2e", "main-tests", "Admin E2E-Tests main");
}
Void publishE2ETestResult(String appName, String appVariant, String reportName) {
def reportDir = "alfa-client/apps/"+appName+"/reports/"+appVariant;
publishHTML (
target: [
allowMissing: false,
alwaysLinkToLastBuild: false,
keepAll: true,
reportDir: "alfa-client/apps/alfa-e2e/reports/${reportFolder}",
reportDir: reportDir,
reportFiles: 'report.html',
reportName: reportName
]
)
}
String runTests(String bezeichner, String reportFolder, Integer dbPort, String stageName) {
def config = generateCypressConfig(bezeichner, reportFolder, dbPort)
String runTests(String bezeichner, String appName, String appVariant, String keycloakClientName, Integer dbPort, String stageName) {
def config = generateCypressConfig(bezeichner, appName, appVariant, keycloakClientName, dbPort)
try {
dir('alfa-client'){
sh "npm run cypress:version"
sh "apps/alfa-e2e/run-tests.sh ${reportFolder} ${config}"
sh "apps/run-tests.sh ${appName} ${appVariant} ${config}"
}
} catch (Exception e) {
printNpmDebugLog()
......@@ -636,26 +739,27 @@ String cutBranchNameForKeycloakRealm(String branchName, String stageName) {
return branchName.take(cutBranchNamePosition)
}
String generateCypressConfig(String bezeichner, String testFolder, Integer dbPort) {
String generateCypressConfig(String bezeichner, String appName, String appVariant, String keycloakClientName, Integer dbPort) {
def namespace = generateNamespace(bezeichner)
def configName = "cypress-ci-"+testFolder+".json"
def configName = "cypress-ci-"+appVariant+".json"
dir('alfa-client/apps/alfa-e2e/'){
dir("alfa-client/apps/${appName}/"){
def config = readJSON file: 'cypress-ci.json'
def vorgangManagerDatabaseSecret = getVorgangManagerDatabaseSecret(namespace);
def decodedPassword = decodeString(vorgangManagerDatabaseSecret.password);
def parsablePassword = makePasswordUrlConform(decodedPassword);
config.baseUrl = "https://${bezeichner}.${env.CLUSTER_BASE_URL}" as String
config.baseUrl = "https://${generateUrlBezeichner(bezeichner, appName)}.${env.CLUSTER_BASE_URL}" as String
config.env.dbUrl = "mongodb://${decodeString(vorgangManagerDatabaseSecret.username)}:${parsablePassword}@localhost:${dbPort}/admin?ssl=false&directConnection=true&socketTimeoutMS=30000&heartbeatFrequencyMS=10000" as String
config.env.keycloakUrl = "https://${env.SSO_URL}/" as String
config.env.keycloakRealm = namespace as String
config.videosFolder = "./reports/${testFolder}/videos" as String
config.screenshotsFolder = "./reports/${testFolder}/screenshots" as String
config.reporterOptions.reportDir = "./reports/${testFolder}/mochawesome-report" as String
config.env.keycloakClient = keycloakClientName as String
config.videosFolder = "./reports/${appVariant}/videos" as String
config.screenshotsFolder = "./reports/${appVariant}/screenshots" as String
config.reporterOptions.reportDir = "./reports/${appVariant}/mochawesome-report" as String
config.specPattern = "src/e2e/${testFolder}/**/*.cy.{js,jsx,ts,tsx}" as String
config.specPattern = "src/e2e/${appVariant}/**/*.cy.{js,jsx,ts,tsx}" as String
config.env.put("search", getElasticsearchEnv(namespace))
config.env.put("userManager", getUserManagerEnv(namespace, dbPort))
......@@ -666,9 +770,18 @@ String generateCypressConfig(String bezeichner, String testFolder, Integer dbPor
sh "cat ${configName}"
}
return "cypress-ci-"+testFolder+".config.ts"
return "cypress-ci-"+appVariant+".config.ts"
}
String generateUrlBezeichner(String bezeichner, String appName){
if(appName == 'admin-e2e'){
return "${bezeichner}-admin";
}
return bezeichner;
}
String makePasswordUrlConform(String password) {
return sh (script: "printf %s ${password} | jq -sRr @uri", returnStdout: true);
}
......
## Allgemein
Dieses Teilprojekt enthält die End-2-End Tests für die Admin-Anwendung.
Der Aufbau ist analog der [E2E-Tests für Alfa](../alfa-e2e/README.md).
Bei Ausführung mit Jenkins im Cluster wird das [Jenkinsfile.e2e](../../Jenkinsfile.e2e) verwendet.
Bei lokaler Ausführung die hier abgelegte [docker-compose.yml](docker-compose.yml) verwenden.
import { nxE2EPreset } from '@nx/cypress/plugins/cypress-preset';
import { defineConfig } from 'cypress';
//Cypress config is generated by JenkinsFile
const cypressConfig = require('./cypress-ci-main-tests.json');
const cypressEvents = require('./src/support/cypress-tasks.ts');
export default defineConfig({
e2e: {
...nxE2EPreset(__dirname),
...cypressConfig,
setupNodeEvents(on, config) {
return cypressEvents(on, config);
},
},
retries: {
experimentalStrategy: 'detect-flake-and-pass-on-threshold',
experimentalOptions: {
maxRetries: 2,
passesRequired: 1,
},
openMode: true,
runMode: true,
},
});
{
"env": {
"database": "vorgang-manager-database",
"keycloakClient": "admin"
},
"fileServerFolder": ".",
"fixturesFolder": "./src/fixtures",
"modifyObstructiveCode": false,
"video": true,
"chromeWebSecurity": false,
"reporter": "../../node_modules/cypress-mochawesome-reporter",
"defaultCommandTimeout": 10000,
"supportFile": "./src/support/e2e.ts",
"testIsolation": false,
"reporterOptions": {
"html": false,
"json": true,
"quite": true,
"reportFilename": "report",
"overwrite": false
}
}
......@@ -19,7 +19,7 @@
"reporterOptions": {
"html": false,
"json": true,
"reportDir": "./reports/mochawesome-report",
"reportDir": "./reports/main-tests/mochawesome-report",
"reportFilename": "report",
"overwrite": true
}
......
import { HeaderE2EComponent } from '../../page-objects/header.po';
import { MainPage } from '../../page-objects/main.po';
import { reload } from '../../support/cypress-helper';
import { exist } from '../../support/cypress.util';
import { loginByUi } from '../../support/user-util';
import { HeaderE2EComponent } from '../../../page-objects/header.po';
import { MainPage } from '../../../page-objects/main.po';
import { reload } from '../../../support/cypress-helper';
import { exist } from '../../../support/cypress.util';
import { loginByUi } from '../../../support/user-util';
describe('Login and Logout', () => {
const mainPage: MainPage = new MainPage();
......
import { BuildInfoE2EComponent } from '../../components/buildinfo/buildinfo.e2e.component';
import { HeaderE2EComponent } from '../../page-objects/header.po';
import { MainPage } from '../../page-objects/main.po';
import { exist } from '../../support/cypress.util';
import { loginAsAriane } from '../../support/user-util';
import { BuildInfoE2EComponent } from '../../../components/buildinfo/buildinfo.e2e.component';
import { HeaderE2EComponent } from '../../../page-objects/header.po';
import { MainPage } from '../../../page-objects/main.po';
import { exist } from '../../../support/cypress.util';
import { loginAsAriane } from '../../../support/user-util';
describe('Buildinfo', () => {
const mainPage: MainPage = new MainPage();
......
import { BenutzerE2EComponent } from '../../components/benutzer/benutzer.e2e.component';
import { MainPage } from '../../page-objects/main.po';
import { exist } from '../../support/cypress.util';
import { loginAsAriane } from '../../support/user-util';
import { MainPage } from 'apps/admin-e2e/src/page-objects/main.po';
import { exist } from 'apps/admin-e2e/src/support/cypress.util';
import { loginAsAriane } from 'apps/admin-e2e/src/support/user-util';
import { BenutzerE2EComponent } from 'apps/admin-e2e/src/components/benutzer/benutzer.e2e.component';
const mainPage: MainPage = new MainPage();
const benutzerPage: BenutzerE2EComponent = new BenutzerE2EComponent();
......
import { PostfachE2EComponent } from '../../components/postfach/postfach.e2e.component';
import { HeaderE2EComponent } from '../../page-objects/header.po';
import { MainPage, waitForSpinnerToDisappear } from '../../page-objects/main.po';
import { exist } from '../../support/cypress.util';
import { loginAsAriane } from '../../support/user-util';
import { PostfachE2EComponent } from '../../../components/postfach/postfach.e2e.component';
import { HeaderE2EComponent } from '../../../page-objects/header.po';
import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po';
import { exist } from '../../../support/cypress.util';
import { loginAsAriane } from '../../../support/user-util';
describe('Signatur', () => {
const mainPage: MainPage = new MainPage();
......
ozgcloud:
bezeichner: admine2emain
environment: dev
e2eTest: true
project:
destinations:
- namespace: "*"
server: https://kubernetes.default.svc
administration:
enabled: true
admin_client:
enabled: true
ingress:
use_staging_cert: true
alfa:
env:
overrideSpringProfiles: "oc,e2e,dev"
ingress:
use_staging_cert: true
vorgang_manager:
env:
overrideSpringProfiles: "oc,e2e,dev"
user_manager:
ozgcloud:
usersync:
onstart: false
period: disabled
ingress:
use_staging_cert: true
smocker:
enabled: false
\ No newline at end of file
# E2E
## Allgemein
Die E2E Tests werden in parallen Jenkins Stages in seperaten Namespaces durchgeführt.
`einheitlicher-ansprechpartener` -> 'EA'-Umgebung
`main-tests` -> 'Dev'-Umgebung
-> es dürfen nur die der Umgebung entsprechenden User für die Tests genutzt werden.
(siehe dokumentation/Anwender/Standardbenutzer.md)
Dieses Teilprojekt bündelt:
* Die End-2-End Tests für die Alfa-Anwendung
* Das Setup für verschiedene Konfigurationsvarianten
Die Konfigurationsvarianten sind:
* Ausführungsart und Umgebung
* lokal
* Im Cluster (dynamisch deployed)
* Im Cluster (statisch)
* Fachlich unterschiedliche Testgruppen
* `einheitlicher-ansprechpartner` -> 'EA'-Umgebung
* `main-tests` -> 'Dev'-Umgebung
Dabei benötigen die Testgruppen (sogenannte "App-Varianten", siehe Verzeichnis [src/e2e](src/e2e)) jeweils eine eigene Umgebung in der gewählten Ausführungsart.
## Lokale Ausführung
Siehe [Entwicklungsdokumentation](https://git.ozg-sh.de/ozgcloud-doc/dokumentation/src/branch/master/Entwicklungsumgebung#e2e-tests).
## Jenkins/Cluster Ausführung
Die E2E Tests werden in parallelen Jenkins Stages in separaten Namespaces durchgeführt.
## Gegen ein bestehenden Namespace testen
Es dürfen nur die der Umgebung entsprechenden User für die Tests genutzt werden (siehe [Standardbenutzer](https://git.ozg-sh.de/ozgcloud-doc/dokumentation/src/branch/master/Anwender/Standardbenutzer.md)).
Es gibt 2 Jenkinsfiles:
* E2E ("main") - Das derzeit benutzte Hauptprofil. Namespaces werden hier neu aufgebaut.
* Static - Profil, wenn eine bestehender Namespace (ggf. in ganz bestimmter Konfiguration) getestet werden soll.
### Dynamisch deployed
* siehe: [Jenkinsfile.e2e](../../Jenkinsfile.e2e)
* Im Verzeichnis 'src/fixtures/argocd' liegen die Kubernetes Templates (ArgoCD-Namespace-Helm-Charts)
* Neue Umgebungen werden im Repo [gitops im Branch "e2e"](https://git.ozg-sh.de/ozgcloud-devops/gitops/src/branch/e2e) eingetragen.
### Gegen ein bestehenden Namespace testen
Siehe: [Jenkinsfile.e2e](../../Jenkinsfile.e2e.static)
Beispiel Namespace: sh-mastere2emain-dev
......@@ -20,10 +45,11 @@ Beispiel Namespace: sh-mastere2emain-dev
4. Cypress mit entsprechender config starten: `npm run cypress:open -- --config-file cypress-master-main.json`
## docker-compose
## Dev Hinweise
### -march Architektur
In die `.env` Datei eintragen:
```
USER_MANAGER_DOCKER_IMAGE=march-snapshot-latest
```
\ No newline at end of file
......@@ -34,7 +34,7 @@
"reporterOptions": {
"html": false,
"json": true,
"reportDir": "./reports/mochawesome-report",
"reportDir": "./reports/main-tests/mochawesome-report",
"reportFilename": "report",
"overwrite": true
}
......
#!/bin/bash
export NO_COLOR=1
REPORT_FOLDER=$1
CONFIG_FILE="${2:-cypress.config.ts}"
echo "Run E2E for $REPORT_FOLDER with configuration apps/alfa-e2e/$CONFIG_FILE..."
rm -rf apps/alfa-e2e/reports/${REPORT_FOLDER}
npx cypress run --project apps/alfa-e2e --spec apps/alfa-e2e/src/e2e/${REPORT_FOLDER} --config-file $CONFIG_FILE
TEST_RESULT=$?
if [ -d "apps/alfa-e2e/reports/${REPORT_FOLDER}/mochawesome-report/.jsons" ]; then
mv apps/alfa-e2e/reports/${REPORT_FOLDER}/mochawesome-report/.jsons apps/alfa-e2e/reports/${REPORT_FOLDER}/mochawesome-report/jsons
npx mochawesome-merge apps/alfa-e2e/reports/${REPORT_FOLDER}/mochawesome-report/**/*.json > apps/alfa-e2e/reports/${REPORT_FOLDER}/report.json
# Workaround: mochawesome's "screenshotsFolder" value is not added in the generated HTML file. Add "screenshots" to image paths.
sed --in-place --regexp-extended 's/"([^"]*\.png)/"screenshots\1/' apps/alfa-e2e/reports/${REPORT_FOLDER}/report.json
npx marge apps/alfa-e2e/reports/${REPORT_FOLDER}/report.json -f report -o apps/alfa-e2e/reports/${REPORT_FOLDER}
else
echo "ERROR: Reports do not exist at apps/alfa-e2e/reports/${REPORT_FOLDER}/mochawesome-report/.jsons"
fi
exit $TEST_RESULT
\ No newline at end of file
......@@ -7,6 +7,14 @@ project:
- namespace: '*'
server: https://kubernetes.default.svc
administration:
enabled: true
admin_client:
enabled: true
ingress:
use_staging_cert: true
alfa:
env:
overrideSpringProfiles: 'oc,ea,e2e,dev'
......
......@@ -6,11 +6,10 @@ project:
destinations:
- namespace: "*"
server: https://kubernetes.default.svc
alfa:
env:
overrideSpringProfiles: "oc,e2e,dev"
customList:
ozgcloud_feature_bescheid-wizard: "true"
ingress:
use_staging_cert: true
ozgcloud:
......
#!/bin/bash
export NO_COLOR=1
if [ $# -eq 0 ]; then
>&2 echo "This script is for Jenkins Execution of E2E-Tests"
>&2 echo "Example: ./run-tests.sh admin-e2e main-tests cypress.config.ts"
exit 1
fi
APP_NAME="${1:-alfa-e2e}"
APP_VARIATION="${2:-main-tests}"
CONFIG_FILE="${3:-cypress.config.ts}"
if [ -z $APP_NAME ]; then echo "App Folder not set" && exit 1; fi
if [ -z $APP_VARIATION ]; then echo "Variation Name not set" && exit 1; fi
if [ -z $CONFIG_FILE ]; then echo "Config File not set" && exit 1; fi
SCRIPT_DIR="$(dirname "$0")"
BASE_PATH=${SCRIPT_DIR}/${APP_NAME}
SPEC_GROUP=${BASE_PATH}/src/e2e/${APP_VARIATION}
COMMAND="npx cypress run --project ${BASE_PATH} --spec ${SPEC_GROUP} --config-file ${CONFIG_FILE}"
REPORT_PATH=${BASE_PATH}/reports/${APP_VARIATION}
echo "Run E2E for ${APP_NAME} with command: '$COMMAND'"
rm -rf ${REPORT_PATH}
eval $COMMAND
TEST_RESULT=$?
if [ -d "${REPORT_PATH}" ]; then
MOCHA_REPORT_PATH=${REPORT_PATH}/mochawesome-report/
MOCHA_REPORT_JSONS=${MOCHA_REPORT_PATH}.jsons
MOCHA_REPORT_FILE=${MOCHA_REPORT_PATH}report.json
mv ${MOCHA_REPORT_JSONS} ${MOCHA_REPORT_PATH}/jsons
npx mochawesome-merge ${MOCHA_REPORT_PATH}**/*.json > ${MOCHA_REPORT_FILE}
# Workaround: mochawesome's "screenshotsFolder" value is not added in the generated HTML file. Add "screenshots" to image paths.
sed --in-place --regexp-extended 's/"([^"]*\.png)/"screenshots\1/' ${MOCHA_REPORT_FILE}
npx marge ${MOCHA_REPORT_FILE} -f report -o ${REPORT_PATH}
else
echo "ERROR: Reports do not exist at ${REPORT_PATH}"
fi
exit $TEST_RESULT
\ No newline at end of file
......@@ -33,9 +33,7 @@ import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Spy;
import org.springframework.core.io.ResourceLoader;
import org.springframework.test.util.ReflectionTestUtils;
class ForwardingLandesnetzInfoServiceTest {
......@@ -43,8 +41,6 @@ class ForwardingLandesnetzInfoServiceTest {
@Spy
@InjectMocks
private ForwardingLandesnetzInfoService service;
@Mock
private ResourceLoader resourceLoader;
@DisplayName("Is email in landesnetz")
@Nested
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment