51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

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 {#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 {#This-project-is-parameterised}

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

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

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

Provide Node & npm bin/ folder to PATH {#Provide-Node-npm-bin-folder-to-PATH}

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

Build Steps {#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 {#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角色权限 {#Jenkins角色权限}

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

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

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

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

不过我们需要先设置

Security {#Security}

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

Security Realm 选择 Jenkins' own userdatabase

Authorization选择 Role-Based Strategy

Manage and Assign Roles {#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 ,然后重新设置权限即可。

赞(0)
未经允许不得转载:工具盒子 » Jenkins自动化部署