持续集成与持续交付

1.git工具使用

在这里插入图片描述

  • 集中化版本控制系统
    在这里插入图片描述
  • 分布式版本控制系统
    在这里插入图片描述

  • Git特点:
    • 速度
    • 简单的设计
    • 对非线性开发模式的强力支持(允许成千上万个并行开发的分支)
    • 完全分布式
    • 有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量)

  • 自诞生于 2005 年以来,Git 日臻成熟完善,在高度易用的同时,仍然保留着初期设定的目
    标。 它的速度飞快,极其适合管理大项目,有着令人难以置信的非线性分支管理系统。

  • Git必看秘籍:https://git-scm.com/book/zh/v2


  • Git 有三种状态:已提交(committed)、已修改(modified) 和 已暂存(staged)。
    • 已修改表示修改了文件,但还没保存到数据库中。
    • 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
    • 已提交表示数据已经安全地保存在本地数据库中。
  • 这会让我们的 Git 项目拥有三个阶段:工作区、暂存区以及 Git 目录。
    在这里插入图片描述

(1) git安装

  • 安装Git:
yum install -y git
  • 获取 Git 仓库通常有两种方式:
    • 将尚未进行版本控制的本地目录转换为 Git 仓库。
    • 从其它服务器克隆 一个已存在的 Git 仓库。比如: git clone
  • 初始化版本库:
[root@rhel7 ~]# mkdir demo
[root@rhel7 ~]# cd demo/
[root@rhel7 demo]# git init
Initialized empty Git repository in /root/demo/.git/
[root@rhel7 demo]# ls .git/
branches  config  description  HEAD  hooks  info  objects  refs

.git目录是git跟踪管理版本库的,没事别瞎溜达!!!


(2)git使用

  • 用户信息
[root@rhel7 demo]# git config --global user.name "RINGringrui"    用户名称
[root@rhel7 demo]# git config --global user.email linuxrui@westos.org    用户邮箱
  • 检查当前文件状态
[root@rhel7 demo]# git status
[root@rhel7 demo]# git status -s

在这里插入图片描述

  • 创建文件并添加到版本库
[root@rhel7 demo]# touch README.text    创建文件
[root@rhel7 demo]# git status -s      
?? README.text                
                     查看当前状态,"??"表示为新建文件,还未添加到版本库
[root@rhel7 demo]# git add README.text    添加到版本库
[root@rhel7 demo]# git add .     添加当前目录所有文件到版本库
  • 状态简览
  [root@rhel7 demo]# git status -s
A  README.text         此状态为当前文件暂存在版本库的缓存区(等待提交)
 [root@rhel7 demo]# git commit -m "add README.text"    提交文件到版本库
[master (root-commit) 8fcdb8a] add README.text
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 README.text
[root@rhel7 demo]# git status -s    无提示,表示当前无需执行动作
[root@rhel7 demo]# echo westos > test.txt    在创建的text.txt文件中写入内容
[root@rhel7 demo]# git status -s
AM test.txt
          此时的状态"AM","A"表示文件在暂存区,"M"在右边表示被修改的文件没有被添加到暂存区("无add动作")
          
[root@rhel7 demo]# echo rehat > README.text
[root@rhel7 demo]# git add README.text
[root@rhel7 demo]# git status -s
M  README.text
AM test.txt
"M"在左边表示被修改的文件已经被添加到了暂存区
[root@rhel7 demo]# git add test.txt    此时提交此文件
[root@rhel7 demo]# git status -s
M  README.text
A  test.txt    
          此时该文件状态"M"到左边与"A"重合,隐藏不显示

[root@rhel7 demo]# git commit -m "add files"    
[master 7cb9513] add files
 3 files changed, 2 insertions(+)
 create mode 100644 test.text
 create mode 100644 test.txt
[root@rhel7 demo]# git status -s    提交后文件无执行动作可做
[root@rhel7 demo]# echo westos >> test.txt
[root@rhel7 demo]# git add test.txt
[root@rhel7 demo]# echo rehat >> test.txt
[root@rhel7 demo]# git status -s
MM test.txt    
          "MM",
          右侧"M"表示此文件在当前工作目录中修改过且此文件没有被"add"到暂停区
          左侧"M"表示已经被提交到暂停区
[root@rhel7 demo]# git add test.txt
[root@rhel7 demo]# git status -s
M  test.txt
          此文件提交到暂停区后,右侧的"M",移动到左边,与左边的"M"重合
[root@rhel7 demo]# git commit -m "change test.txt"
[master 713a191] change test.txt
 1 file changed, 2 insertions(+)
[root@rhel7 demo]# git status -s
          提交过后,此文件无需执行动作          
  • 跟踪新文件
git add README
  • 忽略文件
vim .gitignore
.*           //忽略所有以"."开头的隐藏文件
/test        //只忽略当前目录下的test文件
build/       //忽略任何目录下名为 build 的文件夹
  • 查看已暂存和未暂存的修改
git diff
  • 提交更新
 git commit
  • 跳过使用暂存区域(只能是已经提交到暂停区的文件)
git commit -a -m 'added new benchmarks'
  • 移除文件
[root@rhel7 demo]# rm -f test.txt
[root@rhel7 demo]# git status -s
 D test.txt
[root@rhel7 demo]# git rm test.txt
rm 'test.txt'
[root@rhel7 demo]# git status -s
D  test.txt
[root@rhel7 demo]# git commit -m "delete test.txt"
[master 39ca769] delete test.txt
 1 file changed, 3 deletions(-)
 delete mode 100644 test.txt
[root@rhel7 demo]# git status -s
  • 重命名文件
git mv README.md README

其实,运行 git mv 就相当于运行了下面三条命令:

• $ mv README.md README
• $ git rm README.md
• $ git add README
  • 查看提交历史
• $ git log
• $ git log -p -2
• $ git log --stat • $ git log --pretty=oneline
  • 撤销对文件的修改
[root@rhel7 demo]# git checkout -- test.txt
[root@rhel7 demo]# ls
README.text  test.txt
  • 取消暂存的文件
git reset HEAD README.txt
  • 版本回退:
 git reflog
 git reset --hard efa267a

  • 远程仓库:注册github帐号,并新建一个仓库:
    在这里插入图片描述
  • 推送本地仓库内容到github:
git remote add origin https://github.com/westos007/git.git  //关联远程仓库
git push -u origin master //第一次推送需要加 -u参数

• 使用https方式推送每次需要输入用户名和密码,如果不想麻烦的话采用ssh方式:

 ssh-keygen -t rsa -b 4096 -C "yakexi007@westos.org"

• 生成本地密钥,并上传公钥到github:
在这里插入图片描述

 • $ git remote -v
origin https://github.com/westos007/git.git (fetch)
origin https://github.com/westos007/git.git (push)
• $ git remote rm origin
• $ git remote add origin git@github.com:westos007/git.git
• $ git remote -v 
origin git@github.com:westos007/git.git (fetch)
origin git@github.com:westos007/git.git (push)
• $ git push origin master
  • 克隆远程仓库:
 git clone git@github.com:westos007/gittest.git

在这里插入图片描述


2.gitlab代码仓库

(1)gitlab安装

  • 官网:https://about.gitlab.com/install/
  • 软件下载(官方下载慢,推荐使用国内镜像站点)
    https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/
  • 软件安装: (官方推荐至少4G内存)
free -m    查看内存大小

在这里插入图片描述

yum install -y curl policycoreutils-python openssh-server per1    安装依赖性
yum install -y gitlab-ce-15.3.3-ce.0.el7.x86_64.rpm 
  • 编辑配置文件:
[root@rhel7 ~ ]# cd /etc/gitlab/
[root@rhel7 gitlab]# vim gitlab.rb
编辑: (写入该主机IP,以便访问) 

在这里插入图片描述

  • 重载gitlab
[root@rhel7 gitlab]# gitlab-ctl reconfigure

在这里插入图片描述

  • 查看gitlab状态
[root@rhel7 gitlab]# gitlab-ctl status

在这里插入图片描述

  • 在浏览器上访问gitlab
    http://192.168.239.51
    登录用户为root,登录密码可查看:
 [root@rhel7 gitlab]# cat /etc/gitlab/initial_root_password

在这里插入图片描述
在这里插入图片描述


  • 修改密码
    在这里插入图片描述
  • 生成密钥
    在这里插入图片描述
  • 查看生成的密钥
[root@rhel7 ~]# cd .ssh/
[root@rhel7 .ssh]# ls
id_rsa  id_rsa.pub
[root@rhel7 .ssh]# cat id_rsa.pub
 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDMrJ/NcslBIgLDp3pygzKn5oTwxO49n/cNUqmfYHs8xLeO/VSiWXdRJZFWCLagg2fsvzpNBO8MeAg0FUZvASMvJLSekMr/UZ4nELeLHRbn0tiqNlYNQTRATCEwiSFLn4q/BQu03nGghR6kEiWrv2z1I4vPgt3nHnNgZu928drLlc928DEnCX1Ec5gnqLgZf+73xB8+vlvvQw1JmCKDMsmw7LSjFK09aRazqwctbc5PS3UiMQeQcA3gNvLGN55oymSeXwH1gPW0bGTjpxxqsKHchgGWkEjO2VTbNhHb0EGTIT69vjLq8mRAZ9dJSrK9eZT0CG/ytPzNJ6qkhKbwm+sN root@rhel7.6
  • 添加免密认证
    在这里插入图片描述
    在这里插入图片描述

  • 新建仓库
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • demo仓库创建成功!!!
    在这里插入图片描述

  • 克隆新建仓库
    在这里插入图片描述
[root@rhel7 ~]# git clone git@192.168.239.51:root/demo.git
Cloning into 'demo'...
The authenticity of host '192.168.239.51 (192.168.239.51)' can't be established.
ECDSA key fingerprint is SHA256:IPW1yvczIzfCo/3qPz0lyI9OnKG1DeX746wx6OOQKgo.
ECDSA key fingerprint is MD5:e1:2a:68:cf:5e:ac:32:59:fc:9a:ff:8e:af:30:a0:35.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.239.51' (ECDSA) to the list of known hosts.
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.

3.jenkins持续集成

  • Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建、部署、自动化, 满足任何项目的需要。
  • Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行。
  • CI(Continuous integration持续集成)持续集成强调开发人员提交了新代码之后,立刻进行构建、(单元)测试。
    在这里插入图片描述
  • CD(Continuous Delivery持续交付) 是在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境(类生产环境)中。
    在这里插入图片描述

(1) jenkins安装

• 软件下载:https://jenkins.io/zh/download/
• 国内镜像站:https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat/

  • 安装jenkins:(注意安装顺序)
yum install -y jdk-11.0.15_linux-x64_bin.rpm
yum install -y fontconfig
yum install -y jenkins-2.367-1.1.noarch.rpm
systemctl enable --now jenkins
  • 在浏览器上访问jenkins
http://192.168.76.52:8080
  • 查看jenkins登录界面密码
[root@server ~]# cat /var/lib/jenkins/secrets/initialAdminPassword
01bc59e35d604dfcb8b4e9fdc31f13a9
  • 安装默认插件即可,使用admin用户,登录后修改密码。
  • 解锁jenkins
    在这里插入图片描述
  • 更新插件源:
vim /var/lib/jenkins/hudson.model.UpdateCenter.xml 
编辑:
<?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>
 cd /var/lib/jenkins/updates
 sed -i.bak 's/http:\/\/updates.jenkinsci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json
 sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
  • jenkins安装
    在这里插入图片描述
    在这里插入图片描述

(2)jenkins使用

  • 新建任务
    构建自由风软件项目;
    在这里插入图片描述
    在这里插入图片描述
  • 添加访问git仓库的私钥

在这里插入图片描述

  • 定义轮询间隔,有更新时触发jinkens构建
    在这里插入图片描述

  • 构建选择执行shell命令
    在这里插入图片描述
    Git提交代码到gitlab,jinkens轮询检测到代码仓库的变更,触发构建。

  • 控制台输出
    在这里插入图片描述

  • gitlab自动触发jenkins(添加gitlab插件)
    在这里插入图片描述
    在这里插入图片描述

  • Jenkins自动构建docker镜像,并上传至harbor仓库
    在这里插入图片描述

  • 修改docker.sock权限,不然jenkins无法直接执行docker命令:

 chmod 777 /var/run/docker.sock

在这里插入图片描述


  • Jenkins使用tls方式连接docker构建主机
  • 生成key和ca证书
 openssl genrsa -aes256 -out ca-key.pem 4096
 openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
  • 生成server-key和csr文件(server3为docker主机名)
openssl genrsa -out server-key.pem 4096
openssl req -subj "/CN=server3" -sha256 -new -key server-key.pem -out 
server.csr
  • 可以使用ip地址方式进行tls连接
echo subjectAltName = DNS:server3,IP:172.25.0.13,IP:127.0.0.1 >> 
extfile.cnf
echo extendedKeyUsage = serverAuth >> extfile.cnf
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey cakey.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf
  • Jenkins使用tls方式连接docker构建主机
  • 安装docker证书:
cp ca.pem server-cert.pem server-key.pem /etc/docker/
cp /usr/lib/systemd/system/docker.service /etc/systemd/system/docker.service
vim /etc/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock 
--tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server-cert.pem --
tlskey=/etc/docker/server-key.pem -H tcp://0.0.0.0:2376
 systemctl daemon-reload 
 systemctl restart docker
 netstat -antlp |grep :2375
  • Jenkins使用tls方式连接docker构建主机
  • 生成客户端key和证书
openssl genrsa -out key.pem 4096
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
echo extendedKeyUsage = clientAuth >> extfile.cnf
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey cakey.pem -CAcreateserial -out cert.pem -extfile extfile.cnf

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


  • 添加docker交付功能
    在这里插入图片描述

(3) jenkins结合ansible

  • 添加ansible交付任务:
    • Jenkins服务器提前部署好到目标主机的ssh免密,并安装ansible软件包。
    • 由于是以jenkins用户调用ansible命令,所以需要设置jenkins用户到目标主机的免密。
    • 新建playbook代码仓库
    在这里插入图片描述
 [root@server1 playbook]# tree .
.├── ansible.cfg ├── httpd.conf.j2 ├── inventory │ ├── prod │ └── test ├── playbook.yml └── README.md
[root@server1 playbook]# cat ansible.cfg 
[defaults]
command_warnings=False
remote_user=ansible
[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False
  • 在执行playbook时可以指定inventory文件: test、prod
    在这里插入图片描述

  • 只需指定git仓库即可,无需gitlab主动触发,因为需要手动选择inventory构建参数
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

生产环境中的痛点
(1 )单实例jenkins承载数量有限,构建速度慢,隔离性差,高峰期资源会抢占,空闲
期时资源又浪费
(2) 上万个传统的自由风格或者pipeline的job管理起来很崩溃
(3) 无法设置标准的构建流程,导致各个项目组构建的产物质量不一,开发上传代码
时并不会关心源码扫描、漏洞扫描等问题
jenkins 2.0 的最大特性 : pipeline as code
把自由风格的项目迁移到pipeline上管理
jenkins on k8s
jenkins通过k8s插件,每次构建自动在k8s 拉起一个pod来部署jenkins slave来做构
建,构建后自动释放


(4) jenkins on k8s

  • 安装证书工具:
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
  • 创建证书签名请求:
# vim admin-csr.json
{
"CN": "admin",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "xi'an",
"L": "xi'an",
"O": "system:masters",
"OU": "System"
}
]
}
  • 生成证书:
cfssl gencert -ca=/etc/kubernetes/pki/ca.crt -ca-key=/etc/kubernetes/pki/ca.key --
profile=kubernetes admin-csr.json | cfssljson -bare admin
  • 转换pkc证书格式:
openssl pkcs12 -export -out jenkins-admin.pfx -inkey admin-key.pem -in 
admin.pem -passout pass:westos

在这里插入图片描述

  • 设置代理协议:
    在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值