的网站设计案例,做物流行业网站的开发公司,如何建设一个优秀的电商网站,考研培训班集训营文章目录 环境准备GitLab部署GitLab服务器GitLab中主要的概念客户端上传代码到gitlab服务器CI-CD概述软件程序上线流程安装Jenkins服务器 配置jenkins软件版本管理配置jenkins访问gitlab远程仓库下载到子目录部署代码到web服务器自动化部署流程 配置共享服务器配置jenkins把git… 文章目录 环境准备GitLab部署GitLab服务器GitLab中主要的概念客户端上传代码到gitlab服务器CI-CD概述软件程序上线流程安装Jenkins服务器 配置jenkins软件版本管理配置jenkins访问gitlab远程仓库下载到子目录部署代码到web服务器自动化部署流程 配置共享服务器配置jenkins把gitlab下载的代码打包 web服务自动部署编写自动上线脚本 环境准备
本实验采用华为云ECS进行模拟真实工作环境当然本地电脑环境配置达标也可以在本地电脑使用VMware虚拟机完成本实验供需4台云主机全部使用Rocky Linux8.5操作系统2vCPU4G内存具体要求如下
主机名IP地址配置角色windows––程序员develop192.168.0.10|公网IP2vCPU4G内存程序员gitlab192.168.0.20|公网IP2vCPU4G内存远程仓库jenkins192.168.0.30|公网IP2vCPU4G内存CI/CD服务器web1192.168.0.40|公网IP2vCPU4G内存web服务器
项目架构图 GitLab 它是一个开源的git仓库服务器。用于实现代码集中托管 分为企业版和CE社区版 部署方式软件包部署、容器部署
部署GitLab服务器
云主机192.168.0.20远程连接时需要连接其对应的公网IP地址将2024-AI大模型Java全链路工程师环境资料/第四模块/gitlab_zh.tar拷贝到gitlab服务器的/root将2024-AI大模型Java全链路工程师环境资料/第四模块/docker文件夹拷贝到gitlab服务器的/root通过容器部署GitLab服务
[rootgitlab ~]# cd /root/docker
[rootgitlab docker]# dnf -y localinstall *.rpm #安装容器管理软件docker
[rootgitlab docker]# dnf -y install bash-completion #安装tab键刷新生效
[rootgitlab ~]# systemctl start docker #启动服务
[rootgitlab ~]# systemctl enable docker #将服务设置为开机自启 修改gitlab服务器的的sshd服务端口号为8022因为gitlab容器也要用到22端口有冲突。
vim 17是指打开配置文件时光标直接定位到第17行。
[rootgitlab ~]# vim 17 /etc/ssh/sshd_config #修改配置文件
17 Port 8022
[rootgitlab ~]# systemctl restart sshd #重启sshd远程管理服务
#重启之后需要使用远程工具重新连接gitlab服务器并且指定8022端口号gitlab容器运行需要/etc/resolv.conf文件如果该文件已存在则无需创建
[rootgitlab ~]# touch /etc/resolv.conf导入镜像 一个镜像可以创建很多容器。镜像是只读的容器是可以改变的。容器相当于是精简的虚拟机可以像虚拟机一样对外提供服务。
[rootgitlab ~]# docker load /root/gitlab_zh.tar
[rootgitlab ~]# docker images #查看镜像是否导入保障数据完整性 为了删容器不丢失数据需要把容器需要的数据保存在宿主机上。在哪台主机上启动容器哪台主机就是宿主机。
[rootgitlab ~]# mkdir -p /srv/gitlab/{config,logs,data} #创建持久化目录
[rootgitlab ~]# ls /srv/gitlab/
config data logs创建容器 -d后台运行-h gitlab设置容器的主机名–name gitlab是docker ps查看到的容器名-p指定发布的端口号当访问宿主机443/80/22端口时这样的请求就发给容器的相关端口–restart always是开机自启-v是映射路径将容器中指定的路径映射到宿主机以便保存容器产生的数据最后的gitlab_zh是镜像名
[rootgitlab ~]# docker run -d -h gitlab --name gitlab -p 443:443 -p 80:80 -p 22:22 --restart always -v /srv/gitlab/config:/etc/gitlab -v /srv/gitlab/logs:/var/log/gitlab -v /srv/gitlab/data:/var/opt/gitlab gitlab_zh[rootgitlab ~]# docker ps #查看容器正在运行的容器
# 如果一切正常几分钟后可以访问http://gitlab服务器的公网ip/ (以自己为准)
# 例如http://121.36.66.101/附如果容启动失败再次创建有以下错误
Error: error creating container storage: the container name gitlab is already in use by ca425e33d7ff2给i他d282cbec1033023851cff285fe9b819ed50d47a08a875372fde. You have to remove that container to be able to reuse that name.: that name is already in use则
[rootgitlab ~]# docker rm gitlab
[rootgitlab ~]# docker run -d -h gitlab --name gitlab -p 443:443 -p 80:80 -p 22:22 --restart always -v /srv/gitlab/config:/etc/gitlab -v /srv/gitlab/logs:/var/log/gitlab -v /srv/gitlab/data:/var/opt/gitlab gitlab_zh配置gitlab
第一次登陆‑时要求改密码。密码需要是复杂密码如1234.com。修改之后登陆的用户名是root。 修改外观设置 点击头像–退出重新登录验证 GitLab中主要的概念
用户为使用gitlab的用户创建的账号。组用户的集合可以为部门创建组。将来可以在项目上为组授权组中所有的用户都会得到相应的权限。项目用于保存代码文件的空间。用户、组、项目之间的关系如下 创建用户 用户名jerry密码1234.com 填写截图上的几项后其他使用默认配置点保存。 创建好用户后点击编辑可以为他/她设置密码 保存修改后退出当前账号使用新账号jerry与其密码1234.com登陆测试。 第一次登陆时也是要求修改密码新密码可以设置与旧密码一样。 新建的jerry用户因为权限较小所以看到的界面没有root的功能多。 创建组,注意需要使用root账号创建这里需要切换回root账户 将jerry用户加到devops组中角色是主程序员 创建项目管理员root操作 切换为jerry用户查看项目是否负责 客户端上传代码到gitlab服务器 查看项目路径采用http方式上传 查看项目说明 在客户端develop服务器192.168.0.10连接其公网IP地址上下载项目编写代码并上传
[rootdevelop ~]# dnf -y install git #安装git工具从gitlab服务器复制地址之后需要将gitlab单词改为自己gitlab服务器的公网IP地址
~]# git clone http://121.36.66.101/devops/myproject.git #克隆远程仓库
[rootdevelop ~]# ls #本地出现一个myproject目录
myprojectwindows客户端也可以使用git clone克隆远程仓库提前安装git客户端安装包在2024-AI大模型Java全链路工程师环境资料/第四模块/cicd中
如果是刚刚安装的git软件需要首先定义全局配置方可继续使用执行一次即可
git config --global user.name jerry
git config --global user.email jerrytedu.cn使用develop服务器编写README.txt文件并上传至远程仓库
[rootdevelop ~]# cd myproject/
[rootdevelop myproject]# vim README.md
Welcome to my beautiful world![rootdevelop myproject]# git add . #保存到暂存区
[rootdevelop myproject]# git commit -m init data #提交至本地仓库# 将master分支推送到origin仓库。origin是默认仓库名。
[rootdevelop myproject]# git push -u origin master
Username for http://192.168.4.20: jerry #用户名
Password for http://jerry192.168.4.20: 1234.com #密码(输入不显示)
# 在服务器上刷新web页面可以看到仓库中已经多出了README.md文件重新操作编写代码并提交远程仓库
# 将来就可以重得操作写代码、确认到版本库、上传到服务器
[rootdevelop myproject]# cp /etc/hosts .
[rootdevelop myproject]# git add .
[rootdevelop myproject]# git commit -m add hosts
[rootdevelop myproject]# git push #不需要再使用-u选项
Username for http://192.168.4.20: jerry
Password for http://jerry192.168.4.20: 1234.com #密码(输入不显示)
# 在服务器上刷新web页面可以看到仓库中已经多出了hosts文件另一个客户端Windows拉取新代码并且上传自己的代码(需要windows安装好git客户端)
$ git pull #拉取代码
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 6 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (6/6), 515 bytes | 0 bytes/s, done.
From http://121.36.66.101/devops/myproject* [new branch] master - origin/masterWindows本地仓库中已经多出了数据 Windows上传数据至远程仓库编写win.txt文件内容为Here is Windows file.
$ git add . #提交暂存区
$ git commit -m add Win.txt #提交本地仓库
$ git push -u origin master #将master分支推送到origin仓库
# 在服务器上刷新web页面可以看到仓库中已经多出了Win.txt文件develop服务器拉取新代码验证是否能够同步Win.txt
[rootdevlop myproject]# git pull
[rootdevlop myproject]# ls #查看多出Win.txt
hosts README.md Win.txt
[rootdevlop myproject]# cat Win.txt #内容正确
Here is Windows file.[rootdevlop myproject]# CI-CD概述
CI持续集成Continuous IntegrationCD持续交付Continuous Delivery/Deployment 软件程序上线流程
程序员将代码上传到gitlab服务器SRE工程师通过jenkins服务器自动下载gitlab上的代码SRE工程师编写自动部署到服务器上的脚本
安装Jenkins服务器
jenkins服务器操作192.168.0.30需要远程它的公网IP地址
# 安装依赖包
# jenkins需要通过git下载代码所以装git。
# jenkins是java程序所以装java
# postfix和mailx是邮件程序jenkins可以通过它们给管理员发邮件
[rootjenkins ~]# dnf -y install git postfix mailx java-11-openjdk[rootjenkins ~]# ls #查看是否上传完毕
jenkins-2.263.1-1.1.noarch.rpm jenkins_plugins.tar.gz~]# dnf -y localinstall jenkins-2.263.1-1.1.noarch.rpm #安装jenkins[rootjenkins ~]# systemctl start jenkins #启动jenkins服务
[rootjenkins ~]# systemctl enable jenkins #将jenkins服务设置为开机自启
[rootjenkins ~]# ss -nutlp | grep :8080 #查看端口8080是否正常访问http://jenkins服务器公网IP:8080进行初始化
# 查看初始化密码每个人的都不一样请以自己的为准
[rootjenkins ~]# cat /var/lib/jenkins/secrets/initialAdminPassword
b9d26edeef714940ab10aaa541081d90把查看到的密码粘贴到文本框中如下 不用创建管理员使用自带的admin 修改admin密码 使用admin用户密码123456登录jenkins 配置jenkins
安装插件jenkins的很多功能都是能过插件实现的比如发邮件、比如中文支持
[rootjenkins ~]# tar -xf jenkins_plugins.tar.gz #拷贝文件的时候注意选项-r可以拷贝目录-p保留权限
[rootjenkins ~]# cp -rp jenkins_plugins/* /var/lib/jenkins/plugins/[rootjenkins ~]# systemctl restart jenkins #重启jenkins服务
#刷新web页面如果出现中文则插件安装成功软件版本管理
develop服务器操作可以在git中使用tag标记将某一次commit提交标识为某一版本
[rootdevelop ~]# cd myproject/ #进入项目目录
[rootdevelop myproject]# git tag #查看标记默认没有标记
[rootdevelop myproject]# git tag 1.0 #将当前提交标识为1.0
[rootdevelop myproject]# git tag #查看标记
1.0
[rootdevelop myproject]# echo hello world index.html
[rootdevelop myproject]# git add .
[rootdevelop myproject]# git commit -m add index.html
[rootdevelop myproject]# git tag 1.1 #将当前提交标识为1.1# 将本地文件和tag推送到gitlab服务器
[rootdevelop myproject]# git push #只推送文件不推送标记
[rootdevelop myproject]# git push --tags在gitlab上查看标记 配置jenkins访问gitlab远程仓库
新建任务 参数化构建过程中名称是自己定义的变量名用于标识tag或分支 git仓库地址在gitlab上找到myproject仓库的http地址注意将gitlab名称改为IP地址 指定分支构建的时候使用上面步骤创建的变量$web 构建测试 在jenkins服务器查看内容查看是否下载成功
[rootjenkins ~]# ls /var/lib/jenkins/workspace/myproject/
hosts index.html README.md Win.txt下载到子目录
此时有个问题1.1版本的代码会覆盖1.0版本的代码无法实现多个版本代码并存这个问题可以使用jenkins子目录的方式解决jenkins下载不同的版本到自己的子目录不共享相同目录 新增时如果没有中文英文是checkout to a sub directory 测试
[rootjenkins ~]# rm -rf /var/lib/jenkins/workspace/myproject/ #删除之前下载的执行多次构建构建不同版本 查看下载目录
[rootjenkins ~]# ls /var/lib/jenkins/workspace/myproject/
myproject-1.0 myproject-1.1部署代码到web服务器
自动化部署流程
程序员编写代码推送到gitlab服务器Jenkins服务器从gitlab上下载代码Jenkins处理下载的代码 删除下载目录的版本库(.git本地仓库)将下载的代码打包计算程序压缩包的md5值在Jenkins上安装httpd服务共享程序压缩包 web服务器下载软件包并应用通过脚本实现访问测试
配置共享服务器
在jenkins上安装、配置httpd共享服务器
[rootjenkins ~]# dnf -y install httpd #安装apache的软件包
[rootjenkins ~]# mkdir -p /var/www/html/deploy/packages #创建jenkins从gitlab上下载的打包代码存放的目录
[rootjenkins ~]# chown -R jenkins:jenkins /var/www/html/deploy/ #修改权限因为是jenkins自动下载的需要修改存放的权限
[rootjenkins ~]# systemctl start httpd
[rootjenkins ~]# systemctl enable httpd配置jenkins把gitlab下载的代码打包
在jenkins上修改myproject项目 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 ver.txt测试修改的任务 浏览器访问http://jenkins公网IP/deploy/packages/即可看到打包的代码 web服务自动部署
[rootweb1 ~]# dnf -y install httpd wget
[rootweb1 ~]# mkdir /var/www/download #存储jenkins主机上下载的应用代码
[rootweb1 ~]# mkdir /var/www/deploy #部署应用代码
[rootweb1 ~]# systemctl start httpd #启动httpd服务
[rootweb1 ~]# systemctl enable httpd #将httpd服务设置为开机自启
[rootweb1 ~]# ss -ntulp | grep :80 #查看80端口是否正常编写自动上线脚本
下载软件包检查软件包是否损坏解压、部署到web服务器
[rootweb1 ~] # vim web.py
import os
import requests
import hashlib
import tarfiledef has_new_ver(web1_ver_path, ver_url):# web1_ver_path 为应用服务器web1主机的当前版本文件路径# 如果文件不存在返回True, 提示没有新版本if not os.path.exists(web1_ver_path):return True# 当web1_ver_path存在时先获取当前应用的版本号with open(web1_ver_path, moder) as fr:local_ver fr.read()# 通过requests获取jenkins服务器上的最新版本号r requests.get(ver_url)# 当web1上的版本号和Jenkins服务器上的版本号不相等时返回True, 即有新的版本if local_ver ! r.text:return Truereturn False# 声明函数file_ok(), 功能如果下载的包文件未损坏则返回True否则返回False
def file_ok(web1_tar_path, jenkins_tar_md5_url):m hashlib.md5()with open(web1_tar_path, moderb) as fw:while True:data fw.read(4096)if len(data) 0:breakm.update(data)# jenkins_tar_md5_url 为jenkins服务器上的压缩包的md5值文件链接地址r requests.get(jenkins_tar_md5_url)if m.hexdigest() r.text.strip():# 相等代表文件未损坏返回Truereturn Truereturn False# 声明函数deploy(), 功能用于部署软件到 web1 服务器
def deploy(web1_tar_path, web1_deploy_dir, dest):tar tarfile.open(web1_tar_path) # 打开压缩包web1_tar_pathtar.extractall(pathweb1_deploy_dir) # 解压到web1_deploy_dir目录下tar.close() # 关闭tar# 获取web1_tar_path变量中最后一个/右边的内容然后做切片去除.tar.gz只留下文件名file_name os.path.basename(web1_tar_path)[:-7]# 将变量web1_deploy_dir和变量file_name拼接在一起app_dir os.path.join(web1_deploy_dir, file_name)# 创建链接如果软链接dest存在删除软连接然后为app_dir创建新的软链接if os.path.exists(dest):os.remove(dest)os.symlink(app_dir, dest)if __name__ __main__:### 判断jenkins服务器上是否有新版本# ver_url 为jenkins服务器的当前版本文件路径# web1_ver_path 为应用服务器web1主机的当前版本文件路径# 这里的地址需要求改为自己的IP地址ver_url http://120.46.84.196/deploy/ver.txtweb1_ver_path /var/www/deploy/ver.txtif not has_new_ver(web1_ver_path, ver_url):print(no new version~)exit(1)# # 如果服务器上有新版本则下载新版本# r.text 为jenkins服务器的当前版本内容# jenkins_tar_url 为jenkins服务器上的压缩包链接地址# web1_tar_path 为应用服务器web1主机的压缩包路径# 这里的地址需要修改为自己的IP地址r requests.get(ver_url)jenkins_tar_url fhttp://120.46.84.196/deploy/packages/myproject-{r.text}.tar.gzweb1_tar_path f/var/www/download/myproject-{r.text}.tar.gzwith open(web1_tar_path, modewb) as fw:fw.write(requests.get(jenkins_tar_url).content)# 校验下载的软件包是否损坏如果损坏则删除 os.remove()# jenkins_tar_md5_url 为jenkins服务器上的压缩包的md5值文件链接地址jenkins_tar_md5_url jenkins_tar_url .md5if not file_ok(web1_tar_path, jenkins_tar_md5_url):print(File has been broken~)os.remove(web1_tar_path)exit(2)# web1_deploy_dir /var/www/deploydest /var/www/html/currentdeploy(web1_tar_path, web1_deploy_dir, dest)# 更新本地的版本文件if os.path.exists(web1_ver_path):os.remove(web1_ver_path)with open(web1_ver_path, modew) as fw:fw.write(requests.get(ver_url).text)[rootweb1 ~]# python3 web.py
[rootweb1 html]# ls /var/www/deploy
myproject-1.1 ver.txt浏览器访问http://web服务器公网IP/current 可以看到部署的文件页面