Дженкинс: Использование нескольких док-контейнеров для создания и развертывания приложения

Справочная информация: Jenkins работает в док-контейнере, который прекрасно работает, но мы хотим, чтобы все процессы сборки выполнялись внутри док-контейнеров, чтобы минимизировать программное обеспечение, установленное внутри контейнера Jenkins.

Проблема: Как мне построить трехэтапный процесс, используя два разных контейнера докеров, где все три шага делят файлы?

Шаг 1: Сборка

  • npm build

Шаг 2: Тест

  • npm test`

Шаг 3. Запустите развертывание кода AWS

  • aws deploy push - имя-приложения-приложения -s3-location s3: // my-bucket / app-name --ignore-hidden-files
  • aws deploy create-deploy - имя-приложения-имя-приложения -s3-location bucket=my-bucket, ключ =app-name,bundleType=zip --deployment-group-name dg

Как разбить файл Дженкинса на несколько этапов и поделиться результатами первого этапа для других этапов?

Простой двухэтапный Jenkins file

pipeline {
  agent {
    docker {
      image 'node:10.8.0'
    }
  }
  stages {
    stage('Build') {
      steps {
        sh 'npm install'
      }
    }
    stage('Test') {
      steps {
        sh 'npm test'
      }
    }
  }
}

Но когда я добавляю на третьем этапе, все становится более интересным, так как я не могу использовать глобальный образ докера (агент)

pipeline {
  agent none
  stages {
    stage('Build') {
      agent {
        docker { image 'node:10.8.0' }
      }
      steps {
        sh 'npm install'
      }
    }
    stage('Test') {
      agent {
        docker { image 'node:10.8.0' }
      }
      steps {
        sh 'npm test'
      }
    }
    stage('Deploy') {
      agent {
        docker { image 'coreos/awscli' }
      }
      steps {
        sh 'echo "Deploying to AWS"'
        sh 'aws help'
      }
    }
  }
}

В приведенном выше примере 'npm test' завершается неудачей, поскольку результаты этапа сборки теряются. И развертывание кода не сработает, потому что все артефакты сборки потеряны.

Одним из обходных путей для проведения тестовой работы является создание этапа BuildAndTest, в котором используется изображение, но при этом теряются некоторые преимущества отдельных этапов.

pipeline {
  agent none
  stages {
    stage('Build And Test') {
      agent {
        docker { image 'node:10.8.0' }
      }
      steps {
        sh 'npm install'
        sh 'npm test'
      }
    }
    stage('Deploy') {
      agent {
        docker { image 'coreos/awscli' }
      }
      steps {
        sh 'echo "Deploying to AWS"'
        sh 'aws help'
      }
    }
  }
}

Еще одно (супер уродливое) решение - создать собственный образ, в котором установлены как узел, так и aws, но это означает, что каждый раз, когда мы переходим на более новую версию узла и / или aws, мы должны создавать другой образ докера с обновленной версией. когда на самом деле это совершенно разные задачи.

Другое решение состоит в том, чтобы подключить общий образ для всех экземпляров, но как мне создать "временный" образ, который будет использоваться только для этой сборки и который будет удален после завершения сборки?

1 ответ

Сразу после того, как я отправил вопрос, я нашел статью от разработчика Jenkins

https://jenkins.io/blog/2018/07/02/whats-new-declarative-piepline-13x-sequential-stages/

Это то, что я придумал

pipeline {
  agent none
  stages {
    stage('Build and Test') {
      agent {
        docker 'node:10.8.0'
      }
      stages {
        stage('Build') {
          steps {
            sh 'npm install'
          }
        }
        stage('Test') {
          steps {
            sh 'npm test'
          }
        }
      }
      post {
        success {
          stash name: 'artifacts', includes: "node_modules/**/*"
        }
      }
    }

    stage('Deploy') {
      agent {
        docker 'coreos/awscli'
      }
      steps {
        unstash 'artifacts'
        sh 'echo "Deploying to AWS"'
        sh 'aws help'
      }
    }
  }
}

Дженкинс теперь допускает несколько этапов внутри декларативного, и я не знал о командах 'stash / unstash', которые отлично работают для меня.

Другие вопросы по тегам