前言
在網際網路專案中,專案測試、部署往往需要花費大量時間。傳統方式是在本地打包、測試完畢程式,然後透過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
如果你覺得我的部落格對你有幫助,可以給我點兒打賞,左側微信,右側支付寶。
有可能就是你的一點打賞會讓我的部落格寫的更好:)