Zzx Blog

Since 2017


  • 首页

  • 标签

  • 分类

  • 归档

  • 公益404

  • 搜索

jenkins持续交付实际应用

发表于 2021-06-11 | 分类于 DevOps , Jenkins

jenkins持续交付实际应用

应用发布指定版本号,指定版本发布,回滚

因为团队规模小的原因,代码发布等没有严格的版本规划,使用Jenkins都是用持续集成的那一套,gitlab上的代码分支也只有master一个分支,测试跟正式环境使用的都是master分支,这样不严格的方式有很多缺点,代码管理不严谨,版本规划混乱。在代码部署上还有一个致命缺点,不是很好回滚,线上出了问题话总不能根据commit来回滚吧,而且很多commit信息写的也不是很详细,都不确定要回滚到哪一个版本,所以这种方式不是很可取,特别是当多人开发的时候,问题就越来越明显。
目前使用的解决方案是新加入一个release分支(gitlab上对该分支添加保护模式,只限管理员能push),发布版本时对此分支添加tag,例如v1.0、v1.1的版本号,发布版本时可以根据tag版本号,发布指定版本,或者回滚版本。
步骤如下:

image27ecfe870fe31e16.png

阅读全文 »

一款免费ssl证书生成工具

发表于 2021-06-07 | 分类于 Tools , acme

安装

仓库地址

  • 一键安装脚本

    1
    curl  https://get.acme.sh | sh
  • 设置alias

    1
    alias acme.sh=~/.acme.sh/acme.sh

生成证书方式

  • 推荐dns方式(可以一次生成多个证书)
    1
    2
    3
    4
    export DP_Id="yourid"
    export DP_Key="cc23352a5b4b89729f5141cfe80babdb"

    acme.sh --issue --dns dns_dp -d v2.940303.xyz

部署至nginx

1
2
3
4
5

acme.sh --install-cert -d v2.940303.xyz \
--key-file /etc/nginx/cert/v2.940303.xyz.key \
--fullchain-file /etc/nginx/cert/fullchain.cer \
--reloadcmd "service nginx force-reload"
  • Standalone tls alpn mode

    1
    2
    # 443端口需要暂时关闭
    ./acme.sh --issue -d zhuangzexin.top --alpn --tlsport 443
  • Webroot mode

  • Standalone mode

记录加入对象拷贝功能及遇到的问题

发表于 2021-01-27 | 分类于 Java , Spring

记录加入对象拷贝功能及遇到的问题

Java工程我们常用的POJO类型一般分为 po, dto, vo, query。po代表实体类,dto代表提交对象,vo代表返回对象,query代表查询对象。
当我们使用mybatis-plus,或者tk mybatis时,简单的curd就交给BaseMapper处理,但BaseMapper的参数对象一般都是po对象。那么问题就来了,每当
比如提交时,需要从dto中一一set给po对象,虽然可以用lombok的@builder注解来链式的set,但还是比较麻烦。这个时候就需要用到spring的一个神器:
BeanUtils。可以用一行代码完美解决以上的问题,复制dto与po中相同的属性到po中,大大减少工作量。

  • 安装
    1
    2
    3
    4
    5
    6
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>5.1.9.RELEASE</version>
    </dependency>

注意到以上的版本,这边有个需要注意的,但很容易忽略的问题:包版本的问题。我使用的spring-boot-starter 2.1.8.RELEASE版本,它的spring-core是
5.1.9.RELEASE版本,而当时我搜索spring-beans版本时直接安装的最新版本5.3.3。这就导致我运行的时候出现了以下异常:

阅读全文 »

个人服务器同步备份之路

发表于 2020-12-30 | 分类于 Note

搭建个人服务器的初衷是为了实现NAS的同时,还能部署自己的私有代码仓库,以及部署一些个人的测试环境等等。所以一开始选择机器方面就排除了市面上成熟的NAS产品,而选择了组装一台pc安装linux系统,然后使用各种docker镜像来完成NAS功能的同时,还能满足我的其他需求。

最终选择的机器配置大概是:

  • 华硕H110T(该主板有两个千兆网口,以后淘汰了还可以刷软路由,这也是当时选这款主办的重要原因之一)
  • cpu:G4560T (其实H110T是可以通过刷bios上8代cpu的,但我不需要很高的性能,因为要7*24小时待机,所以功耗是关键,G4560T tdp为35w,核显为HD630, 4k播放性能也尚可)
  • 内存:8g*2
  • 硬盘:系统盘:先锋 256g,m.2 2242。仓库盘 1T机械。
阅读全文 »

记录一次docker容器时区修改遇到的问题

发表于 2020-07-23 | 分类于 Docker , Usage

记录一次docker 容器时区与宿主机不同的修改

  • 在构建一个java应用程序的镜像时发现,配置了time zone环境变量,进入容器后时区依然未改变。构建程序的基础镜像是anapsix/alpine-java
    Dockerfile:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    FROM anapsix/alpine-java

    MAINTAINER banksy zhuang1994@foxmail.com

    ENV TZ=Asia/Shanghai

    RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

    WORKDIR /code-generator

    EXPOSE 9090

    ADD ./target/generator.jar ./

    CMD java -Djava.security.egd=file:/dev/./urandom -jar generator.jar
阅读全文 »

elk docker环境安装

发表于 2020-07-09 | 分类于 Docker , elk

elk docker环境安装

elk即Elasticsearch 、 logstash、Kibana

准备
  • 用的是 deviantony的开源配置

    1
    git  clone https://github.com/deviantony/docker-elk.git
  • 目录结构为

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    ├── docker-compose.yml
    ├── docker-stack.yml
    ├── elasticsearch
    │ ├── config
    │ │ └── elasticsearch.yml
    │ └── Dockerfile
    ├── extensions
    │ ├── apm-server
    │ ├── app-search
    │ ├── curator
    │ ├── logspout
    ├── kibana
    │ ├── config
    │ │ └── kibana.yml
    │ └── Dockerfile
    ├── LICENSE
    ├── logstash
    │ ├── config
    │ │ └── logstash.yml
    │ ├── Dockerfile
    │ └── pipeline
    │ └── logstash.conf
    └── README.md
  • 创建elasticsearch 数据存储路径 ()

    阅读全文 »

SpringBoot 使用线程池批量插入数据

发表于 2020-07-09 | 分类于 Java , Thread

SpringBoot 使用线程池批量插入数据

  • 服务主体逻辑
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
// 初始化线程
ExecutorService executorService= Executors.newFixedThreadPool(16);

List<DutyRecordThread> list= Lists.newLinkedList();

for (Date groupDate : groupDateList) {
List<DutyRecord> dutyRecordList = new ArrayList<>();
teacherIds.forEach(teacherId -> {
DutyRecord dutyRecord = DutyRecord.builder()
.id(UUID.randomUUID().toString().replace("-", ""))
.schoolId(dutyGroup.getSchoolId())
.dutyId(duty.getId())
.dutyName(duty.getName())
.dutyRemark(duty.getRemark())
.dutyGroupId(dutyGroup.getId())
.dutyGroupName(dutyGroup.getName())
.dutyGroupRemark(dutyGroup.getRemark())
.teacherId(teacherId)
.day(groupDate)
.startTime(duty.getStartTime())
.endTime(duty.getEndTime())
.createBy(dutyGroupDTO.getCreateBy())
.build();
dutyRecordList.add(dutyRecord);
});
list.add(new DutyRecordThread(dutyRecordList));
}

// 执行
try{
executorService.invokeAll(list);
} catch (Exception e) {
throw new ApiException(e.getMessage(), 500);

}
  • 线程类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class DutyRecordThread implements Callable<Boolean> {
    private List<DutyRecord> data;

    public DutyRecordThread(List<DutyRecord> data) {
    this.data = data;
    }

    @Override
    public Boolean call() {
    System.out.println("线程" + Thread.currentThread().getName() + "正在执行-----------------------");
    insertBatchData(data);
    return true;
    }
    }
  • 执行的插入逻辑

    1
    2
    3
    4
    5
    6
    7
    8
    9
    //TODO:批量插入数据
    @Async
    @Override
    public int insertBatchData(List<DutyRecord> dutyRecordList) {
    //这是一个批量插入的方法

    return dutyRecordDao.insertBatch(dutyRecordList);

    }

记录一次springboot 循环调用问题

发表于 2020-07-09 | 分类于 Java , SpringBoot

记录一次springboot 循环调用问题

image.png

  • 在生产环境中运行日志遇到上述问题,securityConfig 为spring security配置文件,该配置文件调用userDetailsServiceImpl 中的查询用户接口,userDetailsServiceImpl 调用了userService接口(此处应该是实现该接口,因为历史原因导致该处不规范),userService又 注入了securityConfig 的bCryptPasswordEncoder bean。因此形成了循环依赖。

解决方案

  • 参考自stackoverflow

imageb25bb41a2e38710f.png

  • userDetailsServiceImpl实现userService 接口,userDetailsServiceImpl注入到securityConfig,并且加入@lazy注解(如果不加会出现因为securityConfig先启动而userDetailsServiceImpl并没有在Spring容器中的问题)

Jenkins自动化部署docker镜像全过程

发表于 2020-03-27 | 分类于 Docker , Jenkins
系统及软件版本:
  • ubuntu 18 LTS
  • jenkins 2.176
  • docker 18.09.7
jenkins 配置及插件
  • Docker plugin

  • Docker build step

    因为墙的原因,jenkins下载插件很慢需要更换国内站点,这里用的清华的jenkins站点。但在插件管理-高级中修改升级站点并不会生效,需要到jenkins配置文件中修改,解决方案如下:

    1
    2
    3
    4
    5
    # 修改 /var/lib/jenkins/update/default.json 执行

    :s/http:\/\/updates.jenkins-ci.org\/download\/plugins/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins\/plugins/g

    # 重启即可
阅读全文 »

Vue视屏直播技术(基于Video.js)

发表于 2020-02-20 | 分类于 Javascript , Vue
Vue 2.0 基于video.js 和 vue-video-player插件播放直播

vue-video-player是基于video.js基础上封装的vue插件(官方文档不全很乱,但是能基本使用),以下介绍播放rtmp协议的视屏资源各种直播协议介绍

  • 开始使用,安装

Github地址

npm地址

1
npm install vue-video-player --save

在项目中有三种使用方式(mount with global,mount with component,mount with ssr),根据自己的实际情况装载,我使用的是mount with component。

1
2
3
4
5
6
7
8
9
import 'video.js/dist/video-js.css'
import {videoPlayer} from 'vue-video-player'
import 'videojs-flash' // 本文使用的是rtmp直播源,应用到的是flash技术,所以需要引入此插件

export default {
components: {
videoPlayer
}
}
阅读全文 »
1234…7
Banksy Zhuang

Banksy Zhuang

66 日志
36 分类
40 标签
Github E-Mail
© 2017 — 2024 Banksy Zhuang
本站已运行