Jenkins自动运维专题
整理知识,学习笔记;
居安思危,勤记而补拙,方可不断提高;
一,CI/CD,DevOps介绍
- 持续集成(Continuous Integration,CI):
- 代码合并,构建,部署,测试都在一起不断地执行这个过程,并对结果反馈
- 持续交付(Continuous Delivvers,CD):
- 部署到生产环境,给用户使用
- 持续部署(Continuous Deployment,CD):
- 部署到生产环境
二,部署Git版远程仓库
2.1 系统环境要求
主机名 | IP地址 | 备注 |
---|---|---|
Git | 192.168.100.98 | Git服务器 |
Jenkins | 192.168.100.99 | Jenkins服务器 |
[root@Git ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
[root@Git ~]# uname -r
3.10.0-862.el7.x86_64
[root@Git ~]# systemctl stop firewalld
[root@Git ~]# systemctl disable firewalld
[root@Git ~]# systemctl stop NetworkManager
[root@Git ~]# systemctl disable NetworkManage
2.2 部署Git版远程仓库
#在服务器上进行如下操作
#安装Git
[root@Git ~]# yum -y install git
#创建Git账户
[root@Git ~]# useradd git
[root@Git ~]# passwd
更改用户 root 的密码 。
新的 密码:
无效的密码: 密码是一个回文
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
#创建Git远程仓库
[git@lijingling ~]$ mkdir -p ./chen/app.git #创建Git仓库目录和app的项目目录
[git@lijingling ~]$ cd ./chen/app.git/
[git@lijingling app.git]$ pwd
/home/git/chen/app.git
[git@lijingling app.git]$ git init --bare #--bare创建一个裸仓库(只用做远程推送仓库不支持本地git命令)
初始化空的 Git 版本库于 /chen/app.git/
[git@lijingling app.git]$ ls
branches config description HEAD hooks info objects refs
说明:
使用"git init -bare"方法创建一个所谓的裸仓库,之所以叫裸仓库是因为这个仓库只保存git历史提交版本信息,而不允许用户在上面进行各种git操作,如果你硬要操作的话只会得到下面的操作("This operation must be run in a work tree ")
[root@Git app.git]# git status
fatal: This operation must be run in a work tree
2.3 在Jenkins服务器进行git代码远程推送测试
#在Jenkin是服务器上进行如下操作
#安装git
[root@jenkins-master ~]# yum -y install git
#创建一个目录,尝试git clone远程Git服务器仓库的代码
[root@jenkins-master test]# git clone git@192.168.100.98:/chen/app.git
正克隆到 'app'...
git@192.168.100.98's password: #输入远程服务器git用户的密码
warning: 您似乎克隆了一个空版本库。
[root@jenkins-master test]# ls
app
[root@jenkins-master test]# ls app/
[root@jenkins-master test]# cd app
#进行代码提交测试
[root@jenkins-master app]# touch test #创建一个文件夹
[root@jenkins-master app]# echo "welcome to yunjisuan">> test
[root@jenkins-master app]# cat test
welcome to yunjisuan
[root@jenkins-master app]# git add * #将文件添加到本地暂存区
[root@jenkins-master app]# git commit -m "测试提交" #将代码提交到本地git仓库
*** Please tell me who you are.
Run
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
to set your account's default identity.
Omit --global to set the identity only in this repository.
fatal: unable to auto-detect email address (got 'root@jenkins-master.(none)')
#配置git全局配置
[root@jenkins-master app]# git config --global user.email "2417204620@qq.com"
[root@jenkins-master app]# git config --global user.name "chen"
#进行代码提交测试
[root@jenkins-master app]# git commit -m "测试提交"
[master(根提交) 088e439] 测试提交
1 file changed, 1 insertion(+)
create mode 100644 test
[root@jenkins-master app]# git remote add origin git@192.168.100.98:/chen/app.git #添加远程仓库地址
fatal: 远程 origin 已经存在。
[root@jenkins-master app]# git remote -v #发现已经被添加过(之前clone时自动添加的)
origin git@192.168.100.98:/chen/app.git (fetch)
origin git@192.168.100.98:/chen/app.git (push)
[root@jenkins-master app]# git push -u origin master #将代码推送到远程仓库的master分支
git@192.168.100.98's password:
Counting objects: 3, done.
Writing objects: 100% (3/3), 234 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: error: insufficient permission for adding an object to repository database ./objects ##报错目标用户没有写权限
remote: fatal: failed to write object
error: unpack failed: unpack-objects abnormal exit
To git@192.168.100.98:/chen/app.git
! [remote rejected] master -> master (unpacker error)
error: 无法推送一些引用到 'git@192.168.100.98:/chen/app.git'
[root@Git app.git]# chown -R git:git /chen/app.git ##给仓库添加写权限
[root@jenkins-master app]# git push -u origin master #再次推送成功
git@192.168.100.98's password:
Counting objects: 3, done.
Writing objects: 100% (3/3), 234 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@192.168.100.98:/chen/app.git
* [new branch] master -> master
分支 master 设置为跟踪来自 origin 的远程分支 master。
#查看分支情况
[root@jenkins-master app]# git branch -a
* master #本地当前所处分支
remotes/origin/master #远程仓库已有分支
2.4 在Jenkins服务器进行SSH免密钥操作
[root@jenkins-master ~]# 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:iE/wkwSLoBKRukGCNCrY+lK/te5HW+rtW5diXA9kxh4 root@jenkins-master
The key's randomart image is:
+---[RSA 2048]----+
|*= . |
|B=.. o . |
|X o o . E |
|=. = o = . |
|.o. . * S + |
|.o . o .. .. . + |
|. . . o. + = o .|
| . o .+. o o |
| .o+o..+. |
+----[SHA256]-----+
#进行公钥分发
[root@jenkins-master ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub git@192.168.100.98
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
git@192.168.100.98's password:
Permission denied, please try again.
git@192.168.100.98's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'git@192.168.100.98'"
and check to make sure that only the key(s) you wanted were added.
#测试免秘钥的git推送
[root@jenkins-master ~]# cd /test/app/
[root@jenkins-master app]# ls
test
[root@jenkins-master app]# echo "holl are you">> test
[root@jenkins-master app]# tail -1 test
holl are you
[root@jenkins-master app]# git add *
[root@jenkins-master app]# git commit -m "增加内容"
[master 2c22e8e] 增加内容
1 file changed, 1 insertion(+)
[root@jenkins-master app]# git push -u origin master
Counting objects: 5, done.
Writing objects: 100% (3/3), 277 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@192.168.100.98:/chen/app.git
088e439..2c22e8e master -> master
分支 master 设置为跟踪来自 origin 的远程分支 master。
三,Jenkins的企业应用管理
jenkins官网:Jenkins
redhat版jenkins官方页面 :Redhat Jenkins Packages
3.1 Jenkins的安装与基础配置
- 安装Jenkins的三种方法
- 利用yum安装
- 下载jenkins的rpm包安装
- jenkins的war包安装
3.1.1 利用Yum方式安装最新版本jenkins
#下载Jenkins的yum源文件
[root@jenkins-master ~]# wget -O /etc/yum.repos.d/jenkins.repo #jenkins公司的https加密证书已过期,所以要加上--no-check-certificate选项
#导入jenkins的rpm证书
[root@jenkins-master ~]# rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
#利用yum安装最新版本jenkins
[root@jenkins-master ~]# yum -y install jenkins
#查看jenkins安装路径
[root@jenkins-master ~]# rpm -ql jenkins
/etc/init.d/jenkins
/etc/logrotate.d/jenkins
/etc/sysconfig/jenkins
/usr/bin/jenkins
/usr/lib/systemd/system/jenkins.service
/usr/sbin/rcjenkins
/usr/share/java/jenkins.war
/usr/share/jenkins
/usr/share/jenkins/migrate
/var/cache/jenkins
/var/lib/jenkins
/var/log/jenkins
#因为jenkins的下载源默认是去国外下载,我们需要更换源到国内
[root@jenkins-master ~]# sed -i 's#https://updates.jenkins.io/update-center.json#https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json#g' /var/lib/jenkins/hudson.model.UpdateCenter.xml
3.1.2 安装jdk环境
由于jenkins是Java开发的所以需要支持
[root@jenkins-master ~]# yum install fontconfig java*
3.1.3 安装和配置maven环境
3.1.4 启动jenkins
[root@jenkins-master ~]# systemctl start jenkins
#查看jenkins监听端口8080
[root@jenkins-master ~]# netstat -antup |grep 8080
tcp6 0 0 :::8080 :::* LISTEN 2771/java
#添加开机自启
[root@jenkins-master ~]# systemctl enable jenkins
#jenkins密码
[root@jenkins-master ~]# cat /var/lib/jenkins/secrets/initialAdminPassword
b94edf13e3824d77a2dff09c958520ab
3.1.5 初始化jenkins
使用默认插件安装配置即可
3.1.6 常用系统模块介绍
3.1.7 系统管理--->全局配置介绍
- Maven配置:
- 配置maven的settings.xml配置文件的位置路径(不修改为默认路径)。
- 配置JDK:
- 配置Java命令的执行路径;JDK是Java语言的软件开发工具包。
- 配置Git:
- 配置Git的命令执行路径;Git是分布式版本控制软件。
- 配置Gradle:
- 配置Gradle的执行路径;Gradle是面向Java的自动化构建开源项目,同maven。
- 配置Ant:
- 配置Ant的执行路;Ant是面向Java的自动化构建开源工具,同maven。
- 配置Maven:
- 配置maven的命令执行路径;maven是面向Java的自动化构建开源工具。
- 配置Docker:
- 配置Docker的命令执行路径;Docker是近年火热的容器级虚拟化产品。
3.1.8 全局工具配置---> 配置JDK
3.1.9 全局工具配置---> 配置Git
3.1.10 全局工具配置---> 配置maven
- Apache Maven是一种创新的软件项目管理工具,提供了一个项目对象模型(POM)文件的新概念来管理项目的构建,相关性和文档。最强大的功能就是能够自动下载项目依赖的库文件。
- 在开发中,为了保证编译通过,开发会到处寻找依赖的jar包(类似rpm安装软件时需要的一堆依赖包)
- 因此,就要用到Maven(Ant和gradle也是干这个的)
- Maven其实类似Linux的Yum仓库,可以自动帮我们下载(公网源)和安装Java项目所依赖的支持包。
3.2 用户权限管理
在一个成熟的企业应用环境中,jenkins是需要通过权限来控制角色功能使用的
开发人员利用jenkins====>生产环境项目代码版本发布(A/B测试等)
测试人员利用jenkins====>测试环境自动化部署
运维人员利用jenkins====>生产环境项目代码版本回滚
3.2.1 安装插件Role-based Authorization Strategy
3.2.2 全局安全配置--->授权策略--->Role-Based Strategy
3.2.3 注册两个用户(开发和测试)
由于开启了Role-Based Strategy,此时用户没有任何权限
3.2.4 系统管理--->Manage and Assign Roles
- [x] Manage Roles:全局配置
- [x] Assign Roles:授权管理
(1)进入权限管理
- [x] Golbal roles:全局权限管理
- jenkins的整体权限分配,至少要开读的权限
- [x] Project roles:项目权限管理
- 正则匹配具体的项目,分配管理权限
(2)进入授权管理
- [x] Global roles:全局权限授权
- [x] Item roles:项目权限授权
(3)创建两个项目分别以A-和B-开头
**(4)登陆用户user1和user2进行权限登陆测试
3.3 参数化构建
3.3.1 什么是参数化构建?
参数化构建就是在执行自动构建之前可以对构建过程手动传入外部参数,从而改变构建的过程。
(1)配置一个构建脚本,然后执行
(2)添加参数化构建功能
(3)执行参数构建
当然,我们在构建的时候也可以修改参数的默认值
3.3.2 安装插件Extended Choice Parameter
- Extended Choice Parameter
- 作用就是在参数化构建时可以出现一个下拉框然你给用户直接选择多个值
- 作用就是在参数化构建时可以出现一个下拉框然你给用户直接选择多个值
3.4 Git参数化构建插件
Git Parameter插件可以直接获取Git仓库的branch,tag等信息
3.4.1 安装插件Git Parameter
3.4.2 进行Git参数化构建
(1)配置Git Parameter插件
3.4.3添加远程Git仓库的密钥管理
由于我们之前用jenkins的root账户已经做过免秘钥连接git了
因此,我们创建SSH的密钥管理
(2)配置Git远程仓库
最后保存退出
(3)进行Git参数化构建
(4)给Git远程仓库增加分支
(5)进行jenkins项目代码拉取测试
3.5 Master-Slave架构
主机名 | IP地址 | 备注 |
---|---|---|
Jenkins | 192.168.100.201 | Jenkins-slave主节点 |
Jenkins-slave | 192.168.100.99 | Jenkins-slave节点 |
jenkins的分布式构建操作,可以通过slave代理节点来执行项目任务
3.5.1 系统管理--->节点管理
特别提示
如果没有设置工具位置--->jdk
那么jenkins会默认去/var/lib/jenkins/jdk下找Java命令
如果找不到代理就会连接不上
3.5.2 slave节点安装Java环境
[root@jenkins-salve ~]# yum -y install java-1.8.0*
[root@jenkins-salve ~]# ntpdate ntp1.aliyun.com
16 Jul 21:27:57 ntpdate[2371]: adjust time server 120.25.115.20 offset 0.004509 sec
[root@jenkins-salve ~]# ntpdate ntp1.aliyun.com
16 Jul 21:27:57 ntpdate[2371]: adjust time server 120.25.115.20 offset 0.004509 sec
3.5.3 启动slave节点代理程序
这里遇到两个问题
1.节点同步成功,代码并没有同步,因为没有启用Git Parameter参数构建
2.指定分支不能有/*
3.5.4 查看slave节点动日志
3.5.5 强制让项目A-WebA运行在slave1节点上,并运行项目
3.5.6 查看A-WebA的构建日志
[root@jenkins-salve jenkins]# ls
remoting remoting.jar
[root@jenkins-salve jenkins]# ls
remoting remoting.jar workspace
[root@jenkins-salve jenkins]# ls workspace/
A-PHP_deploy A-PHP_deploy@tmp
[root@jenkins-salve jenkins]# ls workspace/A-PHP_deploy
dev linux test1 test10 test2 test3 test4 test5 test6 test7 test8 test9
[root@jenkins-salve jenkins]# hostname -I
192.168.100.201
+