最近进行了一次开发测试环境迁移 , 顺带连着之前的 Jenkins 也进行了迁移 , 因为对之前的搭建过程没有记录 , 导致这次的迁移过程中遇到了不少阻力 . 现记录主要流程于此 , 方便之后搭建 .

安装

首先我们需要安装 Jenkins , 需要装卸方便 , 因此我们选择用 Docker 或 docker-compose 直接安装

Docker

1
docker run --name devops-jenkins --user=root -p 8080:8080 -p 50000:50000 -v /mnt/data/jenkins/jenkins_home:/var/jenkins_home -d jenkins/jenkins:lts

docker-compose

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
version: '3'
services:
jenkins:
image: jenkins/jenkins:lts
container_name: jenkins
user: root
ports:
- "8080:8080"
volumes:
- /etc/localtime:/etc/localtime:ro
- $PWD/jenkins_home:/var/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock
- /usr/bin/docker:/usr/bin/docker
- /usr/lib64/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7
- /mnt/data/docker:/data/docker
environment:
- TZ=Asia/Shanghai

启动后初始化及安装推荐插件

可以通过容器日志查询初始密码

1
docker logs xxx(容器ID)

可能部分插件超时安装失败 , 我们需要去网站上下载 hpi 插件文件 , 手动上传安装

本文用到一些重要的插件列举如下:

  • Http Request http请求插件
  • Publish Over SSH 文件上传部署插件
  • Docker docker插件
  • Role-based Authorization Strategy 角色权限插件
  • Build-user-vars-plugin 构建角色变量插件
  • Beary Chat 协作工具通知插件(视实际情况进行替换)

系统配置

点击系统管理 -> Global Tool Configuration 找到 JDK 点击新增按钮进行安装 , 此处需要 Oracle 账号请自行注册

然后找到 Maven 点击新增按钮 , 此处我们使用 3.2.5 视具体情况进行替换 , 笔者是因为选择其他版本编译项目会报错 .

点击系统管理 -> 系统设置 配置 SSH (前端nginx服务器)

权限分配

选择系统管理 -> Configuration Global Security 启用安全: TCP port for JNLP agents ->禁用,访问控制-安全域->jenkins专有用户数据库 , 访问控制-授权策略->Role-Based Strategy 如:

img

选择系统管理 Manage and Assign Roles -> Manage Roles

此处针对项目配置权限 , 以项目名正则匹配 . 这里提供几个例子

^((?!other).)*$ 项目名中不带 other 的均符合

[\w\W]*frontend[\w\W] 项目名中间有 frontend 的均符合

[\w\W]* 任意项目名均符合

前端

场景说明

这里针对 前端 Vue 项目进行构建 . 前端开发人员会本地进行打包 , 得到一个 dist.zip 压缩包 , 此时需要上传到 nginx 服务器上 , 自动解压 . 当然有更好的做法 , 直接在服务器上拉取代码 , 编译 , 部署 , 此处我们只讲解打包后通过 Jenkins 上传的流程 .

1
2
3
4
5
6
# 视具体情况进行替换
cd /mnt/data/frontend/$MODULE
sudo rm -rf latest.zip
sudo rm -rf dist
unzip pack.zip
mv pack.zip latest.zip

后端

后端是使用 Java Spring Cloud 项目. 开发者在 Jenkins 指定对应环境、参数然后就会开始构建 , 过程大致为

选择参数构建 -> Jenkins 从 Git 上拉取代码 -> Maven构建 -> Docker构建镜像 -> 推送到私有镜像仓库 -> 通知 Rancher 集群更新服务 -> 通知协作工具 / 邮件通知

首先确定构建参数

Execute Shell

1
2
3
4
5
6
7
8
9
10
11
12
13
docker login --username=仓库USERNAME --password=仓库PASSWORD $DOCKER_REGISTRY
cp $WORKSPACE/$MODULE_NAME/target/*.jar $WORKSPACE/$MODULE_NAME/app.jar
cd $WORKSPACE/$MODULE_NAME
docker build -f Dockerfile-$ENV -t $DOCKER_REGISTRY/$DOCKER_NAMESPACE/$MODULE_NAME:latest .
docker build -f Dockerfile-$ENV -t $DOCKER_REGISTRY/$DOCKER_NAMESPACE/$MODULE_NAME:$DOCKER_TAG .
docker push $DOCKER_REGISTRY/$DOCKER_NAMESPACE/$MODULE_NAME:latest
docker push $DOCKER_REGISTRY/$DOCKER_NAMESPACE/$MODULE_NAME:$DOCKER_TAG

docker rmi $DOCKER_REGISTRY/$DOCKER_NAMESPACE/$MODULE_NAME:latest

if [ ${DOCKER_TAG} != "latest" ]; then
docker rmi $DOCKER_REGISTRY/$DOCKER_NAMESPACE/$MODULE_NAME:$DOCKER_TAG
fi

然后再通过构建后操作使用 Http Request 插件调用接口升级 Rancher 服务 , 具体参考 Rancher通过API升级服务 文章 .

在实际应用中发现 , 此方法升级会覆盖之前的服务主机调度 , 因此对于多机器集群 , 不大适用

参考链接

jenkins+docker持续集成