web-dev-qa-db-fra.com

Pipeline Jenkins - Variable d'environnement pour docker-compose

J'essaie d'utiliser docker-compose avec la variable d'environnement pour le nom d'image défini par la variable Jenkinsfile, mais cela ne fonctionne pas.

J'ai un Jenkinsfile contenant

node() {

  stage('Checkout') {
    cleanWs()
    git credentialsId: 'xxx', url: 'ssh://git@...'
  }

  stage('Build') {
    withMaven(maven: 'maven-3.5.3') {
      sh 'mvn clean package'
      def pom = readMavenPom file:'pom.xml'
      JAR_FILE = pom.artifactId + "-" + pom.version + ".jar"
      JAR_VERSION = pom.version
    }
  }

  stage('Build Docker Image') {
    echo "Docker Build ..."
    docker.withTool('docker') {
      app = docker.build("microservices/my-service:${JAR_VERSION}","--build-arg JAR_FILE=${JAR_FILE} .")
    }
  }

  stage('Running Docker Container') {
    echo "Docker Run ..."
    withEnv(['VERSION=1.0.0']) {
      docker.withTool('docker') {
        sh "docker-compose rm -f -s -v"
        sh "docker-compose up -d"
      }
    }
    cleanWs()
  }
}

Et un docker-compose.yml comme

version: '3.6'

services:

    my-service:
        image: microservices/my-service:${VERSION}
        container_name: my-service
        ...

Tout fonctionne bien, sauf que la dernière étape n'utilise pas ma variable d'environnement.

Docker Run ...
[Pipeline] withEnv
[Pipeline] {
[Pipeline] tool

[Pipeline] withEnv
[Pipeline] {
[Pipeline] sh

[my-service] Running Shell script
+ docker-compose rm -f -s -v
The VERSION variable is not set. Defaulting to a blank string.
3
tweetysat

Après avoir ajouté un sh "printenv" juste avant le sh "docker-compose ..." j’ai vu

Version=1.0.0

Je ne sais pas pourquoi withEnv(['VERSION=1.0.0']) me donne Version=1.0.0 mais utiliser, dans le docker-compose-ymlimage: microservices/my-service:${Version} à la place de image: microservices/my-service:${VERSION}, fonctionne bien.

2
tweetysat

Avez-vous essayé de mettre la environment suivante dans votre fichier Jenkins?

{
    ...
    stage('Running Docker Container') {
        echo "Docker Run ..."
        docker.withTool('docker') {
            sh "docker-compose rm -f -s -v"
            sh "docker-compose up -d"
        }
        cleanWs()
    }

    environment {
        VERSION = "1.0.0"
    }
}

De plus, vous pouvez utiliser les valeurs par défaut en utilisant un fichier .env mais @ mulg0r ( permalink ) explique cette solution dans sa réponse. Vous pouvez lire la substitution variable dans la documentation de docker-compose pour plus d'informations.

0
Paul Rey