摆设GitLab服务器
环境预备[*]本实行采用华为云ECS举行,模拟真实工作环境
[*]当然当地电脑环境设置达标,也可以在当地电脑使用VMware假造机完成
[*]本实行供需4台云主机,全部使用Rocky Linux8.5操纵系统,2vCPU,4G内存
[*]具体要求如下:
主机名IP地址设置角色windows––程序员develop192.168.0.10|公网IP2vCPU,4G内存程序员gitlab192.168.0.20|公网IP2vCPU,4G内存远程堆栈jenkins192.168.0.30|公网IP2vCPU,4G内存CI/CD服务器web1192.168.0.40|公网IP2vCPU,4G内存web服务器 项目架构图
https://i-blog.csdnimg.cn/direct/22124c92653643e49582f208e148e841.png
GitLab
[*] 它是一个开源的git堆栈服务器。用于实现代码集中托管
[*] 分为企业版和CE社区版
[*] 摆设方式:软件包摆设、容器摆设
摆设GitLab服务器
[*]云主机192.168.0.20,远程连接时需要连接其对应的公网IP地址
[*]将2024-AI大模型Java全链路工程师环境资料/第四模块/gitlab_zh.tar拷贝到gitlab服务器的/root
[*]将2024-AI大模型Java全链路工程师环境资料/第四模块/docker文件夹拷贝到gitlab服务器的/root
[*]通过容器摆设GitLab服务
# cd /root/docker
# dnf -y localinstall *.rpm #安装容器管理软件docker
# dnf -y install bash-completion #安装tab键(刷新生效)
# systemctl start docker #启动服务
# systemctl enable docker #将服务设置为开机自启
修改gitlab服务器的的sshd服务端口号为8022,因为gitlab容器也要用到22端口,有冲突。
vim +17是指打开设置文件时,光标直接定位到第17行。
# vim +17 /etc/ssh/sshd_config #修改配置文件
17 Port 8022
# systemctl restart sshd #重启sshd远程管理服务
#重启之后需要使用远程工具重新连接gitlab服务器,并且指定8022端口号
gitlab容器运行需要/etc/resolv.conf文件,如果该文件已存在,则无需创建
# touch /etc/resolv.conf
[*]导入镜像
[*]一个镜像可以创建很多容器。镜像是只读的,容器是可以改变的。
[*]容器相当于是精简的假造机,可以像假造机一样,对外提供服务。
# docker load < /root/gitlab_zh.tar
# docker images #查看镜像是否导入
[*]保障数据完备性
[*]为了删容器,不丢失数据,需要把容器需要的数据生存在宿主机上。
[*]在哪台主机上启动容器,哪台主机就是宿主机。
# mkdir -p /srv/gitlab/{config,logs,data} #创建持久化目录
# ls /srv/gitlab/
config data logs
[*]创建容器
[*]-d背景运行
[*]-h gitlab设置容器的主机名
[*]–name gitlab是docker ps查看到的容器名
[*]-p指定发布的端口号,当访问宿主机443/80/22端口时,这样的请求就发给容器的相关端口
[*]–restart always是开机自启
[*]-v是映射路径,将容器中指定的路径,映射到宿主机,以便生存容器产生的数据
[*]最后的gitlab_zh是镜像名
# 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
# 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
则:
# docker rm gitlab
# 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。
https://i-blog.csdnimg.cn/direct/9082a113770e4325bb5c9c598cd77bde.png
https://i-blog.csdnimg.cn/direct/18ed8830f857450f9d570fd4923032b3.png
[*]修改外观设置
https://i-blog.csdnimg.cn/direct/c08216069c41479688d265ee98c57055.png
https://i-blog.csdnimg.cn/direct/7b9bf105f69f4eb08b47d8294ffc8840.png
https://i-blog.csdnimg.cn/direct/c75e50f34c7f4a5bbc734849eba9e0fb.png
https://i-blog.csdnimg.cn/direct/3a86929caf504938b77c69fbabada1a0.png
点击头像–>退出,重新登录验证
https://i-blog.csdnimg.cn/direct/98f93ca8f7864fee8ad90403ecc24f08.png
https://i-blog.csdnimg.cn/direct/42fa3819cb5d4d19a40125b3333259d0.png
GitLab中重要的概念
[*]用户:为使用gitlab的用户创建的账号。
[*]组:用户的聚集,可以为部分创建组。未来可以在项目上为组授权,组中所有的用户都会得到相应的权限。
[*]项目:用于生存代码文件的空间。
[*]用户、组、项目之间的关系如下
https://i-blog.csdnimg.cn/direct/47ece612a30744bb836844c165c4d463.png
[*]创建用户
[*]用户名:jerry
[*]密码:1234.com
https://i-blog.csdnimg.cn/direct/5928876ecff24ef3aa8aee66947717fd.png
填写截图上的几项后,其他使用默认设置,点生存。
https://i-blog.csdnimg.cn/direct/3765ad327a0e4b56b71a33b4d9d649c1.png
https://i-blog.csdnimg.cn/direct/9f78e6dc236949b88f9c03f16bfb4596.png
创建好用户后,点击编辑,可以为他/她设置密码:
https://i-blog.csdnimg.cn/direct/0d0e50500e224fd3b78e281bd738961d.png
https://i-blog.csdnimg.cn/direct/440d4046bef8451f848de585ac682b14.png
https://i-blog.csdnimg.cn/direct/a70badc8b36e46ee9872a4ab08d7a52a.png
https://i-blog.csdnimg.cn/direct/881d75524951415bb06bcccab9c406c3.png
[*] 生存修改后,退出当前账号,使用新账号jerry与其密码1234.com登岸测试。
[*] 第一次登岸时,也是要求修改密码,新密码可以设置与旧密码一样。
[*] 新建的jerry用户因为权限较小,所以看到的界面,没有root的功能多。
https://i-blog.csdnimg.cn/direct/7eeb65733eae483ea1d1d064c14cc6cc.png
https://i-blog.csdnimg.cn/direct/f3defced819e461aa82f253bd7da5f7a.png
https://i-blog.csdnimg.cn/direct/a63acd296b8a447489a709fb9b2d0278.png
https://i-blog.csdnimg.cn/direct/68b1df356bc9406e8d5eecb1eb843f51.png
[*]创建组,注意,需要使用root账号创建,这里需要切换回root账户
https://i-blog.csdnimg.cn/direct/0bbe12cc3f24426ca5a61c878505777b.png
https://i-blog.csdnimg.cn/direct/c0de24d39b374a0094251114d166c3a4.png
https://i-blog.csdnimg.cn/direct/7de22e3436e14d11a95aad06e2cd96af.png
[*]将jerry用户加到devops组中,角色是"主程序员"
https://i-blog.csdnimg.cn/direct/ee857599657f4333b1f5287383626e5d.png
[*]创建项目,管理员root操纵
https://i-blog.csdnimg.cn/direct/6c49e641cbd14eb79745dda96c6243c4.png
https://i-blog.csdnimg.cn/direct/8cf96b25440a4a08aa96571d55bf6b82.png
[*]切换为jerry用户,查看项目是否负责
https://i-blog.csdnimg.cn/direct/0f2759de159b4bf387a18f88cb92f05d.png
https://i-blog.csdnimg.cn/direct/5692e72bc8514aa58bb83cd1259f813d.png
https://i-blog.csdnimg.cn/direct/3a2f381d57e44f2abc757b0c8a1e5305.png
https://i-blog.csdnimg.cn/direct/792dba1bc122457498c95bc7ea7ac1fb.png
客户端上传代码到gitlab服务器
[*] 查看项目路径,采用http方式上传
[*] 查看项目阐明
https://i-blog.csdnimg.cn/direct/9862c9962c8b4f1eb2ec3c0f0263a026.png
[*]在客户端develop服务器(192.168.0.10,连接其公网IP地址)上下载项目,编写代码并上传
# dnf -y install git #安装git工具
从gitlab服务器复制地址之后,需要将gitlab单词改为自己gitlab服务器的公网IP地址
~]# git clone http://121.36.66.101/devops/myproject.git #克隆远程仓库
# ls #本地出现一个myproject目录
myproject
windows客户端也可以使用git clone克隆远程堆栈,提前安装git客户端(安装包在2024-AI大模型Java全链路工程师环境资料/第四模块/cicd中)
如果是刚刚安装的git软件需要首先界说全局设置,方可继续使用(实行一次即可)
git config --global user.name "jerry"
git config --global user.email "jerry@tedu.cn"
https://i-blog.csdnimg.cn/direct/62f08765e0bd4bdda61bbcc9b42750df.png
使用develop服务器编写README.txt文件,并上传至远程堆栈
# cd myproject/
# vim README.md
Welcome to my beautiful world!
# git add . #保存到暂存区
# git commit -m "init data" #提交至本地仓库
# 将master分支推送到origin仓库。origin是默认仓库名。
# git push -u origin master
Username for 'http://192.168.4.20': jerry #用户名
Password for 'http://jerry@192.168.4.20': 1234.com #密码(输入不显示)
# 在服务器上刷新web页面,可以看到仓库中已经多出了README.md文件
重新操纵编写代码,并提交远程堆栈
# 将来就可以重得操作:写代码、确认到版本库、上传到服务器
# cp /etc/hosts .
# git add .
# git commit -m "add hosts"
# git push #不需要再使用-u选项
Username for 'http://192.168.4.20': jerry
Password for 'http://jerry@192.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
* master -> origin/master
Windows当地堆栈中已经多出了数据
https://i-blog.csdnimg.cn/direct/9958e5c5e132410bb34fbbe3c7034715.png
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
# git pull
# ls #查看多出Win.txt
hostsREADME.mdWin.txt
# cat Win.txt #内容正确
Here is Windows file.#
CI-CD概述
[*]CI:连续集成(Continuous Integration)
[*]CD:连续交付(Continuous Delivery/Deployment)
https://i-blog.csdnimg.cn/direct/499787606015404b85250c37d89f883b.png
软件程序上线流程
[*]程序员将代码上传到gitlab服务器
[*]SRE工程师,通过jenkins服务器主动下载gitlab上的代码
[*]SRE工程师编写主动摆设到服务器上的脚本
安装Jenkins服务器
[*]jenkins服务器操纵(192.168.0.30,需要远程它的公网IP地址)
# 安装依赖包
# jenkins需要通过git下载代码,所以装git。
# jenkins是java程序,所以装java
# postfix和mailx是邮件程序,jenkins可以通过它们给管理员发邮件
# dnf -y installgit postfix mailx java-11-openjdk
# ls #查看是否上传完毕
jenkins-2.263.1-1.1.noarch.rpm jenkins_plugins.tar.gz
~]# dnf -y localinstalljenkins-2.263.1-1.1.noarch.rpm #安装jenkins
# systemctl start jenkins #启动jenkins服务
# systemctl enable jenkins #将jenkins服务设置为开机自启
# ss -nutlp | grep :8080 #查看端口8080是否正常
[*]访问http://jenkins服务器公网IP:8080,举行初始化
# 查看初始化密码,每个人的都不一样,请以自己的为准
# cat /var/lib/jenkins/secrets/initialAdminPassword
b9d26edeef714940ab10aaa541081d90
把查看到的密码粘贴到文本框中,如下:
https://i-blog.csdnimg.cn/direct/3d01d302b6a44330a3fc77e01693fed1.png
https://i-blog.csdnimg.cn/direct/55349cf6d5d247d8a85bade08632f957.png
https://i-blog.csdnimg.cn/direct/4fe138753b464487b733d968740c7a2e.png
[*]不用创建管理员,使用自带的admin
https://i-blog.csdnimg.cn/direct/b7251bb992c14858adcb54bac075bd2c.png
https://i-blog.csdnimg.cn/direct/125df3195a174195b5ae2734c32bc758.png
https://i-blog.csdnimg.cn/direct/172fa603832a4387b30a84e872d5b527.png
[*]修改admin密码
https://i-blog.csdnimg.cn/direct/d0bbb7d147084c1db8d626e3bc1e93cc.png
https://i-blog.csdnimg.cn/direct/aebf89f98a94477a8232c9754271f903.png
使用admin用户,密码123456登录jenkins
https://i-blog.csdnimg.cn/direct/6175fb6cee2f4ab387079e113d15b2c3.png
设置jenkins
[*]安装插件:jenkins的很多功能都是能过插件实现的,好比发邮件、好比中文支持
# tar -xf jenkins_plugins.tar.gz
#拷贝文件的时候,注意选项,-r可以拷贝目录,-p保留权限
# cp -rp jenkins_plugins/* /var/lib/jenkins/plugins/
# systemctl restart jenkins #重启jenkins服务
#刷新web页面,如果出现中文,则插件安装成功
软件版本管理
[*]develop服务器操纵
[*]可以在git中使用tag标记将某一次commit提交标识为某一版本
# cd myproject/ #进入项目目录
# git tag #查看标记,默认没有标记
# git tag 1.0 #将当前提交,标识为1.0
# git tag #查看标记
1.0
# echo 'hello world' > index.html
# git add .
# git commit -m "add index.html"
# git tag 1.1 #将当前提交,标识为1.1
# 将本地文件和tag推送到gitlab服务器
# git push #只推送文件,不推送标记
# git push --tags
在gitlab上查看标记
https://i-blog.csdnimg.cn/direct/b30a96674ea74fc08de367d3d2872ce7.png
设置jenkins访问gitlab远程堆栈
[*]新建任务
https://i-blog.csdnimg.cn/direct/eadae76758104bc4b6d132cf7378342b.png
https://i-blog.csdnimg.cn/direct/031f329957da48b5abee231b7eca69dc.png
[*]参数化构建过程中,"名称"是自己界说的变量名,用于标识tag或分支
https://i-blog.csdnimg.cn/direct/b8c835ec49e0430a8771868e56173ae1.png
https://i-blog.csdnimg.cn/direct/48fd9d26f0a1470f954bebad4eb2b629.png
git堆栈地址,在gitlab上找到myproject堆栈的http地址,注意将gitlab名称改为IP地址
https://i-blog.csdnimg.cn/direct/98cff833cfee46c489ef5637d2a6d20a.png
指定分支构建的时候,使用上面步骤创建的变量$web
https://i-blog.csdnimg.cn/direct/ca3b9a7eefb44cdc9170a7f444f948d4.png
https://i-blog.csdnimg.cn/direct/96e1ce7576114350836414a17821fdac.png
https://i-blog.csdnimg.cn/direct/db071cbe910f408ab149b695ec8e877a.png
[*]构建测试
https://i-blog.csdnimg.cn/direct/7379149373444b36a1d4ea6b4462a7d1.png
https://i-blog.csdnimg.cn/direct/84c9542eb51748ee8a45de6cf7abe75e.png
在jenkins服务器查看内容,查看是否下载乐成
# ls /var/lib/jenkins/workspace/myproject/
hostsindex.htmlREADME.mdWin.txt
下载到子目录
[*]此时有个问题,1.1版本的代码会覆盖1.0版本的代码,无法实现多个版本代码并存
[*]这个问题可以使用jenkins子目录的方式解决
[*]jenkins下载不同的版本到自己的子目录,不共享雷同目录
https://i-blog.csdnimg.cn/direct/80cdd1eb723a4fd2a4d0ce7815192753.png
https://i-blog.csdnimg.cn/direct/44da8af20fdf43ea98ab11e6936bb3df.png
新增时,如果没有中文,英文是"checkout to a sub directory"
https://i-blog.csdnimg.cn/direct/d26c0e4df8a4496fb9c78ed73e6c3288.png
https://i-blog.csdnimg.cn/direct/1557e55c3a3a47ab8cb08d3e33e88d9f.png
测试
# rm -rf /var/lib/jenkins/workspace/myproject/ #删除之前下载的
实行多次构建,构建不同版本
https://i-blog.csdnimg.cn/direct/3aa6fefa2099458483314d076b3e8abb.png
https://i-blog.csdnimg.cn/direct/a27abf8aa2f747b6ab43b5515979be62.png
https://i-blog.csdnimg.cn/direct/5a7f8ca06a5a46a1bfbc382144bd39f7.png
https://i-blog.csdnimg.cn/direct/83d17da4144f4f10b58aad40fd277e59.png
查看下载目录
# ls /var/lib/jenkins/workspace/myproject/
myproject-1.0 myproject-1.1
摆设代码到web服务器
主动化摆设流程
[*]程序员编写代码,推送到gitlab服务器
[*]Jenkins服务器从gitlab上下载代码
[*]Jenkins处置惩罚下载的代码
[*]
[*]删除下载目录的版本库(.git当地堆栈)
[*]将下载的代码打包
[*]计算程序压缩包的md5值
[*]在Jenkins上安装httpd服务,共享程序压缩包
[*]web服务器下载软件包,并应用(通过脚本实现)
[*]访问测试
设置共享服务器
[*]在jenkins上安装、设置httpd共享服务器
# dnf -y install httpd #安装apache的软件包
# mkdir -p /var/www/html/deploy/packages #创建jenkins从gitlab上下载的打包代码存放的目录
# chown -R jenkins:jenkins /var/www/html/deploy/ #修改权限,因为是jenkins自动下载的,需要修改存放的权限
# systemctl start httpd
# systemctl enable httpd
设置jenkins把gitlab下载的代码打包
[*]在jenkins上修改myproject项目
https://i-blog.csdnimg.cn/direct/3c0eeb9489384e72af76a9b54f6c4ef3.png
https://i-blog.csdnimg.cn/direct/5711b4ef9d1e4e6ca3ce21429706e0d0.png
https://i-blog.csdnimg.cn/direct/c1538b8a88184e4d9c2f41eeb909509d.png
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
测试修改的任务
https://i-blog.csdnimg.cn/direct/010cbb8b5a9c4f64b65342561a69cd73.png
https://i-blog.csdnimg.cn/direct/ffd7912fd05f418a962448faa67e99f4.png
https://i-blog.csdnimg.cn/direct/7f8ec1e8541b4a0091cb558eb83db49c.png
https://i-blog.csdnimg.cn/direct/8c55ca27108e421788c5aac4795b2c72.png
浏览器访问:http://jenkins公网IP/deploy/packages/即可看到打包的代码
https://i-blog.csdnimg.cn/direct/dda15f65466a448691d7d9e11f65772a.png
web服务主动摆设
# dnf -y install httpdwget
# mkdir /var/www/download #存储jenkins主机上下载的应用代码
# mkdir /var/www/deploy #部署应用代码
# systemctl start httpd #启动httpd服务
# systemctl enable httpd #将httpd服务设置为开机自启
# ss -ntulp | grep :80 #查看80端口是否正常
编写主动上线脚本
[*]下载软件包
[*]检查软件包是否破坏
[*]解压、摆设到web服务器
# vim web.py
import os
import requests
import hashlib
import tarfile
def 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, mode="r") as fr:
local_ver = fr.read()
# 通过requests获取jenkins服务器上的最新版本号
r = requests.get(ver_url)
# 当web1上的版本号和Jenkins服务器上的版本号不相等时,返回True, 即有新的版本
if local_ver != r.text:
return True
return False
# 声明函数file_ok(), 功能:如果下载的包文件未损坏,则返回True,否则返回False
def file_ok(web1_tar_path, jenkins_tar_md5_url):
m = hashlib.md5()
with open(web1_tar_path, mode="rb") as fw:
while True:
data = fw.read(4096)
if len(data) == 0:
break
m.update(data)
# jenkins_tar_md5_url 为jenkins服务器上的压缩包的md5值文件链接地址
r = requests.get(jenkins_tar_md5_url)
if m.hexdigest() == r.text.strip():
# 相等,代表文件未损坏,返回True
return True
return False
# 声明函数deploy(), 功能:用于部署软件到 web1 服务器
def deploy(web1_tar_path, web1_deploy_dir, dest):
tar = tarfile.open(web1_tar_path)# 打开压缩包web1_tar_path
tar.extractall(path=web1_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.txt"
web1_ver_path = "/var/www/deploy/ver.txt"
if 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 = f"http://120.46.84.196/deploy/packages/myproject-{r.text}.tar.gz"
web1_tar_path = f"/var/www/download/myproject-{r.text}.tar.gz"
with open(web1_tar_path, mode="wb") 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 + ".md5"
if 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/deploy'
dest = '/var/www/html/current'
deploy(web1_tar_path, web1_deploy_dir, dest)
# 更新本地的版本文件
if os.path.exists(web1_ver_path):
os.remove(web1_ver_path)
with open(web1_ver_path, mode="w") as fw:
fw.write(requests.get(ver_url).text)
# python3 web.py
# ls /var/www/deploy
myproject-1.1ver.txt
浏览器访问http://web服务器公网IP/current 可以看到摆设的文件页面
https://i-blog.csdnimg.cn/direct/fabca3d05a254bcaae49cc101d3b671e.png
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]