Desplegar un contendor en Azure App Service desde Jenkins

Otro de los escenarios con el que he estado jugando es con la integración de Jenkins y los despliegues en Microsoft Azure. En este artículo voy a repetir el proceso de creación de la imagen de Docker, subida a Azure Container Registry y el despliegue en Web App for containers, que te mostré en el despliegue de Drupal pero desde Jenkins.

Pipeline de Jenkins

En la pipeline de Jenkins voy a replicar los pasos de la pipeline de build del despliegue de Drupal:

Pipeline de build en Azure DevOps para crear y publicar una imagen

y también la pipeline de release:

Pipeline de release de un contenedor en Web Apps for Containers

El resultado sería el siguiente:

pipeline {
  environment {
    docker_image_name = "drupalrepo.azurecr.io/0gis0/drupal-webapp-for-containers"  
    registry = "https://drupalrepo.azurecr.io"
    registryCredential = 'acr_credentials'
    git_repo = 'https://github.com/0gis0/drupal-webapp-for-containers.git'
    git_branch = 'master'
    tag = "$BUILD_NUMBER"
    staging_url = 'http://drupal-from-jenkins-staging.azurewebsites.net'
  }
  agent {
       label 'ubuntu' 
  }
  stages {
    stage('Cloning Git') {
      steps {
        git(branch: git_branch,
            credentialsId: 'github_private_repository',
            url: git_repo)
      }
    }
    stage('Build the image') {
      steps{
        script {
          docker_image = docker.build docker_image_name + ':$tag'
        }
      }
    }
    stage('Push the image') {
      steps{
        script {
          docker.withRegistry(registry, registryCredential) {
             docker_image.push()
           }
        }
      }
    }
    stage('Remove Unused docker image') {
      steps{
        sh "docker rmi $docker_image_name:$tag"
      }
    }
    stage('Deploy docker image in Web App for Containers on Azure'){
        steps{
            azureWebAppPublish(
                appName: 'drupal-from-jenkins', 
                azureCredentialsId: '917891d4-7095-4390-b368-05d656e99fbc',
                skipDockerBuild: true,
                dockerImageName: docker_image_name,
                dockerImageTag: "$tag",
                dockerRegistryEndpoint: [credentialsId: 'acr_credentials', url: 'https://drupalrepo.azurecr.io'],
                publishType: 'docker',
                resourceGroup: 'Deploy-From-Jenkins',
                slotName: 'staging'
            )
            sleep time: 2, unit: 'MINUTES'
            sh  '''#!/bin/bash
                    echo "warming up the site"
                    while [[ "$(curl -s -o /dev/null -w ''%{http_code}'' $staging_url)" != "200" ]]; do sleep 5; done
                '''
            script {
                sh 'curl $staging_url/en/articles'
                sh 'curl $staging_url/en/recipes'
                sh 'curl $staging_url/es'
                sh 'curl $staging_url/es/articles'
                sh 'curl $staging_url/es/recipes'
            }
        }
    }
    stage('Pass to production'){
        steps{
            azureWebAppSwapSlots(
                azureCredentialsId: '917891d4-7095-4390-b368-05d656e99fbc',
                resourceGroup: 'Deploy-From-Jenkins',
                appName: 'drupal-from-jenkins',
                sourceSlotName: 'staging',
                targetSlotName: 'production'
            )
        }
    }
  }
}

Para poder lanzar esta pipeline debes tener instalado el plugin de Azure App Service. Además, debes de dar de alta en el apartado de Credentials de tu Jenkins tus credenciales de Azure, como te mostré en la creación de agentes dinámicos de Jenkins en Microsoft Azure, y las credenciales de tu Azure Container Registry, del tipo username and password, obteniendo las mismas desde el propio recurso.

¡Saludos!