Как выполнить одноэтапное действие или действие после сборки на хосте docker, если конвейер Jenkins привязан к докеру? - PullRequest
0 голосов
/ 09 июля 2020

Предположим, у меня есть докеризованный конвейер с несколькими шагами. Контейнер docker определен в начале Jenkinsfile:

pipeline {
  agent {
    docker {
      image 'gradle:latest'
    }
  }

  stages {
    // multiple steps, all executed in 'gradle' container 
  }

post {
    always {
      sh 'git whatever-command' // will not work in 'gradle' container
    }
  }
}

Я хотел бы выполнить некоторые команды git в действии после сборки. Проблема в том, что изображение gradle не имеет исполняемого файла git.

скрипт. sh: строка 1: git: команда не найдена

Как я могу выполнить его на хосте Docker, все еще используя контейнер gradle для всех остальных шагов сборки? Конечно, я не хочу явно указывать контейнер для каждого шага, но это c действие после публикации.

1 Ответ

1 голос
/ 21 июля 2020

Хорошо, ниже представлено мое рабочее решение с группировкой нескольких этапов (сборка и тестирование) в один этап dockerized (Dockerized gradle) и одно рабочее пространство, повторно используемое между docker хостом и docker контейнером (см. reuseNode документы ):

pipeline {
  agent {
    // the code will be checked out on out of available docker hosts
    label 'docker'
  }

  stages {
    stage('Dockerized gradle') {
      agent {
        docker {
          reuseNode true // < -- the most important part
          image 'gradle:6.5.1-jdk11'
        }
      }
      stages{
        // Stages in this block will be executed inside of a gradle container
        stage('Build') {
          steps{
            script {
                sh "gradle build -x test"
            }
          }
        }
        stage('Test') {
          steps{
            script {
              sh "gradle test"
            }
          }
        }
      }
    }
    stage('Cucumber Report') {
      // this stage will be executed on docker host labeled 'docker'
      steps {
        cucumber 'build/cucumber.json'
      }
    }
  }

  post {
    always {
      sh 'git whatever-command' // this will also work outside of 'gradle' container and reuse original workspace
    }
  }
}
...