Дженкинс - Параллельные этапы с докером для PHP - PullRequest
0 голосов
/ 12 ноября 2018

Я новичок в Jenkins, и я хотел бы получить почти то же поведение, что и в GitLab CI для одного из моих проектов PHP.

Я использую Docker для тестирования своего проекта на нескольких версиях PHP.

Что я хочу?

Параллельно выполняю сборку и тестирование.

  • Сборка создает мое приложение, исходники приходят из репозитория git, и я запускаю composer installкоманда.
  • Dockerfile хранится в /var/lib/jenkins/Docker
  • Мой Dockerfile имеет параметр (PHP_VERSION), который позволяет мне выбрать нужную версию PHP
  • customWorkspaceкажется, работает

Вот мой Jenkinsfile, чтобы сделать это:

updateGitlabCommitStatus name: 'build', state: 'pending'

pipeline {
    agent none
    post {
      failure {
        updateGitlabCommitStatus name: 'build', state: 'failed'
      }
      success {
        updateGitlabCommitStatus name: 'build', state: 'success'
      }
    }
    stages {

        stage('build') {

            parallel {
                stage('build-php5.4') {
                    agent {
                        dockerfile {
                            additionalBuildArgs  '--build-arg PHP_VERSION=54'
                            dir '/var/lib/jenkins/Docker'
                            customWorkspace './build-php5.4'
                        }
                    }
                    steps {
                        sh 'pwd'
                        sh 'ls'
                        sh 'rm -Rf composer.lock vendor'
                        sh 'composer install'
                    }
                }

                stage('build-php7.0') {
                    agent {
                        dockerfile {
                            additionalBuildArgs  '--build-arg PHP_VERSION=70'
                            dir '/var/lib/jenkins/Docker'
                            customWorkspace './build-php7.0'
                        }
                    }
                    steps {
                        sh 'pwd'
                        sh 'rm -Rf composer.lock vendor'
                        sh 'composer install'
                    }
                }
            }

        }

        stage('tests') {

            parallel {
                stage('test-php5.4') {
                    agent {
                        dockerfile {
                            additionalBuildArgs  '--build-arg PHP_VERSION=54'
                            dir '/var/lib/jenkins/Docker'
                            customWorkspace './build-php5.4'
                        }
                    }
                    steps {
                        sh 'pwd'
                        sh 'php --version'
                        sh 'php vendor/phpunit/phpunit/phpunit tests'
                    }
                }

                stage('test-php7.0') {
                    agent {
                        dockerfile {
                            additionalBuildArgs  '--build-arg PHP_VERSION=70'
                            dir '/var/lib/jenkins/Docker'
                            customWorkspace './build-php7.0'
                        }
                    }
                    steps {
                        sh 'pwd'
                        sh 'php --version'
                        sh 'php vendor/phpunit/phpunit/phpunit tests'
                    }
                }
            }
        }
    }
}

И вот результат:

enter image description here

Это выглядит хорошо, но это не так, и я не совсем понимаю, как это работает.

Как вы можете видеть, на этапе test-php54 используется последний созданный контейнер Docker:

enter image description here

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

1 Ответ

0 голосов
/ 12 ноября 2018

Хорошо, я нашел основную проблему.

Дело в том, что я использую тот же Dockerfile, но с другими параметрами. Если я создаю один Dockerfile для PHP 5.4 и другой для PHP 7.0, этапы распараллеливаются правильно.

updateGitlabCommitStatus name: 'build', state: 'pending'

pipeline {
    agent none
    post {
      failure {
        updateGitlabCommitStatus name: 'build', state: 'failed'
      }
      success {
        updateGitlabCommitStatus name: 'build', state: 'success'
      }
    }
    stages {

        stage('build') {

            parallel {
                stage('build-php5.4') {
                    agent {
                        dockerfile {
                            dir '/var/lib/jenkins/Docker'
                            filename 'Dockerfile-php5.4'
                            customWorkspace './build-php5.4'
                        }
                    }
                    steps {
                        sh 'rm -Rf composer.lock vendor'
                        sh 'composer install'
                    }
                }

                stage('build-php7.0') {
                    agent {
                        dockerfile {
                            dir '/var/lib/jenkins/Docker'
                            filename 'Dockerfile-php7.0'
                            customWorkspace './build-php7.0'
                        }
                    }
                    steps {
                        sh 'rm -Rf composer.lock vendor'
                        sh 'composer install'
                    }
                }
            }

        }

        stage('tests') {

            parallel {
                stage('test-php5.4') {
                    agent {
                        dockerfile {
                            dir '/var/lib/jenkins/Docker'
                            filename 'Dockerfile-php5.4'
                            customWorkspace './build-php5.4'
                        }
                    }
                    steps {
                        sh 'php --version'
                        sh 'php vendor/phpunit/phpunit/phpunit tests'
                    }
                }

                stage('test-php7.0') {
                    agent {
                        dockerfile {
                            dir '/var/lib/jenkins/Docker'
                            filename 'Dockerfile-php7.0'
                            customWorkspace './build-php7.0'
                        }
                    }
                    steps {
                        sh 'php --version'
                        sh 'php vendor/phpunit/phpunit/phpunit tests'
                    }
                }
            }
        }
    }
}

Это похоже на работу! :)

...