Agregar nuevo proyecto al esquema de CI
- Agregar proyecto individual
- Agregar proyecto suite
- Despliegue de un proyecto individual
Agregar proyecto individual
Para este caso será necesario agregar un archivo llamado Jenkinsfile y versionarlo. Para este tipo de proyectos solo se agregan los pasos necesarios para ejecutar las pruebas, y en caso de los branch master y QA publicar los resultados.
Además el proyecto deberá contener los archivos de properties de los ambientes TEST, DEVEL y QA.
Ejemplo:
pipeline{
agent any
tools {
gradle "Gradle 3.5"
}
stages {
stage('Preparing File Configuration') {
steps{
echo "Create folder project_config and move file conf"
sh 'mkdir -p $HOME/.project_config/'
sh 'cp api-seguridad-DEVL.properties $HOME/.project_config/api-seguridad.properties'
}
}
stage('Test App'){
steps {
echo 'Testing app'
sh 'gradle clean test'
}
}
stage('Publishing Tests Reports'){
when {
expression {
env.BRANCH_NAME in ["master", "QA"]
}
}
steps{
echo "Running Test in **${env.BRANCH_NAME}**"
sh "scp -r -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no core/build/reports/tests/test/* [email protected]:/u01/folder_nginx/api-seguridad/${env.BRANCH_NAME}"
}
}
}
post {
success{
slackSend color: "good", message: "Job: ${env.JOB_NAME} with buildnumber ${env.BUILD_NUMBER} was successful"
}
failure{
slackSend color: "danger", message: "Job: ${env.JOB_NAME} with buildnumber ${env.BUILD_NUMBER} was failed"
}
always {
cleanWs()
}
}
}
Publicación de pruebas
Para publicar las pruebas es necesario entrar al server de desarrollo, y dentro del directorio folder_nginx crear un directorio con la siguiente estructura:
Agregar proyecto suite
El proyecto suite es un repositorio de git con las referencias a los submódulos. Será necesario agregar un archivo llamado Jenkinsfile y versionarlo.
Este archivo Jenkinsfile deberá:
- Ejecutar las pruebas de cada submódulo en paralelo
- Construir el ejecutable .war en cada submódulo
- Dependiendo del branch deberá desplegar en algún ambiente (master o QA)
- Tener en cuenta que la ejecución del script de despliegue debe contener el nombre del proyecto y una asignación de puertos no ocupados
Ejemplo:
pipeline{
agent any
tools {
gradle "Gradle 3.5"
}
stages {
stage('Checkout Submodules') {
steps{
echo "Checkout and init submodules"
checkout scm: [
$class: 'GitSCM',
branches: scm.branches,
doGenerateSubmoduleConfigurations: false,
extensions: [[$class: 'SubmoduleOption',
disableSubmodules: false,
parentCredentials: false,
recursiveSubmodules: true,
reference: '',
trackingSubmodules: false]],
submoduleCfg: [],
userRemoteConfigs: scm.userRemoteConfigs
]
}
}
stage('Test submodules: Copy test properties and test'){
parallel{
stage('Test api-ebc-adea app'){
steps{
dir('api-ebc-adea'){
sh 'cp api-ebc-adea-TEST.properties $HOME/.project_config/api-ebc-adea.properties'
sh 'gradle clean test'
}
}
}
stage('Test api-seguridad app'){
steps{
dir('api-seguridad'){
sh 'cp api-seguridad-TEST.properties $HOME/.project_config/api-seguridad.properties'
sh 'gradle clean test'
}
}
}
stage('Test api-ebc app'){
steps{
dir('expedientes-digitales'){
sh 'cp expedientes-digitales-TEST.properties $HOME/.project_config/expedientes-digitales.properties'
sh 'gradle clean test'
}
}
}
}
}
stage('Building applications'){
parallel{
stage('Building api-ebc-adea app'){
steps{
dir('api-ebc-adea'){
sh 'gradle build -x test'
}
}
}
stage('Building api-seguridad app'){
steps{
dir('api-seguridad'){
sh 'gradle build -x test'
}
}
}
stage('Building expedientes-digitales app'){
steps{
dir('expedientes-digitales'){
nodejs(nodeJSInstallationName: 'Node 10.3.0') {
sh 'npm install'
sh 'node_modules/bower/bin/bower update'
sh 'node_modules/coffee-script/bin/coffee --output web/src/main/webapp/libs/compiled_coffeescript/ --compile web/src/main/webapp/libs/coffeescript/'
}
sh 'gradle build -x test'
}
}
}
}
}
/*
* DEVL Environment
*/
stage('DEVL ENVIRONMENT: Transfering Wars'){
when {
expression {
env.BRANCH_NAME in ["master"]
}
}
parallel{
stage('Transfering api-ebc-adea war'){
steps{
dir('api-ebc-adea'){
sh "scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no api-ebc-adea.war [email protected]:~/deploys/suite-expediente-digital/"
}
}
}
stage('Transfering api-seguridad war'){
steps{
dir('api-seguridad'){
sh "scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no api-seguridad.war [email protected]:~/deploys/suite-expediente-digital/"
}
}
}
stage('Transfering expedientes-digitales war'){
steps{
dir('expedientes-digitales'){
sh "scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no expedientes-digitales.war [email protected]:~/deploys/suite-expediente-digital/"
}
}
}
}
}
stage('DEVL ENVIRONMENT: Preparing DEVL Configuration'){
when {
expression {
env.BRANCH_NAME in ["master"]
}
}
steps{
dir('api-ebc-adea'){
sh "scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no api-ebc-adea-DEVL.properties [email protected]:~/deploys/suite-expediente-digital/api-ebc-adea.properties"
}
dir('api-seguridad'){
sh "scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no api-seguridad-DEVL.properties [email protected]:~/deploys/suite-expediente-digital/api-seguridad.properties"
}
dir('expedientes-digitales'){
sh "scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no expedientes-digitales-DEVL.properties [email protected]:~/deploys/suite-expediente-digital/expedientes-digitales.properties"
}
}
}
stage('DEVL ENVIRONMENT:Deploying app in Glassfish Docker'){
when {
expression {
env.BRANCH_NAME in ["master"]
}
}
steps{
sh "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no [email protected] 'sh deployAppGlassfish4.sh deploys/suite-expediente-digital suite-expediente-digital no_content:/root/no_content /u01/logs/suite-expediente-digital:/root/.project_config/logs/logs 8089 4856'"
}
}
/*
* QA Environment
*/
stage('QA ENVIRONMENT: Transfering Wars'){
when {
expression {
env.BRANCH_NAME in ["QA"]
}
}
parallel{
stage('Transfering api-ebc-adea war'){
steps{
dir('api-ebc-adea'){
sh "scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no api-ebc-adea.war [email protected]:~/deploys/suite-expediente-digital/"
}
}
}
stage('Transfering api-seguridad war'){
steps{
dir('api-seguridad'){
sh "scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no api-seguridad.war [email protected]:~/deploys/suite-expediente-digital/"
}
}
}
stage('Transfering expedientes-digitales war'){
steps{
dir('expedientes-digitales'){
sh "scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no expedientes-digitales.war [email protected]:~/deploys/suite-expediente-digital/"
}
}
}
}
}
stage('QA ENVIRONMENT: Preparing QA Configuration'){
when {
expression {
env.BRANCH_NAME in ["QA"]
}
}
steps{
dir('api-ebc-adea'){
sh "scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no api-ebc-adea-QA.properties [email protected]:~/deploys/suite-expediente-digital/api-ebc-adea.properties"
}
dir('api-seguridad'){
sh "scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no api-seguridad-QA.properties [email protected]:~/deploys/suite-expediente-digital/api-seguridad.properties"
}
dir('expedientes-digitales'){
sh "scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no expedientes-digitales-QA.properties [email protected]:~/deploys/suite-expediente-digital/expedientes-digitales.properties"
}
}
}
stage('QA ENVIRONMENT:Deploying app in Glassfish Docker'){
when {
expression {
env.BRANCH_NAME in ["QA"]
}
}
steps{
sh "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no [email protected] 'sh deployAppGlassfish4.sh deploys/suite-expediente-digital suite-expediente-digital no_content:/root/no_content /u01/logs/suite-expediente-digital:/root/.project_config/logs/logs 8089 4856'"
}
}
}
post{
success{
emailext body: '''${JELLY_SCRIPT,template="html_gmail"} AGREGAR AQUI EL BODY DEL CORREO!!''',
mimeType: 'text/html',
subject: "${env.JOB_NAME} - Build #${env.BUILD_NUMBER} - SUCCESS!",
to: "[email protected],[email protected],[email protected] ",
from: "[email protected]",
replyTo: "[email protected]",
recipientProviders: [[$class: 'CulpritsRecipientProvider']]
slackSend color: "good", message: "Job: ${env.JOB_NAME} with buildnumber ${env.BUILD_NUMBER} was successful"
}
failure{
emailext body: '''${JELLY_SCRIPT,template="html_gmail"} AGREGAR AQUI TEMPLATE''',
mimeType: 'text/html',
subject: "${env.JOB_NAME} - Build #${env.BUILD_NUMBER} - FAILURE!",
to: "[email protected],[email protected],[email protected] ",
from: "[email protected]",
replyTo: "[email protected]",
recipientProviders: [[$class: 'CulpritsRecipientProvider']]
slackSend color: "danger", message: "Job: ${env.JOB_NAME} with buildnumber ${env.BUILD_NUMBER} was failed"
}
always {
cleanWs()
}
}
}
Importante:
Para el despligue del aplicativo en el ambiente será necesario crear un directorio en deploys/ que contenga el domain.xml correspondiente. El pipeline se encargará de dejar los archivos .war y .properties en este directorio, y de crear el contenedor a partir del contenido de este directorio.
Despliegue de un proyecto individual
En ocasiones será necesario desplegar un solo proyecto, para ello agregaremos el Jenkinsfile bajo el control de versiones y seguiremos los mismos pasos para desplegar un proyecto SUITE.
Ejemplo
pipeline{
agent any
tools {
gradle "Gradle 3.5"
}
stages {
stage('Preparing File Configuration') {
steps{
echo "Create folder project_config and move file conf"
sh 'mkdir -p $HOME/.project_config/'
sh 'cp apiBanner-TEST.properties $HOME/.project_config/apiBanner.properties'
}
}
stage('Test App'){
steps {
echo 'Testing app'
sh 'gradle clean test'
}
}
stage('Publishing Tests Reports'){
when {
expression {
env.BRANCH_NAME in ["master", "QA"]
}
}
steps{
echo "Running Test in **${env.BRANCH_NAME}**"
sh "scp -r -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no core/build/reports/tests/test/* [email protected]:/u01/folder_nginx/api-banner/${env.BRANCH_NAME}"
}
}
/*
* DEVL Environment
*/
stage('DEVL ENVIRONMENT: Deploy DEVL'){
when {
expression {
env.BRANCH_NAME in ["master"]
}
}
steps{
sh 'gradle build -x test'
sh "scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no api-banner.war [email protected]:~/deploys/api-banner/"
sh "scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no apiBanner-DEVL.properties [email protected]:~/deploys/api-banner/apiBanner.properties"
sh "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no [email protected] 'sh deployAppGlassfish4.sh deploys/api-banner api-banner no_content:/root/no_content /u01/logs/api-banner:/root/.project_config/logs/logs 8097 4864'"
}
}
/*
* QA Environment
*/
stage('QA ENVIRONMENT: Deploy QA'){
when {
expression {
env.BRANCH_NAME in ["QA"]
}
}
steps{
sh 'gradle build -x test'
sh "scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no api-banner.war [email protected]:~/deploys/api-banner/"
sh "scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no apiBanner-QA.properties [email protected]:~/deploys/api-banner/apiBanner.properties"
sh "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no [email protected] 'sh deployAppGlassfish4.sh deploys/api-banner api-banner no_content:/root/no_content /u01/logs/api-banner:/root/.project_config/logs/logs 8097 4864'"
}
}
}
post {
success{
slackSend color: "good", message: "Job: ${env.JOB_NAME} with buildnumber ${env.BUILD_NUMBER} was successful"
}
failure{
slackSend color: "danger", message: "Job: ${env.JOB_NAME} with buildnumber ${env.BUILD_NUMBER} was failed"
}
always {
cleanWs()
}
}
}