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

  • 30
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值