一、CI/CD和DevOps介绍
DevOps(Development和Operations的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。
它是一种重视"软件开发人员(Dev)"和"IT运维技术人员(Ops)"之间沟通合作的文化、运动或惯例。通过自动化"软件交付"和"架构变更"的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。
它的出现是由于软件行业日益清晰地认识到:为了按时交付软件产品和服务,开发和运维工作必须紧密合作。
持续集成(Continuous Integration,CI):
代码合并,构建,部署,测试都在一起,不断地执行这个过程,并对结果反馈
持续交付(Continuous Delivery,CD):
部署到生产环境,给用户使用
持续部署(Continuous Deployment,CD):
部署到生产环境

二、部署Git版远程仓库
2.1、系统环境要求
|-----------------|-----------------|--------------|
| 主机名 | IP地址 | 备注信息 |
| Git | 192.168.200.111 | Git服务器 |
| Jenkins | 192.168.200.112 | Jenkins服务器 |
系统初始化
bash
[root@localhost ~]# hostname Git
[root@localhost ~]# bash
[root@Git ~]# iptables -F
[root@Git ~]# setenforce 0
[root@Git ~]# systemctl stop firewalld
[root@localhost ~]# hostname Jenkins
[root@localhost ~]# bash
[root@Jenkins ~]# iptables -F
[root@Jenkins ~]# setenforce 0
[root@Jenkins ~]# systemctl stop firewalld
2.2、部署Git远程仓库
安装Git
bash
[root@Git ~]# yum -y install git
创建Git账户
bash
[root@Git ~]# useradd git
[root@Git ~]# echo "123456" | passwd --stdin git
[root@Git ~]# su - git
创建Git远程仓库
bash
[git@Git ~]# mkdir repos #创建Git仓库目录
[git@Git ~]# cd repos/
[git@Git repos]# mkdir app.git #创建app的项目目录
[git@Git repos]# cd app.git
[git@Git app.git]# git --bare init #--bare创建一个裸仓库
初始化空的 Git 版本库于 /root/repos/app.git/
[git@Git app.git]# ls
branches config description HEAD hooks info objects refs
说明:
使用git --bare init方法创建一个所谓的裸仓库,之所以叫裸仓库是因为这个仓库只保存git历史提交的版本信息,而不允许用户在上面进行各种git操作,如果你硬要操作的话,只会得到下面的错误("This operation must be run in a work tree")
bash
[git@Git app.git]# git status
fatal: This operation must be run in a work tree
2.3、git客户端远程推送测试

安装Git
bash
[root@Jenkins ~]# yum -y install git
创建一个目录,尝试git clone远程Git服务器仓库的代码
bash
[root@Jenkins ~]# mkdir test
[root@Jenkins ~]# cd test
[root@Jenkins test]# git clone git@192.168.200.111:/home/git/repos/app.git
正克隆到 'app'...
git@192.168.200.111's password: #输入远程服务器git用户的密码
warning: 您似乎克隆了一个空版本库。
进行代码提交测试
bash
[root@Jenkins test]# cd app/
[root@Jenkins app]# echo "hello,devops" > test #创建一个文件
[root@Jenkins app]# cat test
hello,devops
[root@Jenkins app]# git add * #将文件添加到本地暂存区
[root@Jenkins 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.(none)')
配置git全局配置
bash
[root@Jenkins app]# git config --global user.name "crushlinux"
[root@Jenkins app]# git config --global user.email "crushlinux@163.com"
[root@Jenkins app]# git config --list
user.name=crushlinux
user.email=crushlinux@163.com
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
remote.origin.url=git@192.168.200.111:/home/git/repos/app.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
[root@Jenkins app]# git commit -m '测试提交'
[master(根提交) edf908b] 测试提交
1 file changed, 1 insertion(+)
create mode 100644 test
[root@Jenkins app]# git remote -v #已经被添加过远程地址(之前clone时自动添加)
origin git@192.168.200.111:/home/git/repos/app.git (fetch)
origin git@192.168.200.111:/home/git/repos/app.git (push)
[root@Jenkins app]# git push -u origin master #将代码推送到远程仓库的master分支
git@192.168.200.111's password:
Counting objects: 3, done.
Writing objects: 100% (3/3), 223 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@192.168.200.111:/home/git/repos/app.git
* [new branch] master -> master
分支 master 设置为跟踪来自 origin 的远程分支 master。
查看分支情况
bash
[root@Jenkins app]# git branch -a
* master #本地当前所处分支
remotes/origin/master #远程仓库已有分支
2.4 在Jenkins服务器进行SSH免密钥操作
bash
[root@Jenkins ~]# 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:VL0GRJ2B9PYr4W75ixCX4c5cAMMAcCG8xiuzKmOgA9Q root@Jenkins
The key's randomart image is:
+---[RSA 2048]----+
| .o.+o.*B+.o |
| .o .+++ |
| .. . . .=. |
| . E+ . oo= |
|. . . S ..= o |
|o o . B o . |
|+ + . *.. |
|=.. ooo |
|++ .o.o. |
+----[SHA256]-----+
进行公钥分发
bash
[root@Jenkins ~]# ssh-copy-id git@192.168.200.111
测试免密钥的git推送测试
bash
[root@Jenkins ~]# cd test/app/
[root@Jenkins app]# echo "hello,CICD" >> test
[root@Jenkins app]# cat test
hello,devops
hello,CICD
[root@Jenkins app]# git add *
[root@Jenkins app]# git commit -m "免密钥推送测试"
[master fcbcec7] 免密钥推送测试
1 file changed, 1 insertion(+)
[root@Jenkins app]# git push -u origin master
Counting objects: 5, done.
Writing objects: 100% (3/3), 279 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@192.168.200.111:/home/git/repos/app.git
edf908b..fcbcec7 master -> master
分支 master 设置为跟踪来自 origin 的远程分支 master。
三、Jenkins高级管理
Jenkins官网: https://www.jenkins.io/
redhat版jenkins官方页面: https://pkg.jenkins.io/rpm-stable/
3.1、Jenkins的安装与基础配置
安装Jenkins方法
- 利用Yum源安装
- 下载jenkins的rpm包安装
- 基于jenkins的war包安装
- 基于docker容器安装
利用rpm包安装jenkins
bash
[root@Jenkins ~]# rpm -ivh jenkins-2.222-1.1.noarch.rpm
[root@Jenkins ~]# chkconfig jenkins on
[root@Jenkins ~]# /etc/init.d/jenkins start
[root@Jenkins ~]# netstat -lnpt | grep :8080
tcp6 0 0 :::8080 :::* LISTEN 2065/java
本地插件包安装方法
bash
[root@Jenkins ~]#tar xf jenkins-2.222-plugins.tar.gz
[root@Jenkins ~]#rm -rf /var/lib/jenkins/plugins/*
[root@Jenkins ~]#mv plugins/ /var/lib/jenkins/
[root@Jenkins ~]#systemctl stop jenkins
[root@Jenkins ~]#chown -R jenkins:jenkins /var/lib/jenkins
[root@Jenkins ~]#systemctl start jenkins
[root@Jenkins ~]#tail -f /var/log/jenkins/jenkins.log
浏览器访问http://192.168.200.112:8080对jenkins进行初始化配置

bash
[root@Jenkins ~]# cat /var/lib/jenkins/secrets/initialAdminPassword
c53c768b199f4ff087ce72c7938a79c7







更换插件安装源
bash
[root@jenkins ~]# cd /var/lib/jenkins/updates
[root@jenkins updates]# sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json
[root@jenkins updates]# sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
[root@jenkins updates]# /etc/init.d/jenkins restart
Restarting jenkins (via systemctl): [ 确定 ]
修改jenkins初始密码




使用新密码登录


系统管理--->全局工具配置
安装和配置jdk环境
bash
[root@Jenkins ~]# tar xf jdk-8u191-linux-x64.tar.gz
[root@Jenkins ~]# mv jdk1.8.0_191/ /usr/local/java
[root@Jenkins ~]# vim /etc/profile
export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
[root@Jenkins ~]# rm -rf /usr/bin/java
[root@Jenkins ~]# source /etc/profile
[root@Jenkins ~]# java -version
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
安装和配置maven环境
bash
[root@Jenkins ~]# tar xf apache-maven-3.5.0-bin.tar.gz
[root@Jenkins ~]# mv apache-maven-3.5.0 /usr/local/maven
[root@Jenkins ~]# vim /etc/profile
MAVEN_HOME=/usr/local/maven
export PATH=${MAVEN_HOME}/bin:$PATH
[root@Jenkins ~]# source /etc/profile
[root@Jenkins ~]# mvn -v
Apache Maven 3.5.0 (ff8f5e7444045639af65f6095c62210b5713f426; 2017-04-04T03:39:06+08:00)
Maven home: /usr/local/maven
Java version: 1.8.0_191, vendor: Oracle Corporation
Java home: /usr/local/java/jre
Default locale: zh_CN, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-1127.el7.x86_64", arch: "amd64", family: "unix"


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是最近大热的容器级虚拟化产品。
全局工具配置----> 配置Git和JDK
bash
[root@Jenkins ~]# which git
/usr/bin/git

全局工具配置----> 配置maven
- Apache Maven是一种创新的软件项目管理工具,提供了一个项目对象模型(POM)文件的新概念来管理项目的
- 构建,相关性和文档。最强大的功能就是能够自动下载项目依赖的库文件。
- 在开发中,为了保证编译通过,开发会到处去寻找项目依赖的jar包(类似rpm安装软件时需要的一堆依赖包)
- 因此,就要用到Maven(Ant和gradle也是干这个的)
- Maven其实就类似Linux的Yum仓库,可以自动帮我们下载(公网源)和安装java项目所依赖的支持包。

3.2、用户权限管理
在一个成熟的企业生产环境中,jenkins是需要通过权限来控制角色功能使用的
- 开发人员利用jenkins====>生产环境项目代码版本发布(A/B测试等)
- 测试人员利用jenkins====>测试环境自动化部署
- 运维人员利用jenkins====>生产环境项目代码版本回滚
安装插件Role-based Authorization Strategy


全局安全配置--->授权策略--->Role-Based Strategy


注册两个用户(开发和测试)



由于开启了Role-Based Strategy,此时用户没有任何权限

系统管理--->Manage and Assign Roles
- Manage Roles:权限管理
- Assign Roles:授权管理
进入权限管理

Golbal roles:全局权限管理
jenkins的整体权限分配,至少要开读的权限
Project roles:项目权限管理
正则匹配具体的项目,分配管理权限

(2)进入授权管理
- Global roles:全局权限授权
- Item roles:项目权限授权

(3)创建两个项目分别以A-和B-开头

(4)登陆用户user1和user2进行权限登陆测试


3.3、参数化构建
参数化构建就是在执行自动构建之前可以对构建过程手动传入外部参数,从而改变构建的过程。
(1)配置一个构建脚本,然后执行






(2)添加参数化构建功能







安装插件Extended Choice Parameter
Extended Choice Parameter插件作用就是在参数化构建时可以出现一个下拉框让用户直接选择多个值。








我们还可以在一个文件里创建参数,然后让插件引用这个参数
创建一个参数定义文件
bash
[root@Jenkins ~]# vim /opt/jenkins.property
cloud=test01,test02,test04


3.4、Git参数化构建插件
Git Parameter插件可以直接获取Git仓库的branch,tag等信息
安装插件Git Parameter

添加远程Git仓库的密钥管理





由于我们之前用jenkins的root账户已经做过免密钥连接git了
因此,我们创建SSH的密钥管理

进行Git参数化构建
(1)配置Git Parameter插件


(2)配置Git远程仓库




(4)给Git远程仓库增加分支
bash
[root@Jenkins ~]# cd test/app/
[root@Jenkins app]# git branch
* master
[root@Jenkins app]# git branch dev
[root@Jenkins app]# git checkout dev
切换到分支 'dev'
[root@Jenkins app]# ls
test
[root@Jenkins app]# git add *
[root@Jenkins app]# git commit -m "开发分支提交"
# 位于分支 dev
无文件要提交,干净的工作区
[root@Jenkins app]# git push -u origin dev
Total 0 (delta 0), reused 0 (delta 0)
To git@192.168.200.111:/home/git/repos/app.git
* [new branch] dev -> dev
分支 dev 设置为跟踪来自 origin 的远程分支 dev。
(5)进行jenkins项目代码拉取测试


3.5、分布式构建

|-----------------|-----------------|----------------------|
| 主机名 | IP地址 | 备注信息 |
| Git | 192.168.200.111 | Git服务器和Jenkins的Slave |
| Jenkins | 192.168.200.112 | Jenkins服务器 |
jenkins的分布式构建操作,可以通过slave代理节点来执行项目任务;
添加一个用于连接slave代理节点的SSH证书

系统管理--->节点管理




特别提示:
如果没有设置工具位置--->jdk,那么jenkins会默认去/var/lib/jenkins/jdk下找java命令,如果找不到代理就会连接不上。
slave节点安装java环境
bash
[root@Git ~]# tar xf jdk-8u191-linux-x64.tar.gz
[root@Git ~]# mv jdk1.8.0_191/ /usr/local/java
[root@Git ~]# vim /etc/profile
export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
[root@Git ~]# rm -rf /usr/bin/java
[root@Git ~]# source /etc/profile
[root@Git ~]# java -version
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
查看slave节点启动日志

强制让项目A-Web运行在slave1节点上,并运行项目


查看A-web的构建日志

查看slave服务器构建环境
bash
[root@Git ~]# cd /var/lib/jenkins/workspace/
[root@Git workspace]# ls
A-web A-web@tmp
[root@Git workspace]# cat A-web/
.git/ test
[root@Git workspace]# cat A-web/test
hello,devops
hello,CICD
