Linux企业运维——持续集成与持续交付(上)

Posted 是大姚呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux企业运维——持续集成与持续交付(上)相关的知识,希望对你有一定的参考价值。

Linux企业运维——持续集成与持续交付(上)

文章目录

一、git工具使用

1.1、git版本控制系统简介

Git是一个开源的分布式版本控制系统,几乎所有开源软件用的都是分布式版本系统,其可以有效、高速的处理从很小到非常大的项目版本管理。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

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

Git特点:

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

Git 有三种状态:

  • 已提交(committed):表示数据已经安全地保存在本地数据库中。

  • 已修改(modified):表示修改了文件,但还没保存到数据库中。

  • 已暂存(staged):表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。

这会让我们的 Git 项目拥有三个阶段:工作区、暂存区以及 Git 目录。

1.2、本地git仓库部署

部署git有两种方式:
一是将本地目录转化为git仓库
二是克隆已有仓库,如git clone

下面介绍将本地目录转化为git仓库

真实主机使用yum install -y git安装git

在真实主机kiosk目录下新建demo目录,查看目录内无内容(包括隐藏文件)

初始化demo目录为代码库,再次查看目录,发现新建了.git隐藏目录,.git目录是git跟踪管理版本库的。
接着在demo目录中新建代码文件并查看其状态,-s表示简洁输出,代码文件前的??表示该文件不在版本库中。
使用git add命令将代码文件添加进入stage暂存区,查看文件状态看到A表示已添加到暂存区,HEAD指针指向当前正在操作的分支

默认在提交时会提交整个暂存区,提交时-m表示添加注释,提交时会默认创建邮箱和地址,这里也可以自己设置如果邮箱信息没有创建成功导致无法提交,可以根据提示指令创建用户和有效信息。
再次查看可以看到代码文件前无状态内容,无内容表示文件无变更

向代码文件中写入内容,再次查看文件状态可以看到右边出现了红色M,这表示目前代码文件的修改在工作区,使用git add命令后可以看到文件状态是左边绿色M,表示修改提交到了暂存区,然后提交

再次查看文件状态无内容,表示没有改动
向代码文件中追加写入内容,查看状态为右侧红色M,即在工作区进行了修改,根据提示信息可以知道在工作区的修改可以通过checkout命令来撤销
此时查看文件内容可以看到有两行,使用checkout命令撤销工作区的修改后,再次查看文件内容,追加的内容被撤销了

编辑代码文件,新追加一行内容,查看状态显示修改在工作区,使用git add将代码文件提交至暂存区。
继续追加一行内容,查看文件状态,显示两个M。左边绿色M表示我们上一步提交至暂存区的修改,右边红色M表示刚才追加内容的修改
再次添加文件至暂存区,查看状态可以看到只有绿色M,因为所有修改都已经被提交到了暂存区

如果不想提交这些更改,第一步可以使用reset撤销在暂存区的修改,此时查看文件状态可以看到修改处于工作区,第二步用checkout撤销在工作区的修改,此时查看文件内容只有一行内容

为了方便后续对仓库进行操作,可以声明用户信息,用户名为root,邮箱为root@westos.org,这一用户信息被保存在/.gitconfig这一隐藏文件里

回到demo目录下(必须回到代码仓库目录中,因为git命令必须在版本库当中执行),新建隐藏文件和隐藏目录,在隐藏目录中创建一个子文件,这时查看状态可以看到新建的隐藏文件和隐藏目录(目录中有文件,查看状态才可以看到隐藏目录),??表示并未在版本库中

在demo目录下新建并编辑.gitignore文件,像文件中写入.*表示忽略当前目录中的所有隐藏文件,此时查看状态就看不到刚才创建的隐藏文件了。

查看demo目录下的代码文件内容,只有一行,我们再追加一行并提交更改,-a参数相当于之前的add操作,不用分两次执行了。
查看状态无内容,这表示更改已经提交且无变更,此时通过rm -rf删除代码文件,查看状态可以看到右侧红色D,表示删除的是工作区的内容,可以撤销防止误删

使用checkout来撤销此次删除,然后查看文件内容,可以看到文件恢复

如果使用git rm 命令删除,查看状态显示为左边绿色的D,表示删除了暂存区的内容,想恢复的话可以使用reset

reset恢复暂存区的删除操作后,再执行checkout来恢复工作区的误删,这时可以看到文件被恢复了

如果使用git rm进行删除后,再使用commit提交了删除操作,可以使用回滚的方式恢复文件信息,使用git reflog命令查看历史版本信息,然后选择需要回滚到的版本,使用 git reset --hard 版本id进行回滚。

1.3、远程git仓库搭建

可以使用github来新建远程仓库,但github访问速度较慢,这里我们使用阿里的gitee进行远程仓库的搭建
首先注册gitee账户

为了方便后续操作,这里要做ssh免密
切换到.ssh目录下,使用ssh-keygen生成密钥文件

复制生成的公钥

在gitee中选择SSH keys模块,将公钥粘贴进去

添加ssh公钥成功后在右上角选择新建仓库

仓库名称为demo,设置为公开仓库

选择SSH连接访问方式,根据页面的提示信息推送本地仓库内容到gitee,第一次推送时需要指定用户

一定要在仓库目录中添加远程仓库的地址,推送本地仓库内容至远程共有仓库时要指定分支master

在本地将demo代码文件删除,通过gitee远程仓库克隆,可以看到demo恢复

二、搭建远程私有仓库gitlab

gitlab常用命令:

命令作用
gitlab-ctl start启动所有gitlab组件
gitlab-ctl stop停止所有gitlab组件
gitlab-ctl restart重启所有gitlab组件
gitlab-ctl status查看服务状态
gitlab-ctl reconfigure重载服务
gitlab-ctl tail查看日志

真实主机创建两个新的虚拟机

为server2分配至少4G内存

真实主机将gitlab镜像发送给server2

server2先安装相关依赖

安装gitlab包

安装完成后,server2切换到/etc/gitlab/目录下,编辑gitlab.rb配置文件,将external_url参数改为自己的ip

使用gitlab-ctl reconfigure命令重载服务

在/etc/gitlab/initial_root_password文件中可以看到初次登陆gitlab的密码

浏览器访问server2的地址进入登陆页面,复制密码,进行登录

点击右侧Preferences,修改登陆密码

修改完成后点击保存

server2生成ssh密钥

复制生成的公钥

将server2的公钥信息复制到gitlab仓库,完成ssh密钥的添加

新建项目

新建一个名为demo的项目,设置为私有,使用自述文件初始化仓库

server2安装git

通过ssh克隆该项目仓库

server2执行上图克隆命令,克隆demo仓库至本地,查看其内容

三、jenkins持续集成

3.1、jenkins简介

Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建、部署、自动化, 满足任何项目的需要。
Jenkins自动化部署可以解决集成、测试、部署等重复性的工作,工具集成的效率明显高于人工操作;并且持续集成可以更早的获取代码变更的信息,从而更早的进入测试阶段,更早的发现问题,这样解决问题的成本就会显著下降:持续集成缩短了从开发、集成、测试、部署各个环节的时间,从而也就缩短了中间出现的等待时间;持续集成也意味着开发、集成、测试、部署得以持续。
Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行。

CI(Continuous integration持续集成)持续集成强调开发人员提交了新代码之后,立刻进行构建、(单元)测试。
CD(Continuous Delivery持续交付) 是在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境(类生产环境)中。

3.2、jenkins安装

为server3虚拟机分配至少2G内存

真实主机将jdk和jenkins安装包发送给server3

server3中先安装jdk,再安装jenkins

开启jenkins,可以看到8080端口开启

测试访问虚拟机是否能够上网

server3安装wget

更新插件源,测试那个插件元速度快,这里选择清华

测试访问:172.25.33.3:8080,页面提示密码在/var/lib/jenkins/secrets/initialAdminPassword文件内

初始化数据都在/var/lib/jenkins,在server3中查看指定文件,得到登陆密码

登陆成功后,选择右边的自定义插件安装

快速进入jenkins:全不选插件,选择All | None,然后安装

跳过用户创建阶段,选择管理员账户登陆

选择configure

设置登陆密码和时区

server3创建存放更新源CA证书的目录,然后下载证书

将证书文件的拥有者和组由root改为jenkins

3.3、jenkins插件安装

网页中在dashboard界面中选择manage jenkins,点击插件管理

选择advanes,这里要设置插件源地址

先测试哪个源的速度比较快,可以看到清华的速度最快,腾讯也挺快

将插件源地址设置为清华的镜像

server3切换到/var/lib/jenkins目录下,查看hudson.model.UpdateCenter.xml文件内容,可以看到插件源已经修改成了清华的源

搜索中文插件并安装

安装pipeline流水线插件

3.4、jenkins使用

(1)jenkins创建项目

输入任务名称demo,点击构建一个自由风格的软件项目

安装gitlab插件,可以用来为项目配置git仓库

server3安装git

生成ssh密钥以便git和Jenkins进行SSH免密连接

复制生成的公钥

根据SSH密钥管理界面的信息提示将公钥粘贴在指定部分

复制私钥

配置demo项目,进入源码管理界面,输入私有仓库地址,添加证书

类型选择SSH

用户名填root,将刚才复制的私钥粘贴在此处

证书添加完成后,指定分支填写*/main,与gitlab中分支一致

(2)配置周期性检查gitlab变更

接下来的配置这里选择轮询SCM触发器类型,* * * * * 表示每分钟查看一次gitlab代码变化,执行的命令为ls -l

server3切换到/var/lib/jenkins/workspace目录下,选择demo项目并进入,可以看到README.md文件内容

server2新建一个index.html并写入内容,将修改提交,这里提示我们要配置邮箱和姓名

身份信息配置完成后提交改动并上传

在页面已经可以看到提交的内容了

在Dashboard的demo项目中,点击查看#6的修改历史

在控制台中可以看到操作成功的信息

(3)配置实时监控gitlab变更

首先生成秘密令牌

进入jenkins的构建触发器模块,取消轮询,选择只要有变动就上传至gitlab,复制这里的url地址

在gitlab的设置中找到webhooks,将url和秘密令牌粘贴在此

再进入菜单栏选择Admin

勾选 允许webhooks和服务对本地网络的请求

可以看到配置已经生效

下面我们进行测试,server2将新的内容写入到index.html中,然后提交改动并上传

server3的jenkins实现实时同步,可以看到改动

在页面中查看#7改动,可以看到控制台输出

(4)自动构建docker镜像并上传至本地仓库

server2编写dockerfile文件并添加提交上传

因为jenkins实时同步server3也看到dockerfile,server3安装docker

server1将docker配置文件发送给server3

server3修改内核参数并重载

server1将自己docker目录下的cert.d发送至server3的docker目录

server3修改仓库镜像地址并重启docker服务,为docker.sock文件设置权限,使jenkins通过套接字使用docker,然后添加本地域名解析

真实主机将myapp.tar发送给server1

server1拉起myapp镜像

为myapp:v1和myapp:v2添加标签

server1将myapp:v1和myapp:v2上传至仓库

jenkins界面安装docker插件

构建步骤选择Docker Build and Pubish

仓库名称为library/demo,标签动态获取,使用docker套接字,设定仓库地址

添加jenkins凭据提供者

如图填写相关信息

取消强制pull

在jenkins的demo仓库信息中点击最后的图标

可以看到控制台输出信息

上传镜像至本地demo仓库

为镜像设置标签然后再上传至本地仓库

在harbor页面我们可以看到上传的镜像

(5)添加docker交付任务

新建一个任务名为docker,选择自由风格

触发器选择其他工程构建后触发,指定关注demo项目,选择构建稳定时触发

编写触发时执行的shell命令,操作为运行容器

控制台可以看到配置成功

server3测试访问可以看到myapp正在运行

我们将触发器执行的命令修改为下图,即如果已经存在myapp的容器,先删除,休眠1秒后重新拉起
server2编辑dockerfile,添加提交并上传

gitlab中可以看到刚上传的dockerfile

查看控制台输出可以看到myapp:v2

成功push镜像

查看控制台输出可以看到触发器触发,执行了我们配置好的指令

server3测试访问,证明容器正常运行

(6)拉取harbor仓库镜像

真实主机开启虚拟机server4

server4配置本地域名解析
server3将本机的docker.repo发送给server4

server4安装docker

server3再将本机的docker.conf配置文件发送给server4

server4修改内核参数并重载,启动docker

server3将certs.d和daemon.json发送给server4

server4重启docker服务

在daemon.json文件中将镜像源进行修改

下载安装ssh的插件用于远程ssh方式访问

点击系统配置设置ssh连接的主机

将server4的信息填入,添加jenkins凭据

凭证类型选择用户名和密码,输入ssh登陆操作的服务器的账号和密码

凭证配置完成

配置docker项目,填入ssh连接的目标和指令

查看docker项目的控制台输出可以看到#4显示镜像拉取成功

server4测试访问本地容器正常运行,查看镜像信息

将执行命令改为删除以前的镜像,再删除拉取到的最新的镜像,然后运行最新版本的镜像

可以看到控制台显示找不到镜像

以上是关于Linux企业运维——持续集成与持续交付(上)的主要内容,如果未能解决你的问题,请参考以下文章

Linux企业运维——持续集成与持续交付

Linux企业运维——持续集成与持续交付(下)jenkins节点与用户管理jenkins结合ansible

Linux企业运维——持续集成与持续交付(下)jenkins节点与用户管理jenkins结合ansible

Linux企业运维——持续集成与持续交付(下)jenkins节点与用户管理jenkins结合ansible

持续集成基本概念

持续集成与自动化部署 - dev ops & 持续集成交付部署 介绍