Jenkinsfile

This commit is contained in:
cghislai 2021-02-14 00:38:58 +01:00
parent bbdec3388d
commit 38a1ca1c80
7 changed files with 37 additions and 375 deletions

5
.dockerignore Normal file
View File

@ -0,0 +1,5 @@
.idea/
e2e/
jenkins/
node_modules/
src/

View File

@ -1,11 +1,13 @@
FROM docker.valuya.be/apache2:28 FROM docker.valuya.be/apache2:28
ARG CLANG=en
RUN a2ensite default \ RUN a2ensite default \
&& a2enmod rewrite && a2enmod rewrite
ADD docker/app-content.conf /etc/apache2/ ADD docker/app-content.conf /etc/apache2/
ADD dist/${CLANG}/ /var/www/html/
ENV LANG=$CLANG
HEALTHCHECK --interval=10s --timeout=3s \ HEALTHCHECK --interval=10s --timeout=3s \
CMD /check-http-status.sh localhost CMD /check-http-status.sh localhost

94
Jenkinsfile vendored
View File

@ -5,108 +5,56 @@ pipeline {
buildDiscarder(logRotator(numToKeepStr: '10')) buildDiscarder(logRotator(numToKeepStr: '10'))
} }
parameters { 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') booleanParam(name: 'SKIP_TESTS', defaultValue: true, description: 'Skip tests')
string( string(
name: 'PUBLISH_URL', defaultValue: 'https://nexus.valuya.be/nexus/repository', name: 'IMAGE_TAG', defaultValue: 'docker.charlyghislain.com/charlyghislaindotcom',
description: 'Deployment repository url' description: 'Image tag to push'
)
string(
name: 'PUBLISH_REPO', defaultValue: 'web-snapshots',
description: 'Deployment repository'
) )
} }
stages { stages {
stage ('Install') { stage ('Build') {
steps { steps {
nodejs(nodeJSInstallationName: 'node 10', configId: 'npm-global-config') { nodejs(nodeJSInstallationName: 'node 10', configId: 'npm-global-config') { catchError {
ansiColor('xterm') { ansiColor('xterm') {
sh ''' sh '''
rm -rfv dist* rm -rfv dist*
npm install 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 '''
export DATE="$(date -Iseconds)" export DATE="$(date -Iseconds)"
export COMMIT="$(git rev-parse --short HEAD)" export COMMIT="$(git rev-parse --short HEAD)"
echo '{"date":"'$DATE'","commit": "'$COMMIT'"}' > src/assets/buildinfo.json echo '{"date":"'$DATE'","commit": "'$COMMIT'"}' > src/assets/buildinfo.json
for LANG in $LANGUAGES ; do ./node_modules/.bin/ng build -c "production-fr"
CONF_NAME="${CONF_PREFIX}${LANG}" ./node_modules/.bin/ng build -c "production-en"
echo "$COMMIT" > dist/.version
./node_modules/.bin/ng build \
-c "$CONF_NAME"
done
''' '''
} }
}}} }}
stash(name: 'dist', includes: 'dist/**')
} }
} }
stage ('Publish') { stage ('Publish') {
agent {
label 'docker'
}
steps { steps {
withCredentials([usernameColonPassword(credentialsId: 'nexus-basic-auth', variable: 'NEXUS_BASIC_AUTH')]) { container('docker') {
ansiColor('xterm') { unstash(name: 'dist')
nodejs(nodeJSInstallationName: 'node 10', configId: 'npm-global-config') {
sh ''' sh '''
export DATE="$(date -Iseconds)"
export COMMIT="$(git rev-parse --short HEAD)" export COMMIT="$(git rev-parse --short HEAD)"
docker build --build-arg CLANG=fr -t "${IMAGE_TAG}-fr:${COMMIT}" .
for LANG in $LANGUAGES ; do docker push "${IMAGE_TAG}-fr:${COMMIT}" .
export ARCHIVE="charlyghislaindotcom-${COMMIT}-$LANG.tgz" docker build --build-arg CLANG=en -t "${IMAGE_TAG}-en:${COMMIT}" .
docker push "${IMAGE_TAG}-en:${COMMIT}" .
# 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
''' '''
}
}
}
}
}
stage ("Update cluster state") {
steps {
build job: 'infra/cluster-conf-update', parameters: [ build job: 'infra/cluster-conf-update', parameters: [
string(name:"STACK", value:"charlyghislaindotcom"), string(name:"STACK", value:"charlyghislaindotcom"),
string(name:"VALUES_FILE", value:"values.yaml"), string(name:"VALUES_FILE", value:"values.yaml"),
string(name:"VALUES_KEY", value:".deployment.imageTag"), string(name:"VALUES_KEY", value:".deployment.imageTag"),
string(name:"VALUES_VALUE", value:"\"${params.NEW_VERSION}\""), string(name:"VALUES_VALUE", value:"\"${env.COMMIT}\""),
] ]
} }
} }
} }
}
} }

View File

@ -59,7 +59,7 @@
"vendorChunk": false, "vendorChunk": false,
"buildOptimizer": true, "buildOptimizer": true,
"outputPath": "dist/en/", "outputPath": "dist/en/",
"baseHref": "/en/", "baseHref": "/",
"budgets": [ "budgets": [
{ {
"type": "anyComponentStyle", "type": "anyComponentStyle",

View File

@ -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}"
)
}
}
}

View File

@ -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}"
)
}
}
}