Gitlab服务器:192.168.10.20
jenkins服务器:192.168.10.30
web应用服务器:192.168.10.100
通过容器部署gitlab:
安装容器管理软件podman


修改主机的22端口,该gitlab软件包中会使用到该端口

gitlab容器需要使用/etc/resolv.conf文件

导入镜像

将容器中的目录和宿主机的目录映射保存数据

-d后台运行。-h gitlab设置容器的主机名。--name gitlab是podman ps查看到的容器名;-p指定宿主机和容器关联的端口号,当访问宿主机443/80/22端口时,这样的请求就发给容器的相关端口; --restart always是开机自启;-v是映射路径,将容器中指定的路径,映射到宿主机,以便保存容器产生的数据;最后的gitlab_zh是镜像名。

等待一会,访问该IP地址

默认以root登录,修改密码为1234.com



修改登录页面


重新登录查看页面

user1为root用户


创建用户


给用户设置默认的登录密码


创建组


给组添加用户


创建项目



使用jack用户登录,管理项目

第一次登录需要重新设置密码

重新登录


点击项目

复制链接

http://gitlab/devops/myproject.git将链接中的gitlab修改为gitlab服务虚拟主机的IP地址
http://192.168.10.20/devops/myproject.git
在develop主机上克隆该myproject项目,在本地仓库中会有远程分支(origin)来记录远程仓库的地址。

在myproject目录中创建文件并且创建快照

添加文件并打快照

git remote -v :查看远程分支

push:推送本地的代码

刷新Gitlab页面

添加hosts文件

此时也可以不需要加-u 指定远程仓库分支,也能push成功


将远程仓库的代码pull,拉取下来
先将远程仓库克隆

在root下面的仓库添加一个新文件,打快照上传到远程仓库



在/var/tmp下将远程仓库中没有的文件,拉取下来
此时没有passwd文件

git pull:拉取文件

创建公钥

查看密钥,复制公钥

选择设置

选择ssh密钥


将复制的公钥拷贝到密钥框中


此时在develop主机中myproject仓库中的记录的远程仓库路径为http协议,而免密的是ssh协议,所以需要把origin分支删除

创建ssh协议的地址
点击项目

选择ssh协议的地址

git@gitlab:devops/myproject.git将gitlab替换为IP地址
git@192.168.10.20:devops/myproject.git
创建ss地址

添加文件并创建快照



练习:
1.在gitlab上新建名为mytest的项目,为devops组创建,可见等级为公开
2.将192.168.10.10 (develop服务器,以自己的ip为准)上的mytest项目关联到gitlab的mytest,以ssh方式关联
2.将192.168.10.10 (develop服务器,以自己的ip为准)上的mytest项目关联到gitlab的mytest,以ssh方式关联
3.在192.168.10.10 (develop服务器,以自己的ip为准)上,把mytest目录中文件上传
以root用户创建项目



git@gitlab:devops/mytest.git修改为git@192.168.10.20:devops/mytest.git
将develop主机的mytest项目添加远程仓库的地址记录

上传文件到远程仓库


设置自动开启gitlab服务,给文件添加x权限


CI(持续集成)/CD(持续部署)
项目部署的过程:
CI(程序员--->gitlab--->jenkins)CD(--->应用服务器(python编写自动化脚本))

安装Jenkins依赖,jenkins是Java程序所以装java,postfix和mailx是邮件程序,jenkins可以通过它们给管理员发邮件

安装jenkins软件包

开启服务

访问jenkins端口号为8080

在/var/lib/jenkins/secrets/initialAdminPassword文件中查看密码

输入密码

选择跳过插件安装

选择系统自带的管理员用户

保存并完成



修改用户密码


此时密码为123456


安装插件

将解压的插件复制到/var/lib/jenkins/plugins/目录下面

重启jenkins服务

刷新页面此时语言就有中文显示

有些英文没有翻译

给当前的myproject项目打一个标记


添加index.html文件并打快照、打标记

将标签传递给远程仓库



使用jenkins将指定版本的代码下载下来
在jenkins创建任务





将jenkins创建的任务和远程仓库对接,使用myprojecthttp的地址
http:/192.168.10.20/devops/myproject.git

指定分支使用定义的web变量来获取

通过web变量来构建项目(将指定标签的版本拉取到jenkins)



查看jenkins拉取远程仓库的相关操作


查看拉取下来的文件,拉取的是1.0版本没有index文件

拉取1.1的版本


此时覆盖了1.0的版本文件

让不同版本存放在不同的目录,创建项目的子目录存放不同的版本



将已经构建拉取的myproject项目删除

重新构建项目




查看项目

给应用服务器使用,将指定版本的目录打包
在jenkins安装http服务。用来响应应用服务器的http服务请求


将版本号打包


执行的shell命令{
pkg_dir=/var/www/html/deploy/packages
cp -r myproject-$web $pkg_dir
rm -rf $pkg_dir/myproject-$web/.git
cd $pkg_dir
tar zcf myproject-$web.tar.gz myproject-$web
rm -rf myproject-$web
md5sum myproject-$web.tar.gz | awk '{print $1}' > myproject-$web.tar.gz.md5
cd ..
echo -n $web > version.txt

将jenkins的拉取的项目删除,重新构建项目





查看http服务的目录文件

在构建1.1项目


此时访问该项目的http服务路径,就能显示版本文件压缩包和md5文件

在web应用服务器部署http服务,用来获取jenkins服务器http中的项目包,解压自己的项目,并且检查最新版本
安装http服务和Python环境

创建download(复制下载tar包)和deploy(部署指定的项目)目录

当没有web服务器中没有部署过项目,或者项目的版本号不一致时需要从jenkins上下载tar包


全部代码
import os,requests,hashlib,tarfile
#web_ver_path:web服务器的version.txt文件路径
#ver_url:jenkins服务器的version.txt文件的URL路径
def has_new_ver(web_ver_path,ver_url):
if os.path.exists(web_ver_path) == False:
return True #没有该路径,表示没有该项目文件,需要下载
with open(web_ver_path,mode='r') as f:
local_ver = f.read()#读取本地的版本号
response = requests.get(ver_url)
if local_ver != response.text:
return True #版本号不同需要下载
return False
def file_is_ok(web_tar_path,jenkins_tar_md5_url):
m=hashlib.md5()
with open(web_tar_path,mode='rb') as f:
while True:
data = f.read(4096)
if len(data) == 0:
break
m.update(data)
resp = requests.get(jenkins_tar_md5_url)
#去掉换行符
if resp.text.strip() == m.hexdigest():
return True
return False
def deploy(web_tar_path,dest,web_deploy):
tar = tarfile.open(web_tar_path,mode="r")
tar.extractall(path=web_deploy)
tar.close()
#截取项目名
file_name = web_tar_path.split("/")[-1][:-7]
deploy_dir = os.path.join(web_deploy,file_name)
#创建软连接
if os.path.exists(dest) == True:
os.remove(dest)
os.symlink(deploy_dir,dest)
if __name__ == '__main__':
web_ver_path='/var/www/deploy/version.txt'
ver_url='http://192.168.10.30/deploy/version.txt'
if has_new_ver(web_ver_path,ver_url) == False:
print('没有新版本,不需要下载')
exit()
resp = requests.get(ver_url)
#jenkins_tar_url:获取jenkins的tar包URL路径
#web_tar_path:web下载tar的路径
jenkins_tar_url=f'http://192.168.10.30/deploy/packages/myproject-{resp.text}.tar.gz'
web_tar_path=f'/var/www/download/myproject-{resp.text}.tar.gz'
#下载tar包
with open(web_tar_path,mode='wb') as f:
f.write(requests.get(jenkins_tar_url).content)
#计算md5值的函数
jenkins_tar_md5_url=f'http://192.168.10.30/deploy/packages/myproject-{resp.text}.tar.gz.md5'
if file_is_ok(web_tar_path,jenkins_tar_md5_url) == False:
print('资源不完整')
os.remove(web_tar_path)
#项目部署
dest = '/var/www/html/current' #软连接
web_deploy = '/var/www/deploy' #部署目录
deploy(web_tar_path,dest,web_deploy)
#更新版本文件
if os.path.exists(web_ver_path) == True:
os.remove(web_ver_path)
with open(web_ver_path,mode='w') as fw:
fw.write(resp.text)

执行该脚本

访问web服务器

此时在deploy主机中添加文件打标签为1.2

在jenkins上拉取项目

执行该脚本

刷新web服务器的浏览器网址
