前言

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

    Bundle display name 与 Bundle name 的区别是什么?"Bundle Name" and "Bundle display name" ...

  2. ibatis 学习笔记 3 - pfpfpfpfpf的专栏 - 博客频道 - CSDN.NET

    body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...

  3. 哈夫曼树压缩C#算法(huffman)

    算法原理:http://www.cnblogs.com/skywang12345/p/3706833.html. 上代码: using System; using System.Collections ...

  4. Blog开始

    好久没更新Blog了,去看了下之前的csdn的blog感觉特别的乱,为此决心重开blog,记录工作及学习中的一些事 2013-10-28 ymc ...

  5. phpcms v9 在当前栏目下获取父栏目与当前栏目的名称与连接

    <a href="#" target="_blank">首页</a> > <a href="{$CATEGORYS ...

  6. kafka第五篇

    架构设计:http://www.linuxeden.com/html/news/20130309/136716_2.html 代码实现consumer 和producer

  7. 《玩转Bootstrap(基础)》笔记

    基本的HTML模板 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  8. Hibernate 继承表结构

    有Product , Book ,Clothes三张表 Product:id,name Book: id ,name,pageCount Clothes: id ,name ,size 创建三张表 产 ...

  9. 更深入一点理解switch语句及c/c++对const的处理

    首先看一到用 c 编写的程序/* -------------------- filename : ta.c --------------- */int switch_test_first( int x ...

  10. 使用SSH搭建用户注册登录系统

    [转]http://blog.sina.com.cn/s/blog_a6a6b3cd01017c57.html 什么是SSH? SSH对应 struts spring hibernatestruts ...