玩转spring boot——结合阿里云持续交付
前言
在互联网项目中,项目测试、部署往往需要花费大量时间。传统方式是在本地打包、测试完毕程序,然后通过ftp上传至服务器,再把测试的配置文件修改为生产环境的配置文件,最后重新运行服务。这一过程如果交给人工完成往往容易出错,如项目有大量的配置,而仅有一处配置不正确将会发生重大的灾难,因此项目的持续集成和持续交付则尤为重要。之前,笔者的项目是通过git+maven+tomcat+jenkins来完成的,而如今阿里云推出了持续交付平台,笔者来为大家踩踩坑。
一、准备工作(spring boot+maven的项目)
package com.github.carter659.springskill01; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; /** * 入口类 博客出处:http://www.cnblogs.com/GoodHelper/ * */ @SpringBootApplication @Controller public class App { @Value("${name}") private String name; public static void main(String[] args) { SpringApplication.run(App.class, args); } @GetMapping("/") public String index(Model model) { model.addAttribute("name", name); return "index"; } }
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>玩转spring boot——结合阿里云持续交付</title> </head> <body> <h1>玩转spring boot——结合阿里云持续交付</h1> <h4> <a href="http://www.cnblogs.com/GoodHelper/">from 刘冬的博客</a> </h4> <h3 th:text="'环境为:' + ${name}"></h3> <br /> <a href="http://www.cnblogs.com/GoodHelper/">点击访问原版博客(www.cnblogs.com/GoodHelper)</a> </body> </html>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.github.carter659</groupId> <artifactId>springskill01</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.3.RELEASE</version> </parent> <name>springskill01</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> <finalName>spring-skill-01</finalName> </build> </project>
build节点配置生成的jar名“<finalName>spring-skill-01</finalName>”,之后的脚步中会执行java -jar命令的jar的名称就是“spring-skill-01”
增加三个配置文件:
application.properties:
## dev | prod | test spring.profiles.active=dev
application-dev.properties:
name=\u5F00\u53D1\u73AF\u5883
application-prod.properties:
name=\u751F\u4EA7\u73AF\u5883
分别演示开发、生产环境的不同配置
项目结构为:
本地运行效果为:
二、配置linux服务器
mkdir /opt/java mkdir /opt/run vi /opt/run/run.sh
“/opt/java”路径是之后阿里云持续交付平台上传文件的路径
创建项目的目录和运行项目的脚步文件
“/opt/run/run.sh”文件为:
#!/bin/bash cd /opt/java ps aux | grep spring | xargs kill -9 tar -xzf package.tgz java -jar /opt/java/spring-skill-01.jar --spring.profiles.active=prod
目的是:解压阿里云持续交付平台上传的项目,执行java -jar运行并生产环境的spring boot的jar,而“spring-skill-01.jar”就是之前在pom.xml节点<finalName>spring-skill-01</finalName>配置的。
三、配置阿里云持续交付平台
首先,登录阿里云git库“https://code.aliyun.com/” 创建git项目
选择一个私有项目
创建完项目后,选择持续交付平台菜单
创建持续交付项目
为该项目创建工作流
选择默认模板并输入名称
配置工作流节点“打包”,执行“mvn package”命令
配置部署节点,设置之前在服务器创建的路径“/opt/java”
配置运行脚本的路径
配置机器授权
点击拷贝按钮,复制所拷贝的key
在服务器新建文件和key文件
mkdir $HOME/.ssh/ vi $HOME/.ssh/authorized_keys
在“$HOME/.ssh/authorized_keys”文件中粘帖复制的key
四、运行效果
执行git命令push代码
git add. git commit -m 'ok' git push
由于push代码会触发持续交付平台的工作流
所以会按照之前设定好的脚本运行
部署完毕后,访问服务器中项目:
总结
持续交付的整个简单过程就演示完了,但上述方案并不完美。问题出在执行的脚本上,正式项目需要把spring boot创建成服务,使用服务停止的命令终止进程,而不是使用kill来杀死进程。另外,正式项目还需要部署多个web容器,以便于让用户不间断和在察觉不到的情况下更新程序,需要与nginx联合使用。
代码:https://github.com/carter659/spring-boot-skill-01.git
如果你觉得我的博客对你有帮助,可以给我点儿打赏,左侧微信,右侧支付宝。
有可能就是你的一点打赏会让我的博客写的更好:)