如何使用jenkins将spring boot jar文件部署到EC2?

我正在尝试将Spring启动应用程序部署到AWS EC2实例。 我已经看到很多博客和教程完全解释了部署过程,这是可以理解的。 我正在努力如何在jenkins中进行持续部署或交付,其中主要function是春季启动应用程序名称或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文件名也改变如何处理这种情况。帮助我了解该过程。 在那里我可以提前获得完整的想法和一切

我必须说你应该将工件版本作为非prod和prod部署的标准流程。 通常在非prod环境中你可以规划SNAPSHOT版本,在生产中你应该选择RELEASE版本,可以使用maven-release-plugin使用mvn release prepare release perform 。 它将提升您的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的/快照/ $ {}版本

您可以根据Jenkins管道的条件输入参数执行阶段’ Release ‘和’ Prod-Deliver ‘。 在您的情况下,这将是一个平滑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 

我会说使用build.finalName将最终工件的名称保持为常量名称,并且有一个规定将构建版本保留在构建中的某个位置。

当我看到你使用spring boot时,你可以使用spring-boot-maven-plugin build-info目标来保存版本信息的一部分,如下所示。

   your-artifact-name   org.springframework.boot spring-boot-maven-plugin    build-info       

并通过执行器端点http://localhost:8080/actuator/info访问maven构建信息。

或者,您可以通过使用以下命令查看jar文件来获取保存在classpath:META-INF/build-info.properties的版本信息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 

这样,即使意外重命名文件,构建版本也不会更改。

您可以将文件名作为参数传递给shell脚本,即修改shell脚本,如下所示:

 #!/bin/bash nohup java -jar /home/ubuntu/$1 > /home/ubuntu/log.txt 2>&1 & echo $! > /home/ubuntu/pid.file 

然后,您需要根据构建版本确定要使用的正确文件名,并将其作为参数传递给Deliver阶段中的脚本。

您可以在执行scp时重命名该文件

 scp filename username@remote.host.net.:filenewname 

在你的情况下这样的事情

 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' 

以上代码采用jenkins创建的任何构建版本,并在复制时将其重命名为“aws-0.0.1-SNAPSHOT.jar”,因此您无需修改​​start.sh

PS通常在部署最终版本(JAR)时确保仅将jar名称添加为文件名的描述而不是“-0.0.1-SNAPSHOT”

希望能帮助到你 :)