pipeline {
agent any
environment {
DOCKER_IMAGE = 'rexoided/my-laravel-app'
DOCKER_CREDENTIALS_ID = 'docker-hub'
}
stages {
stage('Checkout') {
steps {
git branch: 'main', url: 'https://gitlab.irkat.ru/23322/my-laravel-app.git'
}
}
stage('Build Docker Image') {
steps {
script {
dockerImage = docker.build("${env.DOCKER_IMAGE}:${env.BUILD_ID}")
}
}
}
stage('Run Tests') {
steps {
script {
dockerImage.inside("--rm") {
// Установка зависимостей
sh 'composer install --no-dev --optimize-autoloader --no-cache'
// Вариант 1: запуск тестов через PHPUnit напрямую (рекомендуемый)
sh 'vendor/bin/phpunit --env=testing'
/*
// Вариант 2: если хотите использовать artisan test,
// сначала установите пакет collision
// sh 'composer require --dev nunomaduro/collision'
// sh 'php artisan test --env=testing'
*/
}
}
}
}
stage('Push Docker Image') {
when {
beforeAgent true
expression { currentBuild.result != 'FAILURE' }
}
steps {
script {
docker.withRegistry('https://index.docker.io/v1/', "${env.DOCKER_CREDENTIALS_ID}") {
dockerImage.push("${env.BUILD_ID}")
dockerImage.push('latest')
}
}
}
}
stage('Deploy') {
when {
beforeAgent true
expression { currentBuild.result != 'FAILURE' }
}
steps {
script {
sh 'docker stop my-running-app || true'
sh 'docker rm my-running-app || true'
sh "docker run -d -p 8080:80 --name my-running-app ${env.DOCKER_IMAGE}:${env.BUILD_ID}"
}
}
}
}
post {
always {
sh 'docker image prune -f'
}
failure {
echo 'Pipeline failed!'
// Здесь можно добавить уведомления (email, Slack и т. д.)
}
success {
echo 'Pipeline succeeded!'
}
}
}