У меня есть несколько проектов тестирования (тесты API, тесты UI Selenium и т. Д. c), которые тестируют одно и то же приложение. На данный момент шаги приложения. Развертывание дублируется в каждом файле jenkins.
Цель состоит в том, чтобы иметь общее задание app-deploy , которое подготавливает приложение на сервере:
- Извлекает из определенной ревизии или тега;
- Определяет множество переменных среды, таких как лицензии и т. Д .;
- Создает файлы WAR;
- Копирует их в каталог сборки Tomcat;
- Запускает Tomcat и ожидает готовности контекста.
Я не могу просто завершить сборку sh после этого, так как Jenkins убьет все созданные процессы, включая запущенный Tomcat. Я попытался doNoKillMe
cook ie для Tomcat, но это вызвало несколько других проблем, связанных с перезапуском приложения и подключений к БД. Итак, я поставил шаг input
с идентификатором, когда приложение готово:
node {
properties([
parameters([
string(name: 'REVISION',
defaultValue: '',
),
string(name: 'TAG_NAME',
defaultValue: ''),
]),
])
withEnv(buildEnvVariables()) {
stage('Checkout') {
}
stage('Prepare file system') {
}
stage('Prepare database') {
}
stage('Builds WAR files') {
}
stage('Tomcat deploy') {
// Delete previous WAR files from Tomcat
// Copy generated files to tomcat
sh "$TOMCAT_DIR/bin/startup.sh"
waitForTokenFileOrFail()
}
input(id: 'IsBuilt', 'Application is ready... ')
}
}
Теперь я хочу, чтобы это задание вызывалось из нескольких других testing-speci c jenkins files:
node {
properties([
parameters([
string(name: 'TESTS_SUITE',
defaultValue: '',
),
string(name: 'OTHER_PARAM',
defaultValue: ''),
]),
])
withEnv(buildEnvVariables()) {
stage('Checkout') {
}
stage('Stop any running application builds') {
def jenkinsQueue = Jenkins.instance.queue
jenkinsQueue.items.findAll { it.task.name.startsWith(contextDeployBuildName) }.each {
echo "Found pending $contextDeployBuildName job. Cancelling: ${it.getId()}"
jenkinsQueue.doCancelItem(it.getId())
}
Jenkins.instance.getItemByFullName(contextDeployBuildName)
.getAllJobs().first().getBuilds()
?.each { build ->
if (build.isBuilding()) {
try {
echo "Found running $contextDeployBuildName job. Stopping: ${build.number}"
httpRequest(
httpMode: 'POST',
authentication: 'credentialsID',
url: "${JENKINS_URL}job/$contextDeployBuildName/${build.number}/stop")
} catch (any) {
println any.message
}
}
}
}
stage('Build the app') {
build(wait: true, job: contextDeployBuildName, parameters: [
string(name: 'REVISION', value: env.BRANCH_NAME),
string(name: 'TAG_NAME', value: env.TAG_NAME)])
// How to wait for a specific input/condition here???
}
stage('Run tests') {
}
stage('Report, cleanup') {
}
}
}
Я использую jenkins build step
с условием wait
, но кажется, что он может ждать только до завершения работы sh. Изменение статуса задания развертывания игнорируется (я верю, потому что слушатели сборки не запускаются):
currentBuild.rawBuild.@result = hudson.model.Result.SUCCESS
Вопрос:
Как правильно сообщить в спецификацию тестирования c о сработавшем вводе в app-deploy * job? Существует ли стандартный способ решения такой проблемы «тестирования развертывания»?
Пока у меня есть два уродливых способа проверить состояние, кроме инструментов конвейера:
- Дождаться какого-то определенного c файла в папках Tomcat / application
- Когда ввод с указанным идентификатором инициируется, доступ к его странице можно получить через этот идентификатор, поэтому я могу пропинговать страницу ввода, пока она не вернет 200 статус вместо 404.