GitLab、jenkins

Gitlab服务器:192.168.10.20
jenkins服务器:192.168.10.30
web应用服务器:192.168.10.100
通过容器部署gitlab:
安装容器管理软件podman
d65cbead2c4541869dfdaebf8dd587cb.png
c608cb975db747e0962951df925f4151.png
修改主机的22端口,该gitlab软件包中会使用到该端口
abdf3aacc5f24f4695be45753fc5bb10.png
gitlab容器需要使用/etc/resolv.conf文件
0a081735ee08440fa6ba790d7139d1c6.png
导入镜像
697a1fd144d84f28bb81fc104f96f39e.png
将容器中的目录和宿主机的目录映射保存数据
9027ea3707144516a5aa827af2e3f58d.png
-d后台运行。-h gitlab设置容器的主机名。--name gitlab是podman ps查看到的容器名;-p指定宿主机和容器关联的端口号,当访问宿主机443/80/22端口时,这样的请求就发给容器的相关端口; --restart always是开机自启;-v是映射路径,将容器中指定的路径,映射到宿主机,以便保存容器产生的数据;最后的gitlab_zh是镜像名。
88762e2514064c75891bc677980e0877.png
等待一会,访问该IP地址
3154a633586c4d019740e4c9f46f1605.png
默认以root登录,修改密码为1234.com
20a787fb51b842429704f8f9a6ea60d1.png
efefa2bdc0d24c18978912b7b4c401b4.png
91c4c6a8a142479396767ffdb8bf7200.png
修改登录页面
060fae648da84c5393b8b01717c01457.png
c9ec7aaaf979496b8c1f93cf24bd82a9.png
重新登录查看页面
1ef527f58687440ca5607334eeb1adb2.png
user1为root用户
048fe3a22c4a4e29aaf0c4920fe45530.png
eb6b7902104b437abd672d0bb7ca1316.png
创建用户
ac958499df6d4d3fbff6576f01ed2594.png
286d88d806fd488a8c858a33f769e0ed.png
给用户设置默认的登录密码
5ed3988283e34f4ea02ded19f7dfb8bf.png
3a0ea31378bc4d87a6cba38f5fc42bed.png
创建组
696185963f9f4944864505ef1b2ee4bf.png
dc83eb0276bc4511a4bf3ccac58679ab.png
给组添加用户
b6f1c49d47d34f48bd1ecb4a7cda4d99.png
318790cb6cad4316a5a352020c4743ce.png
创建项目
18c4fb237dc947ea992c716ade484ab9.png
0ff08b5c2fba4ebc98f363db215817d7.png
f502369b27e94bea89a60fb6b5ae403e.png
使用jack用户登录,管理项目
f1ff591d83dc46728301ca1de992c1e2.png
第一次登录需要重新设置密码
74218db9b5d64eef9bcc89dec5b6c49c.png
重新登录
c0bd7ca7ef9444a4ac7a9b0856033894.png
1e5b476fed00479cb2788313309e007d.png
点击项目
54a976cebb9f4fe2b23730a42139f504.png
复制链接
b16e883d7cfd4477925520b03c32e23b.png
http://gitlab/devops/myproject.git将链接中的gitlab修改为gitlab服务虚拟主机的IP地址
http://192.168.10.20/devops/myproject.git
在develop主机上克隆该myproject项目,在本地仓库中会有远程分支(origin)来记录远程仓库的地址。
e7f57ee2820748ed84b09eda04e842a0.png
在myproject目录中创建文件并且创建快照
353c8a8019874a09a780fad31e6b2535.png
添加文件并打快照
daeb13b02c9a4c79b25780bcd4c36a7f.png
git remote -v :查看远程分支
934b867da9984bc4b521cd2646e27ed1.png
push:推送本地的代码
d093d89c521144b9b69b559f8faa270b.png
刷新Gitlab页面
284eda187a0c416bac3dfbb30c7b022f.png
添加hosts文件
ff154aff92df4157aa29ad7ebdd371fd.png
此时也可以不需要加-u 指定远程仓库分支,也能push成功
17ce04cf9aa04f2d9a3bd9e6cebf6040.png
a230ffdfa4da44e1b946b561b7825fc5.png
将远程仓库的代码pull,拉取下来
先将远程仓库克隆
98049b11948c4d4f94d18d54ffcb7fb6.png
在root下面的仓库添加一个新文件,打快照上传到远程仓库
64c3347b4cd24ca6bb476246f0290709.png
5a54756eeafc4166a7e8c5734e43d64e.png
78af2a461e3142a5af58aca0fb0b6454.png
在/var/tmp下将远程仓库中没有的文件,拉取下来
此时没有passwd文件
8692202dc57543bbaee5ae11beeaa65e.png
git pull:拉取文件
1d8659b1ff784cae916f89babf33f848.png
创建公钥
577a821d9adf4b30a64e873d1efe389d.png
查看密钥,复制公钥
4b41d63a5fb54ac590256ef70113885b.png
选择设置
12bec8d23dd24910aa504bbf59e094e7.png
选择ssh密钥
0cb1682784a94c208ff51629ec7f646f.png
7f33aa7fd3ea4d388a95cb96f34e4b21.png
将复制的公钥拷贝到密钥框中
c44de6f2c2794e18b6be5b1ec70c2261.png
00a82820d6b848ab9535d7ed75369e87.png
此时在develop主机中myproject仓库中的记录的远程仓库路径为http协议,而免密的是ssh协议,所以需要把origin分支删除
ef37da9763784917aba187254769ff1a.png
创建ssh协议的地址
点击项目
d910bfb2a9b742abb445cce1274aae03.png
选择ssh协议的地址
8035d78edd204ce589c8ab145f9ba3b8.png
git@gitlab:devops/myproject.git将gitlab替换为IP地址
git@192.168.10.20:devops/myproject.git
创建ss地址
1c48f3f98bc144e988d33d38b0e8a173.png
添加文件并创建快照
d48bfeeffd044602a438343bf9cfab9e.png此时push到远程仓库,就不需要用户和密码了
2802d5e723704b8195ee37d082be5222.png
2b7e1360f23e4b0fa09af21403f3f2a7.png
练习:
1.在gitlab上新建名为mytest的项目,为devops组创建,可见等级为公开
2.将192.168.10.10 (develop服务器,以自己的ip为准)上的mytest项目关联到gitlab的mytest,以ssh方式关联
3.在192.168.10.10 (develop服务器,以自己的ip为准)上,把mytest目录中文件上传
以root用户创建项目
d09feebe0771466c915160162f0ca981.png
c3c4056eed204930921734196363e11f.png
37bb330a76b442b5a3d5e6c4f0cb1588.png
git@gitlab:devops/mytest.git修改为git@192.168.10.20:devops/mytest.git
将develop主机的mytest项目添加远程仓库的地址记录
ab7b147ebfcb4400814cd285a9ea8a55.png
上传文件到远程仓库
7a02f98b29e2411cbeb5ca015f3ad2b8.png
d16cc9c58c7d434897c8178533e30632.png
设置自动开启gitlab服务,给文件添加x权限
d566f1a8d7434d2b8a537cc0594403bb.png
173178989c2e4a089a82389a7b6bf2ea.png
CI(持续集成)/CD(持续部署)
项目部署的过程:
CI(程序员--->gitlab--->jenkins)CD(--->应用服务器(python编写自动化脚本))
7d2d2a3adbcd497f9fd37f9d064f3e78.png
安装Jenkins依赖,jenkins是Java程序所以装java,postfix和mailx是邮件程序,jenkins可以通过它们给管理员发邮件
81b63e7b4c1e41e08620eaaa20b50197.png
安装jenkins软件包
67d1f381e8ef4a709e133df52fa6e2a4.png
开启服务
336b6aca433246dfab78b7e99c209897.png
访问jenkins端口号为8080
986a2f75c1d14f319f3f44673fc07555.png
在/var/lib/jenkins/secrets/initialAdminPassword文件中查看密码
90c3c1e76f0643c79303885b2bd14eda.png
输入密码
8c2ee71a8f514e6faa8a59200b56a2ed.png
选择跳过插件安装
976d537c4854445ca165e59eebdd0c8f.png
选择系统自带的管理员用户
4cd483d1810840728096994251851118.png
保存并完成
9a0f431b8c7446f08c9f88c772cfd024.png
7b1264a97fdc4092b60779e2c961c720.png
c46cc292e7df4042aa92594003d57599.png
修改用户密码
ed92f15785ea44229633ad294e55236b.png
dcaea7da5cae4753876c7827b729f883.png
此时密码为123456
34709083866f47c58e4e89e1ff9bf4e9.png
2ef2170451804e9d8c5d84426283b709.png
安装插件
3f0f81d3287d4f2caa5d7ad4aaff4077.png
将解压的插件复制到/var/lib/jenkins/plugins/目录下面
3f9ea342a67049eea262ac77ba7fa937.png
重启jenkins服务
53e19d9da95d45a5a88fee69090ced0f.png
刷新页面此时语言就有中文显示
469f79e42c5f4c229b5f1dce34c8070c.png
有些英文没有翻译
75f44e2c4b284ef4a84f41162fd18b78.png
给当前的myproject项目打一个标记
9f54e95ed31f4a7d9dfe546485942cab.png
cb9efa7ffcf140cea15dea03f96990a1.png
添加index.html文件并打快照、打标记
6e899a1a0ecb4e998961789f12fa3fef.png
将标签传递给远程仓库
22010d2d58994d4aa321991cd6c55278.png
9fd49f96071a4f8ab6d01375c78bcea3.png
f27052e2b0214ff68a4341bbcb64228f.png
使用jenkins将指定版本的代码下载下来
在jenkins创建任务
0bd02dca229b466aaea67363afab3633.png
259bdc56d9e346bd8d6599df0dc951fa.png
ae651344e9f247908f2c69e0213d7a3a.png
12d11b974b3c483a9d0ba19988516b76.png
bf4f93568a104415ab4d7c0a81b12fe3.png
将jenkins创建的任务和远程仓库对接,使用myprojecthttp的地址 http:/192.168.10.20/devops/myproject.git
a3092dacdd154ee9a835b40c80abae8d.png
指定分支使用定义的web变量来获取
f95a4702abe64842b60d1ad750714e3c.png
通过web变量来构建项目(将指定标签的版本拉取到jenkins)
d85e05d553af4e51b2a8b314e3fc49b8.png
4872dd931f26459db53a4f4d8c8f75ac.png
666ca791590c48d19df8d90d992788e5.png
查看jenkins拉取远程仓库的相关操作
97d6e0d9ca714c4ea30e7b684fd86bfb.png
1fd6d6eb06144583bfce52654d9e5bdb.png
查看拉取下来的文件,拉取的是1.0版本没有index文件
f21800fd133d46698188d97c1c72afed.png
拉取1.1的版本
a9e8003473e6436d95274a635c768dc2.png
149b567471f64944a5ab665869e4ce44.png
此时覆盖了1.0的版本文件
2c7c5b2c2aad4ceb8c0a20ba544c53d7.png
让不同版本存放在不同的目录,创建项目的子目录存放不同的版本
bc65111bfe2b466eac2335bd96fd8752.png
e97d61b3ac584a81b086dffb00bead63.png
7e583c9222774abd9087461bfbd2e5c3.png
将已经构建拉取的myproject项目删除
37444791a153404d8ae6774c828e8ee3.png
重新构建项目
79303616d5f6454495d5336bc3f8cb1f.png
38f8b0640cb14747ae9678fcccf85c05.png
b8144ff98b3a4ea5872e2a28b6a65c8c.png
4d8b958a612d4016b7710def904806bb.png
查看项目
5f901ca2d491493b8ce418c47f20fadc.png
给应用服务器使用,将指定版本的目录打包
在jenkins安装http服务。用来响应应用服务器的http服务请求
570f15c76d7a4e8196be8a8b43b7544d.png
b8d3e64e12714e7aafce44a0c075cc6a.png
将版本号打包
91923628e26f4b67b179f392b9d81937.png
ab13e58d4f9a460d9087fd0bf82a3947.png
执行的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
a14ed8b5049c4fd4a7745d4f565357d1.png
将jenkins的拉取的项目删除,重新构建项目
606bb8c595294532a1516eecc467b796.png
c5e1dc621ac643b3a995edf3f6a332b2.png
50ae2eb9d9de4291baea50102911d612.png
12570bd1ed38452aaa68e9e8f9ab054e.png
50678457c0024e0d831fa142cd692431.png
查看http服务的目录文件
9f56260780d54bf597538dfbc3db59c4.png
在构建1.1项目
7540ac54b8d14ffb89b8eb687615c0a0.png
240ab6eaa2ae4fef8d30478948814377.png
此时访问该项目的http服务路径,就能显示版本文件压缩包和md5文件
008e9d7cca424406819324ebf435fe80.png
在web应用服务器部署http服务,用来获取jenkins服务器http中的项目包,解压自己的项目,并且检查最新版本
安装http服务和Python环境
f5e955fb46804f8d9e0e0b57aa8ad77e.png
创建download(复制下载tar包)和deploy(部署指定的项目)目录
fae79f2866444752acac6485ffb27f5c.png
当没有web服务器中没有部署过项目,或者项目的版本号不一致时需要从jenkins上下载tar包
d4e1b1a9a3bf45f8b63da3e11a55dc92.png
b1dbe79dccc1401194d6c0b95c783057.png
全部代码
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)
5af76c47c31845a9b5923bd9ba00e3a4.png
执行该脚本
c1ccdd2b73a84186b812ca3ed33afb9b.png
访问web服务器
2ef0c71f4b444ead945839ca951b6f84.png
此时在deploy主机中添加文件打标签为1.2
8c6585a5e83548db8b9c83f7a2ec492b.png
在jenkins上拉取项目
f273de8fa53f4f689d4ced9ba91b6b03.png
执行该脚本
af7e026be3884675a729bb3eada1a656.png
刷新web服务器的浏览器网址
dc84886f692e4dca8bbb2f1dc4cbfa82.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/715722.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Thinkphp起名网宝宝起名网站源码

Thinkphp起名网宝宝起名网站源码 源码介绍 1.宝宝在线起名 2.八字起名,周易取名 3.一对一起名 5.支持手机wap 链接数据库地址:Application\Common\Conf 修改里面config.php数据库连接,导入sm.sql数据库文件即可 伪静态用thinkphp 后台…

Centos部署openGauss6.0创新版本,丝滑的体验

作者:IT邦德 中国DBA联盟(ACDU)成员,10余年DBA工作经验, Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主,全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复, 安装迁移,性能优化、故障…

主流框架选择:React、Angular、Vue的详细比较

目前前端小伙伴经常使用三种广泛使用的开发框架:React、Angular、Vue - 来设计网站 Reactjs:效率和多功能性而闻名 Angularjs:创建复杂的应用程序提供了完整的解决方案,紧凑且易于使用的框架 Vuejs:注重灵活性和可重用…

Java | Leetcode Java题解之第155题最小栈

题目&#xff1a; 题解&#xff1a; class MinStack {Deque<Integer> xStack;Deque<Integer> minStack;public MinStack() {xStack new LinkedList<Integer>();minStack new LinkedList<Integer>();minStack.push(Integer.MAX_VALUE);}public void …

【ComfyUI】图像重绘/ 图像到图像生成——Comfyui的基本使用(三)

参考&#xff1a;ComfyUI的安装与使用&#xff08;一&#xff09;&#xff08;windows1660ti 6G显存&#xff09; 草稿img2img 工作流展示&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1Nv68-e4glh6lD7N9KB_-Pg?pwd0614 a tiger with anger emotion ,best qualit…

每日一题——冒泡排序

C语言——冒泡排序 冒泡排序练习 前言&#xff1a;CSDN的小伙伴们&#xff0c;大家好&#xff01;今天我来给大家分享一种解题思想——冒泡排序。 冒泡排序 冒泡法的核心思想&#xff1a;两两相邻的元素进行比较 2.冒泡排序的算法描述如下。 (1)比较相邻的元素。如果第一 个比…

图书馆图书可视化分析+大屏

&#x1f31f;欢迎来到 我的博客 —— 探索技术的无限可能&#xff01; &#x1f31f;博客的简介&#xff08;文章目录&#xff09; 目录 摘要前言技术栈开发环境数据说明 正文数据获取数据存储数据清理数据分析数据挖掘关联规则二分类预测 数据可视化书籍价格区间柱状图书籍评…

MySQL面试重点-1

1. 数据库基础知识&#xff1a; DDL、DML、DQL、DCL的概念与区别&#xff1f; DDL&#xff08;数据定义语言&#xff09;&#xff1a;创建&#xff08;CREATE&#xff09;数据库中的各种对象&#xff1a;表、视图、索引等DML&#xff08;数据操纵语言&#xff09;&#xff1a…

教学资源共享平台的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;老师管理&#xff0c;用户管理&#xff0c;成绩管理&#xff0c;教学资源管理&#xff0c;作业管理 老师账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用…

基于SSM+Jsp的旅游景点线路网站

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

【QT5】<总结> QT主要技术点

文章目录 前言 一、QT串口编程 二、QT网络编程 三、QT多线程 四、开发板上运行QT程序 前言 在学习QT的过程中&#xff0c;旨在更好地巩固所学到的知识&#xff0c;本篇总结QT在嵌入式开发中的主要技术点。 一、QT串口编程 思维导图&#xff1a; 知识点&#xff1a;【QT5…

【仿真建模-anylogic】FlowchartBlock原理解析

Author&#xff1a;赵志乾 Date&#xff1a;2024-06-17 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 1. 类图 2. 原理解析 2.1 核心函数 函数功能FlowchartBlock(Engine engine ,Agent owner, AgentList population )构造函数&#xff…

在表格中渲染轮播图的方法;

效果图&#xff1a;代码&#xff1a; shop()function shop() {// render()$.ajax({url: "http://jingxun.zhbbll.asia/pc/Commodity/shop_list", //要请求的后端地址type: "GET", //数据发送的方式(POST或者GET)dataType: JSON,headers: {token: token,id…

Mybatis工作流程和插件开发

在了解插件开发之前&#xff0c;我们先总体的来梳理一下Mybatis的大致执行流程&#xff1a; 1.new SqlSessionFactoryBuilder().build(inputStream):先根据配置文件&#xff08;包含了全局配置文件和映射配置文件&#xff09;初始化一个对象Configuration&#xff08;这里对象里…

一二三应用开发平台应用开发示例(3)——生成库表及后端代码

生成库表 前端页面的配置&#xff0c;也就是视图功能&#xff0c;我们先放一放&#xff0c;来看看生成库表和后端代码。 关闭实体配置界面&#xff0c;回到实体列表&#xff0c;勾选“文件夹”实体&#xff0c;点击“生成库表”&#xff0c;并确定。 系统提示成功后&#xff…

机器学习-课程整理及初步介绍

简介: 机器学习是人工智能的一个分支&#xff0c;它使计算机系统能够从经验中学习并改进其在特定任务上的表现&#xff0c;而无需进行明确的编程。机器学习涉及多种算法和统计模型&#xff0c;它们可以从数据中学习规律&#xff0c;并做出预测或决策。机器学习的应用非常广泛&…

云计算在保险行业的应用:太平财险团财险理赔新核心业务系统案例

随着科技的快速发展&#xff0c;云计算技术已经成为推动保险行业数字化转型的重要力量。云计算为保险公司提供了弹性、可扩展的计算资源&#xff0c;使其能够灵活应对业务高峰和低谷&#xff0c;提高业务运营效率和风控水平。太平财险与太平金科联合开发的“团财险理赔新核心业…

购物车列表设计

三、缓存结构设计 购物车数量 数据结构 string redisKey : cart_size${userId} value:购物车数量 缓存时间 15天 数据库用户购物车列表 数据结构 string redisKey : cart${userId} value:数据库用户购物车列表json 缓存时间 15天 用户排序后购物车商品列表&#xff…

Android sensor列表和访问记录

命令: dumpsys sensorservice 1.dumpsys sensorservice查看最近申请记录 dumpsys sensorservice命令输出Previous Registrations. Previous Registrations: 23:07:43 0x00000008 pid16587 uid10397 packagecom.start.testdemo.ui.udfp.fql.XsqFQLActivity samplingPeriod66…

智慧分流:探索互联网与物联网的负载均衡技术

数字化时代&#xff0c;个人认为&#xff0c;无论是互联网还是物联网&#xff0c;还是其他网&#xff0c;在各个层级&#xff0c;都对系统的稳定性和效率提出了更高的要求。负载均衡技术作为保障系统平稳运行的关键&#xff0c;其重要性不言而喻。在数字世界的海洋中&#xff0…