0%

配置插件 Global Tool Configuration

添加一个Docker安装,将其命名为:docker

配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
pipeline {
agent any
options {
timestamps()
timeout(30)
}

stages {
stage("Check out") {
steps {
git credentialsId: 'dev', url: 'git@10.1.11.112:psp/system-management-web-portal.git', branch: 'dev'
}
}

stage('Build') {
steps {
nodejs('nodejs') {
sh 'npm install'
sh 'npm run build'
}
script {
docker.withTool('docker') {
withDockerServer([uri: 'tcp://192.168.55.207:2375', credentialsId: null]) {
sh 'docker build . -t psp.system-management-web-portal'
}
}
}

}
}

stage('Deploy') {
steps {
script {
docker.withTool('docker') {
withDockerServer([uri: 'tcp://192.168.55.207:2375', credentialsId: null]) {
sh 'docker rm -f psp.system-management-web-portal || echo "no container exists" '
sh 'docker run -d --network comall --ip 10.1.200.10 --name psp.system-management-web-portal psp.system-management-web-portal'
}
}
}
}
}
}
}

安装插件

nodejs

配置插件 Global Tool Configuration

添加一个NodeJS安装,将其命名为:nodejs

配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
pipeline {
agent any
options {
timestamps()
timeout(30)
}

stages {
stage("Check out") {
steps {
git credentialsId: 'dev', url: 'git@10.1.11.112:psp/system-management-web-portal.git', branch: 'dev'
}
}

stage('Build') {
steps {
nodejs('nodejs') {
sh 'npm install'
sh 'npm run build'
}
}
}
}

一、Swagger是什么

一般做后端,都需要向前端提供API,但是因为后端一般都赖得写API文档,所以就出现了个这东西,用于生成在线的API文档,同时提供了在线测试API的用户接口。

Read more »

一、什么是Feign

呃,这是一个好东西。

我们平常访问远端Restful API时,都是使用OKHttpClient之类的库去访问HTTP Restful API,其实挺类的,既要了解方法,又要了解参数转换,然后写一堆请求代码和数据转换代码,非常不友好。

Feign就是一个解救我们于Restful API请求水深火热中的神器。

二、Feign是怎么做的?

Feign给要请求的API定义成Service Interface

1
2
3
4
interface UserAPI {
@RequestLine("GET /user/{id}")
UserVO fetchDetail(@Param("id") String id);
}

在使用时,我们直接使用即可:

1
2
3
4
5
6
7
8
9
10
11
12
class SomeAPI {
private final UserAPI userAPI;

public SomeAPI(UserAPI userAPI) {
this.userAPI = userAPI;
}

@GetMapping("/{id}")
public UserVO xxx(@PathVarable("id") String id) {
return userAPI.fetchDetail(id);
}
}
Read more »

我记得最之前就已经搞过这个,但是没记录成日志,后来一直都没找到要点去这样做。

其实这个功能真的很实用,统一的API Response,对前端开发是非常友好的,也可以约束服务端的开发规范。

一、什么是统一的Response

我们一般都是基于Restful开发的API,一般情况下会占用HTTP STATUS来表示Response的状态。但是HTTP STATUS的表达能务非常有限(也就只有那几种状态),而且容易给开发造成误解(有时真的是容器出现了异常而不是应用出现了异常,导致误判)。

所以,一般对外的API,我们都不会使用HTTP STATUS来做API输出,而是会将状态下移,放进应答之内:

1
2
3
4
5
{
"code": 0,
"error": null,
"data": "some data"
}

一般我们会定义一个类来封装它:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
* API response
*
* @author kut
*/
@ApiModel
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Response {
// code
@ApiModelProperty(value = "code", example = "0")
private int code;

// error
@ApiModelProperty(value = "error", example = "some error")
private String error;

// data
@ApiModelProperty(value = "data")
private Object data;
}

这样,前端开发人员就很容易区分服务器异常和应用异常了。只要是HTTP STATUS不是200(*)的,直接认为是服务器异常,而应答中code不为0的,则认为是应用异常。

Read more »

MacOS升级Catalina后,发现安装第三方应用,特别是破解应用时,使用以下命令已经不能生效:

1
sudo spctl --master-disable

现在需要另外对应用进行授权操作方可使用:

1
sudo xattr -rds com.apple.quarantine /Applications/Navicat\ for\ MySQL.app

突然发现,系统升级到Catalina引发很多奇怪的问题,苹果这是怎么了?

最近遇到一个奇怪的问题,就是在传递Date类型的数据时,从前端到API端,是正确的,但是从API端通过FeignClient去访问Service RPC的时候,发现Date多了14小时。

在升级最新的SpringCloud之前是没有问题的,却在这个时候大感冒,让人很头痛。幸好,最终解决问题。

Read more »

其实以前是有写日志的习惯的,有段时间一天写几篇,不过那段时间心情很糟,纯属只是发泄内心的郁闷。

最近烦恼于一些过往处理过的问题重复出现,但是每次都没办法很快处理,因为一直都没有记录解决方案,所以处理这些问题每一次都是在尝新,搞得自己有些疲累。还有一个问题就是,现在的行业都要有技术博客才能找到好工作,虽然不敢苟同,但为了生存,我这个老技术人也只能从了这个俗。

好吧,从现在开始,写日志。