第3天-Jenkins详解-3
四、使用Jenkins
1、Jenkins 用户权限管理
1、 用户管理背景
针对开发、运维、测试针对不同角色进行不同权限划分,
基于插件: Role-based Authorization Strategy ,Authorize Project 来实现。
2、 安装用户管理插件
安装该插件:
系统管理->管理插件-可选插件->搜索该插件选中直接安装即可。
3、 开启该插件功能
系统管理->全局安全设置-授权策略->选中该插件功能即可->保存
4、 验证用户管理
关闭用户管理功能来进行实践测试
1、策略改回原来的(全局安全配置)
2、开启允许用户注册(全局安全配置)
3、注册一个新用户
4、登录之后,其默认就是管理员用户,可以进行任何操作
5、开启 Role-Based Strategy
6、重新登录新创建 test1 用户,显示已经没有任何权限了
5、 权限划分
安装 Role-Based Strategy 插件后,系统管理 中多了如图下所示的一个功能,用户权限的划分就是靠他来做的。
1、Manage Roles(管理角色)
- Manage Roles:管理角色,相当于针对角色赋予不同权限,然后在将该角色分配给用户。角色就相当于一个组。其里面又有Global roles(全局)、Project roles(项目)、Slave roles(),来进行不同划分。
默认如图下所示:
1、Global roles
默认是有一个admin用户的,是所有权限都有的,所有权限都是勾选了的。
接下来我们来添加一个角色:user
给其一个读的权限。
2、Project roles
-
roles to add:表示项目角色
-
Pattern:是用来做正则匹配的(匹配的内容是Job(项目名)),比如说根据正则匹配到的项目项目角色就都有权限;
接下来新建一个 ItemA 项目角色,改项目角色一般给其构建、取消、读取、读取空间权限,一般配置这4个即可
还可以在新建一个 ItemB 项目角色:
-
Slave roles(奴隶角色):节点相关的权限
-
roles to add:表示项目角色
-
Pattern:是用来做正则匹配的(匹配的内容是节点(slavej节点)),比如说根据正则匹配到的项目项目角色就都有权限;
2、Assigin roles(分配角色)
1、给予test1用户分配 user 角色
这样其就有 manage roles 中刚才创建的user角色的权限了。
此时再去看 test1用户,已有查看的权限了
2、针对指定用户分配项目角色(一般最常用的就是针对不同用户进行项目角色分配)
比如将test1用户分配有 ItemA 项目角色,这样其就可以有刚才我们创建的 ItemA 项目角色正则匹配到的项目的权限了。
test2 也为其分配一个 ItemB 项目角色
此时可以在 test1 用户这里看到 ItemA 项目角色所匹配到的项目 A-web1
新建一个B-web1项目,同理 test2 用户这里看到I temB 项目角色所匹配到的项目B-web1
为了方便项目管理,可以对不同项目进行分类(借助视图):
分类完如图下所示:
2、Jenkins 参数化构建
1、 参数化构建背景
如果只是简单的构建,jenkins自己默认的插件可以做,但是如果我们想要在构建过程中有更多功能,比如说:选择性构建、传参、项目指定变量等等其他功能,基础的参数化构建可以实现一些简单功能,但是要想使用更多功能这时候我们就需要借助参数化构建来实现交互的功能。此处我们来借助以下插件来进行实现:
-
Extended Choice Parameter(更丰富的参数化构建插件)
-
Git Parameter
2、安装插件
首先还是安装该插件,去管理插件里面进行安装 Extended Choice Parameter
1、项目配置
2、选择安装过的插件
3、进行配置
这里这个branch 我们就相当于给其当做一个变量,然后来为其进行传参。
4、构建选择执行shell进行测试
5、参数化配置已经生效
6、构建 test02
可以发现控制台的输出也是成功了的
7、数据来源选择文件
在jenkins所在服务器进行如下操作:
[root@qfedu.com ~]# vim /opt/jenkins.property # 建立一个文件
abc=t1,t2,t3,t4
web 端配置:
进行测试:
构建前:(可以发现也是生效的)
构建后查看结果:(也是成功的)
3、Git 插件
再用 git 时使用该插件是非常方便的。
1、安装插件 Git Parameter
2、进行配置
在配置之前我们先来说一个坑,当我们在配置git中写了远端地址后,会有如下报错:
这是因为 jenkins 我们 yum 装的运行用户是 jenkins 用户,此处是 jenkins 用户去 git 仓库进行拉取,而 jenkins 用户的话默认是 /bin/false 的,不但不能登录,也没有 git 命令权限,所以肯定是失败的。
解决此问题两种办法:
-
更改jenkins用户为root用户;
-
更改jenkins用户为正常的普通用户/bin/bash,将其的公钥加入到git服务器的git用户中。
此处暂时先用第一种解决办法,更改 jenkins 的运行用户为 root 用户,通过如下方式进行更改:
- 将/etc/sysconfig/jenkins文件由
3、进行相关配置
4、配置 git 仓库
凭据这里有两种方式:
第一种:选择无
- 其实就是基于免秘钥的。
第二种:用户(其实就是git用户)
当构建时给一个选择列表,这个变量是代表分支。有哪些分支传递给这个变量。
5、进行构建
1、列表中已经有了可选的分支
2、构建成功
3、新建分支增添内容再来验证插件
[root@qfedu.com app]# git branch
* master
[root@qfedu.com app]# git branch test
[root@qfedu.com app]# git checkout test
Switched to branch 'test'
[root@qfedu.com app]# git branchmaster
* test
[root@qfedu.com app]# touch a
[root@qfedu.com app]# git add .
[root@qfedu.com app]# git commit -m "a"
[test c286460] a1 file changed, 0 insertions(+), 0 deletions(-)create mode 100644 a
[root@qfedu.com app]# git push origin test
Counting objects: 3, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 231 bytes | 0 bytes/s, done.
Total 2 (delta 0), reused 0 (delta 0)
To git@172.16.1.3:/home/git/repos/app.git* [new branch] test -> test
4、jenkins 构建查看
可以发现已经有了我们新建的分支。
构建成功!!
3、Jenkins Master-Slave 架构
-
jenkins的Master-slave分布式架构主要是为了解决jenkins单点构建任务多、负载较高、性能不足的场景。
-
Master/Slave相当于Server和agent的概念。Master提供web接口让用户来管理job和slave,job可以运行在master本机或者被分配到slave上运行构建。一个master(jenkins服务所在机器)可以关联多个slave用来为不同的job或相同的job的不同配置来服务。
1、安装
前提:slave 所在服务器必须有 java环境
jenkins web 端进行操作:
系统管理->管理节点->新建节点
1、进行基础配置
配置选项中的内容是可变的,根据情况来
注意这里需要配置凭据,也就是配置slave所在服务器用户和密码
之后保存,如果无误的话就会直接启动了,如图下所示是有问题的
通过看输出日志,发现是 jdk 的问题,一般来说,其会判断 slave 所在服务器有没有 jdk,如果有就会进行检测,如下图所示,就是没有检查到(因为jdk是我们自己装的,路径并不是默认的路径)。
没有检查到的话其就会去oracle官网下载,来为 slave 所在服务器进行安装,但是因为中国的原因,被墙了,所以也会下载失败,最终就导致彻底失败了,失败如图下:
有两种方法解决:推荐方法1:
方法1:
在配置时高级的选项里指定java路径:如下图所示:
方法2:
为 java 路径做一个软链接,保证 jenkins 可以检测到 java。
[root@qfedu.com ~]# ln -s /usr/local/jdk1.8/bin/java /usr/bin/java
[root@qfedu.com ~]# ll /usr/bin/java
lrwxrwxrwx 1 root root 26 Jul 25 17:33 /usr/bin/java -> /usr/local/jdk1.8/bin/java
之后在看已经成功了!
并且也可以在 slave 所在服务器看到:
jar 包就是负责接收 master 任务的。
2、配置
在项目 job 中进行配置:
可通过标签或者名称进行匹配(标签可在安装时配置)
3、构建
可以发现控制台的日志,其也是 slave 构建的
之后查看构建完的工作目录,也有预想中的文件。
这样基本上就实现了借助 jenkins 的 slave 去构建 job了。
目前是在 slave 构建也在 slave 上部署,之后我们可以通过脚本,比如借助 rsync、ansible 等部署在其他服务器上。
4、扩展
可以为slave服务器在配置时候加上标签,这样也会方便我们选择,用法也不单单局限在一台服务器上,可以让多台 slave 去竞选。
4、Jenkins pipeline
1、概览
2、安装
在对 jenkins 进行初始化安装时,默认已经安装了 jenkins 的相关插件,如下图所示:
3、实操
1、新建任务
2、编写 pipeline 脚本
可以借助流水线语法去做。
test 流水线脚本:
node {def mvnHomestage('git checkout') { #for display purposescheckout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[url: 'git@172.16.1.3:/home/git/repos/app.git']]])}stage('maven Build') {echo "maven build........."}stage('deploy') {echo "deploy..........."}stage('test') {echo "test..........."}
}
3、构建测试
可以去服务器上验证一下(git checkout)刚才拉取下来的代码:
补充:
-
可以从代码版本管理仓库中读取 pipeline 脚本(相当于将 pipeline 脚本放在仓库中)我们可以选择git。
-
首先需要将 pipeline 脚本提交到我们新建的 git仓库中(步骤再此忽略。)
jenkins 项目中需要进行如下配置:
其中脚本路径的配置,一定要和版本仓库中的路径相一致。
之后如果要更改步骤,不需要再更改 jenkins 的步骤,直接更改文件即可。
补充:
此外之前的测试一直是在 master上构建的,我们还可以通过在 jenkinsfile 中指定节点在相应节点去构建
具体在 jenkinsfile 的 node 后进行指定:
如下图所示:
格式为:node (“节点名称”)
具体配置详解请参考 https://jenkins.io/doc/book/pipeline/
5、Jenkins 构建邮件状态通知
1、 前提
前提:服务器开启邮箱服务
2、 基础配置
需要安装一个插件:
插件: Email Extension Plugin
进行配置:
系统管理->系统设置->相关配置如下图:
可以在此处进行测试发送!检验配置是否正确
3、 配置到项目中
在项目的配置中选择构建后操作
选择我们对应的插件
填写发件人信息
配置构建成功发送邮件
控制台也有邮件发送成功输出
检查实际是否接收到邮件
6、Jenkins 流水线自动化发布PHP项目
1、前提
环境为:lnmp
PHP项目:wordpress(此处我们下载一个wordpress的源码。将其模拟为我们的代码上传到我们的git仓库)
[root@qfedu.com ~]# git config --global user.name "Administrator"
[root@qfedu.com ~]# git config --global user.email '18611142071@163.com'
[root@qfedu.com ~]# git status
[root@qfedu.com ~]# git clone git@192.168.152.138:plat-sp/wordpress.git
[root@qfedu.com ~]# tar xf wordpress-5.2.1.tar.gz
[root@qfedu.com ~]# cd wordpress
[root@qfedu.com ~]# mv /root/wordpress/* .
[root@qfedu.com ~]# git add .
[root@qfedu.com ~]# git commit -m 'new1'
[root@qfedu.com ~]# git push -u origin master
部署节点: node 节点需要在系统管理中配置节点
2、配置
1、创建job
2、参数化构建
3、配置pipeline脚本 (直接配置或者git获取)
4、保存
3、编写 jenkinsfile
接下里编写jenkinsfile文件:
jenkinsfile-PHP:
源码文件:
node ("jenkins-slave2") {stage('git checkout') {checkout([$class: 'GitSCM', branches: [[name: '${branch}']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[url: 'git@192.168.152.138:plat-sp/wordpress.git']]])}stage('code copy') {sh '''rm -rf ${WORKSPACE}/.gitmkdir -p /data/backup/web-$(date +"%F")mv /home/wwwroot/default/* /data/backup/web-$(date +"%F")cp -rf ${WORKSPACE}/* /home/wwwroot/default/'''}stage('test') {sh "curl http://192.168.152.153/status.html"}
}node ("slave01-172.16.1.2") {stage('git checkout') {checkout([$class: 'GitSCM', branches: [[name: '${branch}']], doGenerateSubmoduleConfigurations: false, extensions: [], subm
oduleCfg: [], userRemoteConfigs: [[url: 'git@172.16.1.3:/home/git/repos/wordpress']]])}stage('code copy') {sh '''rm -rf ${WORKSPACE}/.gitmv /usr/share/nginx/html/wp.com /data/backup/wp.com-$(date +"%F_%T")cp -rf ${WORKSPACE} /usr/share/nginx/html/wp.com'''}stage('test') {sh "curl http://wp.test.com/status.html"}
}
下面为带解释版,但不可以使用,部分注释会造成问题
node ("slave01-172.16.1.2") { # 绑定到该节点去执行stage('git checkout') { # 拉代码checkout([$class: 'GitSCM', branches: [[name: '${branch}']], doGenerateSubmoduleConfigurations: false, extensions: [], su
bmoduleCfg: [], userRemoteConfigs: [[url: 'git@172.16.1.3:/home/git/repos/wordpress']]])}# $class: 'GitSCM' git插件获取代码的工具# branches 分支名称# doGenerateSubmoduleConfigurations 是否包含子模块配置# extensions 扩展功能# submoduleCfg 子模块配置# userRemoteConfigs 远程用户配置(仓库地址)stage('code copy') { # 复制代码sh '''rm -rf ${WORKSPACE}/.git # 删除拉下来的项目的.git敏感文件mv /usr/share/nginx/html/wp.com /data/backup/wp.com-$(date +"%F_%T") # 备份旧文件cp -rf ${WORKSPACE} /usr/share/nginx/html/wp.com''' # 新文件复制到站点目录}stage('test') { # 测试sh "curl http://wp.test.com/status.html"}
}
4、构建
构建概览:
控制台输出详情:
可以看到每一步的执行详情,最后也是成功的!!!!!!
此外我们可以查看服务器及网页实际体验效果进行验证。
7、Jenkins流水线自动化发布Java项目
1、前提
插件:Maven Integration plugin
**环境:**maven、tomcat,git
用的博客系统代码:
git clone https://github.com/b3log/solo.git
远端git服务器:
[root@qfedu.com ~]# mkdir -p solo
[root@qfedu.com ~]# cd solo/
[root@qfedu.com ~]# git --bare init
Initialized empty Git repository in /home/git/repos/solo/
本地web:
[root@qfedu.com ~]# git remote -v
origin git@172.16.1.3:/home/git/repos/solo (fetch)
origin git@172.16.1.3:/home/git/repos/solo (push)
[root@qfedu.com ~]# git remote rm origin
[root@qfedu.com ~]# git init
Reinitialized existing Git repository in /root/solo/.git/
[root@qfedu.com ~]# git remote add origin git@172.16.1.3:/home/git/repos/solo
[root@qfedu.com ~]# git add .
[root@qfedu.com ~]# git commit -m "java solo all"
# On branch master
nothing to commit, working directory clean
[root@qfedu.com ~]# git push origin master
Counting objects: 29058, done.
Compressing objects: 100% (9854/9854), done.
Writing objects: 100% (29058/29058), 47.77 MiB | 39.28 MiB/s, done.
Total 29058 (delta 15768), reused 29058 (delta 15768)
To git@172.16.1.3:/home/git/repos/solo* [new branch] master -> master
因为solo需要改如下配置才可以访问:(改serverhost为指定的域名)
[root@qfedu.com ~]# vim /root/solo/src/main/resources/latke.properties
然后再重新提交上去
部署节点: node 节点需要在系统管理中配置节点
2、配置
1、新建job
2、参数化构建
3、配置git仓库(针对jenkinsfile)
3、编写Jenkinsfile
源码配置文件:
node ("slave02-172.16.1.3") {# def mvnHome = '/usr/local/maven'stage('git checkout') {checkout([$class: 'GitSCM', branches: [[name: '${branch}']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[url: 'git@172.16.1.3:/home/git/repos/solo']]])}stage('maven build') {sh '''export JAVA_HOME=/usr/local/java/usr/local/maven/bin/mvn clean package -Dmaven.test.skip=true'''}stage('deploy') {sh '''JENKINS_NODE_COOKIE=dontkillmeexport JAVA_HOME=/usr/local/javaTOMCAT_NAME=tomcatTOMCAT_HOME=/usr/local/$TOMCAT_NAMEWWWROOT=$TOMCAT_HOME/webapps/ROOTif [ -d $WWWROOT ]; thenmv $WWWROOT /data/backup/${TOMCAT_NAME}-$(date +"%F_%T")fiunzip ${WORKSPACE}/target/*.war -d $WWWROOTPID=$(ps -ef |grep $TOMCAT_NAME |egrep -v "grep|$$" |awk \'{print $2}\')[ -n "$PID" ] && kill -9 $PID/bin/bash $TOMCAT_HOME/bin/startup.sh'''}stage('test') {sh "curl http://192.168.152.138:8080/status.html"echo "test ok!!!!!!!"}
}
下面为带解释版,但不可以使用,部分注释会造成问题
node ("slave02-172.16.1.3") { # 绑定到该节点构建# def mvnHome = '/usr/local/maven'stage('git checkout') { # 拉代码checkout([$class: 'GitSCM', branches: [[name: '${branch}']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[url: 'git@172.16.1.3:/home/git/repos/solo']]])}stage('maven build') { # maven buildsh '''export JAVA_HOME=/usr/local/java # 在指定java环境变量/usr/local/maven/bin/mvn clean package -Dmaven.test.skip=true''' # 构建maven包 clean package表示构建之前会清理之前构建的包,-Dmaven.test.skip=true表示跳过单元测试}stage('deploy') { # 部署sh '''JENKINS_NODE_COOKIE=dontkillme # tomcat启动时会衍生出一些子进程,然后才能成功启动,但是jenkins会在构建结束杀掉tomcat的那些衍生子进程,造成tomcat启动失败,此处加上这个参数可以解决这个问题。export JAVA_HOME=/usr/local/javaTOMCAT_NAME=tomcatTOMCAT_HOME=/usr/local/$TOMCAT_NAMEWWWROOT=$TOMCAT_HOME/webapps/ROOTif [ -d $WWWROOT ]; then # 如果目录存在,先备份mv $WWWROOT /data/backup/${TOMCAT_NAME}-$(date +"%F_%T")fiunzip ${WORKSPACE}/target/*.war -d $WWWROOT # 项目包解压到站点目录PID=$(ps -ef |grep $TOMCAT_NAME |egrep -v "grep|$$" |awk \'{print $2}\') # 重启tomcat[ -n "$PID" ] && kill -9 $PID/bin/bash $TOMCAT_HOME/bin/startup.sh'''}stage('test') { # 测试# sh "curl http://wp.test.com/status.html"echo "test ok!!!!!!!"}
}
4、构建
5、访问
报错处理
pipeline script from SCM方式下:
Started by user ***
java.io.FileNotFoundExceptionat jenkins.plugins.git.GitSCMFile$3.invoke(GitSCMFile.java:167)at jenkins.plugins.git.GitSCMFile$3.invoke(GitSCMFile.java:159)at jenkins.plugins.git.GitSCMFileSystem$3.invoke(GitSCMFileSystem.java:193)...l
Finished: FAILURE
原因是git工程下,没有找到Script Path路径下的脚本文件。
8、Jenkins 结合 gitlab 使用
1、创建一个新的任务
输入项目的名称,选择构建只有分风格的软件
2、将Jenkins与gitlab联合
1、Jenkins创建公钥和私钥
[root@qfedu.com ~]# ssh-keygen
Generating public/private rsa key pair.Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:5SGYye8oxCKFJjddb4W8JC0RAQhBWCvuG8aZL8eMJs4 root@Jenkins
The key's randomart image is:
+---[RSA 2048]----+
|==....=* .. |
|...o oo==. |
|+.= . =++.o |
|++ o o.+ . |
|... o S . |
|o.oo o |
| B+ . . . |
|++++ . |
|+Eo. |
+----[SHA256]-----+
[root@qfedu.com ~]# cat .ssh/id_rsa.pub
[root@qfedu.com ~]# cat .ssh/id_rsa
2、在gitlab中添加公钥id_rsa.pub
3、在jenkins中添加私钥id_rsa
在首页中,点击项目名称的下拉监听
选择源码管理,先将gitlab的项目地址复制过来
选择SSH密钥和证书,然后选择直接输入,将私钥复制到下框中即可
添加完成后,点击保存
选择刚才创建的证书,完成后,选择构建
选择构建
拉到最底部,选择使用shell脚本
脚本内容
创建测试环境
[root@qfedu.com ~]# mkdir -p /data/www
[root@qfedu.com ~]# chown -R jenkins.jenkins /data/
选择构建后的操作,让每次构建完成后都将结果发送给管理员
3、测试手动集成
回到主页,点击右侧的按钮进行测试
部署完成
查看部署日志
查看部署结果
[root@qfedu.com ~]# ll /data/www/
总用量 4
-rw-r--r-- 1 jenkins jenkins 4 11月 30 21:22 flag
-rw-r--r-- 1 jenkins jenkins 0 11月 30 21:22 README.md
4、自动测试(gitlab主动通知Jenkins测试)
该功能会使用到一个插件 gitlab plugin
配置gitlab认证
添加一个新的凭证
从gitlab的设置中将 token复制过来(需要手动创建token)
将复制的token粘贴到api token中,点ok
在系统配置中找到Gitlab 将信息进行填写,Credentials 选择刚刚创建对的即可
打开项目,编辑项目的构建触发器
在gitlab上配置连接jenkins ,将Jenkins的Secret token 与Build URL 复制到gitlab中
注意: 在项目设置中的集成
保存之前先进程测试,测试成功后进行保存
在gitlab进行上传文件,可以测试。
在日志中显示是 Started by GitLab push by Administrator 即表示自动集成成功
5、错误解决
-
错误提示:
#很多朋友使用最新版本的gitlab做自动部署时,在增加web钩子那一步, #点击test push events时会报错:Url is blocked: Requests to the local network are not allowed
-
解决方法:
这是因为新版的gitlab为了安全默认禁止了本地局域网地址调用web hook
我们在设置里允许就行,具体步骤如下: