前言

  在互联网项目中,项目测试、部署往往需要花费大量时间。传统方式是在本地打包、测试完毕程序,然后通过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";
}
}

App.java

<!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>

index.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>

pom.xml

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

如果你觉得我的博客对你有帮助,可以给我点儿打赏,左侧微信,右侧支付宝。

有可能就是你的一点打赏会让我的博客写的更好:)

返回玩转spring boot系列目录

玩转spring boot——结合阿里云持续交付的更多相关文章

  1. Sping Boot入门到实战之实战篇(一):实现自定义Spring Boot Starter——阿里云消息队列服务Starter

    在 Sping Boot入门到实战之入门篇(四):Spring Boot自动化配置 这篇中,我们知道Spring Boot自动化配置的实现,主要由如下几部分完成: @EnableAutoConfigu ...

  2. Spring Boot 集成阿里云 OSS 进行文件存储

    最近因为项目中需要存储很多的图片,不想存储到服务器上,因此就直接选用阿里云的对象服务(Object Storage Service,简称 OSS)来进行存储,本文将介绍 Spring Boot 集成 ...

  3. spring boot集成阿里云短信发送接收短信回复功能

    1.集成阿里云通信发送短信: 在pom.xml文件里添加依赖 <!--阿里短信服务--> <dependency> <groupId>com.aliyun</ ...

  4. Spring Boot使用阿里云证书启用HTTPS

    1.到阿里云下载证书页面下载证书 2.根据页面内容,可以使用2种证书:PFX JKS 把对应证书放到src/main/resources目录下 在application.properties文件中加入 ...

  5. 玩转spring boot——开篇

    很久没写博客了,而这一转眼就是7年.这段时间并不是我没学习东西,而是园友们的技术提高的非常快,这反而让我不知道该写些什么.我做程序已经有十几年之久了,可以说是彻彻底底的“程序老炮”,至于技术怎么样?我 ...

  6. 玩转spring boot——war部署

    前言 之前部署spring boot应用是通过直接输入命令“java -jar”来实现的.而有些情况,由于部署环境的制约,只能把项目从jar转换成war才能部署,如新浪云sae的java环境容器.那怎 ...

  7. 玩转spring boot——负载均衡与session共享

     前言 当项目上线后,如果要修复bug或扩充功能,都需要重启tomcat服务.此时,正在使用应用的用户们就需要等待服务器的重启,而这就会造成不好的用户体验.还有,当仅仅只有一台tomcat服务时,如果 ...

  8. 玩转spring boot——结合docker

    前言 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 liunx机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有 ...

  9. 朱晔和你聊Spring系列S1E11:小测Spring Cloud Kubernetes @ 阿里云K8S

    有关Spring Cloud Kubernates(以下简称SCK)详见https://github.com/spring-cloud/spring-cloud-kubernetes,在本文中我们主要 ...

随机推荐

  1. rsync+inotify实现数据的实时备份

    一.rsync概述 1.1.rsync的优点与不足 rsync与传统的cp.tar备份方式相比,rsync具有安全性高.备份迅速.支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需 ...

  2. 在nltk中调用stanfordparser处理中文

    出现unicode decode error 解决办法是修改nltk包internals.py的java()下增加cmd的参数,cmd = ["-Dfile.encoding=UTF-8&q ...

  3. POJ 2728 Desert King 最优比率生成树

    Desert King Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 20978   Accepted: 5898 [Des ...

  4. Spring整合Hibernate--声明式事务管理

    Spring指定datasource 1. 新建jdbc.properties文件: jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc: ...

  5. Spark 的combineByKey函数

    在Spark中有许多聚类操作是基于combineByKey的,例如group那个家族的操作等.所以combineByKey这个函数也是比较重要,所以下午花了点时间看来下这个函数.也参考了http:// ...

  6. Thinking in scala (8)---- 乘幂计算

    递归的方式: b^n = (b^(n/2))^2 若n是偶数 b^n = b*(b^(n-1)) 若n是奇数 迭代的方式 product:存储中间结果,初始化为1 b^n = (b^2)^(n/2) ...

  7. STM32的时钟树深入详解以及RCC配置

    在STM32上如果不使用外部晶振,OSC_IN和OSC_OUT的接法 如果使用内部RC振荡器而不使用外部晶振,请按照下面方法处理: 1)对于100脚或144脚的产品,OSC_IN应接地,OSC_OUT ...

  8. cocos2d中box2d讲解一

    在游戏中我们经常要加入物理碰撞等和物理有关的内容,在游戏中加入物理引擎可以使我们的游戏更加真实,为玩家展示一个更真实的世界,cocos2d-x支持两个物理引擎Box2d和Chipmunk,本文介绍bo ...

  9. Python装饰器学习(九步入门)

    这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 ? 1 2 3 4 5 6 7 8 # -*- coding:gbk -*- '''示 ...

  10. centos 6.5下安装、配置并启动SSH远程访问

    centos 6.5下安装.配置并启动SSH远程访问 1.登录centos 6.5系统,使用root用户登录,如果为非root用户则执行su或su - 或su root或su - root切换为roo ...