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地址
添加文件并创建快照
此时push到远程仓库,就不需要用户和密码了
练习:
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:breakm.update(data)resp = requests.get(jenkins_tar_md5_url)#去掉换行符if resp.text.strip() == m.hexdigest():return Truereturn 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服务器的浏览器网址