我正在尝试将Spring Boot应用程序部署到AWS EC2实例。我已经看到很多博客和教程完全解释了部署过程,这是可以理解的。我正在努力如何在jenkins中进行连续部署或交付,这是Spring Boot应用程序名称或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文件名也会更改如何处理这种情况。帮助我了解该过程。我在哪里可以得到完整的想法,在此先感谢一切
我必须说,您应该将工件的版本维护为非产品和产品部署的标准过程。通常,在非产品环境中,您可以计划 SNAPSHOT 版本,而在生产环境中,您应该使用可以使用maven-release-plugin生成的 RELEASE 版本。它将提升您的pom版本,以用于后续的后续发行。您可以将工件存储到AWS S3或Artifactory或Nexus(以实现高可用性),例如此处引用的ubuntu计算机。mvn release prepare release perform
mvn release prepare release perform
现在,我建议您再添加一个名为 stage(’Release’)的阶段,在该阶段 应使用maven-release- plugin发行版本并将其存储在单独的路径中,例如
ubuntu@00.00.00.00:/ home / ubuntu / RELEASE / $ {version}
并且根据您的stage(’Build’)应该复制到另一个路径,例如
ubuntu@00.00.00.00:/ home / ubuntu / SNAPSHOT / $ {version}
您可以根据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