Цель: Мы разработали конвейерные сценарии для сборки Jenkins. - Дженкинс должен получить код из GITLAB. - Затем собрать и развернуть jar в хранилище Nexus. - тогда Дженкинс должен запустить Rundeck Server для запуска своей Playbook. - Rundeck Playbook состоит из maven_artifact, позволяющего загрузить банку из репозитория Nexus и развернуть ее на целевом сервере.
Проблема: - После создания баночки, когда Дженкинс загружает банку в Nexus,отметка времени добавляется к названию банки. Например: [INFO] Загрузка: https://nexus_server/repository/maven-snapshots/app_name/1.0.0-SNAPSHOT/app_name-1.0.0-20191007.101057-7.jar
- Когда функция maven_artifact в Rundeck пытается загрузить ее из репозитория Nexus, метка времени, которая генерируется автоматически, не совпадает с меткой времени в репозитории Nexusчто приводит к ошибке Http 404.
Журнал ошибок в Rundeck:
"Failed to download MD5\", lambda r: r.read())\r\n File \"/tmp/ansible_3jIAXq/ansible_module_maven_artifact.py\", line 337, in _request\r\n raise ValueError(failmsg + \" because of \" + info['msg'] + \"for URL \" + url_to_use)\r\nValueError: Failed to download MD5 because of HTTP Error 404: app_name/1.0.0-SNAPSHOT/app_name-1.0.0-20191007.120824-9.jar.md5for URL https://nexus_server/repository/maven-snapshots/app_name/1.0.0-SNAPSHOT/app_name-1.0.0-20191007.120824-9.jar.md5\r\n",
"msg": "MODULE FAILURE",
Сценарий конвейера Jenkins:
#!groovy
pipeline {
agent { label 'maven' }
options {
skipDefaultCheckout()
disableConcurrentBuilds()
timeout(time: 1, unit: 'HOURS')
buildDiscarder(logRotator(daysToKeepStr: '2'))
}
environment {
Environmental_Variables_initialization
}
stages {
stage ('Extract Application Info') {
steps {
script{
env.APP_NAME="${env.JOB_NAME}"
int left = env.APP_NAME.lastIndexOf('/', env.APP_NAME.lastIndexOf('/') - 1)
int right = env.APP_NAME.lastIndexOf('/')
env.APP_NAME = env.APP_NAME.substring(left+1, right)
env.APPLICATION_HOME_DIR = "$APPLICATIONS_ROOT_DIR/${env.APP_NAME}"
echo "Ok. I will run for ${env.APP_NAME}."
}
}
post {
failure {
script { env.FAILURE_STAGE = 'Extract Application Info' }
}
}
}
stage ('Checkout Source') {
steps {
script{
git branch: "master", credentialsId: 'user_id', url: "https://GITLAB_Server/${GIT_GROUP}/${APP_NAME}.git", changelog: false, poll: false
}
}
post {
failure {
script { env.FAILURE_STAGE = 'Checkout Source' }
}
}
}
stage ('Build Source') {
environment {
MAVEN_OPTS = '-Xmx256m'
}
steps {
sh 'mvn -B clean deploy -DargLine="-Xmx256m" -Dmaven.test.skip=true -DrunSuite=' + UNIT_TEST_SUITE
}
post {
failure {
script { env.FAILURE_STAGE = 'Build Source' }
}
}
}
stage ('Code Analysis') {
environment {
MAVEN_OPTS = '-Xmx256m'
SONAR_RUNNER_OPTS='-Xmx256m'
}
steps {
sh 'mvn -B sonar:sonar -Dsonar.host.url=https://SONAR_SERVER -Dsonar.scm.disabled=true'
}
post {
failure {
script { env.FAILURE_STAGE = 'Code Analysis' }
}
}
}
stage('Call Rundeck') {
steps{
script {
FunctionToTriggerRundeckServer([
jobID : 'UUID of the job in Rundeck Server',
rundeckUrl : 'https://RUNDECK_SERVER/',
jobParameters: [
NEXUS_URL : "https://NEXUS_SERVER/repository/maven-snapshots",
VERSION : "1.0.0",
DEST : "/directory"
],
credentialID : "SUserId"
])
}
}
}
}
post {
always {
cleanWs()
sh 'echo "All stages finished running and workspace was cleaned."'
}
success {
sh ("echo 'Job finished successfully.'")
}
failure {
sh ("echo 'Job failed.'")
}//failure
}//post
}//pipeline
Сценарий Rundeck Playbook:
---
- name: Spring Batch Application
hosts: "{{ SERVER }}"
tasks:
- maven_artifact:
group_id: com.groupId
artifact_id: app_name
repository_url: '{{ NEXUS_URL }}'
dest: '{{ DEST }}/app_name-{{ VERSION }}.jar'
username: userId
validate_certs: false
state: present
mode: 0755
Наблюдение: Я заметил, что если я выполняю mvn clean install deploy из STS IDE, jar загружается в репозиторий Nexus. и затем, если я запускаю сервер Rundeck напрямую, тогда точная метка времени генерируется методом maven_artifact в Rundeck. Но когда я делаю сборку с сервера Jenkins, создается впечатление, что сгенерированная временная метка временная метка не совпадает с временной меткой в хранилище nexus.
Любая помощь приветствуется.