Всем привет.
Есть два репозитория в gitlab один с основным проектом, второй репозиторий с автотестами.
Создан Jenkins pipeline, со следующими конфигурациями:
Build triggers:
Poll SCM Schedule: * * * * * (то есть проверять изменения каждую минуту).
В разделе Pipeline указан репозиторий основного проекта:
Definition: Pipeline script from SCM
SCM: Git
Repositories:
Repository URL: https://gitlab.com/App/Application.git
Credentials: Creds/******
Branches to build:
Branch Specifier (blank for 'any'): */master
Repository browser: Auto
Script Path: pipelines/Jenkinsfile
Содержимое Jenkinsfile примерно следующее:
try { node('Slave') { stage('Build') { dir('Backend') { git url: "https://$gitRepo", branch: 'master', credentialsId: gitlabCredentialsId def commitHash = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim() version = "${getDateTime()}-$commitHash" sh 'chmod +x gradlew && ./gradlew clean build --no-daemon' withCredentials([usernamePassword(credentialsId: gitlabCredentialsId, passwordVariable: 'GITLAB_PASSWORD', usernameVariable: 'GITLAB_USERNAME')]) { sh("docker login $registryName -u $GITLAB_USERNAME -p $GITLAB_PASSWORD") } docker.withRegistry("https://$registryName") { def image = docker.build(imageName) image.push(version) image.push('latest') } sh 'docker system prune -af || true' } } stage('Integration tests') { dir('Autotests') { try { url: "https://$autotestsGitRepo", branch: 'master', credentialsId: gitlabCredentialsId withCredentials([usernamePassword(credentialsId: gitlabCredentialsId, passwordVariable: 'GITLAB_PASSWORD', usernameVariable: 'GITLAB_USERNAME')]) { sh("docker login $registryName -u $GITLAB_USERNAME -p $GITLAB_PASSWORD; docker-compose pull backend; docker-compose up -d") waitUntilAppIsUp(localhost) sh('./gradlew clean test') } } finally { sh("docker-compose down") step([$class: 'JUnitResultArchiver', keepLongStdio: true, testResults: 'build/test-results/test/*.xml']) } } } stage('Staging deployment') { withCredentials([usernamePassword(credentialsId: gitlabCredentialsId, passwordVariable: 'GITLAB_PASSWORD', usernameVariable: 'GITLAB_USERNAME')]) { sshagent(credentials: [sshInstanceCredentialsId]) { dir('Backend') { sh "scp -o StrictHostKeyChecking=no docker-compose.yml $instanceHost:" sh "ssh -o StrictHostKeyChecking=no $instanceHost 'docker login $registryName -u $GITLAB_USERNAME -p $GITLAB_PASSWORD; docker-compose pull backend; docker-compose up -d'" waitUntilAppIsUp(stagingHost) } } } } } } catch (e) { throw e }
Вкратце - сначала приложение клонируется из репозитория основного проекта на jenkins слэйве, билдится, собирается в докер образ и пушится в докер регистри.
Второй этап это клонирование репозитория с автотестами тоже на jenkins слэйв, далее из докер регистри пулится образ с приложением и разворачивается с помощью docker-compose. После чего запускаются автотесты с помощью команды ./gradlew clean test.
Третий этап заходим по ssh на стэйджинг и разворачиваем там приложение.
Суть вопроса:
Когда делаю мерж в мастер в основном проекте Application, через минуту проверяется, что есть изменения и сборка запускается, как и должно быть и проходит или падает один раз.
Но если я делаю мерж в мастер в другом репозитории - в проекте автотестов Autotests, то сборка запускается как и должна через 1 минуту, далее не дожидается пока пройдёт сборка запускается через минуту ещё одна(та же самая), потому через минуту ещё одна(та же самая) и так до бесконечности, пока хотя бы одна сборка не пройдёт или не упадёт. Кто нибудь с этим сталкивался? Как это исправить. Не совсем понимаю почему отслеживается автотестовый репозиторий на изменения, если в Repository URL указан репозиторий основного проекта https://gitlab.com/App/Application.git.