目标: 我们为Jenkins构建设计了管道脚本。 -Jenkins应该从GITLAB签出代码 -然后构建jar并将其部署到Nexus Repository。 -然后Jenkins应该触发Rundeck Server执行其Playbook。 -Rundeck Playbook由maven_artifact组成,可以从nexus存储库下载jar并将其部署到目标服务器。
问题: -构建jar之后,当詹金斯(Jenkins)将jar上传到Nexus时,时间戳会附加到jar的名称之后。例如: [INFO]上传:https://nexus_server/repository/maven-snapshots/app_name/1.0.0-SNAPSHOT/app_name-1.0.0-20191007.101057-7.jar
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剧本脚本:
---
- 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
观察: 我观察到,如果我从STS IDE进行mvn clean install deploy,则jar将上传到Nexus Repository。然后,如果我直接运行Rundeck Server,则确切的时间戳是由Rundeck中的maven_artifact方法生成的。但是,当我从Jenkins服务器进行构建时,似乎rundeck生成的时间戳与nexus存储库中的时间戳不匹配。
任何帮助将不胜感激。