一尘不染

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

spring-boot

我正在尝试将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文件名也会更改如何处理这种情况。帮助我了解该过程。我在哪里可以得到完整的想法,在此先感谢一切


阅读 382

收藏
2020-05-30

共1个答案

一尘不染

我必须说,您应该将工件的版本维护为非产品和产品部署的标准过程。通常,在非产品环境中,您可以计划 SNAPSHOT
版本,而在生产环境中,您应该使用可以使用maven-release-plugin生成的 RELEASE
版本。它将提升您的pom版本,以用于后续的后续发行。您可以将工件存储到AWS
S3或Artifactory或Nexus(以实现高可用性),例如此处引用的ubuntu计算机。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
2020-05-30