我正在尝试将Spring启动应用程序部署到AWS EC2实例。我已经看到很多博客和教程完全解释了部署过程,这是可以理解的。我正在努力如何在jenkins中进行持续部署或交付,其中主要功能是spring boot app name或jar文件名在那个时间发生变化。
我的管道
pipeline {
agent any
tools{
maven 'localmaven'
}
stages {
stage('Build') {
steps {
sh 'mvn clean package'
}
post {
success {
echo 'Now Archiving...'
archiveArtifacts artifacts: '**/target/*.jar'
}
}
}
stage('Deliver') {
steps {
sh 'scp -v -o StrictHostKeyChecking=no -i /var/lib/jenkins/secrets/mykey target/*.jar ubuntu@00.00.00.00:/home/ubuntu'
sh "sshpass -p password ssh -o StrictHostKeyChecking=no -i /var/lib/jenkins/secrets/mykey ubuntu@00.00.00.00 '/home/ubuntu/start.sh'"
}
}
}
}
在shell脚本中处理服务器启动和停止以及重新启动。
我的start.sh
#!/bin/bash
nohup java -jar /home/ubuntu/aws-0.0.1-SNAPSHOT.jar > /home/ubuntu/log.txt 2>&1 &
echo $! > /home/ubuntu/pid.file
这样可以完美地启动我的服务器并正常运行..
她我的疑问目前在start.sh我使用相同的jar文件名,所以它工作正常但在生产中版本更改jar文件名也改变了如何处理这种情况。帮助我了解该过程。我可以在哪里获得完整的想法和所有事先感谢
答案 0 :(得分:3)
我必须说你应该将工件版本作为非prod和prod部署的标准流程。通常在非产品环境中,您可以规划 SNAPSHOT 版本,在生产中您应该选择 RELEASE 版本,该版本可以使用mvn release prepare release perform
使用maven-release-plugin生成}。它将提升您的pom版本以用于下一个后续版本。您可以将工件存储到AWS S3或Artifactory或Nexus(用于高可用性),例如您在此处引用的ubuntu计算机。
现在我建议您再添加一个名为 stage(' Release')的阶段,您应该使用maven-release-plugin来发布版本并存储它到一个单独的路径,如
ubuntu@00.00.00.00:/家庭/ ubuntu的/ RELEASE / $ {版本}
并根据你的舞台(' Build')应该复制到另一条路径,如
ubuntu@00.00.00.00:/家庭/ ubuntu的/快照/ $ {版本}
您可以执行阶段' 发布'和' Prod-Deliver '基于Jenkins管道的条件输入参数。 在您的情况下,这将是一个平滑CICD的可能解决方案。
pipeline {
agent any
tools{
maven 'localmaven'
}
stages {
stage('Build') {
steps {
sh 'mvn clean install'
}
post {
success {
echo 'Now Archiving...'
}
}
}
stage('Release') {
steps {
sh 'elease:prepare release:perform'
}
post {
success {
////
}
}
}
stage('NonProd-Deliver') {
steps {
/*
You can extract the version from pom.xml,replace you project location in jenkins workspace in the below command
*/
sh 'version=$(echo -e 'setns x=http://maven.apache.org/POM/4.0.0\ncat /x:project/x:version/text()' | xmllint --shell ${YOUR_PROJECT_LOCATION}/pom.xml | grep -v /)'
sh 'scp -v -o StrictHostKeyChecking=no -i /var/lib/jenkins/secrets/mykey target/*.jar ubuntu@00.00.00.00:/home/ubuntu/SNAPSHOT/${version}'
sh "sshpass -p password ssh -o StrictHostKeyChecking=no -i /var/lib/jenkins/secrets/mykey ubuntu@00.00.00.00 '/home/ubuntu/start.sh nonprod $version'"
}
}
stage('Prod-Deliver') {
steps {
/*
For production release you should pass the version as a parameter to your jenkins pipeline which is going to be in production
*/
sh 'scp -v -o StrictHostKeyChecking=no -i /var/lib/jenkins/secrets/mykey target/*.jar ubuntu@00.00.00.00:/home/ubuntu/RELEASE/${version} '
sh "sshpass -p password ssh -o StrictHostKeyChecking=no -i /var/lib/jenkins/secrets/mykey ubuntu@00.00.00.00 '/home/ubuntu/start.sh prod ${version}'"
}
}
}
}
您必须在脚本文件中添加条件,如下所示
#!/bin/bash
release_type=$1
version=$2
if [[ ${release_type} == "prod" ]]; then
# non snapshot release to production env
nohup java -jar /home/ubuntu/RELEASE/${version}/aws-0.0.1.jar > /home/ubuntu/log.txt 2>&1 &
else
# snapshot release to non production env
nohup java -jar /home/ubuntu/SNAPSHOT/${version}/aws-0.0.1-SNAPSHOT.jar > /home/ubuntu/log.txt 2>&1 &
fi
echo $! > /home/ubuntu/pid.file
答案 1 :(得分:2)
我想说使用build.finalName
将最终工件的名称保持为常量名称,并且有一个规定将构建版本保留在构建中的某个位置。
当我看到您使用spring boot时,您可以使用build-info
spring-boot-maven-plugin
目标保存版本信息的一部分,如下所示。
<build>
<finalName>your-artifact-name</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>build-info</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
并通过执行器端点http://localhost:8080/actuator/info
访问maven构建信息。
或者,您可以通过使用以下命令查看jar文件来获取classpath:META-INF/build-info.properties
中保存的版本信息。
$> unzip -qc your-artifact-name.jar META-INF/build-info.properties
#Properties
#Fri May 04 17:43:06 IST 2018
build.time=2018-05-04T12\:13\:06.225Z
build.artifact=your-artifact-name
build.group=com.example
build.name=your-artifact-name
build.version=1.0.0.SNAPSHOT
这样即使意外重命名文件,构建版本也不会更改。
答案 2 :(得分:0)
您可以将文件名作为参数传递给shell脚本,即修改shell脚本,如下所示:
df.drop(['ID', 'CustomerAge'], axis=1, inplace=True)
然后你需要根据构建版本确定要使用的正确文件名,并将其作为参数传递给Deliver阶段的脚本。
答案 3 :(得分:0)
You can just rename the file when you do an scp
scp filename username@remote.host.net.:filenewname
In your case something like this
sh 'scp -v -o StrictHostKeyChecking=no -i /var/lib/jenkins/secrets/mykey target/*.jar ubuntu@00.00.00.00:/home/ubuntu:aws-0.0.1-SNAPSHOT.jar'
The above code takes whatever build version has been created by jenkins and at the time of copying it and renames it to "aws-0.0.1-SNAPSHOT.jar", so you dont have to modify your start.sh
P.S generally when you deploy your final build(JAR) ensure that only the jar name is added as the description to the filename and not "-0.0.1-SNAPSHOT"
Hope it helps :)