前言 {#前言}
官网直达: 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 ,然后重新设置权限即可。