Jenkins自动化部署

前言

官网直达:Jenkins

Jenkins说:构建伟大,无所不能。众所周知Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建、部署、自动化, 满足任何项目的需要。

那么它的作用不就是用于自动化部署的吗?我想是的。

其中他的流程可以参考如下图

假如我们使用的是Github的话,可以使用action实现钩子程序(当然一般的企业项目不会放在github开源),假如不是那么则使用你自己的代码环境的钩子程序即可。

下载

首先你得下载Jenkins 的安装和设置

如果是Windows则直接下载war包其实就可以了,没必要下上面msi,如果你用docker也是可以的。

不过,你的git环境,maven之类的环境一定要配置好,如果嫌麻烦的话,笔者等空闲时间也是会去更新这个Java环境的一些基础配置的,从下载到可以使用的教程。

从入门到会用

初始化

我们下载下来之后,然后java -jar jenkins.war,然后在浏览器打开,输入生成的初始化密钥,这个密钥其实最开始启动就会在屏幕上显示(windows:c:\user\username\.jenkinssecrets/initialAdminPassword,linux:/root/.jenkins/secrets/initialAdminPassword

下依赖插件①

如果不需要换源就可以成功下载,那么我们则不需要下面的步骤,可以直接跳过到 开始使用


如果没有成功则试试:

首先你得先修改配置文件 ×2

.jenkins/updates/default.json

1
2
https://www.google.com -> https://www.baidu.com
https://updates.jenkins.io/download -> https://mirrors.tuna.tsinghua.edu.cn/jenkins

.jenkins/hudson.model.UpdateCenter.xml

1
2
3
4
5
6
7
<?xml version='1.1' encoding='UTF-8'?>
<sites>
<site>
<id>default</id>
<url>https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json</url>
</site>
</sites>

然后重启。

笔者亲测,先启动然后再关掉后修改

如果还不行,那试试自己下插件导入吧

捷径②

链接:https://pan.baidu.com/s/1fAldQYwd4F2nMeWSStP5Aw
提取码:wy0z

过期评论叫博主续期

下载之后,将插件拖入到.jenkins的插件文件夹,然后运行就可以自动导入了(不是 这是保姆级别教学吗)。

开始使用

在安装之后,我们需要在Manage Jenkins中选择例如系统配置或者全局配置,当然你也可以在这个里面查看/管理你自己下载的插件。

在开始之前的基础前置配置项

Configure System (系统设置)

在这里我们需要配置远程服务器的,也就是推送到的机器,这里我们可以查看到一个为 Publish over SSH,那么我们需要配置其服务器地址以及多路密码。

我们可以参考如下图:

解析如下:

Passphrase:服务器的密码配置

Name:设置你的服务器名字,便于自己查看选择(例如:Calyee的阿里云服务器)

Hostname:服务器的IP地址

Username:登录时候的用户名(例如:root)

Remote Directory:上传代码的根路径地址(例如:/usr/local/app

Global Tool Configuration (全局工具配置 )

这个你可以配置你当前跳板机的一些打包环境(注意是打包环境),因为我们打包是在部署了Jenkins的跳板机上面进行打包操作的,假如我们有需要打包前端环境,那么Npm环境当然得配的,Java则JDK环境,Maven环境等等。

所以你需要在当前设置下配置你的环境,有点像在Windows中的各种的环境变量。在此就不列图了,自行配置即可。


这下面是Jenkins的流程配置

源码配置(示例一)

我们选择我们源码的地址拉取方式Git,然后配置git存储库URL,以及配置拉取账号的凭证(账号拥有拉取代码的权限),配置拉取分支(默认不填写:master),源码库浏览器可以选择自动(如果上面的都配置完毕)

Post Steps

1
2
# 样例演示为SpringBoot项目,使用Maven打包
mvn clean install

构建后操作

Send build artifacts over SSH #SSH Publishers #SSH Server

选择SSH连接的机器(如果基础配置有设置的话,此项应该会使用之前配置的,如果没用则需要去配置)

假如我们打包的文件在 chat-server/target/chat-server.jar,这个很好理解,如果是SpringBoot项目,chat-server就是一个模块,然后找到打包好的jar包即可

此时:

1
2
3
Source files:     chat-server/target/chat-server.jar
Remove prefix: chat-server/target/
Remote directory: calyee_chat # 远程文件夹,不填也可以
1
2
3
Exec command:     cd /usr/local/app       # 假如我们的项目在这个目录下
./stop.sh # 停止我们之前运行的服务脚本
./start.sh # 开始运行我们刚刚传输的服务脚本

stop.sh

1
2
3
4
5
6
7
echo "Stop Procedure : chat-server.jar"
pid=`ps -ef |grep java|grep chat-server.jar|awk '{print $2}'`
echo 'old Procedure pid:'$pid
if [ -n "$pid" ]
then
kill -9 $pid
fi

如果是在linux里面则是上面那个形式拿到pid

如果容器是跑在docker里面则可以通过下面的命令获取pid

1
2
3
4
# 建议使用这个
docker inspect -f '{{.State.Pid}}' <container>
# 或者,这个形式得格式化获取pid
docker container top <container>

如果是使用了第一个,那么命令可以修改为(calyeechat:为jar包在docker镜像中的容器名,{print $1}代表拿第几个参数)

1
2
3
4
5
6
7
echo "Stop Procedure : calyeechat"
pid=`docker inspect -f '{{.State.Pid}}' calyeechat |awk '{print $1}'`
echo 'old Procedure pid:'$pid
if [ -n "$pid" ]
then
kill -9 $pid
fi

我们知道{print $1}表示拿第几个参数,那么第二个也可以这样写

1
2
3
4
5
6
7
echo "Stop Procedure : calyeechat"
pid=`docker container top calyeechat |awk '{print $2}'`
echo 'old Procedure pid:'$pid
if [ -n "$pid" ]
then
kill -9 $pid
fi

start.sh

1
2
3
4
5
6
7
8
export JAVA_HOME=/usr/java/jdk1.8.0_402
echo ${JAVA_HOME}
echo 'Start the program : chat-server.jar'
chmod 777 /usr/local/app/chat-server.jar
echo '-------Starting-------'
cd /usr/local/app
nohup ${JAVA_HOME}/bin/java -jar chat-server.jar &
echo 'start success'

第一行:设置设置java home,如果是全局安装,那么不需要设置也可以

第六行:这个就是我们前面在Jenkins中设置的传输路径

那么在Docker也是同理,不过我们在传输后,需要在目录下创建一个Dockerfile文件

具体Dockerfle操作可以参考Dockerfile构建项目

那么只不过中间多了一步打包的环节(打包前需要删除之前的容器:具体操作参考Docker基础命令

然后在docker里面跑起来即可,命令的修改可以参考上面拿pid的操作

配置(示例二)

假如我们需要打包一个Vue的前端项目(这不就是前后端分离项目的Jenkins自动化部署吗?)。

对于这个的话,我们可以创建一个自由风格的项目,然后众所周知Vue脚手架的项目打包,如果依赖已经装了,那么就可以不用装了。这个必须得先在Jenkins插件中装上Node的插件(名字叫: NodeJS Plugin)。

所以这里有一个参数可以选择

This project is parameterised

我们选择一个布尔类型的参数即可,我们只需要一个开关控制。

命名随意,在此笔者命名为 need_install

然后后面还是一样的配置源码地址

Provide Node & npm bin/ folder to PATH

配置完之后,我们还需要在打包环境中配置一个nodejs,这个只需要选择全局的node即可,我们在安装好node后(Jenkins机器),也需要配置node的home路径

Build Steps

笔者在此给一个示例(Execute Shell)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if [ "${need_install}" == "true" ]; then
echo "安装依赖"
npm config set registry https://registry.npmmirror.com
npm config get registry
npm i
else
echo "直接构建"
fi

npm run build
# 假如我们的vue项目打包在这个目录下
cd calyeeRes
# 打包压缩当前文件夹
zip -r ../dist.zip *
cd ../

Post-build Actions

服务器配置+移动文件

前面知道我们压缩的文件名为dist.zip

那么

1
2
3
4
5
6
Source files:     dist.zip
Remove prefix: # 当前场景不需要
Remote directory: calyee_web/
Exec command Exec:mv ~/calyee_web/dist.zip /home/calyee/web/dist.zip
cd /home/calyee/web
./update.sh # 解压 移动的脚本

都到这儿了,你应该会用了吧

Jenkins角色权限

权限管理笔者是用的Role-based Authorization Strategy

对于权限 我们首先要知道Jenkins里面有三类

  • Global Roles: 全局角色
  • Item Roles: 项目角色
  • Agent roles: 代理角色

在安装好插件后,重启一下,然后在System Configuration中就可以找到Manage and Assign Roles

不过我们需要先设置

Security

Security的话 也是在System Configuration中(笔者版本2.464 JDK17),可能不同版本会有所差异,只要你寻找到授权策略也是一样的。

Security Realm 选择 Jenkins' own userdatabase

Authorization选择 Role-Based Strategy

Manage and Assign Roles

然后选择此项,里面就可以配置角色的权限了,笔者推荐,未认证(Anonymous)的用户,不给任何权限。这样没有认证就什么都看不到,如果有这个需求可以适当放宽。任何认证的用户(Authenticated Users)可以给一些可读的权限(即只能看,不过Job项那,不推荐给可读),其次就是,对于项目的管理,这个根据自己项目的规模以及具体的需求自定义(比如:我们开发的话,直接全拉满也行,如果自己就是运维。如果分工明确的话,具体权限具体给即可)

在此有一项需要注意:就是Pattern,此项可以配置角色的访问项目例如:

当前有三个项目:

  • calyee_blog_web
  • calyee_blog_api
  • calyee_chat

那么假如我只需要看到calyee_blog的项目,而calyee_chat没有权限,那么则可这样设置calyee_blog_.*

注意:是 .* 不是 * 。

可能会遇到的问题

管理员权限被取消

当在切换权限的时候,把管理员权限给去掉了,我们可以找到jenkins的目录 %Jenkins_Home%.jenkins/config.xml

1
2
3
<useSecurity>true</useSecurity>
修改为
<useSecurity>false</useSecurity>

重启,然后就可以进入了,此时我们还需要重复步骤 Security,然后重新设置权限即可。