Déploiement d'un livrable depuis Nexus

De Wiki de Jordan LE NUFF
Sauter à la navigation Sauter à la recherche

Présentation

Cette page a pour but de partager un script rédigé pour déployer un livrable au format zip depuis un serveur Nexus vers un serveur web.

Script

def instances = [
    PREPROD: [
        MyCompany1: [
            SERVER: 'mydevserver1',
            DIRECTORY: '/data/www/PREPROD/MyApp1',
        ],
        MyCompany2: [
            SERVER: 'mydevserver2',
            DIRECTORY: '/data/www/PREPROD/MyApp2',
        ],
        MyCompany3: [
            SERVER: 'mydevserver1',
            DIRECTORY: '/data/www/PREPROD/MyApp3',
        ],
        MyCompany4: [
            SERVER: 'mydevserver2',
            DIRECTORY: '/data/www/PREPROD/MyApp4',
        ],
    ],
    PROD: [
        MyCompany1: [
            SERVER: 'myprodserver1',
            DIRECTORY: '/data/www/PROD/MyApp1',
        ],
        MyCompany2: [
            SERVER: 'myprodserver2',
            DIRECTORY: '/data/www/PROD/MyApp2',
        ],
        MyCompany3: [
            SERVER: 'myprodserver1',
            DIRECTORY: '/data/www/PROD/MyApp3',
        ],
        MyCompany4: [
            SERVER: 'myprodserver2',
            DIRECTORY: '/data/www/PROD/MyApp4',
        ],
    ],
]

def versions_count_to_keep = 2

def sshUser = "www"

def filenameTab = "${NexusReleaseUrl}".split('/')
def packageFilename = filenameTab[ filenameTab.size() - 1 ]

def packageExtension = packageFilename[packageFilename.lastIndexOf('.')..-1]
def packageName = packageFilename.take(packageFilename.lastIndexOf('.'))

def appNameTab = packageFilename.split('-')
def version = appNameTab[ appNameTab.size() - 1 ].replace(packageExtension,"")

currentBuild.displayName = "${BUILD_NUMBER} Déploiement GCA ${version} ${Phase}, société(s) ${Company}"

node {
    try {
        stage('Définition des variables') {

            echo "Liste des sociétés sélectionnées :"
			Company.split(',').each { company ->
				println "${company}"
			}
			echo "Liste des instances concernées :"
			Company.split(',').each { company ->
				def server = instances."${Phase}"."${company}".SERVER
				def appDirectory = instances."${Phase}"."${company}".DIRECTORY
				echo "Serveur '${server}', dossier '${appDirectory}'"
			}
        }

        stage('Récupération du package') {
            withCredentials([
                usernamePassword(
                    credentialsId: 'nexus_admin', 
                    usernameVariable: 'nexusUser', 
                    passwordVariable: 'nexusPass'
                )
            ]) {
    			echo "URL du package à récupérer : ${NexusReleaseUrl}"
                sh ('wget --user=$nexusUser --password=$nexusPass -q $NexusReleaseUrl')
            }
        }

		Company.split(',').each { company ->
			stage("Société ${company}") {
    			println "${company}"
    			
                def server = instances."${Phase}"."${company}".SERVER
				def appDirectory = instances."${Phase}"."${company}".DIRECTORY

                withCredentials([
                	sshUserPrivateKey(
                		credentialsId: "${sshUser}-${server}", 
                		keyFileVariable: 'sshKey', 
                		passphraseVariable: 'sshPassphrase'
                	)
                ]) {
                    def sshServer = [:]
                    sshServer.name = "Serveur de ${Phase} pour ${company}"
                    sshServer.host = "${server}"
                    sshServer.user = "${sshUser}"
                    sshServer.identityFile = sshKey
                    sshServer.passphrase = sshPassphrase
                    sshServer.allowAnyHosts = true

                    sshPut remote: sshServer, from: "${packageFilename}", into: "/tmp/"
                    if ( "${appDirectory}" != "${appDirectory}/${packageName}" && "${appDirectory}/" != "${appDirectory}/${packageName}") {
                        sshCommand remote: sshServer, command: "rm -rf ${appDirectory}/${packageName}"
                    }

                    def directories = sshCommand remote: sshServer, command: "ls -1d ${appDirectory}/*|grep -vE 'PARAM|LOG|DATA|MAINTENANCE|BATCH|zip|APPLI|CURRENT'|sort -V"
        			def directoriesCount = directories.split('\n').length
        				println "Nombre total de répertoires versionnés : ${directoriesCount}"
    				def versions_count_to_del = directoriesCount - versions_count_to_keep
        				println "Nombre de répertoires à supprimer : ${versions_count_to_del}"
                    sshCommand remote: sshServer, command: "for i in \$(ls -1d ${appDirectory}/*|grep -vE 'PARAM|LOG|DATA|MAINTENANCE|BATCH|zip|CURRENT'|sort -V|head -${versions_count_to_del});do echo 'Suppression du dossier : '\$i;rm -rf \$i;done"

                    sshCommand remote: sshServer, command: "unzip -q /tmp/${packageFilename} -d ${appDirectory}/${packageName}"
                    sshCommand remote: sshServer, command: "rm /tmp/${packageFilename}"
                    sshCommand remote: sshServer, command: "chown -R www:www ${appDirectory}/${packageName}"
                    sshCommand remote: sshServer, command: "unlink ${appDirectory}/CURRENT && ln -s ${packageName} ${appDirectory}/CURRENT"
                }
			}
		}
    } catch (err) {
        currentBuild.result = "FAILURE"
        throw err
    } finally {
        script {
            deleteDir()
        }
    }
}