Дженкинс: Использование нескольких док-контейнеров для создания и развертывания приложения
Справочная информация: 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', которые отлично работают для меня.