diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..ef6b5de --- /dev/null +++ b/.dockerignore @@ -0,0 +1,5 @@ +.idea/ +e2e/ +jenkins/ +node_modules/ +src/ diff --git a/Dockerfile b/Dockerfile index b52dd50..ff2f634 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,11 +1,13 @@ FROM docker.valuya.be/apache2:28 +ARG CLANG=en RUN a2ensite default \ && a2enmod rewrite ADD docker/app-content.conf /etc/apache2/ +ADD dist/${CLANG}/ /var/www/html/ - +ENV LANG=$CLANG HEALTHCHECK --interval=10s --timeout=3s \ CMD /check-http-status.sh localhost diff --git a/Jenkinsfile b/Jenkinsfile index 449a9ca..a43de2f 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -5,108 +5,56 @@ pipeline { buildDiscarder(logRotator(numToKeepStr: '10')) } parameters { - string( - name: 'CONF_PREFIX', defaultValue: 'production-', - description: 'Will be appended with the language' - ) - string( - name: 'LANGUAGES', defaultValue: 'en fr', - description: 'Space-separated list of locales to build' - ) booleanParam(name: 'SKIP_TESTS', defaultValue: true, description: 'Skip tests') string( - name: 'PUBLISH_URL', defaultValue: 'https://nexus.valuya.be/nexus/repository', - description: 'Deployment repository url' - ) - string( - name: 'PUBLISH_REPO', defaultValue: 'web-snapshots', - description: 'Deployment repository' + name: 'IMAGE_TAG', defaultValue: 'docker.charlyghislain.com/charlyghislaindotcom', + description: 'Image tag to push' ) } stages { - stage ('Install') { - steps { - nodejs(nodeJSInstallationName: 'node 10', configId: 'npm-global-config') { - ansiColor('xterm') { - sh ''' - rm -rfv dist* - npm install - ''' - } - } - } - } stage ('Build') { steps { - withCredentials([usernameColonPassword(credentialsId: 'nexus-basic-auth', variable: 'NEXUS_BASIC_AUTH')]) { nodejs(nodeJSInstallationName: 'node 10', configId: 'npm-global-config') { catchError { ansiColor('xterm') { sh ''' + rm -rfv dist* + npm install + export DATE="$(date -Iseconds)" export COMMIT="$(git rev-parse --short HEAD)" echo '{"date":"'$DATE'","commit": "'$COMMIT'"}' > src/assets/buildinfo.json - for LANG in $LANGUAGES ; do - CONF_NAME="${CONF_PREFIX}${LANG}" - - ./node_modules/.bin/ng build \ - -c "$CONF_NAME" - done + ./node_modules/.bin/ng build -c "production-fr" + ./node_modules/.bin/ng build -c "production-en" + echo "$COMMIT" > dist/.version ''' } - }}} + }} + stash(name: 'dist', includes: 'dist/**') } } stage ('Publish') { + agent { + label 'docker' + } steps { - withCredentials([usernameColonPassword(credentialsId: 'nexus-basic-auth', variable: 'NEXUS_BASIC_AUTH')]) { - ansiColor('xterm') { - nodejs(nodeJSInstallationName: 'node 10', configId: 'npm-global-config') { - sh ''' - export DATE="$(date -Iseconds)" - export COMMIT="$(git rev-parse --short HEAD)" - - for LANG in $LANGUAGES ; do - export ARCHIVE="charlyghislaindotcom-${COMMIT}-$LANG.tgz" - - # Compress - cd dist/${LANG}/ - tar -cvzf ../${ARCHIVE} ./ - cd ../.. - - # Upload archives - curl -v --user $NEXUS_BASIC_AUTH --upload-file dist/${ARCHIVE} \ - ${PUBLISH_URL}/${PUBLISH_REPO}/com/charlyghislain/charlyghislaindotcom/${ARCHIVE} - - # Create .latest 'links' (branch heads) if required - if [ "${BRANCH_NAME}" = "master" ] ; then - export ARCHIVE_LINK="master.${LANG}.latest" - echo "$ARCHIVE" > ./${ARCHIVE_LINK} - curl -v --user $NEXUS_BASIC_AUTH --upload-file ./${ARCHIVE_LINK} \ - ${PUBLISH_URL}/${PUBLISH_REPO}/com/charlyghislain/charlyghislaindotcom/${ARCHIVE_LINK} - - elif [ "${BRANCH_NAME}" = "dev" ] ; then - export ARCHIVE_LINK="dev.${LANG}.latest" - echo "$ARCHIVE" > ./${ARCHIVE_LINK} - curl -v --user $NEXUS_BASIC_AUTH --upload-file ./${ARCHIVE_LINK} \ - ${PUBLISH_URL}/${PUBLISH_REPO}/com/charlyghislain/charlyghislaindotcom/${ARCHIVE_LINK} - fi - done - ''' - } - } + container('docker') { + unstash(name: 'dist') + sh ''' + export COMMIT="$(git rev-parse --short HEAD)" + docker build --build-arg CLANG=fr -t "${IMAGE_TAG}-fr:${COMMIT}" . + docker push "${IMAGE_TAG}-fr:${COMMIT}" . + docker build --build-arg CLANG=en -t "${IMAGE_TAG}-en:${COMMIT}" . + docker push "${IMAGE_TAG}-en:${COMMIT}" . + ''' + build job: 'infra/cluster-conf-update', parameters: [ + string(name:"STACK", value:"charlyghislaindotcom"), + string(name:"VALUES_FILE", value:"values.yaml"), + string(name:"VALUES_KEY", value:".deployment.imageTag"), + string(name:"VALUES_VALUE", value:"\"${env.COMMIT}\""), + ] } } } - stage ("Update cluster state") { - steps { - build job: 'infra/cluster-conf-update', parameters: [ - string(name:"STACK", value:"charlyghislaindotcom"), - string(name:"VALUES_FILE", value:"values.yaml"), - string(name:"VALUES_KEY", value:".deployment.imageTag"), - string(name:"VALUES_VALUE", value:"\"${params.NEW_VERSION}\""), - ] - } - } } } diff --git a/angular.json b/angular.json index 30b32cc..bc400c6 100644 --- a/angular.json +++ b/angular.json @@ -59,7 +59,7 @@ "vendorChunk": false, "buildOptimizer": true, "outputPath": "dist/en/", - "baseHref": "/en/", + "baseHref": "/", "budgets": [ { "type": "anyComponentStyle", diff --git a/jenkins/dsl/charlyghislainfotcom.groovy b/jenkins/dsl/charlyghislaindotcom.groovy similarity index 100% rename from jenkins/dsl/charlyghislainfotcom.groovy rename to jenkins/dsl/charlyghislaindotcom.groovy diff --git a/jenkins/lifeislife_keycloak_release.jenkinsfile b/jenkins/lifeislife_keycloak_release.jenkinsfile deleted file mode 100644 index a0d74ab..0000000 --- a/jenkins/lifeislife_keycloak_release.jenkinsfile +++ /dev/null @@ -1,96 +0,0 @@ -pipeline { - agent any - parameters { - string(name: 'NEW_PROVIDERS_VERSION', defaultValue: '', description: 'New version, eg: 2020.0.0') - string(name: 'NEXT_PROVIDERS_VERSION', defaultValue: '11.0.1', description: 'Next version') - string(name: 'NEW_KEYCLOAK_IMAGE_TAG', defaultValue: '2-11.0.0', description: 'New image tag') - string(name: 'IMPORTEXPORT_VERSION', defaultValue: '11.0.2', description: 'Import export rest provider version') - string(name: 'PROVIDERS_RELEASE_BRANCH', defaultValue: 'master', description: 'Release branch') - string(name: 'PROVIDERS_DEV_BRANCH', defaultValue: 'dev', description: 'Release branch') - string(name: 'IMAGE_BUILD_BRANCH', defaultValue: 'master', description: 'Image branch to use for build') - string(name: 'CLUSTER_STACK', defaultValue: 'lifeislifedev', description: 'Namespace to use for conf update') - } - options { - disableConcurrentBuilds() - buildDiscarder(logRotator(numToKeepStr: '10')) - } - stages { - stage('Release') { - steps { - buildName "#${BUILD_NUMBER} ${params.NEW_KEYCLOAK_IMAGE_TAG}" - - build job: "lifeislife/release-keycloak-itsme-broker", parameters: [ - string(name: 'NEW_VERSION', value: "${params.NEW_PROVIDERS_VERSION}"), - string(name: 'RELEASE_BRANCH', value: "${env.PROVIDERS_RELEASE_BRANCH}"), - string(name: 'GIT_REPO_BRANCH', value: "${env.PROVIDERS_DEV_BRANCH}"), - ] - - build job: "lifeislife/release-keycloak-lifeislife-userstorage", parameters: [ - string(name: 'NEW_VERSION', value: "${params.NEW_PROVIDERS_VERSION}"), - string(name: 'RELEASE_BRANCH', value: "${env.PROVIDERS_RELEASE_BRANCH}"), - string(name: 'GIT_REPO_BRANCH', value: "${env.PROVIDERS_DEV_BRANCH}"), - ] - - - build job: "lifeislife/keycloak-itsme-broker/${params.PROVIDERS_RELEASE_BRANCH}", parameters: [ - booleanParam(name: 'FORCE_DEPLOY', value: true), - ] - - build job: "lifeislife/keycloak-lifeislife-userstorage/${params.PROVIDERS_RELEASE_BRANCH}", parameters: [ - booleanParam(name: 'FORCE_DEPLOY', value: true), - ] - - sh 'sleep 20' - - build job: "lifeislife/lifeislife-keycloak/${params.IMAGE_BUILD_BRANCH}", parameters: [ - string(name: 'USERSTORAGE_VERSION', value: "${params.NEW_PROVIDERS_VERSION}"), - string(name: 'ITSME_BROKER_VERSION', value: "${params.NEW_PROVIDERS_VERSION}"), - string(name: 'IMPORTEXPORT_EAR_VERSION', value: "${params.IMPORTEXPORT_VERSION}"), - string(name: 'IMAGE_VERSION', value: "${params.NEW_KEYCLOAK_IMAGE_TAG}"), - ] - - } - } - - stage('Post release') { - parallel { - stage('Release next version') { - steps { - build job: "lifeislife/release-keycloak-itsme-broker", parameters: [ - string(name: 'NEW_VERSION', value: "${params.NEXT_PROVIDERS_VERSION}-SNAPSHOT"), - string(name: 'RELEASE_BRANCH', value: "${env.PROVIDERS_DEV_BRANCH}"), - string(name: 'GIT_REPO_BRANCH', value: "${env.PROVIDERS_RELEASE_BRANCH}"), - booleanParam(name: 'SKIP_PUSH_TAG', value: true), - ] - - build job: "lifeislife/release-keycloak-lifeislife-userstorage", parameters: [ - string(name: 'NEW_VERSION', value: "${params.NEXT_PROVIDERS_VERSION}-SNAPSHOT"), - string(name: 'RELEASE_BRANCH', value: "${env.PROVIDERS_DEV_BRANCH}"), - string(name: 'GIT_REPO_BRANCH', value: "${env.PROVIDERS_RELEASE_BRANCH}"), - booleanParam(name: 'SKIP_PUSH_TAG', value: true), - ] - } - } - stage('Update cluster state') { - steps { - build job: 'infra/cluster-conf-update', parameters: [ - string(name:"STACK", value:"${params.CLUSTER_STACK}"), - string(name:"VALUES_FILE", value:"values.keycloak.yaml"), - string(name:"VALUES_KEY", value:".keycloak.deployment.imageTag"), - string(name:"VALUES_VALUE", value:"\"${params.NEW_KEYCLOAK_IMAGE_TAG}\"") - ] - } - } - } - } - } - post { - failure { - mail( - to: 'charlyghislain@gmail.com', cc: 'yannick@valuya.be', - subject: "lifeislife REALEASE keycloak ${BUILD_NUMBER} failed", - body: "See job at ${BUILD_URL}" - ) - } - } -} \ No newline at end of file diff --git a/jenkins/lifeislife_release.jenkinsfile b/jenkins/lifeislife_release.jenkinsfile deleted file mode 100644 index 9d4158e..0000000 --- a/jenkins/lifeislife_release.jenkinsfile +++ /dev/null @@ -1,197 +0,0 @@ -pipeline { - agent any - parameters { - booleanParam(name: 'DRY_RUN', defaultValue: 'true', description: 'Stay on DEV branches') - booleanParam(name: 'SKIP_TESTS', defaultValue: 'false', description: 'Skip tests') - string(name: 'NEW_VERSION', defaultValue: '', description: 'New version, eg: 2020.0.0') - string(name: 'NEXT_VERSION', defaultValue: '2020.1.0', description: 'Next version') - string(name: 'NEW_VERSION_MESSAGE', defaultValue: 'Nouvelle version', description: 'New version message') - string(name: 'GIT_CREDENTIAL_ID', defaultValue: 'jenkins-jenkins-ssh-key', description: '') - } - options { - disableConcurrentBuilds() - buildDiscarder(logRotator(numToKeepStr: '10')) - } - stages { - stage('Prepare release') { - steps { - buildName "#${BUILD_NUMBER} ${params.NEW_VERSION}" - - script { - env.LIFEISLIFE_RELEASE_BRANCH = (params.DRY_RUN ? 'dev' : 'master') - env.LIFEISLIFE_DEV_BRANCH = (params.DRY_RUN ? 'dev' : 'dev') - env.JOB_BUILD_WILDFLY = (params.DRY_RUN ? 'lifeislife/lifeislife-back/dev' : 'lifeislife/lifeislife-back/master') - env.JOB_TEST_WILDFLY = (params.DRY_RUN ? 'lifeislife/lifeislife-it/dev' : 'lifeislife/lifeislife-it/master') - env.CLUSTER_STACK = (params.DRY_RUN ? 'lifeislifedev' : 'lifeislifeprod') - - env.JOB_BUILD_FRONTENDS = (params.DRY_RUN ? 'lifeislife/lifeislife-front/dev' : 'lifeislife/lifeislife-front/master') - env.SKIP_TESTS = params.SKIP_TEST - } - - checkout poll: false, scm: [$class: 'GitSCM', branches: [[name: "*/${LIFEISLIFE_DEV_BRANCH}"],[name: "*/${LIFEISLIFE_RELEASE_BRANCH}"]], - doGenerateSubmoduleConfigurations: false, - extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'lifeislife-back']], - userRemoteConfigs: [[credentialsId: 'jenkins-jenkins-ssh-key', url: 'ssh://git@gitlab.valuya.be:1022/lifeislife/lifeislife-back.git']]] - - dir ('lifeislife-back') { - sh "echo 'back: merges: ' >>../release.log" - sh "git log origin/${LIFEISLIFE_RELEASE_BRANCH}..origin/${LIFEISLIFE_DEV_BRANCH} --pretty=format:'[%cd %ce %h] %s' --min-parents=2 --date=short >>../release.log" - sh "echo 'back: commits: ' >>../release.log" - sh "git log origin/${LIFEISLIFE_RELEASE_BRANCH}..origin/${LIFEISLIFE_DEV_BRANCH} --pretty=format:'[%cd %ce %h] %s' --max-parents=1 --date=short >>../release.log" - sh "echo '' >> ./release.log" - } - - checkout poll: false, scm: [$class: 'GitSCM', branches: [[name: "*/${LIFEISLIFE_DEV_BRANCH}"],[name: "*/${LIFEISLIFE_RELEASE_BRANCH}"]], - doGenerateSubmoduleConfigurations: false, - extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'lifeislife-front']], - userRemoteConfigs: [[credentialsId: 'jenkins-jenkins-ssh-key', url: 'ssh://git@gitlab.valuya.be:1022/lifeislife/lifeislife-front.git']]] - dir ('lifeislife-front') { - sh "echo 'Front: merges: ' >>../release.log" - sh "git log origin/${LIFEISLIFE_RELEASE_BRANCH}..origin/${LIFEISLIFE_DEV_BRANCH} --pretty=format:'[%cd %ce %h] %s' --min-parents=2 --date=short >>../release.log" - sh "echo 'Front: commits: ' >>../release.log" - sh "git log origin/${LIFEISLIFE_RELEASE_BRANCH}..origin/${LIFEISLIFE_DEV_BRANCH} --pretty=format:'[%cd %ce %h] %s' --max-parents=1 --date=short >>../release.log" - sh "echo '' >> ./release.log" - } - - stash includes: 'release.log', name: 'release-log' - } - } - - stage('Release Lifeislife') { - steps { - build job: "lifeislife/release-lifeislife-back", parameters: [ - string(name: 'NEW_VERSION', value: "${params.NEW_VERSION}"), - string(name: 'RELEASE_BRANCH', value: "${env.LIFEISLIFE_RELEASE_BRANCH}"), - string(name: 'GIT_REPO_BRANCH', value: "${env.LIFEISLIFE_DEV_BRANCH}"), - ] - } - } - - stage('Test Lifeislife') { - when { - expression { return params.SKIP_TESTS != true } - } - steps { - build job: "${env.JOB_TEST_WILDFLY}", parameters: [ - booleanParam(name: 'SKIP_TESTS', value: false), - ] - } - } - - stage('Build Lifeislife') { - steps { - build job: "${env.JOB_BUILD_WILDFLY}", parameters: [ - booleanParam(name: 'SKIP_TESTS', value: true), - booleanParam(name: 'FORCE_DEPLOY', value: true), - ] - } - } - - - - stage('Update front api') { - steps { - build job: "lifeislife/update-api-lifeislife-front/${env.LIFEISLIFE_DEV_BRANCH}", parameters: [ - string(name: 'API_VERSION', value: "${params.NEW_VERSION}"), - booleanParam(name: 'SKIP_BUILD_LIBS', value: true), - ] - } - } - - stage('Release lifeislife front') { - steps { - build job: "lifeislife/release-lifeislife-front/${env.LIFEISLIFE_DEV_BRANCH}", parameters: [ - string(name: 'NEW_VERSION', value: "${params.NEW_VERSION}"), - string(name: 'RELEASE_BRANCH', value: "${env.LIFEISLIFE_RELEASE_BRANCH}"), - string(name: 'DEV_BRANCH', value: "${env.LIFEISLIFE_DEV_BRANCH}"), - booleanParam(name: 'SKIP_BUILD', value: true), - booleanParam(name: 'SKIP_NEXT_VERSION', value: true), - ] - } - } - stage('Build lifeislife-front') { - steps { - build job: "${env.JOB_BUILD_FRONTENDS}", parameters: [ - ] - } - } - - stage('Update cluster state') { - steps { - build job: 'infra/cluster-conf-update', parameters: [ - string(name:"STACK", value:"${env.CLUSTER_STACK}"), - string(name:"VALUES_FILE", value:"values.wildfly.yaml"), - string(name:"VALUES_KEY", value:".wildfly.deployment.imageTag"), - string(name:"VALUES_VALUE", value:"\"${params.NEW_VERSION}\"") - ] - build job: 'infra/cluster-conf-update', parameters: [ - string(name:"STACK", value:"${env.CLUSTER_STACK}"), - string(name:"VALUES_FILE", value:"values.front-admin.yaml"), - string(name:"VALUES_KEY", value:".adminFront.deployment.imageTag"), - string(name:"VALUES_VALUE", value:"\"${params.NEW_VERSION}\"") - ] - build job: 'infra/cluster-conf-update', parameters: [ - string(name:"STACK", value:"${env.CLUSTER_STACK}"), - string(name:"VALUES_FILE", value:"values.front-customer.yaml"), - string(name:"VALUES_KEY", value:".customerFront.deployment.imageTag"), - string(name:"VALUES_VALUE", value:"\"${params.NEW_VERSION}\"") - ] - build job: 'infra/cluster-conf-update', parameters: [ - string(name:"STACK", value:"${env.CLUSTER_STACK}"), - string(name:"VALUES_FILE", value:"values.front-mypension.yaml"), - string(name:"VALUES_KEY", value:".mypensionFront.deployment.imageTag"), - string(name:"VALUES_VALUE", value:"\"${params.NEW_VERSION}\""), - ] - build job: 'infra/cluster-conf-update', parameters: [ - string(name:"STACK", value:"${env.CLUSTER_STACK}"), - string(name:"VALUES_FILE", value:"values.front-simu.yaml"), - string(name:"VALUES_KEY", value:".simuFront.deployment.imageTag"), - string(name:"VALUES_VALUE", value:"\"${params.NEW_VERSION}\""), - ] - } - } - - - stage('Release next version') { - steps { - build job: "lifeislife/release-lifeislife-back", parameters: [ - string(name: 'NEW_VERSION', value: "${params.NEXT_VERSION}-SNAPSHOT"), - string(name: 'RELEASE_BRANCH', value: "${env.LIFEISLIFE_DEV_BRANCH}"), - string(name: 'GIT_REPO_BRANCH', value: "${env.LIFEISLIFE_RELEASE_BRANCH}"), - booleanParam(name: 'SKIP_PUSH_TAG', value: true), - ] - - build job: "lifeislife/release-lifeislife-front/${env.LIFEISLIFE_RELEASE_BRANCH}", parameters: [ - string(name: 'NEW_VERSION', value: "${params.NEXT_VERSION}-rc.0"), - string(name: 'RELEASE_BRANCH', value: "${env.LIFEISLIFE_DEV_BRANCH}"), - string(name: 'DEV_BRANCH', value: "${env.LIFEISLIFE_RELEASE_BRANCH}"), - booleanParam(name: 'SKIP_BUILD', value: true), - booleanParam(name: 'SKIP_NEXT_VERSION', value: true), - booleanParam(name: 'SKIP_PUSH_TAG', value: true), - ] - } - } - } - post { - failure { - mail( - to: 'charlyghislain@gmail.com', cc: 'yannick@valuya.be', - subject: "lifeislife RELEASE ${BUILD_NUMBER} failed", - body: "See job at ${BUILD_URL}" - ) - } - success { - unstash 'release-log' - script { - env.RELEASE_LOG = readFile(file: './release.log') - env.MAIL_BODY = "Changes: \n" + "${RELEASE_LOG}" - } - - mail( - to: 'charlyghislain@gmail.com', cc: 'yannick@valuya.be', - subject: "lifeislife ${params.NEW_VERSION} released", - body: "${env.MAIL_BODY}" - ) - } - } -} \ No newline at end of file